OSDN Git Service

Adds a setting to remove incoming emails body after a delimiter (#4409).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 23 Dec 2009 18:35:19 +0000 (18:35 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 23 Dec 2009 18:35:19 +0000 (18:35 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@3226 e93f8b46-1217-0410-a6f0-8f06a7374b81

41 files changed:
app/models/mail_handler.rb
app/views/settings/_mail_handler.rhtml
config/locales/bg.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/da.yml
config/locales/de.yml
config/locales/el.yml
config/locales/en.yml
config/locales/es.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hu.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ko.yml
config/locales/lt.yml
config/locales/nl.yml
config/locales/no.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sk.yml
config/locales/sl.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/th.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-TW.yml
config/locales/zh.yml
config/settings.yml
public/stylesheets/application.css
test/fixtures/mail_handler/ticket_on_given_project.eml
test/unit/mail_handler_test.rb

index 2ecf373..1880575 100644 (file)
@@ -136,7 +136,6 @@ class MailHandler < ActionMailer::Base
     if issue.subject.blank?
       issue.subject = '(no subject)'
     end
-    issue.description = plain_text_body
     # custom fields
     issue.custom_field_values = issue.available_custom_fields.inject({}) do |h, c|
       if value = get_keyword(c.name, :override => true)
@@ -144,6 +143,7 @@ class MailHandler < ActionMailer::Base
       end
       h
     end
+    issue.description = cleaned_up_text_body
     # add To and Cc as watchers before saving so the watchers can reply to Redmine
     add_watchers(issue)
     issue.save!
@@ -174,7 +174,7 @@ class MailHandler < ActionMailer::Base
     end
 
     # add the note
-    journal = issue.init_journal(user, plain_text_body)
+    journal = issue.init_journal(user, cleaned_up_text_body)
     add_attachments(issue)
     # check workflow
     if status && issue.new_statuses_allowed_to(user).include?(status)
@@ -205,7 +205,7 @@ class MailHandler < ActionMailer::Base
       
       if !message.locked?
         reply = Message.new(:subject => email.subject.gsub(%r{^.*msg\d+\]}, '').strip,
-                            :content => plain_text_body)
+                            :content => cleaned_up_text_body)
         reply.author = user
         reply.board = message.board
         message.children << reply
@@ -276,6 +276,9 @@ class MailHandler < ActionMailer::Base
     @plain_text_body
   end
   
+  def cleaned_up_text_body
+    cleanup_body(plain_text_body)
+  end
 
   def self.full_sanitizer
     @full_sanitizer ||= HTML::FullSanitizer.new
@@ -299,4 +302,16 @@ class MailHandler < ActionMailer::Base
       user.save ? user : nil
     end
   end
+
+  private
+  
+  # Removes the email body of text after the truncation configurations.
+  def cleanup_body(body)
+    delimiters = Setting.mail_handler_body_delimiters.to_s.split(/[\r\n]+/).reject(&:blank?).map {|s| Regexp.escape(s)}
+    unless delimiters.empty?
+      regex = Regexp.new("^(#{ delimiters.join('|') })\s*$.*", Regexp::MULTILINE)
+      body = body.gsub(regex, '')
+    end
+    body.strip
+  end
 end
index 89ea55c..f3508ac 100644 (file)
@@ -1,6 +1,13 @@
 <% form_tag({:action => 'edit', :tab => 'mail_handler'}) do %>
 
 <div class="box tabular settings">
+  <p>
+    <%= setting_text_area :mail_handler_body_delimiters, :rows => 5 %>
+    <br /><em><%= l(:text_line_separated) %></em>
+  </p>
+</div>
+
+<div class="box tabular settings">
 <p><%= setting_check_box :mail_handler_api_enabled, 
                                 :onclick => "if (this.checked) { Form.Element.enable('settings_mail_handler_api_key'); } else { Form.Element.disable('settings_mail_handler_api_key'); }"%></p>
 
@@ -12,4 +19,5 @@
 </div>
 
 <%= submit_tag l(:button_save) %>
+
 <% end %>
index faf606d..d70626c 100644 (file)
@@ -865,3 +865,5 @@ bg:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index f8b26d6..860d1f2 100644 (file)
@@ -889,3 +889,5 @@ bs:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index ff857af..0f4dbf0 100644 (file)
@@ -868,3 +868,5 @@ ca:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index ba9386d..6165b6d 100644 (file)
@@ -871,3 +871,5 @@ cs:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 9c9bc2b..7877161 100644 (file)
@@ -891,3 +891,5 @@ da:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index b540f3c..7d1dbcb 100644 (file)
@@ -891,3 +891,5 @@ de:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 6674f81..d4b9616 100644 (file)
@@ -871,3 +871,5 @@ el:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index cf42a7b..3770907 100644 (file)
@@ -308,6 +308,7 @@ en:
   setting_activity_days_default: Days displayed on project activity
   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_api_enabled: Enable WS for incoming emails
   setting_mail_handler_api_key: API key
   setting_sequential_project_identifiers: Generate sequential project identifiers
