Commit b65258a4ad9fb14970eedcf74352d09b9ff5502c

Authored by Caio Almeida
Committed by Larissa Reis
1 parent 9ccdbb65

Starting federated login

app/concerns/authenticated_system.rb
@@ -25,7 +25,14 @@ module AuthenticatedSystem @@ -25,7 +25,14 @@ module AuthenticatedSystem
25 # Accesses the current user from the session. 25 # Accesses the current user from the session.
26 def current_user user_id = session[:user] 26 def current_user user_id = session[:user]
27 @current_user ||= begin 27 @current_user ||= begin
28 - user = User.find_by id: user_id if user_id 28 + user = nil
  29 + if session[:external]
  30 + user = User.new
  31 + user.external_person_id = session[:external]
  32 + else
  33 + id = session[:user]
  34 + user = User.where(id: id).first if id
  35 + end
29 user.session = session if user 36 user.session = session if user
30 User.current = user 37 User.current = user
31 user 38 user
@@ -37,9 +44,13 @@ module AuthenticatedSystem @@ -37,9 +44,13 @@ module AuthenticatedSystem
37 if new_user.nil? 44 if new_user.nil?
38 session.delete(:user) 45 session.delete(:user)
39 else 46 else
40 - session[:user] = new_user.id 47 + if new_user.id
  48 + session[:user] = new_user.id
  49 + else
  50 + session[:external] = new_user.external_person_id
  51 + end
41 new_user.session = session 52 new_user.session = session
42 - new_user.register_login 53 + new_user.register_login if new_user.id
43 end 54 end
44 @current_user = User.current = new_user 55 @current_user = User.current = new_user
45 end 56 end
app/controllers/application_controller.rb
@@ -8,6 +8,8 @@ class ApplicationController < ActionController::Base @@ -8,6 +8,8 @@ class ApplicationController < ActionController::Base
8 before_filter :allow_cross_domain_access 8 before_filter :allow_cross_domain_access
9 9
10 include AuthenticatedSystem 10 include AuthenticatedSystem
  11 + include ExternalAuthenticatedSystem
  12 +
11 before_filter :require_login_for_environment, :if => :private_environment? 13 before_filter :require_login_for_environment, :if => :private_environment?
12 14
13 before_filter :verify_members_whitelist, :if => [:private_environment?, :user] 15 before_filter :verify_members_whitelist, :if => [:private_environment?, :user]
app/models/user.rb
@@ -8,6 +8,8 @@ class User < ApplicationRecord @@ -8,6 +8,8 @@ class User < ApplicationRecord
8 8
9 attr_accessible :login, :email, :password, :password_confirmation, :activated_at 9 attr_accessible :login, :email, :password, :password_confirmation, :activated_at
10 10
  11 + include ExternalUser
  12 +
11 N_('Password') 13 N_('Password')
12 N_('Password confirmation') 14 N_('Password confirmation')
13 N_('Terms accepted') 15 N_('Terms accepted')
@@ -147,7 +149,8 @@ class User < ApplicationRecord @@ -147,7 +149,8 @@ class User < ApplicationRecord
147 u.generate_private_token_if_not_exist 149 u.generate_private_token_if_not_exist
148 return u 150 return u
149 end 151 end
150 - return nil 152 +
  153 + return User.external_authenticate(login, password, environment)
151 end 154 end
152 155
153 def register_login 156 def register_login
lib/external_user.rb 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +module ExternalUser
  2 + included do
  3 + attr_accessor :external_person_id
  4 + end
  5 +
  6 + def self.webfinger_lookup(login, domain, environment)
  7 + if login && domain && environment.has_federated_network?(domain)
  8 + # Ask if network at <domain> has user with login <login>
  9 + # FIXME: Make an actual request to the federated network, which should return nil if not found
  10 + {
  11 + login: login
  12 + }
  13 + end
  14 + nil
  15 + end
  16 +
  17 + def self.external_login
  18 + # Call Noosfero /api/login
  19 + end
  20 +
  21 + # Authenticates a user from an external social network
  22 + def self.external_authenticate(username, password, environment)
  23 + login, domain = username.split('@')
  24 + webfinger = User.webfinger_lookup(login, domain, environment)
  25 + if webfinger
  26 + user = User.external_login(login, password, domain)
  27 + if user
  28 + u = User.new
  29 + # Set other fields on "u" based on information in "user" returned by API
  30 + u.external_person_id = ExternalPerson.get_or_create(login, domain).id
  31 + return u
  32 + end
  33 + end
  34 + nil
  35 + end
  36 +end