devise_g5_authenticatable 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e6178bfffa50bb6940208406f65192bc3fa8e8e
4
- data.tar.gz: 36ae13c7b26dfc6af43a26cb6c22f36e0c93e2a9
3
+ metadata.gz: c21c4321163499661d4fd43789dfcff59c38d10a
4
+ data.tar.gz: 7ae73de16b05661c29a0a092da8191b2242f442b
5
5
  SHA512:
6
- metadata.gz: cd3303525818dea3add1c492fd6dc45500240fb308d1f098dae9966601735bb730ddb93f646cef8c9bdcaf35f31b8d878d2a288074fd8a5925a68b52bf772713
7
- data.tar.gz: 4656dcac40c6697ab9bc249660848bd207b5a8f948c85b1ba3b9c6f2c8ec89ae312e604eec5f5dd86e15515820fb00d70d131d39f1332019173e7d7cbdb83ae0
6
+ metadata.gz: d75544ee10f7e7749c4f7b7a95504b76ff015d9bfc74dd168f7c369135c61d386622738f102843c20ff9c61f6872379688b20a09b187cbcb20f181645dbf2947
7
+ data.tar.gz: e73c4a027bdbfa89f39078becfe6f15dd1c6931da06222e3f6456114c7eec55391ba23c87fe44215d2593e7b76a2f6eba85777c9c96ae0c2e69edc15367bd161
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.1.0
1
+ 2.1.2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## v0.1.1 (2014-07-31)
2
+ * Find a user by email when a duplicate email exception is returned from
3
+ user creation.
4
+
1
5
  ## v0.1.0 (2014-03-12)
2
6
 
3
7
  * Move `rake g5:export_users` from
data/Gemfile CHANGED
@@ -4,9 +4,10 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  # Dependencies for the dummy test app
7
- gem 'rails', '~> 3.2.15'
7
+ gem 'rails', '4.1.4'
8
8
  gem 'jquery-rails'
9
9
  gem 'pg'
10
+ gem 'protected_attributes'
10
11
 
11
12
  group :test, :development do
12
13
  gem 'rspec-rails', '~> 2.14'
@@ -18,6 +19,6 @@ group :test do
18
19
  gem 'simplecov'
19
20
  gem 'codeclimate-test-reporter'
20
21
  gem 'webmock'
21
- gem 'shoulda-matchers'
22
+ gem 'shoulda-matchers', '~> 2.6'
22
23
  gem 'factory_girl_rails', '~> 4.3', require: false
23
24
  end
data/circle.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  database:
2
2
  override:
3
3
  - cp spec/dummy/config/database.yml.ci spec/dummy/config/database.yml
4
- - RAILS_ENV=test rake app:db:setup
4
+ - RAILS_ENV=test bundle exec rake app:db:setup
@@ -15,9 +15,19 @@ module Devise
15
15
 
16
16
  private
17
17
  def create_auth_user
18
- auth_user = auth_client.create_user(auth_user_args)
19
18
  set_auth_attributes(auth_user)
20
- auth_user
19
+ end
20
+
21
+ def auth_user
22
+ begin
23
+ auth_client.create_user(auth_user_args)
24
+ rescue StandardError => e
25
+ if e.message =~ /Email has already been taken/
26
+ auth_client.find_user_by_email(model.email)
27
+ else
28
+ raise e
29
+ end
30
+ end
21
31
  end
22
32
 
23
33
  def auth_user_exists?
@@ -42,6 +52,7 @@ module Devise
42
52
  model.provider = 'g5'
43
53
  model.uid = auth_user.id
44
54
  model.clean_up_passwords
55
+ model
45
56
  end
46
57
  end
47
58
  end
@@ -1,3 +1,3 @@
1
1
  module DeviseG5Authenticatable
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
@@ -4,7 +4,4 @@ class User < ActiveRecord::Base
4
4
  # :confirmable, :lockable, :timeoutable and :omniauthable
5
5
  devise :registerable, :trackable, :validatable,
6
6
  :g5_authenticatable
7
-
8
- # Setup accessible (or protected) attributes for your model
9
- # attr_accessible :title, :body
10
7
  end
@@ -4,7 +4,6 @@ require File.expand_path('../boot', __FILE__)
4
4
  require 'active_record/railtie'