@@ -812,6 +813,7 @@ en:
   text_tracker_no_workflow: No workflow defined for this tracker
   text_unallowed_characters: Unallowed characters
   text_comma_separated: Multiple values allowed (comma separated).
+  text_line_separated: Multiple values allowed (one line for each value).
   text_issues_ref_in_commit_messages: Referencing and fixing issues in commit messages
   text_issue_added: "Issue {{id}} has been reported by {{author}}."
   text_issue_updated: "Issue {{id}} has been updated by {{author}}."
index 79da10c..4b88288 100644 (file)
@@ -912,3 +912,5 @@ es:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index fa03fc5..2dcf457 100644 (file)
@@ -901,3 +901,5 @@ fi:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index f613b3c..eb9b382 100644 (file)
@@ -330,6 +330,7 @@ fr:
   setting_activity_days_default: Nombre de jours affichés sur l'activité des projets
   setting_display_subprojects_issues: Afficher par défaut les demandes des sous-projets sur les projets principaux
   setting_enabled_scm: SCM activés
+  setting_mail_handler_body_delimiters: "Tronquer les emails après l'une de ces lignes"
   setting_mail_handler_api_enabled: "Activer le WS pour la réception d'emails"
   setting_mail_handler_api_key: Clé de protection de l'API
   setting_sequential_project_identifiers: Générer des identifiants de projet séquentiels
@@ -820,6 +821,7 @@ fr:
   text_tracker_no_workflow: Aucun worflow n'est défini pour ce tracker
   text_unallowed_characters: Caractères non autorisés
   text_comma_separated: Plusieurs valeurs possibles (séparées par des virgules).
+  text_line_separated: Plusieurs valeurs possibles (une valeur par ligne).
   text_issues_ref_in_commit_messages: Référencement et résolution des demandes dans les commentaires de commits
   text_issue_added: "La demande {{id}} a Ã©té soumise par {{author}}."
   text_issue_updated: "La demande {{id}} a Ã©té mise Ã  jour par {{author}}."
index a0d2b05..90a07f3 100644 (file)
@@ -891,3 +891,5 @@ gl:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 1d45621..4830041 100644 (file)
@@ -875,3 +875,5 @@ he:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index d4fbb9d..bc303fa 100644 (file)
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 35b88ef..b06e00c 100644 (file)
@@ -878,3 +878,5 @@ it:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index aefb770..d2dfb2b 100644 (file)
@@ -900,3 +900,5 @@ ja:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index a17bcb6..78d8a52 100644 (file)
@@ -931,3 +931,5 @@ ko:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 4c34bf5..9294d2d 100644 (file)
@@ -939,3 +939,5 @@ lt:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index af7c5bd..9ee4140 100644 (file)
@@ -853,3 +853,5 @@ nl:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 7eb22a8..f6f9da3 100644 (file)
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 8be9d6f..affd8dc 100644 (file)
@@ -894,3 +894,5 @@ pl:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 63d60d3..0fa944c 100644 (file)
@@ -899,3 +899,5 @@ pt-BR:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 0885d32..0a567a6 100644 (file)
@@ -883,3 +883,5 @@ pt:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 3cbd65e..45956a4 100644 (file)
@@ -868,3 +868,5 @@ ro:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 73196f6..51bd8db 100644 (file)
@@ -979,3 +979,5 @@ ru:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 0289ab8..e95eefa 100644 (file)
@@ -870,3 +870,5 @@ sk:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 77cea82..5845ee0 100644 (file)
@@ -867,3 +867,5 @@ sl:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index d80d05f..5cbd596 100644 (file)
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 7b64b35..3d7b2e3 100644 (file)
@@ -920,3 +920,5 @@ sv:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 6bb7e4e..07de4c4 100644 (file)
@@ -868,3 +868,5 @@ th:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 7c04da8..056cb56 100644 (file)
@@ -898,3 +898,5 @@ tr:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 599099c..f5b83b2 100644 (file)
@@ -867,3 +867,5 @@ uk:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index dc5add3..50ac2d8 100644 (file)
@@ -930,3 +930,5 @@ vi:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 5fa4f52..471029c 100644 (file)
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index c909282..883c4bb 100644 (file)
@@ -895,3 +895,5 @@ zh:
   label_missing_api_access_key: Missing an API access key
   label_missing_feeds_access_key: Missing a RSS access key
   button_show: Show
