From 8aeeadd8b03c38a2c78d60b79ffe24f8a64b3c36 Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Tue, 27 Apr 2021 08:48:51 +0300 Subject: [PATCH] FIX: Replace use of regular expression (#12838) It used a regular expression to check if message IDs were in RFC format. --- lib/email.rb | 13 ++++++------- spec/components/email/email_spec.rb | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/email.rb b/lib/email.rb index 54893e145dd..f1b8329a7b0 100644 --- a/lib/email.rb +++ b/lib/email.rb @@ -3,9 +3,6 @@ require 'mail' module Email - # cute little guy ain't he? - MESSAGE_ID_REGEX = /<(.*@.*)+>/ - def self.is_valid?(email) return false unless String === email !!(EmailValidator.email_regex =~ email) @@ -57,17 +54,19 @@ module Email # https://tools.ietf.org/html/rfc850#section-2.1.7 def self.message_id_rfc_format(message_id) - return message_id if message_id =~ MESSAGE_ID_REGEX - "<#{message_id}>" + message_id.present? && !is_message_id_rfc?(message_id) ? "<#{message_id}>" : message_id end def self.message_id_clean(message_id) - return message_id if !(message_id =~ MESSAGE_ID_REGEX) - message_id.tr("<>", "") + message_id.present? && is_message_id_rfc?(message_id) ? message_id.gsub(/^<|>$/, "") : message_id end private + def self.is_message_id_rfc?(message_id) + message_id.start_with?('<') && message_id.include?('@') && message_id.end_with?('>') + end + def self.obfuscate_part(part) if part.size < 3 "*" * part.size diff --git a/spec/components/email/email_spec.rb b/spec/components/email/email_spec.rb index 127a51251bc..b2127041e31 100644 --- a/spec/components/email/email_spec.rb +++ b/spec/components/email/email_spec.rb @@ -65,4 +65,29 @@ describe Email do end + describe "message_id_rfc_format" do + + it "returns message ID in RFC format" do + expect(Email.message_id_rfc_format("test@test")).to eq("") + end + + it "returns input if already in RFC format" do + expect(Email.message_id_rfc_format("")).to eq("") + end + + end + + describe "message_id_clean" do + + it "returns message ID if in RFC format" do + expect(Email.message_id_clean("")).to eq("test@test") + end + + it "returns input if a clean message ID is not in RFC format" do + message_id = "<" + "@" * 50 + expect(Email.message_id_clean(message_id)).to eq(message_id) + end + + end + end