5
5
  require 'action_controller/railtie'
6
6
  require 'action_mailer/railtie'
7
- require 'active_resource/railtie'
8
7
  require 'sprockets/railtie'
9
8
 
10
9
  Bundler.require(*Rails.groups)
@@ -49,12 +48,6 @@ module Dummy
49
48
  # like if you have constraints or database-specific column types
50
49
  # config.active_record.schema_format = :sql
51
50
 
52
- # Enforce whitelist mode for mass assignment.
53
- # This will create an empty whitelist of attributes available for mass-assignment for all models
54
- # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
55
- # parameters by using an attr_accessible or attr_protected declaration.
56
- config.active_record.whitelist_attributes = true
57
-
58
51
  # Enable the asset pipeline
59
52
  config.assets.enabled = true
60
53
 
@@ -6,9 +6,6 @@ Dummy::Application.configure do
6
6
  # since you don't have to restart the web server when you make code changes.
7
7
  config.cache_classes = false
8
8
 
9
- # Log error messages when you accidentally call methods on nil.
10
- config.whiny_nils = true
11
-
12
9
  # Show full error reports and disable caching
13
10
  config.consider_all_requests_local = true
14
11
  config.action_controller.perform_caching = false
@@ -21,19 +18,15 @@ Dummy::Application.configure do
21
18
  # Print deprecation notices to the Rails logger
22
19
  config.active_support.deprecation = :log
23
20
 
24
- # Only use best-standards-support built into browsers
25
- config.action_dispatch.best_standards_support = :builtin
26
-
27
- # Raise exception on mass assignment protection for Active Record models
28
- config.active_record.mass_assignment_sanitizer = :strict
29
-
30
21
  # Log the query plan for queries taking more than this (works
31
22
  # with SQLite, MySQL, and PostgreSQL)
32
23
  config.active_record.auto_explain_threshold_in_seconds = 0.5
33
24
 
34
25
  # Do not compress assets
35
- config.assets.compress = false
26
+ config.assets.js_compressor = nil
36
27
 
37
28
  # Expands the lines which load the assets
38
29
  config.assets.debug = true
30
+
31
+ config.eager_load = false
39
32
  end
@@ -11,9 +11,6 @@ Dummy::Application.configure do
11
11
  config.serve_static_assets = true
12
12
  config.static_cache_control = "public, max-age=3600"
13
13
 
14
- # Log error messages when you accidentally call methods on nil
15
- config.whiny_nils = true
16
-
17
14
  # Show full error reports and disable caching
18
15
  config.consider_all_requests_local = true
19
16
  config.action_controller.perform_caching = false
@@ -29,9 +26,8 @@ Dummy::Application.configure do
29
26
  # ActionMailer::Base.deliveries array.
30
27
  config.action_mailer.delivery_method = :test
31
28
 
32
- # Raise exception on mass assignment protection for Active Record models
33
- config.active_record.mass_assignment_sanitizer = :strict
34
-
35
29
  # Print deprecation notices to the stderr
36
30
  config.active_support.deprecation = :stderr
31
+
32
+ config.eager_load = false
37
33
  end
@@ -21,6 +21,10 @@ Devise.setup do |config|
21
21
  # available as additional gems.
22
22
  require 'devise/orm/active_record'
23
23
 
24
+ # Require optional support for protected_attributes in devise
25
+ # models
26
+ require 'devise_g5_authenticatable/models/protected_attributes'
27
+
24
28
  # ==> Configuration for any authentication mechanism
25
29
  # Configure which keys are used when authenticating a user. The default is
26
30
  # just :email. You can configure it to use [:username, :subdomain], so for
@@ -5,3 +5,4 @@
5
5
  # Make sure the secret is at least 30 characters and all random,
6
6
  # no regular words or you'll be exposed to dictionary attacks.
7
7
  Dummy::Application.config.secret_token = '647a56085c4f52cc5e906029f424ff1fa1d118d66800fb131b28c7ef7467f379f253ec847cc15af0036a8c55a4c547c9ef73d09d17bf00f9ecbd6823e90edbae'