+  text_line_separated: Multiple values allowed (one line for each value).
+  setting_mail_handler_body_delimiters: Truncate emails after one of these lines
index 09bce1f..cebfbb5 100644 (file)
@@ -116,6 +116,8 @@ notified_events:
   default: 
   - issue_added
   - issue_updated
+mail_handler_body_delimiters:
+  default: ''
 mail_handler_api_enabled:
   default: 0
 mail_handler_api_key:
index f5e4e82..64741d7 100644 (file)
@@ -370,6 +370,7 @@ input#time_entry_comments { width: 90%;}
 
 .tabular.settings p{ padding-left: 300px; }
 .tabular.settings label{ margin-left: -300px; width: 295px; }
+.tabular.settings textarea { width: 99%; }
 
 fieldset.settings label { display: block; }
 
index 5dbd0dc..372e730 100644 (file)
@@ -26,10 +26,22 @@ in urna sed tellus aliquet lobortis. Morbi scelerisque tortor in dolor. Cras
 sagittis odio eu lacus. Aliquam sem tortor, consequat sit amet, vestibulum \r
 id, iaculis at, lectus. Fusce tortor libero, congue ut, euismod nec, luctus \r
 eget, eros. Pellentesque tortor enim, feugiat in, dignissim eget, tristique \r
-sed, mauris. Pellentesque habitant morbi tristique senectus et netus et \r
+sed, mauris --- Pellentesque habitant morbi tristique senectus et netus et \r
 malesuada fames ac turpis egestas. Quisque sit amet libero. In hac habitasse \r
 platea dictumst.\r
 \r
+--- This line starts with a delimiter and should not be stripped\r
+\r
+This paragraph is before delimiters.\r
+\r
+BREAK\r
+\r
+This paragraph is between delimiters.\r
+\r
+---\r
+\r
+This paragraph is after the delimiter so it shouldn't appear.\r
+\r
 Nulla et nunc. Duis pede. Donec et ipsum. Nam ut dui tincidunt neque \r
 sollicitudin iaculis. Duis vitae dolor. Vestibulum eget massa. Sed lorem. \r
 Nullam volutpat cursus erat. Cras felis dolor, lacinia quis, rutrum et, \r
index a4ae373..21d2aed 100644 (file)
@@ -279,10 +279,62 @@ class MailHandlerTest < ActiveSupport::TestCase
     assert_equal 'This is a html-only email.', issue.description
   end
 
+  context "truncate emails based on the Setting" do
+    context "with no setting" do
+      setup do
+        Setting.mail_handler_body_delimiters = ''
+      end
+
+      should "add the entire email into the issue" do
+        issue = submit_email('ticket_on_given_project.eml')
+        assert_issue_created(issue)
+        assert issue.description.include?('---')
+        assert issue.description.include?('This paragraph is after the delimiter')
+      end
+    end
+
+    context "with a single string" do
+      setup do
+        Setting.mail_handler_body_delimiters = '---'
+      end
+
+      should "truncate the email at the delimiter for the issue" do
+        issue = submit_email('ticket_on_given_project.eml')
+        assert_issue_created(issue)
+        assert issue.description.include?('This paragraph is before delimiters')
+        assert issue.description.include?('--- This line starts with a delimiter')
+        assert !issue.description.match(/^---$/)
+        assert !issue.description.include?('This paragraph is after the delimiter')
+      end
+    end
+
+    context "with multiple strings" do
+      setup do
+        Setting.mail_handler_body_delimiters = "---\nBREAK"
+      end
+
+      should "truncate the email at the first delimiter found (BREAK)" do
+        issue = submit_email('ticket_on_given_project.eml')
+        assert_issue_created(issue)
+        assert issue.description.include?('This paragraph is before delimiters')
+        assert !issue.description.include?('BREAK')
+        assert !issue.description.include?('This paragraph is between delimiters')
+        assert !issue.description.match(/^---$/)
+        assert !issue.description.include?('This paragraph is after the delimiter')
+      end
+    end
+  end
+
   private
   
   def submit_email(filename, options={})
     raw = IO.read(File.join(FIXTURES_PATH, filename))
     MailHandler.receive(raw, options)
   end
+
+  def assert_issue_created(issue)
+    assert issue.is_a?(Issue)
+    assert !issue.new_record?
+    issue.reload
+  end
 end