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 5c078d2..ead96eb 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 @@ -40,12 +40,13 @@ class OauthClientPluginPublicController < PublicController person = ExternalPerson.get_or_create(webfinger) user.external_person_id = person.id - if person.oauth_auth.nil? + oauth_auth = person.oauth_auth + if oauth_auth.nil? auth_data = { external_person: person, provider: provider, enabled: true, external_person_uid: auth.uid, external_person_image_url: auth.info.image } - OauthClientPlugin::Auth.create_for_strategy(provider.strategy, auth_data) + oauth_auth = OauthClientPlugin::Auth.create_for_strategy(provider.strategy, auth_data) end - self.current_user = user + self.current_user = user if oauth_auth.enabled? else session[:notice] = _("Can't login with %s") % provider.name end diff --git a/plugins/oauth_client/models/oauth_client_plugin/auth.rb b/plugins/oauth_client/models/oauth_client_plugin/auth.rb index 11db685..bf99049 100644 --- a/plugins/oauth_client/models/oauth_client_plugin/auth.rb +++ b/plugins/oauth_client/models/oauth_client_plugin/auth.rb @@ -38,7 +38,7 @@ class OauthClientPlugin::Auth < ApplicationRecord def must_be_related_to_profile if self.profile.nil? && self.external_person.nil? - self.errors.add(:base, "Must ") + self.errors.add(:base, "Must be related to a profile or an external person") end end @@ -50,9 +50,16 @@ class OauthClientPlugin::Auth < ApplicationRecord :icon => "18" } - # Should be implemented by the Provider specific Auth classes + # The following methods should be implemented by + # the Provider specific Auth classes def image_url(size = nil) nil end + def profile_url + nil + end + def settings_url + nil + end end diff --git a/plugins/oauth_client/test/functional/oauth_client_plugin_public_controller_test.rb b/plugins/oauth_client/test/functional/oauth_client_plugin_public_controller_test.rb index d85b2b8..f7b7bfe 100644 --- a/plugins/oauth_client/test/functional/oauth_client_plugin_public_controller_test.rb +++ b/plugins/oauth_client/test/functional/oauth_client_plugin_public_controller_test.rb @@ -5,76 +5,70 @@ class OauthClientPluginPublicControllerTest < ActionController::TestCase def setup @auth = mock @auth.stubs(:info).returns(mock) + @auth.info.stubs(:email).returns("user@email.com") + @auth.info.stubs(:name).returns("User") + @auth.info.stubs(:nickname).returns("user") + @auth.info.stubs(:image).returns("url.to.image.com") + @auth.stubs(:provider).returns("testprovider") + @auth.stubs(:uid).returns("jh12j3h12kjh312") + request.env["omniauth.auth"] = @auth @environment = Environment.default - @provider = OauthClientPlugin::Provider.create!(:name => 'provider', :strategy => 'provider', :enabled => true) + @provider = OauthClientPlugin::Provider.create!(:name => 'provider', :strategy => 'github', :enabled => true) + + session[:provider_id] = provider.id end attr_reader :auth, :environment, :provider should 'redirect to signup when user is not found' do - auth.info.stubs(:email).returns("xyz123@noosfero.org") - auth.info.stubs(:name).returns('xyz123') - session[:provider_id] = provider.id - get :callback assert_match /.*\/account\/signup/, @response.redirect_url end - should 'redirect to login when user is found' do - user = create_user - auth.info.stubs(:email).returns(user.email) - auth.info.stubs(:name).returns(user.name) - session[:provider_id] = provider.id + should 'login using provider when url param is present' do + request.env["omniauth.params"] = {"action" => "external_login"} get :callback assert_redirected_to :controller => :account, :action => :login - assert_equal user.id, session[:user] + assert session[:external].present? end - should 'do not login when the provider is disabled' do - user = create_user - auth.info.stubs(:email).returns(user.email) - auth.info.stubs(:name).returns(user.name) - session[:provider_id] = provider.id + should 'not login when the provider is disabled' do + request.env["omniauth.params"] = {"action" => "external_login"} provider.update_attribute(:enabled, false) get :callback assert_redirected_to :controller => :account, :action => :login - assert_equal nil, session[:user] + assert session[:external].nil? end - should 'do not login when the provider is disabled for a user' do - user = create_user - auth.info.stubs(:email).returns(user.email) - auth.info.stubs(:name).returns(user.name) - session[:provider_id] = provider.id - user.person.oauth_auths.create!(profile: user.person, provider: provider, enabled: false) + should 'not login when the provider is disabled for a user' do + request.env["omniauth.params"] = {"action" => "external_login"} + OauthClientPlugin::GithubAuth.any_instance.stubs(:enabled?).returns(false) get :callback assert_redirected_to :controller => :account, :action => :login - assert_equal nil, session[:user] + assert session[:external].nil? end - should 'save provider when an user login with it' do - user = create_user - auth.info.stubs(:email).returns(user.email) - auth.info.stubs(:name).returns(user.name) - session[:provider_id] = provider.id - - get :callback - assert_equal [provider], user.oauth_providers - end - - should 'do not duplicate relations between an user and a provider when the same provider was used again in a login' do - user = create_user - auth.info.stubs(:email).returns(user.email) - auth.info.stubs(:name).returns(user.name) - session[:provider_id] = provider.id + should 'save provider when an external person logs in with it' do + request.env["omniauth.params"] = {"action" => "external_login"} get :callback - assert_no_difference 'user.oauth_auths.count' do - 3.times { get :callback } - end + external_person = ExternalPerson.find_by(identifier: auth.info.nickname) + assert_equal provider, external_person.oauth_auth.provider end +# should 'do not duplicate relations between an user and a provider when the same provider was used again in a login' do +# user = create_user +# auth.info.stubs(:email).returns(user.email) +# auth.info.stubs(:name).returns(user.name) +# session[:provider_id] = provider.id +# +# get :callback +# assert_no_difference 'user.oauth_auths.count' do +# 3.times { get :callback } +# end +# end +# end diff --git a/plugins/oauth_client/test/unit/auth_test.rb b/plugins/oauth_client/test/unit/auth_test.rb new file mode 100644 index 0000000..4248425 --- /dev/null +++ b/plugins/oauth_client/test/unit/auth_test.rb @@ -0,0 +1,33 @@ +require 'test_helper' + +class AuthTest < ActiveSupport::TestCase + + def setup + @person = fast_create(Person) + @provider = fast_create(OauthClientPlugin::Provider, name: "GitHub") + @external_person = fast_create(ExternalPerson, name: "testuser", email: "test@email,com") + end + + should "not create an auth without a related profile or external person" do + auth = OauthClientPlugin::Auth.new(provider: @provider) + assert_not auth.valid? + end + + should "create an auth with an external person" do + auth = OauthClientPlugin::Auth.create!(external_person: @external_person, provider: @provider) + assert auth.id.present? + end + + should "create an auth with a profile" do + auth = OauthClientPlugin::Auth.create!(profile: @person, provider: @provider) + assert auth.id.present? + end + + should "create an auth for a custom provider" do + auth = OauthClientPlugin::Auth.create_for_strategy("github", provider: @provider, + profile: @person) + assert auth.id.present? + assert auth.is_a? OauthClientPlugin::GithubAuth + end + +end -- libgit2 0.21.2