git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@12167 e93f8b46-1217-0410-a6f0-8f06a7374b81tags/2.4.0
@@ -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) |
@@ -5,6 +5,11 @@ | |||
<%= setting_text_area :mail_handler_body_delimiters, :rows => 5 %> | |||
<em class="info"><%= l(:text_line_separated) %></em> | |||
</p> | |||
<p> | |||
<%= setting_text_field :mail_handler_excluded_filenames, :size => 60 %> | |||
<em class="info"><%= l(:text_comma_separated) %> | |||
<%= l(:label_example) %>: smime.p7s, *.vcf</em> | |||
</p> | |||
</div> | |||
<div class="box tabular settings"> |
@@ -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 |
@@ -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 |
@@ -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: |
@@ -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) |