Commit 1bafef867058ffb54590687467041ede3e7832a5

Authored by Marcos Pereira
1 parent d2159684

Adds hotspot to allow custom API login method

Signed-off-by: Macartur Sousa <macartur.sc@gmail.com>
Signed-off-by: Marcos Ronaldo <marcos.rpj2@gmail.com>
lib/noosfero/api/helpers.rb
... ... @@ -23,6 +23,7 @@ require_relative &#39;../../find_by_contents&#39;
23 23 def current_user
24 24 private_token = (params[PRIVATE_TOKEN_PARAM] || headers['Private-Token']).to_s
25 25 @current_user ||= User.find_by private_token: private_token
  26 + @current_user ||= plugins.dispatch("api_custom_login", request).first
26 27 @current_user
27 28 end
28 29  
... ...
lib/noosfero/plugin.rb
... ... @@ -682,6 +682,10 @@ class Noosfero::Plugin
682 682 {}
683 683 end
684 684  
  685 + def api_custom_login request
  686 + nil
  687 + end
  688 +
685 689 def method_missing(method, *args, &block)
686 690 # This is a generic hotspot for all controllers on Noosfero.
687 691 # If any plugin wants to define filters to run on any controller, the name of
... ...
plugins/remote_user/lib/remote_user_plugin.rb
... ... @@ -8,43 +8,42 @@ class RemoteUserPlugin &lt; Noosfero::Plugin
8 8 _("A plugin that add remote user support.")
9 9 end
10 10  
  11 + def api_custom_login request
  12 + RemoteUserPlugin::current_user request, environment
  13 + end
  14 +
  15 + def self.current_user request, environment
  16 + remote_user = request.env["HTTP_REMOTE_USER"]
  17 + user_data = request.env['HTTP_REMOTE_USER_DATA']
  18 +
  19 + remote_user_email = user_data.blank? ? (remote_user + '@remote.user') : JSON.parse(user_data)['email']
  20 + remote_user_name = user_data.blank? ? remote_user : JSON.parse(user_data)['name']
  21 +
  22 + user = User.where(environment_id: environment, login: remote_user).first
  23 + unless user
  24 + user = User.create!(:environment => environment, :login => remote_user, :email => remote_user_email, :name => remote_user_name, :password => ('pw4'+remote_user), :password_confirmation => ('pw4'+remote_user))
  25 + user.activate
  26 + user.save!
  27 + end
  28 + user
  29 + end
  30 +
11 31 def application_controller_filters
12 32 block = proc do
13 33  
14 34 begin
15 35 remote_user = request.headers["HTTP_REMOTE_USER"]
16   - user_data = request.env['HTTP_REMOTE_USER_DATA']
17 36  
18 37 if remote_user.blank?
19 38 self.current_user = nil
20 39 else
21   - if user_data.blank?
22   - remote_user_email = remote_user + '@remote.user'
23   - remote_user_name = remote_user
24   - else
25   - user_data = JSON.parse(user_data)
26   - remote_user_email = user_data['email']
27   - remote_user_name = user_data['name']
28   - end
29   -
30 40 if !logged_in?
31   - self.current_user = User.where(environment_id: environment, login: remote_user).first
32   - unless self.current_user
33   - self.current_user = User.create!(:environment => environment, :login => remote_user, :email => remote_user_email, :name => remote_user_name, :password => ('pw4'+remote_user), :password_confirmation => ('pw4'+remote_user))
34   - self.current_user.activate
35   - end
36   - self.current_user.save!
  41 + self.current_user = RemoteUserPlugin::current_user request, environment
37 42 else
38 43 if remote_user != self.current_user.login
39 44 self.current_user.forget_me
40 45 reset_session
41   -
42   - self.current_user = User.where(environment_id: environment, login: remote_user).first
43   - unless self.current_user
44   - self.current_user = User.create!(:environment => environment, :login => remote_user, :email => remote_user_email, :name => remote_user_name, :password => ('pw4'+remote_user), :password_confirmation => ('pw4'+remote_user))
45   - self.current_user.activate
46   - end
47   - self.current_user.save!
  46 + self.current_user = RemoteUserPlugin::current_user request, environment
48 47 end
49 48 end
50 49 end
... ...
plugins/remote_user/test/unit/remote_user_plugin_test.rb 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +require 'test_helper'
  2 +require_relative '../../../../test/api/test_helper'
  3 +
  4 +class RemoteUserPluginTest < ActiveSupport::TestCase
  5 + should 'call remote user hotspot to authenticate in API' do
  6 + environment = Environment.default
  7 + environment.enable_plugin(RemoteUserPlugin)
  8 + RemoteUserPlugin.any_instance.expects(:api_custom_login).once
  9 + get "/api/v1/people/me"
  10 + end
  11 +end
... ...
test/api/helpers_test.rb
... ... @@ -41,15 +41,24 @@ class APIHelpersTest &lt; ActiveSupport::TestCase
41 41 assert_equal user.person, current_person
42 42 end
43 43  
44   -# #FIXME see how to make this test. Get the current_user variable
45   -# should 'set current_user to nil after logout' do
46   -# user = create_user('someuser')
47   -# user.stubs(:private_token_expired?).returns(false)
48   -# User.stubs(:find_by(private_token).returns: user)
49   -# assert_not_nil current_user
50   -# assert false
51   -# logout
52   -# end
  44 + should 'get the current user from plugins' do
  45 +
  46 + class CoolPlugin < Noosfero::Plugin
  47 + def api_custom_login request
  48 + user = User.create!(:login => 'zombie', :password => 'zombie', :password_confirmation => 'zombie', :email => 'zombie@brains.org', :environment => environment)
  49 + user.activate
  50 + user
  51 + end
  52 + end
  53 +
  54 + Noosfero::Plugin.stubs(:all).returns([CoolPlugin.name])
  55 + Environment.default.enable_plugin(CoolPlugin)
  56 +
  57 + get "/api/v1/people/me"
  58 +
  59 + json = JSON.parse(last_response.body)
  60 + assert_equal "zombie", json['person']['name']
  61 + end
53 62  
54 63 should 'limit be defined as the params limit value' do
55 64 local_limit = 30
... ...