8
+ Dummy::Application.config.secret_key_base = '77ca04658d54f9b0e5ec8d6331964640bb6237e145d03031b88a0186a13cb584b6e5031e6956ba23f37941a216f91387b6f1b9999eae0fb0ba598d798fa58367'
@@ -7,8 +7,3 @@
7
7
  ActiveSupport.on_load(:action_controller) do
8
8
  wrap_parameters format: [:json]
9
9
  end
10
-
11
- # Disable root element in JSON by default.
12
- ActiveSupport.on_load(:active_record) do
13
- self.include_root_in_json = false
14
- end
@@ -76,7 +76,7 @@ describe 'User registration' do
76
76
  let(:password_confirmation) { 'something else entirely' }
77
77
 
78
78
  it_should_behave_like 'a registration validation error' do
79
- let(:error_message) { "Password doesn't match confirmation" }
79
+ let(:error_message) { "Password confirmation doesn't match" }
80
80
  end
81
81
  end
82
82
 
@@ -16,84 +16,104 @@ describe Devise::G5::AuthUserCreator do
16
16
  let(:password) { 'new password' }
17
17
  let(:password_confirmation) { 'new password confirmation' }
18
18
 
19
- let(:auth_client) { double(:g5_authentication_client, create_user: auth_user) }
20
- let(:auth_user) { double(:auth_user, id: uid, email: model.email) }
19
+ let(:auth_client) { double(:g5_authentication_client) }
20
+ let(:auth_user) { double(:auth_user, id: uid, email: model.email, clean_up_passwords: nil) }
21
21
  let(:uid) { 'remote-auth-user-42' }
22
+
22
23
  before do
23
24
  allow(G5AuthenticationClient::Client).to receive(:new).and_return(auth_client)
24
25
  end
25
26
 
26
- context 'when the new model has no uid' do
27
- before { model.uid = nil }
27
+ context 'when there is an existing auth user' do
28
+ before do
29
+ model.uid = nil
30
+ allow(auth_client).to receive(:create_user).and_raise(StandardError.new('Email has already been taken'))
31
+ allow(auth_client).to receive(:find_user_by_email).and_return(auth_user)
32
+ create
33
+ end
28
34
 
29
- context 'when updated by an existing user' do
30
- let(:updated_by) { build_stubbed(:user) }
35
+ it 'should create the local user with the existing uid' do
36
+ expect(model.uid).to eq(uid)
37
+ end
38
+ end
31
39
 
32
- before { create }
40
+ context 'when there is no existing auth user' do
41
+ before do
42
+ allow(auth_client).to receive(:create_user).and_return(auth_user)
43
+ end
33
44
 
34
- it 'should use the token for updated_by user to call g5 auth' do
35
- expect(G5AuthenticationClient::Client).to have_received(:new).
36
- with(access_token: updated_by.g5_access_token)
37
- end
45
+ context 'when the new model has no uid' do
46
+ before { model.uid = nil }
38
47
 
39
- it 'should create a new auth user with the correct email' do
40
- expect(auth_client).to have_received(:create_user).
41
- with(hash_including(email: model.email))
42
- end
48
+ context 'when updated by an existing user' do
49
+ let(:updated_by) { build_stubbed(:user) }
43
50
 
44
- it 'should create a new auth user with the correct password' do
45
- expect(auth_client).to have_received(:create_user).
46
- with(hash_including(password: password))
47
- end
51
+ before { create }
48
52
 
49
- it 'should create a new auth user with the correct password confirmation' do
50
- expect(auth_client).to have_received(:create_user).
51
- with(hash_including(password_confirmation: password_confirmation))
52
- end
53
+ it 'should use the token for updated_by user to call g5 auth' do
54
+ expect(G5AuthenticationClient::Client).to have_received(:new).
55
+ with(access_token: updated_by.g5_access_token)
56
+ end
53
57
 
54
- it 'should reset the password' do
55
- expect(model.password).to be_nil
56
- end
58
+ it 'should create a new auth user with the correct email' do
59
+ expect(auth_client).to have_received(:create_user).
60
+ with(hash_including(email: model.email))
61
+ end
57
62
 
58
- it 'should reset the password_confirmation' do
59
- expect(model.password_confirmation).to be_nil
60
- end
61
- end
63
+ it 'should create a new auth user with the correct password' do
64
+ expect(auth_client).to have_received(:create_user).
65
+ with(hash_including(password: password))
66
+ end
62
67
 
