diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-10-19 15:57:54 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-10-19 15:57:54 +0300 |
commit | 419c53ec62de6e97a517abd5fdd4cbde3a942a34 (patch) | |
tree | 1f43a548b46bca8a5fb8fe0c31cef1883d49c5b6 /lib/gitlab/email | |
parent | 1da20d9135b3ad9e75e65b028bffc921aaf8deb7 (diff) |
Add latest changes from gitlab-org/gitlab@16-5-stable-eev16.5.0-rc42
Diffstat (limited to 'lib/gitlab/email')
-rw-r--r-- | lib/gitlab/email/handler/base_handler.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/email/handler/create_issue_handler.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/email/handler/create_merge_request_handler.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/email/handler/create_note_on_issuable_handler.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/email/handler/service_desk_handler.rb | 14 | ||||
-rw-r--r-- | lib/gitlab/email/message/build_ios_app_guide.rb | 57 | ||||
-rw-r--r-- | lib/gitlab/email/message/in_product_marketing/helper.rb | 97 | ||||
-rw-r--r-- | lib/gitlab/email/receiver.rb | 57 |
8 files changed, 35 insertions, 202 deletions
diff --git a/lib/gitlab/email/handler/base_handler.rb b/lib/gitlab/email/handler/base_handler.rb index 2e487c42cb5..19826138075 100644 --- a/lib/gitlab/email/handler/base_handler.rb +++ b/lib/gitlab/email/handler/base_handler.rb @@ -6,7 +6,7 @@ module Gitlab class BaseHandler attr_reader :mail, :mail_key - HANDLER_ACTION_BASE_REGEX ||= /(?<project_slug>.+)-(?<project_id>\d+)/.freeze + HANDLER_ACTION_BASE_REGEX ||= /(?<project_slug>.+)-(?<project_id>\d+)/ def initialize(mail, mail_key) @mail = mail diff --git a/lib/gitlab/email/handler/create_issue_handler.rb b/lib/gitlab/email/handler/create_issue_handler.rb index 869bcc6e2be..cac6c29f10b 100644 --- a/lib/gitlab/email/handler/create_issue_handler.rb +++ b/lib/gitlab/email/handler/create_issue_handler.rb @@ -11,8 +11,8 @@ module Gitlab class CreateIssueHandler < BaseHandler include ReplyProcessing - HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-(?<incoming_email_token>.+)-issue\z/.freeze - HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+(?<incoming_email_token>.*)\z/.freeze + HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-(?<incoming_email_token>.+)-issue\z/ + HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+(?<incoming_email_token>.*)\z/ def initialize(mail, mail_key) super(mail, mail_key) diff --git a/lib/gitlab/email/handler/create_merge_request_handler.rb b/lib/gitlab/email/handler/create_merge_request_handler.rb index c723c2762c7..6e25202241c 100644 --- a/lib/gitlab/email/handler/create_merge_request_handler.rb +++ b/lib/gitlab/email/handler/create_merge_request_handler.rb @@ -12,8 +12,8 @@ module Gitlab class CreateMergeRequestHandler < BaseHandler include ReplyProcessing - HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-(?<incoming_email_token>.+)-merge-request\z/.freeze - HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+merge-request\+(?<incoming_email_token>.*)/.freeze + HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-(?<incoming_email_token>.+)-merge-request\z/ + HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\+merge-request\+(?<incoming_email_token>.*)/ def initialize(mail, mail_key) super(mail, mail_key) diff --git a/lib/gitlab/email/handler/create_note_on_issuable_handler.rb b/lib/gitlab/email/handler/create_note_on_issuable_handler.rb index aed3647744a..8fea0593c78 100644 --- a/lib/gitlab/email/handler/create_note_on_issuable_handler.rb +++ b/lib/gitlab/email/handler/create_note_on_issuable_handler.rb @@ -15,7 +15,7 @@ module Gitlab attr_reader :issuable_iid - HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-(?<incoming_email_token>.+)-issue-(?<issuable_iid>\d+)\z/.freeze + HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-(?<incoming_email_token>.+)-issue-(?<issuable_iid>\d+)\z/ def initialize(mail, mail_key) super(mail, mail_key) diff --git a/lib/gitlab/email/handler/service_desk_handler.rb b/lib/gitlab/email/handler/service_desk_handler.rb index 949fa554aeb..ebc4e9c2c8c 100644 --- a/lib/gitlab/email/handler/service_desk_handler.rb +++ b/lib/gitlab/email/handler/service_desk_handler.rb @@ -10,9 +10,9 @@ module Gitlab include ReplyProcessing include Gitlab::Utils::StrongMemoize - HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-issue-\z/.freeze - HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\z/.freeze - PROJECT_KEY_PATTERN = /\A(?<slug>.+)-(?<key>[a-z0-9_]+)\z/.freeze + HANDLER_REGEX = /\A#{HANDLER_ACTION_BASE_REGEX}-issue-\z/ + HANDLER_REGEX_LEGACY = /\A(?<project_path>[^\+]*)\z/ + PROJECT_KEY_PATTERN = /\A(?<slug>.+)-(?<key>[a-z0-9_]+)\z/ def initialize(mail, mail_key, service_desk_key: nil) if service_desk_key @@ -75,9 +75,10 @@ module Gitlab def contains_custom_email_address_verification_subaddress? return false unless Feature.enabled?(:service_desk_custom_email, project) + return false unless to_address.present? # Verification email only has one recipient - mail.to.first.include?(ServiceDeskSetting::CUSTOM_EMAIL_VERIFICATION_SUBADDRESS) + to_address.include?(ServiceDeskSetting::CUSTOM_EMAIL_VERIFICATION_SUBADDRESS) end def handled_custom_email_address_verification? @@ -209,6 +210,11 @@ module Gitlab (mail.reply_to || []).first || mail.from.first || mail.sender end + def to_address + mail.to&.first + end + strong_memoize_attr :to_address + def can_handle_legacy_format? project_path && project_path.include?('/') && !mail_key.include?('+') end diff --git a/lib/gitlab/email/message/build_ios_app_guide.rb b/lib/gitlab/email/message/build_ios_app_guide.rb deleted file mode 100644 index 4acf558a6a2..00000000000 --- a/lib/gitlab/email/message/build_ios_app_guide.rb +++ /dev/null @@ -1,57 +0,0 @@ -# frozen_string_literal: true - -module Gitlab - module Email - module Message - class BuildIosAppGuide - include Gitlab::Email::Message::InProductMarketing::Helper - include Gitlab::Routing - - attr_accessor :format - - def initialize(format: :html) - @format = format - end - - def subject_line - s_('InProductMarketing|Get set up to build for iOS') - end - - def title - s_("InProductMarketing|Building for iOS? We've got you covered.") - end - - def body_line1 - s_( - 'InProductMarketing|Want to get your iOS app up and running, including publishing all the way to ' \ - 'TestFlight? Follow our guide to set up GitLab and fastlane to publish iOS apps to the App Store.' - ) - end - - def cta_text - s_('InProductMarketing|Learn how to build for iOS') - end - - def cta_link - action_link(cta_text, 'https://about.gitlab.com/blog/2019/03/06/ios-publishing-with-gitlab-and-fastlane/') - end - - def cta2_text - s_('InProductMarketing|Watch iOS building in action.') - end - - def cta2_link - action_link(cta2_text, 'https://www.youtube.com/watch?v=325FyJt7ZG8') - end - - def logo_path - 'mailers/in_product_marketing/create-0.png' - end - - def unsubscribe - unsubscribe_message - end - end - end - end -end diff --git a/lib/gitlab/email/message/in_product_marketing/helper.rb b/lib/gitlab/email/message/in_product_marketing/helper.rb deleted file mode 100644 index 0770e5f4d76..00000000000 --- a/lib/gitlab/email/message/in_product_marketing/helper.rb +++ /dev/null @@ -1,97 +0,0 @@ -# frozen_string_literal: true - -module Gitlab - module Email - module Message - module InProductMarketing - module Helper - include ActionView::Context - include ActionView::Helpers::TagHelper - - def footer_links - links = [ - [s_('InProductMarketing|Blog'), 'https://about.gitlab.com/blog'], - [s_('InProductMarketing|Twitter'), 'https://twitter.com/gitlab'], - [s_('InProductMarketing|Facebook'), 'https://www.facebook.com/gitlab'], - [s_('InProductMarketing|YouTube'), 'https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg'] - ] - case format - when :html - links.map do |text, link| - ActionController::Base.helpers.link_to(text, link) - end - else - '| ' + links.map do |text, link| - [text, link].join(' ') - end.join("\n| ") - end - end - - def address - s_('InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA').html_safe % strong_options - end - - def unsubscribe_message(self_managed_preferences_link = nil) - parts = Gitlab.com? ? unsubscribe_com : unsubscribe_self_managed(self_managed_preferences_link) - - case format - when :html - parts.join(' ') - else - parts.join("\n" + ' ' * 16) - end - end - - private - - def unsubscribe_link - unsubscribe_url = Gitlab.com? ? '%tag_unsubscribe_url%' : profile_notifications_url - - link(s_('InProductMarketing|unsubscribe'), unsubscribe_url) - end - - def unsubscribe_com - [ - s_('InProductMarketing|If you no longer wish to receive marketing emails from us,'), - s_('InProductMarketing|you may %{unsubscribe_link} at any time.') % { unsubscribe_link: unsubscribe_link } - ] - end - - def unsubscribe_self_managed(preferences_link) - [ - s_('InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}.') % { unsubscribe_link: unsubscribe_link }, - s_("InProductMarketing|If you don't want to receive marketing emails directly from GitLab, %{marketing_preference_link}.") % { marketing_preference_link: preferences_link } - ] - end - - def strong_options - case format - when :html - { strong_start: '<b>'.html_safe, strong_end: '</b>'.html_safe } - else - { strong_start: '', strong_end: '' } - end - end - - def link(text, link) - case format - when :html - ActionController::Base.helpers.link_to text, link - else - "#{text} (#{link})" - end - end - - def action_link(text, link) - case format - when :html - ActionController::Base.helpers.link_to text, link, target: '_blank', rel: 'noopener noreferrer' - else - [text, link].join(' >> ') - end - end - end - end - end - end -end diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb index ee11105537b..d5877234c3a 100644 --- a/lib/gitlab/email/receiver.rb +++ b/lib/gitlab/email/receiver.rb @@ -8,7 +8,7 @@ module Gitlab class Receiver include Gitlab::Utils::StrongMemoize - RECEIVED_HEADER_REGEX = /for\s+\<([^<]+)\>/.freeze + RECEIVED_HEADER_REGEX = /for\s+\<([^<]+)\>/ # Errors that are purely from users and not anything we can control USER_ERRORS = [ @@ -50,6 +50,7 @@ module Gitlab delivered_to: delivered_to.map(&:value), envelope_to: envelope_to.map(&:value), x_envelope_to: x_envelope_to.map(&:value), + cc_address: cc, # reduced down to what looks like an email in the received headers received_recipients: recipients_from_received_headers, meta: { @@ -84,23 +85,27 @@ module Gitlab def mail_key strong_memoize(:mail_key) do - key_from_to_header || key_from_additional_headers + find_first_key_from(to) || key_from_additional_headers end end - def key_from_to_header - to.find do |address| - key = email_class.key_from_address(address) - break key if key + def find_first_key_from(items) + items.each do |item| + email = item.is_a?(Mail::Field) ? item.value : item + + key = email_class.key_from_address(email) + return key if key end + nil end def key_from_additional_headers find_key_from_references || - find_key_from_delivered_to_header || - find_key_from_envelope_to_header || - find_key_from_x_envelope_to_header || - find_first_key_from_received_headers + find_first_key_from(delivered_to) || + find_first_key_from(envelope_to) || + find_first_key_from(x_envelope_to) || + find_first_key_from(recipients_from_received_headers) || + find_first_key_from(cc) end def ensure_references_array(references) @@ -131,6 +136,10 @@ module Gitlab Array(mail.to) end + def cc + Array(mail.cc) + end + def delivered_to Array(mail[:delivered_to]) end @@ -147,34 +156,6 @@ module Gitlab Array(mail[:received]) end - def find_key_from_delivered_to_header - delivered_to.find do |header| - key = email_class.key_from_address(header.value) - break key if key - end - end - - def find_key_from_envelope_to_header - envelope_to.find do |header| - key = email_class.key_from_address(header.value) - break key if key - end - end - - def find_key_from_x_envelope_to_header - x_envelope_to.find do |header| - key = email_class.key_from_address(header.value) - break key if key - end - end - - def find_first_key_from_received_headers - recipients_from_received_headers.find do |email| - key = email_class.key_from_address(email) - break key if key - end - end - def recipients_from_received_headers strong_memoize :emails_from_received_headers do received.filter_map { |header| header.value[RECEIVED_HEADER_REGEX, 1] } |