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