diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 50823ca7..592c006d 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -42,10 +42,6 @@ class ApplicationController < ActionController::Base end def default_url_options - if request.domain == 'docuseal.com' - return { host: 'docuseal.com', protocol: ENV['FORCE_SSL'].present? ? 'https' : 'http' } - end - Docuseal.default_url_options end diff --git a/app/controllers/submissions_download_controller.rb b/app/controllers/submissions_download_controller.rb index eb216bc5..39dee165 100644 --- a/app/controllers/submissions_download_controller.rb +++ b/app/controllers/submissions_download_controller.rb @@ -65,7 +65,7 @@ class SubmissionsDownloadController < ApplicationController key: AccountConfig::DOCUMENT_FILENAME_FORMAT_KEY)&.value Submitters.select_attachments_for_download(submitter).map do |attachment| - ActiveStorage::Blob.proxy_url( + ActiveStorage::Blob.proxy_path( attachment.blob, expires_at: FILES_TTL.from_now.to_i, filename: Submitters.build_document_filename(submitter, attachment.blob, filename_format) @@ -83,7 +83,7 @@ class SubmissionsDownloadController < ApplicationController filename_format = AccountConfig.find_or_initialize_by(account_id: submitter.account_id, key: AccountConfig::DOCUMENT_FILENAME_FORMAT_KEY)&.value - ActiveStorage::Blob.proxy_url( + ActiveStorage::Blob.proxy_path( attachment.blob, expires_at: FILES_TTL.from_now.to_i, filename: Submitters.build_document_filename(submitter, attachment.blob, filename_format) diff --git a/app/controllers/submit_form_download_controller.rb b/app/controllers/submit_form_download_controller.rb index 3ebdc5e2..af9cbeb4 100644 --- a/app/controllers/submit_form_download_controller.rb +++ b/app/controllers/submit_form_download_controller.rb @@ -33,7 +33,7 @@ class SubmitFormDownloadController < ApplicationController end urls = attachments.map do |attachment| - ActiveStorage::Blob.proxy_url(attachment.blob, expires_at: FILES_TTL.from_now.to_i) + ActiveStorage::Blob.proxy_path(attachment.blob, expires_at: FILES_TTL.from_now.to_i) end render json: urls diff --git a/app/controllers/template_documents_controller.rb b/app/controllers/template_documents_controller.rb index b29a18f6..51fc4111 100644 --- a/app/controllers/template_documents_controller.rb +++ b/app/controllers/template_documents_controller.rb @@ -6,7 +6,7 @@ class TemplateDocumentsController < ApplicationController FILES_TTL = 5.minutes def index - render json: @template.schema_documents.map { |d| ActiveStorage::Blob.proxy_url(d.blob, expires_at: FILES_TTL.from_now.to_i) } + render json: @template.schema_documents.map { |d| ActiveStorage::Blob.proxy_path(d.blob, expires_at: FILES_TTL.from_now.to_i) } end def create diff --git a/app/mailers/submitter_mailer.rb b/app/mailers/submitter_mailer.rb index 18d2f570..976ddc78 100644 --- a/app/mailers/submitter_mailer.rb +++ b/app/mailers/submitter_mailer.rb @@ -14,12 +14,7 @@ class SubmitterMailer < ApplicationMailer @email_message = submitter.account.email_messages.find_by(uuid: submitter.preferences['email_message_uuid']) end - template_submitters_index = - if @email_message.blank? - build_submitter_preferences_index(@submitter) - else - {} - end + template_submitters_index = @email_message.blank? ? build_submitter_preferences_index(@submitter) : {} @body = @email_message&.body.presence || template_submitters_index.dig(@submitter.uuid, 'request_email_body').presence || @@ -36,6 +31,8 @@ class SubmitterMailer < ApplicationMailer reply_to = build_submitter_reply_to(@submitter) + maybe_set_custom_domain(@submitter) + I18n.with_locale(@current_account.locale) do subject = build_invite_subject(@subject, @email_config, submitter) @@ -133,6 +130,8 @@ class SubmitterMailer < ApplicationMailer assign_message_metadata('submitter_documents_copy', @submitter) reply_to = build_submitter_reply_to(submitter, email_config: @email_config, documents_copy_email: true) + maybe_set_custom_domain(@submitter) + I18n.with_locale(@current_account.locale) do subject = @subject.present? ? ReplaceEmailVariables.call(@subject, submitter:) : I18n.t(:your_document_copy) @@ -262,4 +261,10 @@ class SubmitterMailer < ApplicationMailer def fetch_config_email_body(email_config, _submitter = nil) email_config ? email_config.value['body'].presence : nil end + + def maybe_set_custom_domain(submitter) + if Docuseal.multitenant? && (config = AccountConfig.find_by(account_id: submitter.account_id, key: :custom_domain)) + @custom_domain = config.value + end + end end diff --git a/app/views/submissions/show.html.erb b/app/views/submissions/show.html.erb index 7940f337..acbaedad 100644 --- a/app/views/submissions/show.html.erb +++ b/app/views/submissions/show.html.erb @@ -21,7 +21,7 @@ <%= button_to button_title(title: t('unarchive'), disabled_with: t('unarchive')[0..-2], icon: svg_icon('rotate', class: 'w-6 h-6')), submission_unarchive_index_path(@submission), class: 'btn btn-primary btn-ghost text-base hidden md:flex' %> <% end %> <% if @submission.audit_trail.present? %> - + <%= svg_icon('external_link', class: 'w-6 h-6') %> diff --git a/app/views/submitter_mailer/documents_copy_email.html.erb b/app/views/submitter_mailer/documents_copy_email.html.erb index 3117481d..9e230cf2 100644 --- a/app/views/submitter_mailer/documents_copy_email.html.erb +++ b/app/views/submitter_mailer/documents_copy_email.html.erb @@ -5,7 +5,7 @@

<%= t('please_check_the_copy_of_your_name_in_the_email_attachments', name: @submitter.submission.name || @submitter.submission.template.name) %>

<%= t('alternatively_you_can_review_and_download_your_copy_using_the_link_below') %>

- <%= link_to @submitter.submission.name || @submitter.submission.template.name, submissions_preview_url(@submitter.submission.slug, { sig: @sig }.compact) %> + <%= link_to @submitter.submission.name || @submitter.submission.template.name, submissions_preview_url(@submitter.submission.slug, { sig: @sig, host: @custom_domain || ENV.fetch('EMAIL_HOST', Docuseal.default_url_options[:host]) }.compact) %>

<%= t('thanks') %>,
<%= @current_account.name %> diff --git a/app/views/submitter_mailer/invitation_email.html.erb b/app/views/submitter_mailer/invitation_email.html.erb index 06e38f30..408016df 100644 --- a/app/views/submitter_mailer/invitation_email.html.erb +++ b/app/views/submitter_mailer/invitation_email.html.erb @@ -1,12 +1,12 @@ <% if @body.present? %> <%= render 'custom_content', content: @body, submitter: @submitter %> <% if !@body.match?(ReplaceEmailVariables::SUBMITTER_LINK) && !@body.match?(ReplaceEmailVariables::SUBMITTER_ID) && !@body.match?(ReplaceEmailVariables::SUBMISSION_LINK) && !@body.match?(ReplaceEmailVariables::TEMPLATE_ID) && !@submitter.submission.source.in?(%w[api embed]) %> -

<%= link_to nil, submit_form_url(slug: @submitter.slug, t: SubmissionEvents.build_tracking_param(@submitter, 'click_email')) %>

+

<%= link_to nil, submit_form_url(slug: @submitter.slug, t: SubmissionEvents.build_tracking_param(@submitter, 'click_email'), host: @custom_domain || ENV.fetch('EMAIL_HOST', Docuseal.default_url_options[:host])) %>

<% end %> <% else %>

<%= t('hi_there') %>,

<%= I18n.t(@submitter.with_signature_fields? ? :you_have_been_invited_to_sign_the_name : :you_have_been_invited_to_submit_the_name_form, name: @submitter.submission.name || @submitter.submission.template.name) %>

-

<%= link_to I18n.t(@submitter.with_signature_fields? ? :review_and_sign : :review_and_submit), submit_form_url(slug: @submitter.slug, t: SubmissionEvents.build_tracking_param(@submitter, 'click_email'), host: ENV.fetch('EMAIL_HOST', Docuseal.default_url_options[:host])) %>

+

<%= link_to I18n.t(@submitter.with_signature_fields? ? :review_and_sign : :review_and_submit), submit_form_url(slug: @submitter.slug, t: SubmissionEvents.build_tracking_param(@submitter, 'click_email'), host: @custom_domain || ENV.fetch('EMAIL_HOST', Docuseal.default_url_options[:host])) %>

<%= t('please_contact_us_by_replying_to_this_email_if_you_have_any_questions') %>

<%= t('thanks') %>,
<%= @current_account.name %> diff --git a/app/views/templates/_submission.html.erb b/app/views/templates/_submission.html.erb index 3c3348ec..bcfcd66c 100644 --- a/app/views/templates/_submission.html.erb +++ b/app/views/templates/_submission.html.erb @@ -81,7 +81,7 @@ <% elsif !submission.archived_at? && !template&.archived_at? && !submission.expired? && !submitter.declined_at? %> <% if current_user.email == submitter.email %>

- + <% if t('sign_now').length < 12 %> <%= svg_icon('writing_sign', class: 'w-4 h-4 stroke-2') %> @@ -167,7 +167,7 @@ <% elsif !template&.archived_at? && !submission.archived_at? && !is_submission_completed && !submission.expired? && !submitter.declined_at? %>
<% if current_user.email == submitter.email %> - + <% if t('sign_now').length < 12 %> <%= svg_icon('writing_sign', class: 'w-4 h-4 stroke-2') %> diff --git a/app/views/templates_share_link/show.html.erb b/app/views/templates_share_link/show.html.erb index 1511b4c2..43149a29 100644 --- a/app/views/templates_share_link/show.html.erb +++ b/app/views/templates_share_link/show.html.erb @@ -17,9 +17,9 @@ <% end %>
- + - <%= render 'shared/clipboard_copy', icon: 'copy', text: start_form_url(slug: @template.slug), class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %> + <%= render 'shared/clipboard_copy', icon: 'copy', text: start_form_url(slug: @template.slug, host: form_link_host), class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %>
<% end %> diff --git a/config/initializers/active_storage.rb b/config/initializers/active_storage.rb index 78637ddb..2bcdc57b 100644 --- a/config/initializers/active_storage.rb +++ b/config/initializers/active_storage.rb @@ -10,6 +10,7 @@ ActiveSupport.on_load(:active_storage_attachment) do end end +# rubocop:disable Metrics/BlockLength ActiveSupport.on_load(:active_storage_blob) do attribute :uuid, :string, default: -> { SecureRandom.uuid } attribute :io_data, :string, default: '' @@ -22,6 +23,12 @@ ActiveSupport.on_load(:active_storage_blob) do ) end + def self.proxy_path(blob, expires_at: nil, filename: nil) + Rails.application.routes.url_helpers.blobs_proxy_path( + signed_uuid: blob.signed_uuid(expires_at:), filename: filename || blob.filename + ) + end + def uuid super || begin new_uuid = SecureRandom.uuid @@ -40,6 +47,7 @@ ActiveSupport.on_load(:active_storage_blob) do service.delete(key) end end +# rubocop:enable Metrics/BlockLength ActiveStorage::LogSubscriber.detach_from(:active_storage) if Rails.env.production? diff --git a/lib/replace_email_variables.rb b/lib/replace_email_variables.rb index 4222e676..392c585d 100644 --- a/lib/replace_email_variables.rb +++ b/lib/replace_email_variables.rb @@ -89,8 +89,10 @@ module ReplaceEmailVariables # rubocop:enable Metrics def build_documents_links_text(submitter, sig = nil) + url_options = build_url_options_for(submitter) + Rails.application.routes.url_helpers.submissions_preview_url( - submitter.submission.slug, { sig:, **Docuseal.default_url_options }.compact + submitter.submission.slug, { sig:, **url_options }.compact ) end @@ -139,14 +141,9 @@ module ReplaceEmailVariables end def build_submitter_link(submitter, tracking_event_type) - if tracking_event_type == 'click_email' - url_options = - if EMAIL_HOST.present? - { host: EMAIL_HOST, protocol: ENV['FORCE_SSL'].present? ? 'https' : 'http' } - else - Docuseal.default_url_options - end + url_options = build_url_options_for(submitter, is_email: tracking_event_type == 'click_email') + if tracking_event_type == 'click_email' Rails.application.routes.url_helpers.submit_form_url( slug: submitter.slug, t: SubmissionEvents.build_tracking_param(submitter, 'click_email'), @@ -156,11 +153,22 @@ module ReplaceEmailVariables Rails.application.routes.url_helpers.submit_form_url( slug: submitter.slug, c: SubmissionEvents.build_tracking_param(submitter, 'click_sms'), - **Docuseal.default_url_options + **url_options ) end end + def build_url_options_for(submitter, is_email: true) + if Docuseal.multitenant? && + (config = AccountConfig.find_by(account_id: submitter.account_id, key: :custom_domain)) + { host: config.value, protocol: 'https' } + elsif is_email && EMAIL_HOST.present? + { host: EMAIL_HOST, protocol: ENV['FORCE_SSL'].present? ? 'https' : 'http' } + else + Docuseal.default_url_options + end + end + def build_submission_link(submission) Rails.application.routes.url_helpers.submission_url(submission, **Docuseal.default_url_options) end