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