From d15b7db1216f220b9f5af7e777cf04712483cbdf Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 17 Jan 2017 14:50:49 -0500 Subject: Fix References header parser for Microsoft Exchange Microsoft Exchange would append a comma and another message id into the References header, therefore we'll need to fallback and parse the header by ourselves. Closes #26567 --- lib/gitlab/email/receiver.rb | 17 ++++++++++++++++- lib/gitlab/incoming_email.rb | 9 ++++----- 2 files changed, 20 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb index a40c44eb1bc..df9d1cae8da 100644 --- a/lib/gitlab/email/receiver.rb +++ b/lib/gitlab/email/receiver.rb @@ -35,6 +35,8 @@ module Gitlab handler.execute end + private + def build_mail Mail::Message.new(@raw) rescue Encoding::UndefinedConversionError, @@ -54,7 +56,20 @@ module Gitlab end def key_from_additional_headers(mail) - Array(mail.references).find do |mail_id| + find_key_from_references(ensure_references_array(mail.references)) + end + + def ensure_references_array(references) + case references + when Array + references + when String # Handle emails from Microsoft exchange which uses commas + Gitlab::IncomingEmail.scan_fallback_references(references) + end + end + + def find_key_from_references(references) + references.find do |mail_id| key = Gitlab::IncomingEmail.key_from_fallback_message_id(mail_id) break key if key end diff --git a/lib/gitlab/incoming_email.rb b/lib/gitlab/incoming_email.rb index 801dfde9a36..9ae3a2c1214 100644 --- a/lib/gitlab/incoming_email.rb +++ b/lib/gitlab/incoming_email.rb @@ -3,8 +3,6 @@ module Gitlab WILDCARD_PLACEHOLDER = '%{key}'.freeze class << self - FALLBACK_MESSAGE_ID_REGEX = /\Areply\-(.+)@#{Gitlab.config.gitlab.host}\Z/.freeze - def enabled? config.enabled && config.address end @@ -32,10 +30,11 @@ module Gitlab end def key_from_fallback_message_id(mail_id) - match = mail_id.match(FALLBACK_MESSAGE_ID_REGEX) - return unless match + mail_id[/\Areply\-(.+)@#{Gitlab.config.gitlab.host}\z/, 1] + end - match[1] + def scan_fallback_references(references) + references.scan(/(?!<)[^<>]+(?=>)/.freeze) end def config -- cgit v1.2.1 From 7fcbe37df37cb9f04eae4e690305a26ea88410d2 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Fri, 20 Jan 2017 20:20:40 +0800 Subject: Specify that iOS app would also do this --- lib/gitlab/email/receiver.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb index df9d1cae8da..fa08b5c668f 100644 --- a/lib/gitlab/email/receiver.rb +++ b/lib/gitlab/email/receiver.rb @@ -63,7 +63,9 @@ module Gitlab case references when Array references - when String # Handle emails from Microsoft exchange which uses commas + when String + # Handle emails from clients which append with commas, + # example clients are Microsoft exchange and iOS app Gitlab::IncomingEmail.scan_fallback_references(references) end end -- cgit v1.2.1 From f30e2a6ec7c011d0649aad9f118bf8c5a57ecdbc Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Fri, 3 Feb 2017 17:29:08 +0800 Subject: Use message_id_regexp variable for the regexp Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8620#note_22021001 --- lib/gitlab/incoming_email.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/gitlab/incoming_email.rb b/lib/gitlab/incoming_email.rb index a386d9b36fb..0ea42148c58 100644 --- a/lib/gitlab/incoming_email.rb +++ b/lib/gitlab/incoming_email.rb @@ -35,7 +35,9 @@ module Gitlab end def key_from_fallback_message_id(mail_id) - mail_id[/\Areply\-(.+)@#{Gitlab.config.gitlab.host}\z/, 1] + message_id_regexp = /\Areply\-(.+)@#{Gitlab.config.gitlab.host}\z/ + + mail_id[message_id_regexp, 1] end def scan_fallback_references(references) -- cgit v1.2.1 From 849d09cfd692c0c54d45baf1ce71cd9c1ea2c6ab Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Fri, 3 Feb 2017 17:30:54 +0800 Subject: Use references variable Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8620#note_22020035 --- lib/gitlab/email/receiver.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb index fa08b5c668f..b64db5d01ae 100644 --- a/lib/gitlab/email/receiver.rb +++ b/lib/gitlab/email/receiver.rb @@ -56,7 +56,9 @@ module Gitlab end def key_from_additional_headers(mail) - find_key_from_references(ensure_references_array(mail.references)) + references = ensure_references_array(mail.references) + + find_key_from_references(references) end def ensure_references_array(references) -- cgit v1.2.1 From 2f80cbb6759beb412491f9b1b4f0dbcbec6619c0 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Fri, 3 Feb 2017 17:37:06 +0800 Subject: Freeze regexp and add a comment Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8620#note_21590440 --- lib/gitlab/incoming_email.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/gitlab/incoming_email.rb b/lib/gitlab/incoming_email.rb index 0ea42148c58..a492f904303 100644 --- a/lib/gitlab/incoming_email.rb +++ b/lib/gitlab/incoming_email.rb @@ -35,12 +35,14 @@ module Gitlab end def key_from_fallback_message_id(mail_id) - message_id_regexp = /\Areply\-(.+)@#{Gitlab.config.gitlab.host}\z/ + message_id_regexp = + /\Areply\-(.+)@#{Gitlab.config.gitlab.host}\z/.freeze mail_id[message_id_regexp, 1] end def scan_fallback_references(references) + # It's looking for each <...> references.scan(/(?!<)[^<>]+(?=>)/.freeze) end -- cgit v1.2.1 From bec10d5852a8820de4002af25dd7fbb705561718 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 7 Feb 2017 01:28:58 +0800 Subject: No strong reasons to freeze them Feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/8620#note_22868713 --- lib/gitlab/incoming_email.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/gitlab/incoming_email.rb b/lib/gitlab/incoming_email.rb index a492f904303..c9122a23568 100644 --- a/lib/gitlab/incoming_email.rb +++ b/lib/gitlab/incoming_email.rb @@ -35,15 +35,14 @@ module Gitlab end def key_from_fallback_message_id(mail_id) - message_id_regexp = - /\Areply\-(.+)@#{Gitlab.config.gitlab.host}\z/.freeze + message_id_regexp = /\Areply\-(.+)@#{Gitlab.config.gitlab.host}\z/ mail_id[message_id_regexp, 1] end def scan_fallback_references(references) # It's looking for each <...> - references.scan(/(?!<)[^<>]+(?=>)/.freeze) + references.scan(/(?!<)[^<>]+(?=>)/) end def config -- cgit v1.2.1