From a8a861ae2a122b310d1aca6f9f9b1d0601b8c49f Mon Sep 17 00:00:00 2001
From: Douwe Maan <douwe@gitlab.com>
Date: Wed, 19 Aug 2015 12:35:08 -0700
Subject: [PATCH] Add BaseMailer to house shared mailer functionality.

---
 app/mailers/base_mailer.rb            | 50 +++++++++++++++++++++++++++
 app/mailers/email_rejection_mailer.rb | 18 +---------
 app/mailers/notify.rb                 | 33 +-----------------
 3 files changed, 52 insertions(+), 49 deletions(-)
 create mode 100644 app/mailers/base_mailer.rb

diff --git a/app/mailers/base_mailer.rb b/app/mailers/base_mailer.rb
new file mode 100644
index 00000000000..38b8a296842
--- /dev/null
+++ b/app/mailers/base_mailer.rb
@@ -0,0 +1,50 @@
+class EmailRejectionMailer < ActionMailer::Base
+  add_template_helper ApplicationHelper
+  add_template_helper GitlabMarkdownHelper
+
+  attr_accessor :current_user
+  helper_method :current_user, :can?
+
+  default from:     Proc.new { default_sender_address.format }
+  default reply_to: Proc.new { default_reply_to_address.format }
+
+  def self.delay
+    delay_for(2.seconds)
+  end
+
+  def rejection(reason, original_raw, can_retry = false)
+    @reason = reason
+    @original_message = Mail::Message.new(original_raw)
+
+    headers = {
+      to: @original_message.from,
+      subject: "[Rejected] #{@original_message.subject}"
+    }
+
+    headers['Message-ID'] = SecureRandom.hex
+    headers['In-Reply-To'] = @original_message.message_id
+    headers['References'] = @original_message.message_id
+
+    headers['Reply-To'] = @original_message.to.first if can_retry
+
+    mail(headers)
+  end
+
+  def can?
+    Ability.abilities.allowed?(user, action, subject)
+  end
+
+  private
+
+  def default_sender_address
+    address = Mail::Address.new(Gitlab.config.gitlab.email_from)
+    address.display_name = Gitlab.config.gitlab.email_display_name
+    address
+  end
+
+  def default_reply_to_address
+    address = Mail::Address.new(Gitlab.config.gitlab.email_reply_to)
+    address.display_name = Gitlab.config.gitlab.email_display_name
+    address
+  end
+end
diff --git a/app/mailers/email_rejection_mailer.rb b/app/mailers/email_rejection_mailer.rb
index f29c4e052fc..89aceda82d1 100644
--- a/app/mailers/email_rejection_mailer.rb
+++ b/app/mailers/email_rejection_mailer.rb
@@ -1,12 +1,4 @@
-class EmailRejectionMailer < ActionMailer::Base
-  add_template_helper ApplicationHelper
-  add_template_helper GitlabMarkdownHelper
-
-  helper_method :current_user, :can?
-
-  default from:     "#{Gitlab.config.gitlab.email_display_name} <#{Gitlab.config.gitlab.email_from}>"
-  default reply_to: "#{Gitlab.config.gitlab.email_display_name} <#{Gitlab.config.gitlab.email_reply_to}>"
-
+class EmailRejectionMailer < BaseMailer
   def rejection(reason, original_raw, can_retry = false)
     @reason = reason
     @original_message = Mail::Message.new(original_raw)
@@ -24,12 +16,4 @@ class EmailRejectionMailer < ActionMailer::Base
 
     mail(headers)
   end
-
-  def current_user
-    nil
-  end
-
-  def can?
-    false
-  end
 end
diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index b4c83f8c5fc..1a2286f9d47 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -1,4 +1,4 @@
-class Notify < ActionMailer::Base
+class Notify < BaseMailer
   include ActionDispatch::Routing::PolymorphicRoutes
 
   include Emails::Issues
@@ -8,22 +8,9 @@ class Notify < ActionMailer::Base
   include Emails::Profile
   include Emails::Groups
 
-  add_template_helper ApplicationHelper
-  add_template_helper GitlabMarkdownHelper
   add_template_helper MergeRequestsHelper
   add_template_helper EmailsHelper
 
-  attr_accessor :current_user
-  helper_method :current_user, :can?
-
-  default from: Proc.new { default_sender_address.format }
-  default reply_to: Proc.new { default_reply_to_address.format }
-
-  # Just send email with 2 seconds delay
-  def self.delay
-    delay_for(2.seconds)
-  end
-
   def test_email(recipient_email, subject, body)
     mail(to: recipient_email,
          subject: subject,
@@ -69,20 +56,6 @@ class Notify < ActionMailer::Base
 
   private
 
-  # The default email address to send emails from
-  def default_sender_address
-    address = Mail::Address.new(Gitlab.config.gitlab.email_from)
-    address.display_name = Gitlab.config.gitlab.email_display_name
-    address
-  end
-
-  # The default email address to send emails from
-  def default_reply_to_address
-    address = Mail::Address.new(Gitlab.config.gitlab.email_reply_to)
-    address.display_name = Gitlab.config.gitlab.email_display_name
-    address
-  end
-
   def can_send_from_user_email?(sender)
     sender_domain = sender.email.split("@").last
     self.class.allowed_email_domains.include?(sender_domain)
@@ -197,10 +170,6 @@ class Notify < ActionMailer::Base
     mail_thread(model, headers)
   end
 
-  def can?
-    Ability.abilities.allowed?(user, action, subject)
-  end
-
   def reply_key
     @reply_key ||= Gitlab::ReplyByEmail.reply_key
   end
-- 
GitLab