From 026e03c3073284be4e5d02b71d7027be95f9f8b2 Mon Sep 17 00:00:00 2001 From: Jordan Brough Date: Tue, 18 Apr 2023 07:48:23 -0600 Subject: [PATCH] fix: Handle spaces in CC/BCC email lists (#6788) When the CC field is generated in the UI, the email values are joined together with ", " but when they are parsed, we currently split by just ",". This causes an error on the backend and on the frontend. It seems reasonable to update the code to allow whitespace in the input and to split by `\s*,\s` and also to trim leading and trailing whitespace from the CC list. --------- Co-authored-by: Sojan --- app/builders/messages/message_builder.rb | 4 ++-- .../widgets/conversation/helpers/emailHeadHelper.js | 2 +- .../helpers/specs/emailHeadHelper.spec.js | 3 +++ spec/builders/messages/message_builder_spec.rb | 11 +++++++++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/builders/messages/message_builder.rb b/app/builders/messages/message_builder.rb index ba5861859..aca06cd04 100644 --- a/app/builders/messages/message_builder.rb +++ b/app/builders/messages/message_builder.rb @@ -49,10 +49,10 @@ class Messages::MessageBuilder return unless @conversation.inbox&.inbox_type == 'Email' cc_emails = [] - cc_emails = @params[:cc_emails].split(',') if @params[:cc_emails].present? + cc_emails = @params[:cc_emails].gsub(/\s+/, '').split(',') if @params[:cc_emails].present? bcc_emails = [] - bcc_emails = @params[:bcc_emails].split(',') if @params[:bcc_emails].present? + bcc_emails = @params[:bcc_emails].gsub(/\s+/, '').split(',') if @params[:bcc_emails].present? all_email_addresses = cc_emails + bcc_emails validate_email_addresses(all_email_addresses) diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/emailHeadHelper.js b/app/javascript/dashboard/components/widgets/conversation/helpers/emailHeadHelper.js index ad36393a7..5304627c4 100644 --- a/app/javascript/dashboard/components/widgets/conversation/helpers/emailHeadHelper.js +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/emailHeadHelper.js @@ -2,6 +2,6 @@ import emailValidator from 'vuelidate/lib/validators/email'; export const validEmailsByComma = value => { if (!value.length) return true; - const emails = value.split(','); + const emails = value.replace(/\s+/g, '').split(','); return emails.every(email => emailValidator(email)); }; diff --git a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/emailHeadHelper.spec.js b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/emailHeadHelper.spec.js index 2275a810b..7c9142ee4 100644 --- a/app/javascript/dashboard/components/widgets/conversation/helpers/specs/emailHeadHelper.spec.js +++ b/app/javascript/dashboard/components/widgets/conversation/helpers/specs/emailHeadHelper.spec.js @@ -10,4 +10,7 @@ describe('#validEmailsByComma', () => { it('returns false when one of the email passed is invalid', () => { expect(validEmailsByComma('ni@njan.com,pova.da')).toEqual(false); }); + it('strips spaces between emails before validating', () => { + expect(validEmailsByComma('1@test.com , 2@test.com')).toEqual(true); + }); }); diff --git a/spec/builders/messages/message_builder_spec.rb b/spec/builders/messages/message_builder_spec.rb index 845c1ab99..be5d60834 100644 --- a/spec/builders/messages/message_builder_spec.rb +++ b/spec/builders/messages/message_builder_spec.rb @@ -98,6 +98,17 @@ describe ::Messages::MessageBuilder do params = ActionController::Parameters.new({ cc_emails: 'test.com', bcc_emails: 'test_bcc.com' }) expect { described_class.new(user, conversation, params).perform }.to raise_error 'Invalid email address' end + + it 'strips off whitespace before saving cc_emails and bcc_emails' do + cc_emails = ' test1@test.com , test2@test.com, test3@test.com' + bcc_emails = 'test1@test.com,test2@test.com, test3@test.com ' + params = ActionController::Parameters.new({ cc_emails: cc_emails, bcc_emails: bcc_emails }) + + message = described_class.new(user, conversation, params).perform + + expect(message.content_attributes[:cc_emails]).to eq ['test1@test.com', 'test2@test.com', 'test3@test.com'] + expect(message.content_attributes[:bcc_emails]).to eq ['test1@test.com', 'test2@test.com', 'test3@test.com'] + end end end end