Commit 1bafef867058ffb54590687467041ede3e7832a5
1 parent
d2159684
Exists in
send_email_to_admins
and in
5 other branches
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>
Showing
5 changed files
with
56 additions
and
32 deletions
Show diff stats
lib/noosfero/api/helpers.rb
@@ -23,6 +23,7 @@ require_relative '../../find_by_contents' | @@ -23,6 +23,7 @@ require_relative '../../find_by_contents' | ||
23 | def current_user | 23 | def current_user |
24 | private_token = (params[PRIVATE_TOKEN_PARAM] || headers['Private-Token']).to_s | 24 | private_token = (params[PRIVATE_TOKEN_PARAM] || headers['Private-Token']).to_s |
25 | @current_user ||= User.find_by private_token: private_token | 25 | @current_user ||= User.find_by private_token: private_token |
26 | + @current_user ||= plugins.dispatch("api_custom_login", request).first | ||
26 | @current_user | 27 | @current_user |
27 | end | 28 | end |
28 | 29 |
lib/noosfero/plugin.rb
@@ -682,6 +682,10 @@ class Noosfero::Plugin | @@ -682,6 +682,10 @@ class Noosfero::Plugin | ||
682 | {} | 682 | {} |
683 | end | 683 | end |
684 | 684 | ||
685 | + def api_custom_login request | ||
686 | + nil | ||
687 | + end | ||
688 | + | ||
685 | def method_missing(method, *args, &block) | 689 | def method_missing(method, *args, &block) |
686 | # This is a generic hotspot for all controllers on Noosfero. | 690 | # This is a generic hotspot for all controllers on Noosfero. |
687 | # If any plugin wants to define filters to run on any controller, the name of | 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 < Noosfero::Plugin | @@ -8,43 +8,42 @@ class RemoteUserPlugin < Noosfero::Plugin | ||
8 | _("A plugin that add remote user support.") | 8 | _("A plugin that add remote user support.") |
9 | end | 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 | def application_controller_filters | 31 | def application_controller_filters |
12 | block = proc do | 32 | block = proc do |
13 | 33 | ||
14 | begin | 34 | begin |
15 | remote_user = request.headers["HTTP_REMOTE_USER"] | 35 | remote_user = request.headers["HTTP_REMOTE_USER"] |
16 | - user_data = request.env['HTTP_REMOTE_USER_DATA'] | ||
17 | 36 | ||
18 | if remote_user.blank? | 37 | if remote_user.blank? |
19 | self.current_user = nil | 38 | self.current_user = nil |
20 | else | 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 | if !logged_in? | 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 | else | 42 | else |
38 | if remote_user != self.current_user.login | 43 | if remote_user != self.current_user.login |
39 | self.current_user.forget_me | 44 | self.current_user.forget_me |
40 | reset_session | 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 | end | 47 | end |
49 | end | 48 | end |
50 | end | 49 | end |
plugins/remote_user/test/unit/remote_user_plugin_test.rb
0 → 100644
@@ -0,0 +1,11 @@ | @@ -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 < ActiveSupport::TestCase | @@ -41,15 +41,24 @@ class APIHelpersTest < ActiveSupport::TestCase | ||
41 | assert_equal user.person, current_person | 41 | assert_equal user.person, current_person |
42 | end | 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 | should 'limit be defined as the params limit value' do | 63 | should 'limit be defined as the params limit value' do |
55 | local_limit = 30 | 64 | local_limit = 30 |
-
mentioned in commit 3624f9df53f65d5f51ca67d082e3c08cb114c40d