diff --git a/app/assets/stylesheets/base/main.scss b/app/assets/stylesheets/base/main.scss index 592f89a91..b8018e18f 100644 --- a/app/assets/stylesheets/base/main.scss +++ b/app/assets/stylesheets/base/main.scss @@ -64,6 +64,7 @@ a { // Logo .site-logo { max-width: var(--max-width, 125px); + max-height: 40px; font-size: var(--font-size, var(--fs-base)); font-weight: var(--font-weight, var(--fw-medium)); diff --git a/app/controllers/admin/creator_settings_controller.rb b/app/controllers/admin/creator_settings_controller.rb index 673daef0c..a6c3ca2f6 100644 --- a/app/controllers/admin/creator_settings_controller.rb +++ b/app/controllers/admin/creator_settings_controller.rb @@ -1,18 +1,28 @@ module Admin class CreatorSettingsController < Admin::ApplicationController - ALLOWED_PARAMS = %i[community_name logo_svg primary_brand_color_hex invite_only_mode public checked_code_of_conduct - checked_terms_and_conditions].freeze + ALLOWED_PARAMS = %i[checked_code_of_conduct checked_terms_and_conditions community_name + invite_only_mode logo primary_brand_color_hex public].freeze - def new; end + def new + @max_file_size = LogoUploader::MAX_FILE_SIZE + @logo_allowed_types = (LogoUploader::CONTENT_TYPE_ALLOWLIST + + LogoUploader::EXTENSION_ALLOWLIST.map { |extension| ".#{extension}" }).join(",") + end def create extra_authorization ActiveRecord::Base.transaction do ::Settings::Community.community_name = settings_params[:community_name] - ::Settings::General.logo_svg = settings_params[:logo_svg] ::Settings::UserExperience.primary_brand_color_hex = settings_params[:primary_brand_color_hex] ::Settings::Authentication.invite_only_mode = settings_params[:invite_only] ::Settings::UserExperience.public = settings_params[:public] + + if settings_params[:logo] + logo_uploader = upload_logo(settings_params[:logo]) + ::Settings::General.original_logo = logo_uploader.url + # An SVG will not be resized, hence we apply the OR statements below to populate SETTINGS consistently. + ::Settings::General.resized_logo = logo_uploader.resized_logo.url || logo_uploader.url + end end current_user.update!( saw_onboarding: true, @@ -34,5 +44,11 @@ module Admin def settings_params params.permit(ALLOWED_PARAMS) end + + def upload_logo(image) + LogoUploader.new.tap do |uploader| + uploader.store!(image) + end + end end end diff --git a/app/models/settings/general.rb b/app/models/settings/general.rb index 24860adc2..fa26d5083 100644 --- a/app/models/settings/general.rb +++ b/app/models/settings/general.rb @@ -37,6 +37,9 @@ module Settings setting :logo_svg, type: :string + setting :original_logo, type: :string + setting :resized_logo, type: :string + setting :enable_video_upload, type: :boolean, default: false # Mascot diff --git a/app/uploaders/base_uploader.rb b/app/uploaders/base_uploader.rb index 52e2e7674..cc762694b 100644 --- a/app/uploaders/base_uploader.rb +++ b/app/uploaders/base_uploader.rb @@ -26,6 +26,9 @@ class BaseUploader < CarrierWave::Uploader::Base # strip EXIF (and GPS) data def strip_exif + # svg's do not contain exif or gps data + return if file.content_type.include?("svg") + manipulate! do |image| image.strip unless image.frames.count > FRAME_STRIP_MAX image = yield(image) if block_given? diff --git a/app/uploaders/logo_uploader.rb b/app/uploaders/logo_uploader.rb new file mode 100644 index 000000000..754190a69 --- /dev/null +++ b/app/uploaders/logo_uploader.rb @@ -0,0 +1,50 @@ +class LogoUploader < BaseUploader + MAX_FILE_SIZE = 3.megabytes + STORE_DIRECTORY = "uploads/logos/".freeze + EXTENSION_ALLOWLIST = %w[svg png jpg jpeg jpe].freeze + IMAGE_TYPE_ALLOWLIST = %i[svg png jpg jpeg jpe].freeze + CONTENT_TYPE_ALLOWLIST = %w[image/svg+xml image/png image/jpg image/jpeg].freeze + + def store_dir + STORE_DIRECTORY + end + + def extension_allowlist + EXTENSION_ALLOWLIST + end + + def image_type_whitelist + # this is needed by CarrierWave::BombShelter + IMAGE_TYPE_ALLOWLIST + end + + def size_range + 1..MAX_FILE_SIZE + end + + def content_type_allowlist + CONTENT_TYPE_ALLOWLIST + end + + def filename + # random_string in the filename to avoid caching issues + "original_logo_#{random_string}.#{file.extension}" if original_filename + end + + version :resized_logo, if: :not_svg? do + process resize_to_limit: [nil, 80] + def full_filename(_for_file = file) + "resized_logo_#{random_string}.#{file.extension}" if original_filename + end + end + + private + + def random_string + SecureRandom.alphanumeric(20) + end + + def not_svg?(file) + file.content_type.exclude?("svg") + end +end diff --git a/app/views/admin/creator_settings/_form.html.erb b/app/views/admin/creator_settings/_form.html.erb index 75dac8b43..4a9fda539 100644 --- a/app/views/admin/creator_settings/_form.html.erb +++ b/app/views/admin/creator_settings/_form.html.erb @@ -8,17 +8,14 @@
Ideally SVG, but PNG or JPEG will work, too.
<% end %>