From a651debcf71483e4d8042e57608bd948048f489d Mon Sep 17 00:00:00 2001 From: Gabriel Silva Date: Tue, 9 Aug 2016 19:31:08 +0000 Subject: [PATCH] Fixes ExternalUser info override --- plugins/oauth_client/controllers/public/oauth_client_plugin_public_controller.rb | 8 ++++---- plugins/oauth_client/db/migrate/20160809181708_adds_type_to_external_person.rb | 9 +++++++++ plugins/oauth_client/lib/ext/external_person.rb | 38 -------------------------------------- plugins/oauth_client/models/oauth_client_plugin/oauth_external_person.rb | 35 +++++++++++++++++++++++++++++++++++ plugins/oauth_client/test/functional/oauth_client_plugin_public_controller_test.rb | 2 +- plugins/oauth_client/test/unit/oauth_external_person_test.rb | 31 +++++++++++++++++++++++++++++++ plugins/oauth_client/test/unit/provider_test.rb | 2 +- 7 files changed, 81 insertions(+), 44 deletions(-) create mode 100644 plugins/oauth_client/db/migrate/20160809181708_adds_type_to_external_person.rb delete mode 100644 plugins/oauth_client/lib/ext/external_person.rb create mode 100644 plugins/oauth_client/models/oauth_client_plugin/oauth_external_person.rb create mode 100644 plugins/oauth_client/test/unit/oauth_external_person_test.rb 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 c60819a..35a3837 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 @@ -30,13 +30,13 @@ class OauthClientPluginPublicController < PublicController provider = OauthClientPlugin::Provider.find(session[:provider_id]) user = User.new(email: auth_data.info.email, login: auth_data.info.name.to_slug) - person_data = OpenStruct.new( + person = OauthClientPlugin::OauthExternalPerson.find_or_create_by( identifier: auth_data.info.nickname || user.login, name: auth_data.info.name, created_at: Time.now, - domain: provider.site || auth_data.provider, - email: user.email) - person = ExternalPerson.get_or_create(person_data) + source: provider.site || auth_data.provider, + email: user.email + ) user.external_person_id = person.id oauth_auth = person.oauth_auth diff --git a/plugins/oauth_client/db/migrate/20160809181708_adds_type_to_external_person.rb b/plugins/oauth_client/db/migrate/20160809181708_adds_type_to_external_person.rb new file mode 100644 index 0000000..402c1b6 --- /dev/null +++ b/plugins/oauth_client/db/migrate/20160809181708_adds_type_to_external_person.rb @@ -0,0 +1,9 @@ +class AddsTypeToExternalPerson < ActiveRecord::Migration + def up + add_column :external_people, :type, :string + end + + def down + remove_column :external_people, :type + end +end diff --git a/plugins/oauth_client/lib/ext/external_person.rb b/plugins/oauth_client/lib/ext/external_person.rb deleted file mode 100644 index 469e736..0000000 --- a/plugins/oauth_client/lib/ext/external_person.rb +++ /dev/null @@ -1,38 +0,0 @@ -require_dependency 'external_person' - -class ExternalPerson - - has_one :oauth_auth, as: :profile, class_name: 'OauthClientPlugin::Auth', dependent: :destroy - has_one :oauth_provider, through: :oauth_auth, source: :provider - - def avatar - self.oauth_auth.image_url - end - - def image - ExternalPerson::Image.new(self.oauth_auth) - end - - def public_profile_url - self.oauth_auth.profile_url - end - - def url - self.oauth_auth.profile_url - end - - def admin_url - self.oauth_auth.settings_url - end - - class ExternalPerson::Image - def initialize(oauth_auth) - @oauth_auth = oauth_auth - end - - def public_filename(size = nil) - URI(@oauth_auth.image_url(size)) - end - end - -end diff --git a/plugins/oauth_client/models/oauth_client_plugin/oauth_external_person.rb b/plugins/oauth_client/models/oauth_client_plugin/oauth_external_person.rb new file mode 100644 index 0000000..5e885e3 --- /dev/null +++ b/plugins/oauth_client/models/oauth_client_plugin/oauth_external_person.rb @@ -0,0 +1,35 @@ +class OauthClientPlugin::OauthExternalPerson < ExternalPerson + + has_one :oauth_auth, as: :profile, class_name: 'OauthClientPlugin::Auth', dependent: :destroy + has_one :oauth_provider, through: :oauth_auth, source: :provider + + def avatar + self.oauth_auth.image_url + end + + def image + OauthClientPlugin::OauthExternalPerson::Image.new(self.oauth_auth) + end + + def public_profile_url + self.oauth_auth.profile_url + end + + def url + self.oauth_auth.profile_url + end + + def admin_url + self.oauth_auth.settings_url + end + + class OauthClientPlugin::OauthExternalPerson::Image < ExternalPerson::Image + def initialize(oauth_auth) + @oauth_auth = oauth_auth + end + + def public_filename(size = nil) + URI(@oauth_auth.image_url(size)) + end + 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 77bfc3b..c339b09 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 @@ -95,7 +95,7 @@ class OauthClientPluginPublicControllerTest < ActionController::TestCase request.env["omniauth.params"] = {"action" => "external_login"} get :callback - external_person = ExternalPerson.find_by(identifier: auth.info.nickname) + external_person = OauthClientPlugin::OauthExternalPerson.find_by(identifier: auth.info.nickname) assert_equal provider, external_person.oauth_auth.provider end end diff --git a/plugins/oauth_client/test/unit/oauth_external_person_test.rb b/plugins/oauth_client/test/unit/oauth_external_person_test.rb new file mode 100644 index 0000000..2b32b0e --- /dev/null +++ b/plugins/oauth_client/test/unit/oauth_external_person_test.rb @@ -0,0 +1,31 @@ + +require 'test_helper' + +class OauthExternalPersonTest < ActiveSupport::TestCase + + def setup + provider = fast_create(OauthClientPlugin::Provider, name: "GitHub") + @external_person = fast_create(ExternalPerson, name: "testuser", email: "test@email.com", + identifier: "testuser") + OauthClientPlugin::GithubAuth.create!(profile: @external_person, provider: provider) + + @oauth_external_person = fast_create(OauthClientPlugin::OauthExternalPerson, + name: "testuser", email: "test@email.com", + identifier: "testuser") + OauthClientPlugin::GithubAuth.create!(profile: @oauth_external_person, + provider: provider) + end + + should "not orverride info from a regular external person" do + assert_not_equal @external_person.avatar, @oauth_external_person.avatar + assert_not_equal @external_person.url, @oauth_external_person.url + assert_not_equal @external_person.admin_url, @oauth_external_person.admin_url + assert_not_equal @external_person.public_profile_url, + @oauth_external_person.public_profile_url + end + + should "not override the Image class from a regular external person" do + assert @external_person.image.is_a? ExternalPerson::Image + assert @oauth_external_person.image.is_a? OauthClientPlugin::OauthExternalPerson::Image + end +end diff --git a/plugins/oauth_client/test/unit/provider_test.rb b/plugins/oauth_client/test/unit/provider_test.rb index 4377916..c2948fc 100644 --- a/plugins/oauth_client/test/unit/provider_test.rb +++ b/plugins/oauth_client/test/unit/provider_test.rb @@ -2,7 +2,7 @@ require 'test_helper' class ProviderTest < ActiveSupport::TestCase - should "only create a noosfero provider without a site" do + should "only create a noosfero provider with a site" do provider = OauthClientPlugin::Provider.new(:name => 'noosfero', :strategy => 'noosfero_oauth2') assert_not provider.valid? -- libgit2 0.21.2