Commit 96ba5c755103bb3da6a1170e785a22ec211040b1

Authored by Victor Costa
2 parents 32d9d2f3 648ba45f

Merge branch 'api' into production

Conflicts:
	lib/noosfero/api/helpers.rb
lib/noosfero/api/api.rb
@@ -31,6 +31,7 @@ module Noosfero @@ -31,6 +31,7 @@ module Noosfero
31 before { setup_multitenancy } 31 before { setup_multitenancy }
32 before { detect_stuff_by_domain } 32 before { detect_stuff_by_domain }
33 before { filter_disabled_plugins_endpoints } 33 before { filter_disabled_plugins_endpoints }
  34 + before { init_noosfero_plugins }
34 after { set_session_cookie } 35 after { set_session_cookie }
35 36
36 version 'v1' 37 version 'v1'
lib/noosfero/api/helpers.rb
@@ -6,11 +6,18 @@ @@ -6,11 +6,18 @@
6 DEFAULT_ALLOWED_PARAMETERS = [:parent_id, :from, :until, :content_type] 6 DEFAULT_ALLOWED_PARAMETERS = [:parent_id, :from, :until, :content_type]
7 7
8 include SanitizeParams 8 include SanitizeParams
  9 + include Noosfero::Plugin::HotSpot
  10 + include ForgotPasswordHelper
9 11
10 def set_locale 12 def set_locale
11 I18n.locale = (params[:lang] || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en') 13 I18n.locale = (params[:lang] || request.env['HTTP_ACCEPT_LANGUAGE'] || 'en')
12 end 14 end
13 15
  16 + # FIXME this filter just loads @plugins
  17 + def init_noosfero_plugins
  18 + plugins
  19 + end
  20 +
14 def current_user 21 def current_user
15 private_token = (params[PRIVATE_TOKEN_PARAM] || headers['Private-Token']).to_s 22 private_token = (params[PRIVATE_TOKEN_PARAM] || headers['Private-Token']).to_s
16 @current_user ||= User.find_by_private_token(private_token) 23 @current_user ||= User.find_by_private_token(private_token)
lib/noosfero/api/session.rb
@@ -91,6 +91,45 @@ module Noosfero @@ -91,6 +91,45 @@ module Noosfero
91 render_api_error!(_('Token is invalid'), 412) 91 render_api_error!(_('Token is invalid'), 412)
92 end 92 end
93 end 93 end
  94 +
  95 + # Request a new password.
  96 + #
  97 + # Parameters:
  98 + # value (required) - Email or login
  99 + # Example Request:
  100 + # POST /forgot_password?value=some@mail.com
  101 + post "/forgot_password" do
  102 + requestors = fetch_requestors(params[:value])
  103 + not_found! if requestors.blank?
  104 +
  105 + requestors.each do |requestor|
  106 + ChangePassword.create!(:requestor => requestor)
  107 + end
  108 + end
  109 +
  110 + params do
  111 + requires :code, type: String, desc: _("Forgot password code")
  112 + end
  113 + # Change password
  114 + #
  115 + # Parameters:
  116 + # code (required) - Change password code
  117 + # password (required)
  118 + # password_confirmation (required)
  119 + # Example Request:
  120 + # PATCH /new_password?code=xxxx&password=secret&password_confirmation=secret
  121 + patch "/new_password" do
  122 + change_password = ChangePassword.find_by_code(params[:code])
  123 + not_found! if change_password.nil?
  124 +
  125 + if change_password.update_attributes(:password => params[:password], :password_confirmation => params[:password_confirmation])
  126 + change_password.finish
  127 + present change_password.requestor.user, :with => Entities::UserLogin
  128 + else
  129 + something_wrong!
  130 + end
  131 + end
  132 +
94 end 133 end
95 end 134 end
96 end 135 end
test/unit/api/session_test.rb
@@ -118,4 +118,47 @@ class SessionTest < ActiveSupport::TestCase @@ -118,4 +118,47 @@ class SessionTest < ActiveSupport::TestCase
118 assert_equal 412, last_response.status 118 assert_equal 412, last_response.status
119 end 119 end
120 120
  121 + should 'create task to change password by user login' do
  122 + user = create_user
  123 + params = {:value => user.login}
  124 + assert_difference 'ChangePassword.count' do
  125 + post "/api/v1/forgot_password?#{params.to_query}"
  126 + end
  127 + end
  128 +
  129 + should 'not create task to change password when user is not found' do
  130 + params = {:value => 'wronglogin'}
  131 + assert_no_difference 'ChangePassword.count' do
  132 + post "/api/v1/forgot_password?#{params.to_query}"
  133 + end
  134 + assert_equal 404, last_response.status
  135 + end
  136 +
  137 + should 'change user password and close task' do
  138 + user = create_user
  139 + task = ChangePassword.create!(:requestor => user.person)
  140 + params = {:code => task.code, :password => 'secret', :password_confirmation => 'secret'}
  141 + patch "/api/v1/new_password?#{params.to_query}"
  142 + assert_equal Task::Status::FINISHED, task.reload.status
  143 + assert user.reload.authenticated?('secret')
  144 + json = JSON.parse(last_response.body)
  145 + assert_equal user.id, json['id']
  146 + end
  147 +
  148 + should 'do not change user password when password confirmation is wrong' do
  149 + user = create_user
  150 + task = ChangePassword.create!(:requestor => user.person)
  151 + params = {:code => task.code, :password => 'secret', :password_confirmation => 's3cret'}
  152 + patch "/api/v1/new_password?#{params.to_query}"
  153 + assert_equal Task::Status::ACTIVE, task.reload.status
  154 + assert !user.reload.authenticated?('secret')
  155 + assert_equal 400, last_response.status
  156 + end
  157 +
  158 + should 'render not found when provide a wrong code on password change' do
  159 + params = {:code => "wrongcode", :password => 'secret', :password_confirmation => 'secret'}
  160 + patch "/api/v1/new_password?#{params.to_query}"
  161 + assert_equal 404, last_response.status
  162 + end
  163 +
121 end 164 end