mirror of
https://github.com/TracksApp/tracks.git
synced 2025-12-16 23:30:12 +01:00
Merge pull request #25 from 02strich/cloudmailin_integration
Adding cloudmailin support for adding tasks
This commit is contained in:
commit
671652c4c4
5 changed files with 114 additions and 13 deletions
1
Gemfile
1
Gemfile
|
|
@ -17,6 +17,7 @@ gem "ruby-openid", :require => "openid"
|
||||||
gem "sqlite3"
|
gem "sqlite3"
|
||||||
gem 'bcrypt-ruby', '~> 2.1.4'
|
gem 'bcrypt-ruby', '~> 2.1.4'
|
||||||
gem 'htmlentities', '~> 4.3.0'
|
gem 'htmlentities', '~> 4.3.0'
|
||||||
|
gem "mail"
|
||||||
|
|
||||||
if RUBY_VERSION.to_f >= 1.9
|
if RUBY_VERSION.to_f >= 1.9
|
||||||
gem "soap4r-ruby1.9"
|
gem "soap4r-ruby1.9"
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
class IntegrationsController < ApplicationController
|
class IntegrationsController < ApplicationController
|
||||||
|
require 'mail'
|
||||||
|
|
||||||
skip_before_filter :login_required, :only => [:search_plugin, :google_gadget]
|
skip_before_filter :login_required, :only => [:cloudmailin, :search_plugin, :google_gadget]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@page_title = 'TRACKS::Integrations'
|
@page_title = 'TRACKS::Integrations'
|
||||||
|
|
@ -36,4 +37,49 @@ class IntegrationsController < ApplicationController
|
||||||
render :layout => false, :content_type => Mime::XML
|
render :layout => false, :content_type => Mime::XML
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def cloudmailin
|
||||||
|
# verify cloudmailin signature
|
||||||
|
provided = request.request_parameters.delete(:signature)
|
||||||
|
signature = Digest::MD5.hexdigest(request.request_parameters.sort{|a,b| a[0].to_s <=> b[0].to_s}.map{|k,v| v}.join + SITE_CONFIG['cloudmailin'])
|
||||||
|
|
||||||
|
# if signature does not match, return 403
|
||||||
|
if provided != signature
|
||||||
|
render :text => "Message signature verification failed.", :status => 403
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
# parse message
|
||||||
|
message = Mail.new(params[:message])
|
||||||
|
|
||||||
|
# find user
|
||||||
|
user = User.find(:first, :include => [:preference], :conditions => ["preferences.sms_email = ?", message.from])
|
||||||
|
if user.nil?
|
||||||
|
render :text => "No user found", :status => 404
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
# load user settings
|
||||||
|
context = user.prefs.sms_context
|
||||||
|
|
||||||
|
# prepare body
|
||||||
|
if message.body.multipart?
|
||||||
|
body = message.body.preamble
|
||||||
|
else
|
||||||
|
body = message.body.to_s
|
||||||
|
end
|
||||||
|
|
||||||
|
# parse mail
|
||||||
|
if message.subject.to_s.empty?
|
||||||
|
description = body
|
||||||
|
notes = nil
|
||||||
|
else
|
||||||
|
description = message.subject.to_s
|
||||||
|
notes = body
|
||||||
|
end
|
||||||
|
|
||||||
|
# create todo
|
||||||
|
todo = Todo.from_rich_message(user, context.id, description, notes)
|
||||||
|
todo.save!
|
||||||
|
render :text => 'success', :status => 200
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -86,8 +86,9 @@ ActionController::Routing::Routes.draw do |map|
|
||||||
map.with_options :controller => :integrations do |i|
|
map.with_options :controller => :integrations do |i|
|
||||||
i.integrations 'integrations', :action => 'index'
|
i.integrations 'integrations', :action => 'index'
|
||||||
i.rest_api_docs 'integrations/rest_api', :action => "rest_api"
|
i.rest_api_docs 'integrations/rest_api', :action => "rest_api"
|
||||||
i.search_plugin 'integrations/search_plugin.xml', :controller => 'integrations', :action => 'search_plugin', :format => 'xml'
|
i.search_plugin 'integrations/search_plugin.xml', :action => 'search_plugin', :format => 'xml'
|
||||||
i.google_gadget 'integrations/google_gadget.xml', :controller => 'integrations', :action => 'google_gadget', :format => 'xml'
|
i.google_gadget 'integrations/google_gadget.xml', :action => 'google_gadget', :format => 'xml'
|
||||||
|
i.cloudmailin 'integrations/cloudmailin', :action => 'cloudmailin'
|
||||||
end
|
end
|
||||||
|
|
||||||
map.with_options :controller => :preferences do |p|
|
map.with_options :controller => :preferences do |p|
|
||||||
|
|
|
||||||
|
|
@ -51,3 +51,8 @@ open_signups: false
|
||||||
# - 'localhost'
|
# - 'localhost'
|
||||||
# use_ssl: false
|
# use_ssl: false
|
||||||
# login_format: 'cn=%s,dc=example,dc=com'
|
# login_format: 'cn=%s,dc=example,dc=com'
|
||||||
|
|
||||||
|
# When integrating your tracks instance with http://cloudmailin.com/ by using the /integrations/cloudmailin URL,
|
||||||
|
# this value is the cloudmailin-secret for verifying the authenticity of the request.
|
||||||
|
# (see http://docs.cloudmailin.com/validating_the_sender)
|
||||||
|
# cloudmailin: asdasd
|
||||||
|
|
|
||||||
|
|
@ -13,15 +13,63 @@ class IntegrationsControllerTest < ActionController::TestCase
|
||||||
@response = ActionController::TestResponse.new
|
@response = ActionController::TestResponse.new
|
||||||
end
|
end
|
||||||
|
|
||||||
# Replace this with your real tests.
|
|
||||||
def test_truth
|
|
||||||
assert true
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_page_load
|
def test_page_load
|
||||||
login_as(:admin_user)
|
login_as(:admin_user)
|
||||||
get :rest_api
|
get :rest_api
|
||||||
assert_response :success
|
assert_response :success
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_cloudmailin_integration_success
|
||||||
|
SITE_CONFIG['cloudmailin'] = "123456789"
|
||||||
|
post :cloudmailin, {
|
||||||
|
"html"=>"",
|
||||||
|
"plain"=>"asdasd",
|
||||||
|
"x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]",
|
||||||
|
"disposable"=>"",
|
||||||
|
"from"=>"5555555555@tmomail.net",
|
||||||
|
"signature"=>"e85e908fb893394762047c21e54ce248",
|
||||||
|
"to"=>"<123123@cloudmailin.net>",
|
||||||
|
"subject"=>"asd",
|
||||||
|
"x_cc_header"=>"",
|
||||||
|
"message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <5555555555@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_cloudmailin_integration_invalid_signature
|
||||||
|
SITE_CONFIG['cloudmailin'] = "12345678901234567890"
|
||||||
|
post :cloudmailin, {
|
||||||
|
"html"=>"",
|
||||||
|
"plain"=>"asdasd",
|
||||||
|
"x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]",
|
||||||
|
"disposable"=>"",
|
||||||
|
"from"=>"5555555555@tmomail.net",
|
||||||
|
"signature"=>"e85e908fb893394762047c21e54ce248",
|
||||||
|
"to"=>"<123123@cloudmailin.net>",
|
||||||
|
"subject"=>"asd",
|
||||||
|
"x_cc_header"=>"",
|
||||||
|
"message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <5555555555@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_response 403
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_cloudmailin_integration_unknown_address
|
||||||
|
SITE_CONFIG['cloudmailin'] = "123456789"
|
||||||
|
post :cloudmailin, {
|
||||||
|
"html"=>"",
|
||||||
|
"plain"=>"asdasd",
|
||||||
|
"x_to_header"=>"[\"81496ecea21032d35a7a@cloudmailin.net\"]",
|
||||||
|
"disposable"=>"",
|
||||||
|
"from"=>"444444444444@tmomail.net",
|
||||||
|
"signature"=>"6d2df0e807bfa9b77d24c31dce6d4515",
|
||||||
|
"to"=>"<123123@cloudmailin.net>",
|
||||||
|
"subject"=>"asd",
|
||||||
|
"x_cc_header"=>"",
|
||||||
|
"message"=>"Received: from VMBX103.ihostexchange.net ([192.168.3.3]) by\r\n HUB103.ihostexchange.net ([66.46.182.53]) with mapi; Wed, 5 Oct 2011 17:12:44\r\n -0400\r\nFrom: SMS User <444444444444@tmomail.net>\r\nTo: Tracks <123123@cloudmailin.net>\r\nDate: Wed, 5 Oct 2011 17:12:43 -0400\r\nSubject: asd\r\nThread-Topic: asd\r\nThread-Index: AcyDo4aig2wghvcsTAOkleWqi4t/FQ==\r\nMessage-ID: <7D7CB176-7559-4997-A301-8DF9726264C7@tmomail.net>\r\nAccept-Language: de-DE, en-US\r\nContent-Language: en-US\r\nX-MS-Has-Attach:\r\nX-MS-TNEF-Correlator:\r\nacceptlanguage: de-DE, en-US\r\nContent-Type: text/plain; charset=\"us-ascii\"\r\nContent-Transfer-Encoding: quoted-printable\r\nMIME-Version: 1.0\r\n\r\nasdasd\r\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_response 404
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue