From cfc05d310e711de8326fbf9e71cbe7ffb264c54a Mon Sep 17 00:00:00 2001 From: Jean-Philippe Lang Date: Sun, 29 Sep 2013 11:50:49 +0000 Subject: [PATCH] Exclude attachments from incoming emails based on file name (#3413). git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12167 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- app/models/mail_handler.rb | 14 ++++++++++++++ app/views/settings/_mail_handler.html.erb | 5 +++++ config/locales/en.yml | 1 + config/locales/fr.yml | 1 + config/settings.yml | 2 ++ test/unit/mail_handler_test.rb | 18 ++++++++++++++++++ 6 files changed, 41 insertions(+) diff --git a/app/models/mail_handler.rb b/app/models/mail_handler.rb index fec2675fc..3c9857873 100644 --- a/app/models/mail_handler.rb +++ b/app/models/mail_handler.rb @@ -267,6 +267,7 @@ class MailHandler < ActionMailer::Base def add_attachments(obj) if email.attachments && email.attachments.any? email.attachments.each do |attachment| + next unless accept_attachment?(attachment) obj.attachments << Attachment.create(:container => obj, :file => attachment.decoded, :filename => attachment.filename, @@ -276,6 +277,19 @@ class MailHandler < ActionMailer::Base end end + # Returns false if the +attachment+ of the incoming email should be ignored + def accept_attachment?(attachment) + @excluded ||= Setting.mail_handler_excluded_filenames.to_s.split(',').map(&:strip).reject(&:blank?) + @excluded.each do |pattern| + regexp = %r{\A#{Regexp.escape(pattern).gsub("\\*", ".*")}\z}i + if attachment.filename.to_s =~ regexp + logger.info "MailHandler: ignoring attachment #{attachment.filename} matching #{pattern}" + return false + end + end + true + end + # Adds To and Cc as watchers of the given object if the sender has the # appropriate permission def add_watchers(obj) diff --git a/app/views/settings/_mail_handler.html.erb b/app/views/settings/_mail_handler.html.erb index 1051436b5..f255b4adc 100644 --- a/app/views/settings/_mail_handler.html.erb +++ b/app/views/settings/_mail_handler.html.erb @@ -5,6 +5,11 @@ <%= 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 6db126283..ae00c7759 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -407,6 +407,7 @@ en: setting_non_working_week_days: Non-working days setting_jsonp_enabled: Enable JSONP support setting_default_projects_tracker_ids: Default trackers for new projects + setting_mail_handler_excluded_filenames: Exclude attachments by name permission_add_project: Create project permission_add_subprojects: Create subprojects diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 2b17af2b5..4cf57e739 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -404,6 +404,7 @@ fr: setting_non_working_week_days: Jours non travaillés setting_jsonp_enabled: Activer le support JSONP setting_default_projects_tracker_ids: Trackers par défaut pour les nouveaux projets + setting_mail_handler_excluded_filenames: Exclure les fichiers attachés par leur nom permission_add_project: Créer un projet permission_add_subprojects: Créer des sous-projets diff --git a/config/settings.yml b/config/settings.yml index 0c9f270a1..61c24c798 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -147,6 +147,8 @@ notified_events: - issue_updated mail_handler_body_delimiters: default: '' +mail_handler_excluded_filenames: + default: '' mail_handler_api_enabled: default: 0 mail_handler_api_key: diff --git a/test/unit/mail_handler_test.rb b/test/unit/mail_handler_test.rb index 3244d8cd2..7e0f80cf3 100644 --- a/test/unit/mail_handler_test.rb +++ b/test/unit/mail_handler_test.rb @@ -759,6 +759,24 @@ class MailHandlerTest < ActiveSupport::TestCase end end + def test_attachments_that_match_mail_handler_excluded_filenames_should_be_ignored + with_settings :mail_handler_excluded_filenames => '*.vcf, *.jpg' 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'}) + assert issue.is_a?(Issue) + assert !issue.new_record? + assert_equal 1, issue.reload.attachments.size + end + end + def test_email_with_long_subject_line issue = submit_email('ticket_with_long_subject.eml') assert issue.is_a?(Issue)