From 76f12c1316ebcf93bc86ccd449b6032c378cc760 Mon Sep 17 00:00:00 2001
From: Go MAEDA
Date: Sat, 3 Mar 2018 04:29:54 +0000
Subject: [PATCH] Optional regex for filtering attachments on incoming emails
(#27025).
Patch by Jan Schulz-Hofen.
git-svn-id: http://svn.redmine.org/redmine/trunk@17225 e93f8b46-1217-0410-a6f0-8f06a7374b81
---
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 518e8c84b..0231d84db 100755
--- a/app/models/mail_handler.rb
+++ b/app/models/mail_handler.rb
@@ -310,7 +310,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 b73aae4f2..d66470d0a 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 3e1a40d1d..36fa864bb 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 9a44dcc12..018235a3d 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -414,7 +414,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 c997c2900..10f8c4b7b 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -185,6 +185,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 ea341d849..f2dc36495 100644
--- a/test/unit/mail_handler_test.rb
+++ b/test/unit/mail_handler_test.rb
@@ -1053,6 +1053,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.39.5