From b65258a4ad9fb14970eedcf74352d09b9ff5502c Mon Sep 17 00:00:00 2001 From: Caio SBA Date: Fri, 22 Apr 2016 09:36:56 -0300 Subject: [PATCH] Starting federated login --- app/concerns/authenticated_system.rb | 17 ++++++++++++++--- app/controllers/application_controller.rb | 2 ++ app/models/user.rb | 5 ++++- lib/external_user.rb | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 lib/external_user.rb diff --git a/app/concerns/authenticated_system.rb b/app/concerns/authenticated_system.rb index db82d73..c08eef2 100644 --- a/app/concerns/authenticated_system.rb +++ b/app/concerns/authenticated_system.rb @@ -25,7 +25,14 @@ module AuthenticatedSystem # Accesses the current user from the session. def current_user user_id = session[:user] @current_user ||= begin - user = User.find_by id: user_id if user_id + user = nil + if session[:external] + user = User.new + user.external_person_id = session[:external] + else + id = session[:user] + user = User.where(id: id).first if id + end user.session = session if user User.current = user user @@ -37,9 +44,13 @@ module AuthenticatedSystem if new_user.nil? session.delete(:user) else - session[:user] = new_user.id + if new_user.id + session[:user] = new_user.id + else + session[:external] = new_user.external_person_id + end new_user.session = session - new_user.register_login + new_user.register_login if new_user.id end @current_user = User.current = new_user end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c4301a9..99a96e2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -8,6 +8,8 @@ class ApplicationController < ActionController::Base before_filter :allow_cross_domain_access include AuthenticatedSystem + include ExternalAuthenticatedSystem + before_filter :require_login_for_environment, :if => :private_environment? before_filter :verify_members_whitelist, :if => [:private_environment?, :user] diff --git a/app/models/user.rb b/app/models/user.rb index ff9255a..8d7ab7e 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -8,6 +8,8 @@ class User < ApplicationRecord attr_accessible :login, :email, :password, :password_confirmation, :activated_at + include ExternalUser + N_('Password') N_('Password confirmation') N_('Terms accepted') @@ -147,7 +149,8 @@ class User < ApplicationRecord u.generate_private_token_if_not_exist return u end - return nil + + return User.external_authenticate(login, password, environment) end def register_login diff --git a/lib/external_user.rb b/lib/external_user.rb new file mode 100644 index 0000000..0bb97db --- /dev/null +++ b/lib/external_user.rb @@ -0,0 +1,36 @@ +module ExternalUser + included do + attr_accessor :external_person_id + end + + def self.webfinger_lookup(login, domain, environment) + if login && domain && environment.has_federated_network?(domain) + # Ask if network at has user with login + # FIXME: Make an actual request to the federated network, which should return nil if not found + { + login: login + } + end + nil + end + + def self.external_login + # Call Noosfero /api/login + end + + # Authenticates a user from an external social network + def self.external_authenticate(username, password, environment) + login, domain = username.split('@') + webfinger = User.webfinger_lookup(login, domain, environment) + if webfinger + user = User.external_login(login, password, domain) + if user + u = User.new + # Set other fields on "u" based on information in "user" returned by API + u.external_person_id = ExternalPerson.get_or_create(login, domain).id + return u + end + end + nil + end +end -- libgit2 0.21.2