From adfd841ece1ca0c6cbb025987c94b52fe0fcb553 Mon Sep 17 00:00:00 2001
From: Jan Schulz-Hofen 
Date: Mon, 18 Sep 2017 19:26:54 +0200
Subject: [PATCH 1/4] Optional regex for filtering attachments on incoming 
 emails
---
 app/models/mail_handler.rb                |  4 ++++
 app/models/setting.rb                     | 19 ++++++++++++-------
 app/views/settings/_mail_handler.html.erb |  6 +++++-
 config/locales/en.yml                     |  2 +-
 config/settings.yml                       |  2 ++
 test/unit/mail_handler_test.rb            | 10 ++++++++++
 6 files changed, 34 insertions(+), 9 deletions(-)
diff --git a/app/models/mail_handler.rb b/app/models/mail_handler.rb
index 9bcc1b1..5a9333f 100755
--- a/app/models/mail_handler.rb
+++ b/app/models/mail_handler.rb
@@ -309,7 +309,11 @@ class MailHandler < ActionMailer::Base
   def accept_attachment?(attachment)
     @excluded ||= Setting.mail_handler_excluded_filenames.to_s.split(',').map(&:strip).reject(&:blank?)
     @excluded.each do |pattern|
+      if Setting.mail_handler_enable_regex_excluded_filenames?
+        regexp = %r{\A#{pattern}\z}i
+      else
       regexp = %r{\A#{Regexp.escape(pattern).gsub("\\*", ".*")}\z}i
+      end
       if attachment.filename.to_s =~ regexp
         logger.info "MailHandler: ignoring attachment #{attachment.filename} matching #{pattern}"
         return false
diff --git a/app/models/setting.rb b/app/models/setting.rb
index b73aae4..d66470d 100644
--- a/app/models/setting.rb
+++ b/app/models/setting.rb
@@ -143,21 +143,26 @@ class Setting < ActiveRecord::Base
   def self.validate_all_from_params(settings)
     messages = []
 
-    if settings.key?(:mail_handler_body_delimiters) || settings.key?(:mail_handler_enable_regex_delimiters)
-      regexp = Setting.mail_handler_enable_regex_delimiters?
-      if settings.key?(:mail_handler_enable_regex_delimiters)
-        regexp = settings[:mail_handler_enable_regex_delimiters].to_s != '0'
+    [[:mail_handler_enable_regex_delimiters,         :mail_handler_body_delimiters,    /[\r\n]+/],
+     [:mail_handler_enable_regex_excluded_filenames, :mail_handler_excluded_filenames, /\s*,\s*/]
+    ].each do |enable_regex, regex_field, delimiter|
+
+    if settings.key?(regex_field) || settings.key?(enable_regex)
+      regexp = Setting.send("#{enable_regex}?")
+      if settings.key?(enable_regex)
+        regexp = settings[enable_regex].to_s != '0'
       end
       if regexp
-        settings[:mail_handler_body_delimiters].to_s.split(/[\r\n]+/).each do |delimiter|
+        settings[regex_field].to_s.split(delimiter).each do |value|
           begin
-            Regexp.new(delimiter)
+            Regexp.new(value)
           rescue RegexpError => e
-            messages << [:mail_handler_body_delimiters, "#{l('activerecord.errors.messages.not_a_regexp')} (#{e.message})"]
+            messages << [regex_field, "#{l('activerecord.errors.messages.not_a_regexp')} (#{e.message})"]
           end
         end
       end
     end
+    end
 
     messages
   end
diff --git a/app/views/settings/_mail_handler.html.erb b/app/views/settings/_mail_handler.html.erb
index 3e1a40d..36fa864 100644
--- a/app/views/settings/_mail_handler.html.erb
+++ b/app/views/settings/_mail_handler.html.erb
@@ -5,12 +5,16 @@
     <%= setting_text_area :mail_handler_body_delimiters, :rows => 5 %>
     
     <%= l(:text_line_separated) %>
   
   
     <%= setting_text_field :mail_handler_excluded_filenames, :size => 60 %>
+    
     <%= l(:text_comma_separated) %>
     <%= l(:label_example) %>: smime.p7s, *.vcf
   
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 3fb86c1..ec7dd39 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -415,7 +415,7 @@ en:
   setting_display_subprojects_issues: Display subprojects issues on main projects by default
   setting_enabled_scm: Enabled SCM
   setting_mail_handler_body_delimiters: "Truncate emails after one of these lines"
-  setting_mail_handler_enable_regex_delimiters: "Enable regular expressions"
+  setting_mail_handler_enable_regex: "Enable regular expressions"
   setting_mail_handler_api_enabled: Enable WS for incoming emails
   setting_mail_handler_api_key: Incoming email WS API key
   setting_sys_api_key: Repository management WS API key
diff --git a/config/settings.yml b/config/settings.yml
index c10ae1a..9b3f808 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -187,6 +187,8 @@ mail_handler_body_delimiters:
   default: ''
 mail_handler_enable_regex_delimiters:
   default: 0
+mail_handler_enable_regex_excluded_filenames:
+  default: 0
 mail_handler_excluded_filenames:
   default: ''
 mail_handler_api_enabled:
diff --git a/test/unit/mail_handler_test.rb b/test/unit/mail_handler_test.rb
index ab95cd7..b8ca276 100644
--- a/test/unit/mail_handler_test.rb
+++ b/test/unit/mail_handler_test.rb
@@ -1045,6 +1045,16 @@ class MailHandlerTest < ActiveSupport::TestCase
     end
   end
 
+  def test_attachments_that_match_mail_handler_excluded_filenames_by_regex_should_be_ignored
+    with_settings :mail_handler_excluded_filenames => '.+\.vcf,(pa|nut)ella\.jpg',
+                  :mail_handler_enable_regex_excluded_filenames => 1 do
+      issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'})
+      assert issue.is_a?(Issue)
+      assert !issue.new_record?
+      assert_equal 0, issue.reload.attachments.size
+    end
+  end
+
   def test_attachments_that_do_not_match_mail_handler_excluded_filenames_should_be_attached
     with_settings :mail_handler_excluded_filenames => '*.vcf, *.gif' do
       issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'})
-- 
2.7.2