]> source.dussan.org Git - redmine.git/commitdiff
Adds a simple API and a standalone script that can be used to forward emails from...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 25 Jun 2008 19:25:28 +0000 (19:25 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Wed, 25 Jun 2008 19:25:28 +0000 (19:25 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1584 e93f8b46-1217-0410-a6f0-8f06a7374b81

36 files changed:
app/controllers/mail_handler_controller.rb [new file with mode: 0644]
app/helpers/mail_handler_helper.rb [new file with mode: 0644]
app/helpers/settings_helper.rb
app/models/mail_handler.rb
app/views/settings/_mail_handler.rhtml [new file with mode: 0644]
config/settings.yml
extra/mail_handler/rdm-mailhandler.rb [new file with mode: 0644]
lang/bg.yml
lang/cs.yml
lang/da.yml
lang/de.yml
lang/en.yml
lang/es.yml
lang/fi.yml
lang/fr.yml
lang/he.yml
lang/hu.yml
lang/it.yml
lang/ja.yml
lang/ko.yml
lang/lt.yml
lang/nl.yml
lang/no.yml
lang/pl.yml
lang/pt-br.yml
lang/pt.yml
lang/ro.yml
lang/ru.yml
lang/sr.yml
lang/sv.yml
lang/th.yml
lang/uk.yml
lang/zh-tw.yml
lang/zh.yml
public/javascripts/application.js
test/functional/mail_handler_controller_test.rb [new file with mode: 0644]

diff --git a/app/controllers/mail_handler_controller.rb b/app/controllers/mail_handler_controller.rb
new file mode 100644 (file)
index 0000000..8bcfce6
--- /dev/null
@@ -0,0 +1,44 @@
+# redMine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+class MailHandlerController < ActionController::Base
+  before_filter :check_credential
+  
+  verify :method => :post,
+         :only => :index,
+         :render => { :nothing => true, :status => 405 }
+         
+  # Submits an incoming email to MailHandler
+  def index
+    options = params.dup
+    email = options.delete(:email)
+    if MailHandler.receive(email, options)
+      render :nothing => true, :status => :created
+    else
+      render :nothing => true, :status => :unprocessable_entity
+    end
+  end
+  
+  private
+  
+  def check_credential
+    User.current = nil
+    unless Setting.mail_handler_api_enabled? && params[:key] == Setting.mail_handler_api_key
+      render :nothing => true, :status => 403
+    end
+  end
+end
diff --git a/app/helpers/mail_handler_helper.rb b/app/helpers/mail_handler_helper.rb
new file mode 100644 (file)
index 0000000..a29a6dd
--- /dev/null
@@ -0,0 +1,19 @@
+# redMine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+module MailHandlerHelper
+end
index f4ec5a7a74c7b69b857397ac9ad33892a499eb1f..d88269f7d5bf17583cb8555ac5a6db08e2d93431 100644 (file)
@@ -21,6 +21,7 @@ module SettingsHelper
             {:name => 'authentication', :partial => 'settings/authentication', :label => :label_authentication},
             {:name => 'issues', :partial => 'settings/issues', :label => :label_issue_tracking},
             {:name => 'notifications', :partial => 'settings/notifications', :label => l(:field_mail_notification)},
+            {:name => 'mail_handler', :partial => 'settings/mail_handler', :label => l(:label_incoming_emails)},
             {:name => 'repositories', :partial => 'settings/repositories', :label => :label_repository_plural}
             ]
   end
index 7b85077e183f1161034233b7bc446c3bc13bab79..124f7db74bd62806953fd200d020c35e2957cbd3 100644 (file)
@@ -84,7 +84,7 @@ class MailHandler < ActionMailer::Base
     # TODO: other ways to specify project:
     # * parse the email To field
     # * specific project (eg. Setting.mail_handler_target_project)
-    identifier = if @@handler_options[:project]
+    identifier = if !@@handler_options[:project].blank?
                    @@handler_options[:project]
                  elsif email.plain_text_body =~ %r{^Project:[ \t]*(.+)$}i
                     $1
diff --git a/app/views/settings/_mail_handler.rhtml b/app/views/settings/_mail_handler.rhtml
new file mode 100644 (file)
index 0000000..830b1ba
--- /dev/null
@@ -0,0 +1,18 @@
+<% form_tag({:action => 'edit', :tab => 'mail_handler'}) do %>
+
+<div class="box tabular settings">
+<p><label><%= l(:setting_mail_handler_api_enabled) %></label>
+<%= check_box_tag 'settings[mail_handler_api_enabled]', 1, Setting.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'); }" %>
+<%= hidden_field_tag 'settings[mail_handler_api_enabled]', 0 %></p>
+
+<p><label><%= l(:setting_mail_handler_api_key) %></label>
+<%= text_field_tag 'settings[mail_handler_api_key]', Setting.mail_handler_api_key, 
+                                                     :size => 30,
+                                                     :id => 'settings_mail_handler_api_key',
+                                                     :disabled => !Setting.mail_handler_api_enabled? %>
+<%= link_to_function l(:label_generate_key), "if ($('settings_mail_handler_api_key').disabled == false) { $('settings_mail_handler_api_key').value = randomKey(20) }" %></p>
+</div>
+
+<%= submit_tag l(:button_save) %>
+<% end %>
index 616665f23f5073e6e5199bf128b2d1102d467fea..78a366f351c7e36eab6202cff3c511ff734e97a4 100644 (file)
@@ -101,6 +101,10 @@ notified_events:
   default: 
   - issue_added
   - issue_updated
+mail_handler_api_enabled:
+  default: 0
+mail_handler_api_key:
+  default: 
 issue_list_default_columns:
   serialized: true
   default: 
diff --git a/extra/mail_handler/rdm-mailhandler.rb b/extra/mail_handler/rdm-mailhandler.rb
new file mode 100644 (file)
index 0000000..585afef
--- /dev/null
@@ -0,0 +1,79 @@
+#!/usr/bin/ruby
+
+# rdm-mailhandler
+# Reads an email from standard input and forward it to a Redmine server
+# Can be used from a remote mail server
+
+require 'net/http'
+require 'net/https'
+require 'uri'
+require 'getoptlong'
+
+class RedmineMailHandler
+  VERSION = '0.1'
+  
+  attr_accessor :verbose, :project, :url, :key
+
+  def initialize
+    opts = GetoptLong.new(
+      [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
+      [ '--version', '-V', GetoptLong::NO_ARGUMENT ],
+      [ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
+      [ '--url', '-u', GetoptLong::REQUIRED_ARGUMENT ],
+      [ '--key', '-k', GetoptLong::REQUIRED_ARGUMENT],
+      [ '--project', '-p', GetoptLong::REQUIRED_ARGUMENT ]
+    )
+
+    opts.each do |opt, arg|
+      case opt
+      when '--url'
+        self.url = arg.dup
+      when '--key'
+        self.key = arg.dup
+      when '--help'
+        usage
+      when '--verbose'
+        self.verbose = true
+      when '--version'
+        puts VERSION; exit
+      when '--project'
+        self.project = arg.dup
+      end
+    end
+    
+    usage if url.nil?
+  end
+  
+  def submit(email)
+    uri = url.gsub(%r{/*$}, '') + '/mail_handler'
+    debug "Posting to #{uri}..."
+    data = { 'key' => key, 'project' => project, 'email' => email }
+    response = Net::HTTP.post_form(URI.parse(uri), data)
+    debug "Response received: #{response.code}"
+    response.code == 201 ? 0 : 1
+  end
+  
+  private
+  
+  def usage
+    puts "Usage: rdm-mailhandler [options] --url=<Redmine URL> --key=<API key>"
+    puts "Reads an email from standard input and forward it to a Redmine server"
+    puts
+    puts "Options:"
+    puts "  --help             show this help"
+    puts "  --verbose          show extra information"
+    puts "  --project          identifier of the target project"
+    puts
+    puts "Examples:"
+    puts "  rdm-mailhandler --url http://redmine.domain.foo --key secret"
+    puts "  rdm-mailhandler --url https://redmine.domain.foo --key secret --project foo"
+    exit
+  end
+  
+  def debug(msg)
+    puts msg if verbose
+  end
+end
+
+handler = RedmineMailHandler.new
+handler.submit(STDIN.read)
index 48226c79a6a7fdd1d5767981b05ce6c48da8cc62..1339d9a839a92a61b1dc4dbb3b5432c29d73ae8c 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index de460ba3a6ae626fa1113536ec10a5b5c8cb4531..00d0642de7bb53d0d8502f5f419dd5524059f1d0 100644 (file)
@@ -631,3 +631,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 6919cdfcbfefd8f6bb51398db20a7faa80681da9..b8546ab209af573d106ad42c6b2ba5121df1661f 100644 (file)
@@ -628,3 +628,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 290acd91628de94aea45324127f77c052b51c1fc..6bc7919f9f054d9076c32015a37e47958d48c092 100644 (file)
@@ -627,3 +627,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index ffbd1062270a60332121353141676ff933c20bd8..7ab73f051248a12240fc51a85f6f100bb9230ec2 100644 (file)
@@ -214,6 +214,8 @@ setting_user_format: Users display format
 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_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
 
 project_module_issue_tracking: Issue tracking
 project_module_time_tracking: Time tracking
@@ -515,6 +517,8 @@ label_preferences: Preferences
 label_chronological_order: In chronological order
 label_reverse_chronological_order: In reverse chronological order
 label_planning: Planning
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
 
 button_login: Login
 button_submit: Submit
index b027f48e3ae80fc93476facf463042856773215a..2615d8f61b0ccc92367d100d3d568ab41f5bcce3 100644 (file)
@@ -629,3 +629,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index e1d188dcca2b04151d6f40311a679429f1d9fa96..51b0c04a0548a7c12a1bc3737f9395d620bd36ec 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index eaae517651d5faad88771d528b8156f44629c330..1fd86dd07be330f802aafe7d75e2743600831b8c 100644 (file)
@@ -215,6 +215,8 @@ setting_user_format: Format d'affichage des utilisateurs
 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_api_enabled: "Activer le WS pour la réception d'emails"
+setting_mail_handler_api_key: Clé de protection de l'API
 
 project_module_issue_tracking: Suivi des demandes
 project_module_time_tracking: Suivi du temps passé
@@ -515,6 +517,8 @@ label_preferences: Préférences
 label_chronological_order: Dans l'ordre chronologique
 label_reverse_chronological_order: Dans l'ordre chronologique inverse
 label_planning: Planning
+label_incoming_emails: Emails entrants
+label_generate_key: Générer une clé
 
 button_login: Connexion
 button_submit: Soumettre
index 5f14ee16eea421ce5e862825f48663ebfe4f6076..7455fc3956d65fea274b7aea82657efad3dd4117 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index c46d0e26c0c3dce36b93dba08ae59664dd9af994..ba904ed458ee7104dceea8ffdf7d02a942645d29 100644 (file)
@@ -627,3 +627,7 @@ label_duplicated_by: duplikálta
 setting_enabled_scm: Forráskódkezelő (SCM) engedélyezése
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 8aec9ef0e9e255dedd7bec06e1332565b2c3f8dd..867c73f9a3cb225be4bf6bbd65d6e8044f7ac48e 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index c48579dda8147a87184f570d2bd5fb99381c588c..aa4320c3a615d866cdeb8b27f809b21369b92004 100644 (file)
@@ -627,3 +627,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index f2339556f4cec874349388e6e162e5ee65105525..f945537a928f1d775b8b4fcbfad83229bfcd9deb 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 61533b3ab138ca129662434b9531bf37c94d5486..355f473c86f363d41f690a5157136ae6107268bd 100644 (file)
@@ -628,3 +628,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 109d444f1d9a5dd9a6397070358a4ec3685ee2fb..89b8a57367e558fe59ae5577b49890cc4ceffa17 100644 (file)
@@ -627,3 +627,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 4e47c75a21d0593c1191991f02fc65b1a2f84148..5e4bdcca3d589b768274551bb2aef614239fa7d1 100644 (file)
@@ -627,3 +627,7 @@ enumeration_doc_categories: Dokument-kategorier
 enumeration_activities: Aktiviteter (tidssporing)
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 97378b5b14c4102096c2d386f35e9b60d24bdd17..0b0f87b6f984d92f098dc70f755091f1acd5854d 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 67822499e8e250f72a63653487916c8ba1b1a791..e2036afdee74dec8b39def3485116c92913e6c05 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM\r
 text_enumeration_category_reassign_to: 'Reassign them to this value:'\r
 text_enumeration_destroy_question: '%d objects are assigned to this value.'\r
+label_incoming_emails: Incoming emails\r
+label_generate_key: Generate a key\r
+setting_mail_handler_api_enabled: Enable WS for incoming emails\r
+setting_mail_handler_api_key: API key\r
index a91eea01b52167ddfde57ad7dc64292aedd46540..543743cabb4f7e5d522ea4a891b395b8c4f0ee81 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index aafc61916990f59ca6c9bc56831f3efff4d5a983..16c2ea10458ea4c6809326dd41e2e8dbb3dc3032 100644 (file)
@@ -626,3 +626,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index e04377781b7af2a8d97891c5fb0a4ed2d4fce972..f68505be5fe1d09f0c869bd24999bcb72df8e49e 100644 (file)
@@ -630,3 +630,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index ec01774bcbd07f527163cba94671075d3357b74b..83bfdf43c7248822c361a997107c84cb400209f0 100644 (file)
@@ -627,3 +627,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index e28943d9b4033f73f27eb4b387b478f42b908bfa..375970f3ef3d9847cca15d67f73d52bfeb5900b3 100644 (file)
@@ -627,3 +627,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 6c84dba70c9248f6f343c67cc9a1d3acc661db7a..acbf146cf593d6035f831d730de2542b64f7ac84 100644 (file)
@@ -629,3 +629,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 365ced150b348f2663a1f78bcd256f328095a1a3..d70916b1e2d7aad503b19cdb5a9f5909ae99891c 100644 (file)
@@ -628,3 +628,7 @@ label_duplicated_by: duplicated by
 setting_enabled_scm: Enabled SCM
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index c7b473548d97943687b57971d50476d4c7d16afc..4626335756ff48470c45b10b12f85fa0d3ce3c23 100644 (file)
@@ -627,3 +627,7 @@ enumeration_doc_categories: 文件分類
 enumeration_activities: 活動 (時間追蹤)
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index 981e8102d7a2a7f50c0f5d0e6947756c2e4ca806..9f81d42faeec6db9083051f38d332a28e71320c0 100644 (file)
@@ -627,3 +627,7 @@ enumeration_doc_categories: 文档类别
 enumeration_activities: 活动(时间跟踪)
 text_enumeration_category_reassign_to: 'Reassign them to this value:'
 text_enumeration_destroy_question: '%d objects are assigned to this value.'
+label_incoming_emails: Incoming emails
+label_generate_key: Generate a key
+setting_mail_handler_api_enabled: Enable WS for incoming emails
+setting_mail_handler_api_key: API key
index a8b6c0e46cf809663ee0909fd74654697bfebd31..4e5b67e558d8952caffc21c75469aa8ecca05a04 100644 (file)
@@ -107,6 +107,15 @@ function scmEntryLoaded(id) {
     Element.removeClassName(id, 'loading');
 }
 
+function randomKey(size) {
+       var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');
+       var key = '';
+       for (i = 0; i < size; i++) {
+       key += chars[Math.floor(Math.random() * chars.length)];
+       }
+       return key;
+}
+
 /* shows and hides ajax indicator */
 Ajax.Responders.register({
     onCreate: function(){
diff --git a/test/functional/mail_handler_controller_test.rb b/test/functional/mail_handler_controller_test.rb
new file mode 100644 (file)
index 0000000..6c5af23
--- /dev/null
@@ -0,0 +1,53 @@
+# redMine - project management software
+# Copyright (C) 2006-2008  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.dirname(__FILE__) + '/../test_helper'
+require 'mail_handler_controller'
+
+# Re-raise errors caught by the controller.
+class MailHandlerController; def rescue_action(e) raise e end; end
+
+class MailHandlerControllerTest < Test::Unit::TestCase
+  fixtures :users, :projects, :enabled_modules, :roles, :members, :issues, :issue_statuses, :trackers, :enumerations
+  
+  FIXTURES_PATH = File.dirname(__FILE__) + '/../fixtures/mail_handler'
+  
+  def setup
+    @controller = MailHandlerController.new
+    @request    = ActionController::TestRequest.new
+    @response   = ActionController::TestResponse.new
+    User.current = nil
+  end
+  
+  def test_should_create_issue
+    # Enable API and set a key
+    Setting.mail_handler_api_enabled = 1
+    Setting.mail_handler_api_key = 'secret'
+    
+    post :index, :key => 'secret', :email => IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml'))
+    assert_response 201
+  end
+  
+  def test_should_not_allow
+    # Disable API
+    Setting.mail_handler_api_enabled = 0
+    Setting.mail_handler_api_key = 'secret'
+    
+    post :index, :key => 'secret', :email => IO.read(File.join(FIXTURES_PATH, 'ticket_on_given_project.eml'))
+    assert_response 403
+  end
+end