63
- context 'when auth service returns an error' do
64
- before do
65
- allow(auth_client).to receive(:create_user).and_raise('Error!')
68
+ it 'should create a new auth user with the correct password confirmation' do
69
+ expect(auth_client).to have_received(:create_user).
70
+ with(hash_including(password_confirmation: password_confirmation))
71
+ end
72
+
73
+ it 'should reset the password' do
74
+ expect(model.password).to be_nil
75
+ end
76
+
77
+ it 'should reset the password_confirmation' do
78
+ expect(model.password_confirmation).to be_nil
79
+ end
66
80
  end
67
81
 
68
- it 'should raise an exception' do
69
- expect { create }.to raise_error('Error!')
82
+ context 'when auth service returns an error' do
83
+ before do
84
+ allow(auth_client).to receive(:create_user).and_raise('Error!')
85
+ end
86
+
87
+ it 'should raise an exception' do
88
+ expect { create }.to raise_error('Error!')
89
+ end
70
90
  end
71
- end
72
91
 
73
- context 'when not updated by an existing user' do
74
- before { create }
92
+ context 'when not updated by an existing user' do
93
+ before { create }
75
94
 
76
- it 'should use the user token to call g5 auth' do
77
- expect(G5AuthenticationClient::Client).to have_received(:new).
78
- with(access_token: model.g5_access_token)
95
+ it 'should use the user token to call g5 auth' do
96
+ expect(G5AuthenticationClient::Client).to have_received(:new).
97
+ with(access_token: model.g5_access_token)
98
+ end
79
99
  end
80
100
  end
81
- end
82
101
 
83
- context 'when new model already has a uid' do
84
- before { model.uid = 'remote-user-42' }
85
- before { create }
102
+ context 'when new model already has a uid' do
103
+ before { model.uid = 'remote-user-42' }
104
+ before { create }
86
105
 
87
- it 'should not create a user' do
88
- expect(auth_client).to_not have_received(:create_user)
89
- end
106
+ it 'should not create a user' do
107
+ expect(auth_client).to_not have_received(:create_user)
108
+ end
90
109
 
91
- it 'should not reset the password' do
92
- expect(model.password).to_not be_blank
93
- end
110
+ it 'should not reset the password' do
111
+ expect(model.password).to_not be_blank
112
+ end
94
113
 
95
- it 'should not reset the password_confirmation' do
96
- expect(model.password_confirmation).to_not be_blank
114
+ it 'should not reset the password_confirmation' do
115
+ expect(model.password_confirmation).to_not be_blank
116
+ end
97
117
  end
98
118
  end
99
119
  end
@@ -1,6 +1,14 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe DeviseG5Authenticatable::Models::ProtectedAttributes do
4
+ before do
5
+ Dummy::Application.config.active_record.whitelist_attributes = true
6
+ end
7
+
8
+ after do
9
+ Dummy::Application.config.active_record.whitelist_attributes = false
10
+ end
11
+
4
12
  subject { model }
5
13
 
6
14
  let(:model_class) { User }
data/spec/spec_helper.rb CHANGED
@@ -41,4 +41,6 @@ RSpec.configure do |config|
41
41
  # config.filter_run_excluding type: 'feature'
42
42
 
43
43
  config.after(:suite) { WebMock.disable! }
44
+
45
+ config.infer_spec_type_from_file_location!
44
46
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise_g5_authenticatable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maeve Revels
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-12 00:00:00.000000000 Z
11
+ date: 2014-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: devise
@@ -102,7 +102,7 @@ files:
102
102
  - spec/dummy/app/assets/stylesheets/custom_sessions.css
103
103
  - spec/dummy/app/assets/stylesheets/home.css
104
104
  - spec/dummy/app/controllers/application_controller.rb
105
- - spec/dummy/app/controllers/custom_registrations_controllers.rb
105
+ - spec/dummy/app/controllers/custom_registrations_controller.rb
106
106
  - spec/dummy/app/controllers/custom_sessions_controller.rb
107
107
  - spec/dummy/app/controllers/home_controller.rb
108
108
  - spec/dummy/app/helpers/application_helper.rb
