From 9dddb81cf688109908f56eb08c403e935035ea1a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Hanol?= <regis@hanol.fr>
Date: Mon, 22 May 2017 23:35:41 +0200
Subject: [PATCH] FIX: remove memoization on class method used in a job

---
 lib/email/receiver.rb                  | 25 ++++++++++------------
 spec/components/email/receiver_spec.rb | 29 ++++++++++++++++++++++++++
 2 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/lib/email/receiver.rb b/lib/email/receiver.rb
index cc333ab41fc..eba4409dd09 100644
--- a/lib/email/receiver.rb
+++ b/lib/email/receiver.rb
@@ -461,17 +461,16 @@ module Email
       true
     end
 
-    def self.reply_by_email_address_regex
-      @reply_by_email_address_regex ||= begin
-        reply_addresses = [
-           SiteSetting.reply_by_email_address,
-          *(SiteSetting.alternative_reply_by_email_addresses.presence || "").split("|")
-        ]
-        escaped_reply_addresses = reply_addresses.select(&:present?)
-                                                 .map { |a| Regexp.escape(a) }
-                                                 .map { |a| a.gsub(Regexp.escape("%{reply_key}"), "(\\h{32})") }
-        Regexp.new(escaped_reply_addresses.join("|"))
-      end
+    def self.reply_by_email_address_regex(extract_reply_key=true)
+      reply_addresses = [SiteSetting.reply_by_email_address]
+      reply_addresses << (SiteSetting.alternative_reply_by_email_addresses.presence || "").split("|")
+
+      reply_addresses.flatten!
+      reply_addresses.select!(&:present?)
+      reply_addresses.map! { |a| Regexp.escape(a) }
+      reply_addresses.map! { |a| a.gsub(Regexp.escape("%{reply_key}"), "(\\h{32})") }
+
+      /#{reply_addresses.join("|")}/
     end
 
     def group_incoming_emails_regex
@@ -529,9 +528,7 @@ module Email
     end
 
     def post_action_for(body)
-      if likes.include?(body.strip.downcase)
-        PostActionType.types[:like]
-      end
+      PostActionType.types[:like] if likes.include?(body.strip.downcase)
     end
 
     def create_topic(options={})
diff --git a/spec/components/email/receiver_spec.rb b/spec/components/email/receiver_spec.rb
index 1b6c2228b08..3242e55a414 100644
--- a/spec/components/email/receiver_spec.rb
+++ b/spec/components/email/receiver_spec.rb
@@ -526,4 +526,33 @@ describe Email::Receiver do
 
   end
 
+  context "#reply_by_email_address_regex" do
+
+    before do
+      SiteSetting.reply_by_email_address = nil
+      SiteSetting.alternative_reply_by_email_addresses = nil
+    end
+
+    it "is empty by default" do
+      expect(Email::Receiver.reply_by_email_address_regex).to eq(//)
+    end
+
+    it "uses 'reply_by_email_address' site setting" do
+      SiteSetting.reply_by_email_address = "foo+%{reply_key}@bar.com"
+      expect(Email::Receiver.reply_by_email_address_regex).to eq(/foo\+(\h{32})@bar\.com/)
+    end
+
+    it "uses 'alternative_reply_by_email_addresses' site setting" do
+      SiteSetting.alternative_reply_by_email_addresses = "alt.foo+%{reply_key}@bar.com"
+      expect(Email::Receiver.reply_by_email_address_regex).to eq(/alt\.foo\+(\h{32})@bar\.com/)
+    end
+
+    it "combines both 'reply_by_email' settings" do
+      SiteSetting.reply_by_email_address = "foo+%{reply_key}@bar.com"
+      SiteSetting.alternative_reply_by_email_addresses = "alt.foo+%{reply_key}@bar.com"
+      expect(Email::Receiver.reply_by_email_address_regex).to eq(/foo\+(\h{32})@bar\.com|alt\.foo\+(\h{32})@bar\.com/)
+    end
+
+  end
+
 end