From 66196de3cb8fe04af28e10b5afa229631527ae46 Mon Sep 17 00:00:00 2001 From: divyamtayal Date: Wed, 9 Oct 2024 15:43:57 -0700 Subject: [PATCH 1/5] Adding header processing --- lib/gitlab/email/receiver.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/gitlab/email/receiver.rb b/lib/gitlab/email/receiver.rb index 61bdb7c09a5637..8f437356c6c177 100644 --- a/lib/gitlab/email/receiver.rb +++ b/lib/gitlab/email/receiver.rb @@ -51,6 +51,7 @@ def mail_metadata envelope_to: envelope_to.map(&:value), x_envelope_to: x_envelope_to.map(&:value), x_original_to: x_original_to.map(&:value), + x_forwarded_to: x_forwarded_to.map(&:value), cc_address: cc, # reduced down to what looks like an email in the received headers received_recipients: recipients_from_received_headers, @@ -114,6 +115,7 @@ def key_from_additional_headers find_first_key_from(x_envelope_to) || find_first_key_from(recipients_from_received_headers) || find_first_key_from(x_original_to) || + find_first_key_from(x_forwarded_to) || find_first_key_from(cc) end @@ -169,6 +171,10 @@ def x_original_to Array(mail[:x_original_to]) end + def x_forwarded_to + Array(mail[:x_forwarded_to]) + end + def recipients_from_received_headers strong_memoize :emails_from_received_headers do received.filter_map { |header| header.value[RECEIVED_HEADER_REGEX, 1] } -- GitLab From c7974d8a3dc8722d3e1a2b44ba4937f60c1e1995 Mon Sep 17 00:00:00 2001 From: divyamtayal Date: Wed, 9 Oct 2024 15:53:21 -0700 Subject: [PATCH 2/5] Adding specs --- spec/lib/gitlab/email/receiver_spec.rb | 19 ++++++++++++++++++- .../email/service_desk_receiver_spec.rb | 15 +++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/spec/lib/gitlab/email/receiver_spec.rb b/spec/lib/gitlab/email/receiver_spec.rb index 7dc25044434857..278b3c9656c616 100644 --- a/spec/lib/gitlab/email/receiver_spec.rb +++ b/spec/lib/gitlab/email/receiver_spec.rb @@ -33,7 +33,7 @@ metadata = receiver.mail_metadata - expect(metadata.keys).to match_array(%i[mail_uid from_address to_address mail_key references delivered_to envelope_to x_envelope_to meta received_recipients cc_address x_original_to]) + expect(metadata.keys).to match_array(%i[mail_uid from_address to_address mail_key references delivered_to envelope_to x_envelope_to meta received_recipients cc_address x_original_to x_forwarded_to]) expect(metadata[:meta]).to include(client_id: client_id, project: project.full_path) expect(metadata[meta_key]).to eq(meta_value) end @@ -148,6 +148,23 @@ it_behaves_like 'successful receive' end + context 'when in a X-Forwarded-To header' do + let(:email_raw) do + <<~EMAIL + From: jake@example.com + To: to@example.com + X-Forwarded-To: #{incoming_email} + Subject: Issue titile + + Issue description + EMAIL + end + + let(:meta_key) { :x_forwarded_to } + + it_behaves_like 'successful receive' + end + context 'when Service Desk custom email reply address in To header and no References header exists' do let_it_be_with_refind(:setting) { create(:service_desk_setting, project: project, add_external_participants_from_cc: true) } diff --git a/spec/lib/gitlab/email/service_desk_receiver_spec.rb b/spec/lib/gitlab/email/service_desk_receiver_spec.rb index 18243ef2a0e515..3844231d79e895 100644 --- a/spec/lib/gitlab/email/service_desk_receiver_spec.rb +++ b/spec/lib/gitlab/email/service_desk_receiver_spec.rb @@ -66,6 +66,21 @@ it_behaves_like 'received successfully' end + context 'when in a X-Forwarded-To header' do + let(:email) do + <<~EMAIL + From: from@example.com + To: to@example.com + X-Forwarded-To: #{service_desk_email} + Subject: Issue titile + + Issue description + EMAIL + end + + it_behaves_like 'received successfully' + end + context 'when in a Cc header' do let(:email) do <<~EMAIL -- GitLab From 4458581dcfc4d7ead2364a69c05939379d4f3ee4 Mon Sep 17 00:00:00 2001 From: divyamtayal Date: Wed, 9 Oct 2024 16:00:35 -0700 Subject: [PATCH 3/5] Adding documentation --- doc/administration/incoming_email.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/administration/incoming_email.md b/doc/administration/incoming_email.md index 674be5d7e114f0..9a11fca63e50c3 100644 --- a/doc/administration/incoming_email.md +++ b/doc/administration/incoming_email.md @@ -74,6 +74,7 @@ this method only supports replies, and not the other features of [incoming email > - Accepting `Cc` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348572) in GitLab 16.5. > - Accepting `X-Original-To` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/149874) in GitLab 17.0. +> - Accepting `X-Forwarded-To` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/168716) in GitLab 17.0. Email is processed correctly when a configured email address is present in one of the following headers (sorted in the order they are checked): @@ -83,6 +84,7 @@ Email is processed correctly when a configured email address is present in one o - `Envelope-To` or `X-Envelope-To` - `Received` - `X-Original-To` +- `X-Forwarded-To` - `Cc` The `References` header is also accepted, however it is used specifically to relate email responses to existing discussion threads. It is not used for creating issues by email. -- GitLab From b157a443d1c0a8c7e5c9d67f06b78434920732ca Mon Sep 17 00:00:00 2001 From: divyamtayal Date: Thu, 10 Oct 2024 20:55:08 -0700 Subject: [PATCH 4/5] Updating the release version --- doc/administration/incoming_email.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/administration/incoming_email.md b/doc/administration/incoming_email.md index 9a11fca63e50c3..d23f96681938fd 100644 --- a/doc/administration/incoming_email.md +++ b/doc/administration/incoming_email.md @@ -74,7 +74,7 @@ this method only supports replies, and not the other features of [incoming email > - Accepting `Cc` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/348572) in GitLab 16.5. > - Accepting `X-Original-To` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/149874) in GitLab 17.0. -> - Accepting `X-Forwarded-To` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/168716) in GitLab 17.0. +> - Accepting `X-Forwarded-To` headers [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/168716) in GitLab 17.6. Email is processed correctly when a configured email address is present in one of the following headers (sorted in the order they are checked): -- GitLab From 79ce60ade8683f45ae825eaa9417bd9785ffb4a2 Mon Sep 17 00:00:00 2001 From: divyamtayal Date: Thu, 10 Oct 2024 21:34:15 -0700 Subject: [PATCH 5/5] Solving merge conflicts --- spec/lib/gitlab/email/receiver_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/lib/gitlab/email/receiver_spec.rb b/spec/lib/gitlab/email/receiver_spec.rb index 278b3c9656c616..4f0b7b101e30e8 100644 --- a/spec/lib/gitlab/email/receiver_spec.rb +++ b/spec/lib/gitlab/email/receiver_spec.rb @@ -165,7 +165,7 @@ it_behaves_like 'successful receive' end - context 'when Service Desk custom email reply address in To header and no References header exists' do + context 'for Service Desk custom email' do let_it_be_with_refind(:setting) { create(:service_desk_setting, project: project, add_external_participants_from_cc: true) } let!(:credential) { create(:service_desk_custom_email_credential, project: project) } -- GitLab