diff --git a/plugins/oauth_client/controllers/public/oauth_client_plugin_public_controller.rb b/plugins/oauth_client/controllers/public/oauth_client_plugin_public_controller.rb index 365b078..7078a21 100644 --- a/plugins/oauth_client/controllers/public/oauth_client_plugin_public_controller.rb +++ b/plugins/oauth_client/controllers/public/oauth_client_plugin_public_controller.rb @@ -2,18 +2,8 @@ class OauthClientPluginPublicController < PublicController def callback auth = request.env["omniauth.auth"] - login = auth.info.email.split('@').first - user = environment.users.find_with_omniauth(auth) - - if user - session[:user] = user - redirect_to :controller => :account, :action => :login - else - session[:oauth_data] = auth - name = auth.info.name - name ||= auth.extra && auth.extra.raw_info ? auth.extra.raw_info.name : '' - redirect_to :controller => :account, :action => :signup, :user => {:login => login, :email => auth.info.email}, :profile_data => {:name => name} - end + user = environment.users.find_by_email(auth.info.email) + user ? login(user) : signup(auth) end def failure @@ -26,4 +16,29 @@ class OauthClientPluginPublicController < PublicController redirect_to root_url end + protected + + def login(user) + provider = OauthClientPlugin::Provider.find(session[:provider_id]) + user_provider = user.oauth_user_providers.find_by_provider_id(provider.id) + unless user_provider + user_provider = user.oauth_user_providers.create(:user => user, :provider => provider, :enabled => true) + end + if user_provider.enabled? + session[:user] = user.id + else + session[:notice] = _("Can't login with #{provider.name}") + end + + redirect_to :controller => :account, :action => :login + end + + def signup(auth) + login = auth.info.email.split('@').first + session[:oauth_data] = auth + name = auth.info.name + name ||= auth.extra && auth.extra.raw_info ? auth.extra.raw_info.name : '' + redirect_to :controller => :account, :action => :signup, :user => {:login => login, :email => auth.info.email}, :profile_data => {:name => name} + end + end diff --git a/plugins/oauth_client/db/migrate/20140828184930_add_settings_to_users.rb b/plugins/oauth_client/db/migrate/20140828184930_add_settings_to_users.rb deleted file mode 100644 index 75ffe1f..0000000 --- a/plugins/oauth_client/db/migrate/20140828184930_add_settings_to_users.rb +++ /dev/null @@ -1,9 +0,0 @@ -class AddSettingsToUsers < ActiveRecord::Migration - def self.up - add_column :users, :settings, :string - end - - def self.down - remove_column :users, :settings - end -end diff --git a/plugins/oauth_client/db/migrate/20141014162710_create_oauth_client_user_providers.rb b/plugins/oauth_client/db/migrate/20141014162710_create_oauth_client_user_providers.rb new file mode 100644 index 0000000..f1223f7 --- /dev/null +++ b/plugins/oauth_client/db/migrate/20141014162710_create_oauth_client_user_providers.rb @@ -0,0 +1,14 @@ +class CreateOauthClientUserProviders < ActiveRecord::Migration + def self.up + create_table :oauth_client_plugin_user_providers do |t| + t.references :user + t.references :provider + t.boolean :enabled + t.timestamps + end + end + + def self.down + drop_table :oauth_client_plugin_user_providers + end +end diff --git a/plugins/oauth_client/lib/ext/user.rb b/plugins/oauth_client/lib/ext/user.rb index f70e20b..f2972a4 100644 --- a/plugins/oauth_client/lib/ext/user.rb +++ b/plugins/oauth_client/lib/ext/user.rb @@ -2,21 +2,11 @@ require_dependency 'user' class User - acts_as_having_settings :field => :settings - - settings_items :oauth_providers, :type => Array, :default => [] - - def self.find_with_omniauth(auth) - user = self.find_by_email(auth.info.email) - if user# && !user.oauth_providers.empty? #FIXME save new oauth providers - user - else - nil - end - end + has_many :oauth_user_providers, :class_name => 'OauthClientPlugin::UserProvider' + has_many :oauth_providers, :through => :oauth_user_providers, :source => :provider def password_required_with_oauth? - password_required_without_oauth? && oauth_providers.blank? + password_required_without_oauth? && oauth_providers.empty? end alias_method_chain :password_required?, :oauth @@ -24,7 +14,12 @@ class User after_create :activate_oauth_user def activate_oauth_user - activate unless oauth_providers.empty? + unless oauth_providers.empty? + activate + oauth_providers.each do |provider| + OauthClientPlugin::UserProvider.create!(:user => self, :provider => provider, :enabled => true) + end + end end def make_activation_code_with_oauth diff --git a/plugins/oauth_client/lib/oauth_client_plugin.rb b/plugins/oauth_client/lib/oauth_client_plugin.rb index 53bcd10..cdde2cb 100644 --- a/plugins/oauth_client/lib/oauth_client_plugin.rb +++ b/plugins/oauth_client/lib/oauth_client_plugin.rb @@ -60,6 +60,8 @@ class OauthClientPlugin < Noosfero::Plugin provider_id = request.session['omniauth.params'] ? request.session['omniauth.params']['id'] : request.params['id'] provider = environment.oauth_providers.find(provider_id) strategy.options.merge!(provider.options.symbolize_keys) + + request.session[:provider_id] = provider_id } provider provider, :setup => setup, @@ -80,7 +82,7 @@ class OauthClientPlugin < Noosfero::Plugin auth = session[:oauth_data] if auth.present? && params[:user].present? - params[:user][:oauth_providers] = [{:provider => auth.provider, :uid => auth.uid}] + params[:user][:oauth_providers] = [OauthClientPlugin::Provider.find(session[:provider_id])] if request.post? && auth.info.email != params[:user][:email] raise "Wrong email for oauth signup" end diff --git a/plugins/oauth_client/lib/oauth_client_plugin/user_provider.rb b/plugins/oauth_client/lib/oauth_client_plugin/user_provider.rb new file mode 100644 index 0000000..77b2bda --- /dev/null +++ b/plugins/oauth_client/lib/oauth_client_plugin/user_provider.rb @@ -0,0 +1,10 @@ +class OauthClientPlugin::UserProvider < Noosfero::Plugin::ActiveRecord + + belongs_to :user, :class_name => 'User' + belongs_to :provider, :class_name => 'OauthClientPlugin::Provider' + + set_table_name :oauth_client_plugin_user_providers + + attr_accessible :user, :provider, :enabled + +end diff --git a/plugins/oauth_client/test/unit/oauth_client_plugin_test.rb b/plugins/oauth_client/test/unit/oauth_client_plugin_test.rb index 98e1cf1..82c21dd 100644 --- a/plugins/oauth_client/test/unit/oauth_client_plugin_test.rb +++ b/plugins/oauth_client/test/unit/oauth_client_plugin_test.rb @@ -9,9 +9,10 @@ class OauthClientPluginTest < ActiveSupport::TestCase @environment = Environment.default @session = {} @request = mock + @provider = OauthClientPlugin::Provider.create!(:name => 'name', :identifier => 'identifier', :strategy => 'strategy') end - attr_reader :params, :plugin, :environment, :session, :request + attr_reader :params, :plugin, :environment, :session, :request, :provider should 'has extra contents for login' do assert plugin.login_extra_contents @@ -41,6 +42,7 @@ class OauthClientPluginTest < ActiveSupport::TestCase oauth_data.stubs(:provider).returns('provider') info.stubs(:email).returns('test@example.com') session[:oauth_data] = oauth_data + session[:provider_id] = provider.id params[:user] = {:email => 'test2@example.com'} assert_raises RuntimeError do @@ -58,6 +60,7 @@ class OauthClientPluginTest < ActiveSupport::TestCase oauth_data.stubs(:provider).returns('provider') info.stubs(:email).returns('test@example.com') session[:oauth_data] = oauth_data + session[:provider_id] = provider.id params[:user] = {:email => 'test@example.com'} instance_eval(&plugin.account_controller_filters[:block]) @@ -74,6 +77,7 @@ class OauthClientPluginTest < ActiveSupport::TestCase oauth_data = mock oauth_data.stubs(:uid).returns('uid') oauth_data.stubs(:provider).returns('provider') + session[:provider_id] = provider.id session[:oauth_data] = oauth_data instance_eval(&plugin.account_controller_filters[:block]) diff --git a/plugins/oauth_client/test/unit/user_test.rb b/plugins/oauth_client/test/unit/user_test.rb index be46ef5..dfab84c 100644 --- a/plugins/oauth_client/test/unit/user_test.rb +++ b/plugins/oauth_client/test/unit/user_test.rb @@ -2,22 +2,13 @@ require File.dirname(__FILE__) + '/../test_helper' class UserTest < ActiveSupport::TestCase - should 'find with omniauth params' do - user = fast_create(User) - user.settings[:oauth_providers] = [:test => {}] - user.save! - auth = {:info => OpenStruct.new({:email => user.email})} - assert_equal user, User.find_with_omniauth(OpenStruct.new(auth)) - end - - should 'do not return user if there is no provider' do - user = fast_create(User) - auth = {:info => OpenStruct.new({:email => user.email})} - assert_equal nil, User.find_with_omniauth(OpenStruct.new(auth)) + def setup + @provider = OauthClientPlugin::Provider.create!(:name => 'name', :identifier => 'identifier', :strategy => 'strategy') end + attr_reader :provider should 'password is not required if there is a oauth provider' do - User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [:test]) + User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [provider]) end should 'password is required if there is a oauth provider' do @@ -27,7 +18,7 @@ class UserTest < ActiveSupport::TestCase end should 'activate user when created with oauth' do - user = User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [:test]) + user = User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [provider]) assert user.activated? end @@ -37,7 +28,7 @@ class UserTest < ActiveSupport::TestCase end should 'not make activation code when created with oauth' do - user = User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [:test]) + user = User.create!(:email => 'testoauth@example.com', :login => 'testoauth', :oauth_providers => [provider]) assert !user.activation_code end -- libgit2 0.21.2