Project

General

Profile

Patch #27025 » 0001-Optional-regex-for-filtering-attachments-on-incoming.patch

Jan from Planio www.plan.io, 2017-09-18 19:41

View differences:

app/models/mail_handler.rb
309 309
  def accept_attachment?(attachment)
310 310
    @excluded ||= Setting.mail_handler_excluded_filenames.to_s.split(',').map(&:strip).reject(&:blank?)
311 311
    @excluded.each do |pattern|
312
      if Setting.mail_handler_enable_regex_excluded_filenames?
313
        regexp = %r{\A#{pattern}\z}i
314
      else
312 315
      regexp = %r{\A#{Regexp.escape(pattern).gsub("\\*", ".*")}\z}i
316
      end
313 317
      if attachment.filename.to_s =~ regexp
314 318
        logger.info "MailHandler: ignoring attachment #{attachment.filename} matching #{pattern}"
315 319
        return false
app/models/setting.rb
143 143
  def self.validate_all_from_params(settings)
144 144
    messages = []
145 145

  
146
    if settings.key?(:mail_handler_body_delimiters) || settings.key?(:mail_handler_enable_regex_delimiters)
147
      regexp = Setting.mail_handler_enable_regex_delimiters?
148
      if settings.key?(:mail_handler_enable_regex_delimiters)
149
        regexp = settings[:mail_handler_enable_regex_delimiters].to_s != '0'
146
    [[:mail_handler_enable_regex_delimiters,         :mail_handler_body_delimiters,    /[\r\n]+/],
147
     [:mail_handler_enable_regex_excluded_filenames, :mail_handler_excluded_filenames, /\s*,\s*/]
148
    ].each do |enable_regex, regex_field, delimiter|
149

  
150
    if settings.key?(regex_field) || settings.key?(enable_regex)
151
      regexp = Setting.send("#{enable_regex}?")
152
      if settings.key?(enable_regex)
153
        regexp = settings[enable_regex].to_s != '0'
150 154
      end
151 155
      if regexp
152
        settings[:mail_handler_body_delimiters].to_s.split(/[\r\n]+/).each do |delimiter|
156
        settings[regex_field].to_s.split(delimiter).each do |value|
153 157
          begin
154
            Regexp.new(delimiter)
158
            Regexp.new(value)
155 159
          rescue RegexpError => e
156
            messages << [:mail_handler_body_delimiters, "#{l('activerecord.errors.messages.not_a_regexp')} (#{e.message})"]
160
            messages << [regex_field, "#{l('activerecord.errors.messages.not_a_regexp')} (#{e.message})"]
157 161
          end
158 162
        end
159 163
      end
160 164
    end
165
    end
161 166

  
162 167
    messages
163 168
  end
app/views/settings/_mail_handler.html.erb
5 5
    <%= setting_text_area :mail_handler_body_delimiters, :rows => 5 %>
6 6
    <label class="block">
7 7
      <%= setting_check_box :mail_handler_enable_regex_delimiters, :label => false %>
8
      <%= l(:setting_mail_handler_enable_regex_delimiters) %>
8
      <%= l(:setting_mail_handler_enable_regex) %>
9 9
    </label>
10 10
    <em class="info"><%= l(:text_line_separated) %></em>
11 11
  </p>
12 12
  <p>
13 13
    <%= setting_text_field :mail_handler_excluded_filenames, :size => 60 %>
14
    <label class="block">
15
      <%= setting_check_box :mail_handler_enable_regex_excluded_filenames, :label => false %>
16
      <%= l(:setting_mail_handler_enable_regex) %>
17
    </label>
14 18
    <em class="info"><%= l(:text_comma_separated) %>
15 19
    <%= l(:label_example) %>: smime.p7s, *.vcf</em>
16 20
  </p>
config/locales/en.yml
415 415
  setting_display_subprojects_issues: Display subprojects issues on main projects by default
416 416
  setting_enabled_scm: Enabled SCM
417 417
  setting_mail_handler_body_delimiters: "Truncate emails after one of these lines"
418
  setting_mail_handler_enable_regex_delimiters: "Enable regular expressions"
418
  setting_mail_handler_enable_regex: "Enable regular expressions"
419 419
  setting_mail_handler_api_enabled: Enable WS for incoming emails
420 420
  setting_mail_handler_api_key: Incoming email WS API key
421 421
  setting_sys_api_key: Repository management WS API key
config/settings.yml
187 187
  default: ''
188 188
mail_handler_enable_regex_delimiters:
189 189
  default: 0
190
mail_handler_enable_regex_excluded_filenames:
191
  default: 0
190 192
mail_handler_excluded_filenames:
191 193
  default: ''
192 194
mail_handler_api_enabled:
test/unit/mail_handler_test.rb
1045 1045
    end
1046 1046
  end
1047 1047

  
1048
  def test_attachments_that_match_mail_handler_excluded_filenames_by_regex_should_be_ignored
1049
    with_settings :mail_handler_excluded_filenames => '.+\.vcf,(pa|nut)ella\.jpg',
1050
                  :mail_handler_enable_regex_excluded_filenames => 1 do
1051
      issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'})
1052
      assert issue.is_a?(Issue)
1053
      assert !issue.new_record?
1054
      assert_equal 0, issue.reload.attachments.size
1055
    end
1056
  end
1057

  
1048 1058
  def test_attachments_that_do_not_match_mail_handler_excluded_filenames_should_be_attached
1049 1059
    with_settings :mail_handler_excluded_filenames => '*.vcf, *.gif' do
1050 1060
      issue = submit_email('ticket_with_attachment.eml', :issue => {:project => 'onlinestore'})
(2-2/4)