@@ -121,7 +121,6 @@ files:
121
121
  - spec/dummy/config/database.yml.sample
122
122
  - spec/dummy/config/environment.rb
123
123
  - spec/dummy/config/environments/development.rb
124
- - spec/dummy/config/environments/production.rb
125
124
  - spec/dummy/config/environments/test.rb
126
125
  - spec/dummy/config/initializers/backtrace_silencers.rb
127
126
  - spec/dummy/config/initializers/devise.rb
@@ -197,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
196
  version: '0'
198
197
  requirements: []
199
198
  rubyforge_project:
200
- rubygems_version: 2.2.0
199
+ rubygems_version: 2.2.2
201
200
  signing_key:
202
201
  specification_version: 4
203
202
  summary: Devise extension for the G5 Auth service
@@ -216,7 +215,7 @@ test_files:
216
215
  - spec/dummy/app/assets/stylesheets/custom_sessions.css
217
216
  - spec/dummy/app/assets/stylesheets/home.css
218
217
  - spec/dummy/app/controllers/application_controller.rb
219
- - spec/dummy/app/controllers/custom_registrations_controllers.rb
218
+ - spec/dummy/app/controllers/custom_registrations_controller.rb
220
219
  - spec/dummy/app/controllers/custom_sessions_controller.rb
221
220
  - spec/dummy/app/controllers/home_controller.rb
222
221
  - spec/dummy/app/helpers/application_helper.rb
@@ -235,7 +234,6 @@ test_files:
235
234
  - spec/dummy/config/database.yml.sample
236
235
  - spec/dummy/config/environment.rb
237
236
  - spec/dummy/config/environments/development.rb
238
- - spec/dummy/config/environments/production.rb
239
237
  - spec/dummy/config/environments/test.rb
240
238
  - spec/dummy/config/initializers/backtrace_silencers.rb
241
239
  - spec/dummy/config/initializers/devise.rb
@@ -1,67 +0,0 @@
1
- Dummy::Application.configure do
2
- # Settings specified here will take precedence over those in config/application.rb
3
-
4
- # Code is not reloaded between requests
5
- config.cache_classes = true
6
-
7
- # Full error reports are disabled and caching is turned on
8
- config.consider_all_requests_local = false
9
- config.action_controller.perform_caching = true
10
-
11
- # Disable Rails's static asset server (Apache or nginx will already do this)
12
- config.serve_static_assets = false
13
-
14
- # Compress JavaScripts and CSS
15
- config.assets.compress = true
16
-
17
- # Don't fallback to assets pipeline if a precompiled asset is missed
18
- config.assets.compile = false
19
-
20
- # Generate digests for assets URLs
21
- config.assets.digest = true
22
-
23
- # Defaults to nil and saved in location specified by config.assets.prefix
24
- # config.assets.manifest = YOUR_PATH
25
-
26
- # Specifies the header that your server uses for sending files
27
- # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
28
- # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx
29
-
30
- # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
31
- # config.force_ssl = true
32
-
33
- # See everything in the log (default is :info)
34
- # config.log_level = :debug
35
-
36
- # Prepend all log lines with the following tags
37
- # config.log_tags = [ :subdomain, :uuid ]
38
-
39
- # Use a different logger for distributed setups
40
- # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)
41
-
42
- # Use a different cache store in production
43
- # config.cache_store = :mem_cache_store
44
-
45
- # Enable serving of images, stylesheets, and JavaScripts from an asset server
46
- # config.action_controller.asset_host = "http://assets.example.com"
47
-
48
- # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
49
- # config.assets.precompile += %w( search.js )
50
-
51
- # Disable delivery errors, bad email addresses will be ignored
52
- # config.action_mailer.raise_delivery_errors = false
53
-
54
- # Enable threaded mode
55
- # config.threadsafe!
56
-
57
- # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
58
- # the I18n.default_locale when a translation can not be found)
59
- config.i18n.fallbacks = true
60
-
61
- # Send deprecation notices to registered listeners
62
- config.active_support.deprecation = :notify
63
-
64
- # Log the query plan for queries taking more than this (works
65
- # with SQLite, MySQL, and PostgreSQL)
66
- # config.active_record.auto_explain_threshold_in_seconds = 0.5
67
- end