diff --git a/lib/sorcery/controller/submodules/external.rb b/lib/sorcery/controller/submodules/external.rb index 40809152..4c0d9505 100644 --- a/lib/sorcery/controller/submodules/external.rb +++ b/lib/sorcery/controller/submodules/external.rb @@ -72,6 +72,10 @@ def access_token(provider) # # And this will cause 'moishe' to be set as the value of :username field. # Note: Be careful. This method skips validations model. + # Instead you can pass a block, if the block returns false the user will not be created + # + # create_from(provider) {|user| user.some_check } + # def create_from(provider) provider = provider.to_sym @provider = Config.send(provider) @@ -91,11 +95,17 @@ def create_from(provider) attrs.each do |k,v| @user.send(:"#{k}=", v) end + + if block_given? + return false unless yield @user + end + @user.save(:validate => false) user_class.sorcery_config.authentications_class.create!({config.authentications_user_id_attribute_name => @user.id, config.provider_attribute_name => provider, config.provider_uid_attribute_name => @user_hash[:uid]}) end @user end + end end end diff --git a/spec/rails3/app/controllers/application_controller.rb b/spec/rails3/app/controllers/application_controller.rb index 14697a58..5b244b0e 100644 --- a/spec/rails3/app/controllers/application_controller.rb +++ b/spec/rails3/app/controllers/application_controller.rb @@ -186,6 +186,20 @@ def test_create_from_provider redirect_to "blu", :alert => "Failed!" end end + + def test_create_from_provider_with_block + provider = params[:provider] + login_from(provider) + @user = create_from(provider) do |user| + # check uniqueness of username + User.where(:username => user.username).empty? + end + if @user + redirect_to "bla", :notice => "Success!" + else + redirect_to "blu", :alert => "Failed!" + end + end protected diff --git a/spec/rails3_mongo_mapper/app/controllers/application_controller.rb b/spec/rails3_mongo_mapper/app/controllers/application_controller.rb index 726711c7..24186b52 100644 --- a/spec/rails3_mongo_mapper/app/controllers/application_controller.rb +++ b/spec/rails3_mongo_mapper/app/controllers/application_controller.rb @@ -101,6 +101,20 @@ def test_create_from_provider end end + def test_create_from_provider_with_block + provider = params[:provider] + login_from(provider) + @user = create_from(provider) do |user| + # check uniqueness of username + User.where(:username => user.username).empty? + end + if @user + redirect_to "bla", :notice => "Success!" + else + redirect_to "blu", :alert => "Failed!" + end + end + protected diff --git a/spec/rails3_mongoid/app/controllers/application_controller.rb b/spec/rails3_mongoid/app/controllers/application_controller.rb index 9e78172d..4408e963 100644 --- a/spec/rails3_mongoid/app/controllers/application_controller.rb +++ b/spec/rails3_mongoid/app/controllers/application_controller.rb @@ -106,6 +106,20 @@ def test_create_from_provider end end + def test_create_from_provider_with_block + provider = params[:provider] + login_from(provider) + @user = create_from(provider) do |user| + # check uniqueness of username + User.where(:username => user.username).empty? + end + if @user + redirect_to "bla", :notice => "Success!" + else + redirect_to "blu", :alert => "Failed!" + end + end + protected diff --git a/spec/shared_examples/controller_oauth2_shared_examples.rb b/spec/shared_examples/controller_oauth2_shared_examples.rb index 36147618..cf4bd2cb 100644 --- a/spec/shared_examples/controller_oauth2_shared_examples.rb +++ b/spec/shared_examples/controller_oauth2_shared_examples.rb @@ -32,6 +32,25 @@ end.should change(User, :count).by(1) User.first.username.should == "Noam Ben Ari" User.first.created_at.should_not be_nil - end + end + + describe "with a block" do + + before(:each) do + user = User.new(:username => 'Noam Ben Ari') + user.save!(:validate => false) + user.authentications.create(:provider => 'twitter', :uid => '456') + end + + it "should not create user" do + sorcery_model_property_set(:authentications_class, Authentication) + sorcery_controller_external_property_set(:facebook, :user_info_mapping, {:username => "name"}) + lambda do + # test_create_from_provider_with_block in controller will check for uniqueness of username + get :test_create_from_provider_with_block, :provider => "facebook" + end.should_not change(User, :count) + end + + end end end \ No newline at end of file diff --git a/spec/shared_examples/controller_oauth_shared_examples.rb b/spec/shared_examples/controller_oauth_shared_examples.rb index b4fce07b..ff526f03 100644 --- a/spec/shared_examples/controller_oauth_shared_examples.rb +++ b/spec/shared_examples/controller_oauth_shared_examples.rb @@ -33,5 +33,23 @@ User.first.username.should == "coming soon to sorcery gem: twitter and facebook authentication support." User.first.created_at.should_not be_nil end + + describe "with a block" do + + before(:each) do + user = User.new(:username => 'nbenari') + user.save!(:validate => false) + user.authentications.create(:provider => 'github', :uid => '456') + end + + it "should not create user" do + sorcery_model_property_set(:authentications_class, Authentication) + sorcery_controller_external_property_set(:twitter, :user_info_mapping, {:username => "screen_name"}) + lambda do + get :test_create_from_provider_with_block, :provider => "twitter" + end.should_not change(User, :count) + end + + end end end \ No newline at end of file