sorcery 0.8.6 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.travis.yml +75 -14
- data/CHANGELOG.md +32 -1
- data/Gemfile +1 -0
- data/README.md +138 -86
- data/gemfiles/active_record-rails40.gemfile +7 -0
- data/gemfiles/active_record-rails41.gemfile +3 -2
- data/gemfiles/mongo_mapper-rails40.gemfile +9 -0
- data/gemfiles/mongo_mapper-rails41.gemfile +2 -1
- data/gemfiles/mongoid-rails40.gemfile +9 -0
- data/gemfiles/mongoid-rails41.gemfile +3 -5
- data/gemfiles/mongoid3-rails32.gemfile +9 -0
- data/lib/generators/sorcery/USAGE +1 -1
- data/lib/generators/sorcery/install_generator.rb +19 -5
- data/lib/generators/sorcery/templates/initializer.rb +36 -10
- data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +3 -1
- data/lib/generators/sorcery/templates/migration/core.rb +2 -2
- data/lib/generators/sorcery/templates/migration/external.rb +3 -1
- data/lib/sorcery/adapters/active_record_adapter.rb +120 -0
- data/lib/sorcery/adapters/base_adapter.rb +30 -0
- data/lib/sorcery/adapters/data_mapper_adapter.rb +176 -0
- data/lib/sorcery/adapters/mongo_mapper_adapter.rb +110 -0
- data/lib/sorcery/adapters/mongoid_adapter.rb +97 -0
- data/lib/sorcery/controller/config.rb +65 -0
- data/lib/sorcery/controller/submodules/activity_logging.rb +16 -21
- data/lib/sorcery/controller/submodules/brute_force_protection.rb +6 -6
- data/lib/sorcery/controller/submodules/external.rb +9 -29
- data/lib/sorcery/controller/submodules/remember_me.rb +4 -4
- data/lib/sorcery/controller/submodules/session_timeout.rb +10 -6
- data/lib/sorcery/controller.rb +5 -64
- data/lib/sorcery/model/config.rb +96 -0
- data/lib/sorcery/model/submodules/activity_logging.rb +29 -36
- data/lib/sorcery/model/submodules/brute_force_protection.rb +21 -37
- data/lib/sorcery/model/submodules/external.rb +53 -9
- data/lib/sorcery/model/submodules/remember_me.rb +12 -31
- data/lib/sorcery/model/submodules/reset_password.rb +21 -39
- data/lib/sorcery/model/submodules/user_activation.rb +21 -63
- data/lib/sorcery/model/temporary_token.rb +4 -4
- data/lib/sorcery/model.rb +47 -175
- data/lib/sorcery/providers/base.rb +11 -0
- data/lib/sorcery/providers/facebook.rb +16 -5
- data/lib/sorcery/providers/github.rb +11 -2
- data/lib/sorcery/providers/google.rb +1 -1
- data/lib/sorcery/providers/heroku.rb +57 -0
- data/lib/sorcery/providers/jira.rb +77 -0
- data/lib/sorcery/providers/linkedin.rb +1 -1
- data/lib/sorcery/providers/liveid.rb +1 -1
- data/lib/sorcery/providers/salesforce.rb +50 -0
- data/lib/sorcery/providers/twitter.rb +1 -1
- data/lib/sorcery/providers/vk.rb +6 -4
- data/lib/sorcery/providers/xing.rb +2 -2
- data/lib/sorcery/test_helpers/internal.rb +7 -3
- data/lib/sorcery/test_helpers/rails/controller.rb +5 -1
- data/lib/sorcery/version.rb +3 -0
- data/lib/sorcery.rb +75 -43
- data/sorcery.gemspec +6 -2
- data/spec/active_record/user_activity_logging_spec.rb +9 -0
- data/spec/controllers/controller_activity_logging_spec.rb +124 -0
- data/spec/controllers/controller_brute_force_protection_spec.rb +43 -0
- data/spec/{active_record → controllers}/controller_http_basic_auth_spec.rb +14 -11
- data/spec/{active_record → controllers}/controller_oauth2_spec.rb +151 -64
- data/spec/{active_record → controllers}/controller_oauth_spec.rb +94 -70
- data/spec/{active_record → controllers}/controller_remember_me_spec.rb +32 -12
- data/spec/{active_record → controllers}/controller_session_timeout_spec.rb +15 -5
- data/spec/{shared_examples/controller_shared_examples.rb → controllers/controller_spec.rb} +34 -19
- data/spec/{datamapper → data_mapper}/user_activation_spec.rb +1 -1
- data/spec/data_mapper/user_activity_logging_spec.rb +14 -0
- data/spec/{datamapper → data_mapper}/user_brute_force_protection_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_oauth_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_remember_me_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_reset_password_spec.rb +1 -1
- data/spec/{datamapper → data_mapper}/user_spec.rb +1 -1
- data/spec/mongoid/user_spec.rb +13 -0
- data/spec/orm/active_record.rb +12 -0
- data/spec/orm/{datamapper.rb → data_mapper.rb} +16 -2
- data/spec/orm/mongo_mapper.rb +0 -1
- data/spec/orm/mongoid.rb +4 -0
- data/spec/rails_app/app/controllers/sorcery_controller.rb +62 -1
- data/spec/rails_app/app/mongo_mapper/user.rb +2 -0
- data/spec/rails_app/config/routes.rb +9 -0
- data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +2 -2
- data/spec/shared_examples/user_activation_shared_examples.rb +7 -7
- data/spec/shared_examples/user_activity_logging_shared_examples.rb +73 -5
- data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +127 -9
- data/spec/shared_examples/user_oauth_shared_examples.rb +3 -6
- data/spec/shared_examples/user_remember_me_shared_examples.rb +6 -3
- data/spec/shared_examples/user_reset_password_shared_examples.rb +10 -10
- data/spec/shared_examples/user_shared_examples.rb +146 -46
- data/spec/spec_helper.rb +7 -22
- metadata +36 -57
- data/Gemfile.rails4 +0 -22
- data/VERSION +0 -1
- data/lib/sorcery/model/adapters/active_record.rb +0 -54
- data/lib/sorcery/model/adapters/datamapper.rb +0 -123
- data/lib/sorcery/model/adapters/mongo_mapper.rb +0 -60
- data/lib/sorcery/model/adapters/mongoid.rb +0 -88
- data/lib/sorcery/test_helpers/rails.rb +0 -7
- data/spec/active_record/controller_activity_logging_spec.rb +0 -29
- data/spec/active_record/controller_brute_force_protection_spec.rb +0 -158
- data/spec/active_record/controller_spec.rb +0 -8
- data/spec/active_record/integration_spec.rb +0 -23
- data/spec/datamapper/controller_activity_logging_spec.rb +0 -17
- data/spec/datamapper/controller_spec.rb +0 -8
- data/spec/datamapper/user_activity_logging_spec.rb +0 -9
- data/spec/mongo_mapper/controller_spec.rb +0 -8
- data/spec/mongoid/controller_activity_logging_spec.rb +0 -16
- data/spec/mongoid/controller_spec.rb +0 -8
- data/spec/rails_app/public/404.html +0 -26
- data/spec/rails_app/public/422.html +0 -26
- data/spec/rails_app/public/500.html +0 -26
- data/spec/rails_app/public/favicon.ico +0 -0
- data/spec/rails_app/public/images/rails.png +0 -0
- data/spec/rails_app/public/javascripts/application.js +0 -2
- data/spec/rails_app/public/javascripts/controls.js +0 -965
- data/spec/rails_app/public/javascripts/dragdrop.js +0 -974
- data/spec/rails_app/public/javascripts/effects.js +0 -1123
- data/spec/rails_app/public/javascripts/prototype.js +0 -6001
- data/spec/rails_app/public/javascripts/rails.js +0 -175
- data/spec/rails_app/public/robots.txt +0 -5
- data/spec/rails_app/public/stylesheets/.gitkeep +0 -0
- data/spec/shared_examples/controller_activity_logging_shared_examples.rb +0 -125
- data/spec/shared_examples/controller_oauth2_shared_examples.rb +0 -52
- data/spec/shared_examples/controller_oauth_shared_examples.rb +0 -62
- /data/spec/rails_app/app/{datamapper → data_mapper}/authentication.rb +0 -0
- /data/spec/rails_app/app/{datamapper → data_mapper}/user.rb +0 -0
|
@@ -69,12 +69,16 @@ shared_examples_for "rails_3_core_model" do
|
|
|
69
69
|
|
|
70
70
|
expect(User.sorcery_config.stretches).to eq stretches
|
|
71
71
|
end
|
|
72
|
+
|
|
73
|
+
it 'respond to username=' do
|
|
74
|
+
expect(User.new).to respond_to(:username=)
|
|
75
|
+
end
|
|
72
76
|
end
|
|
73
77
|
|
|
74
78
|
describe "when activated with sorcery" do
|
|
75
79
|
before(:all) { sorcery_reload! }
|
|
76
|
-
before(:each) { User.delete_all }
|
|
77
|
-
|
|
80
|
+
before(:each) { User.sorcery_adapter.delete_all }
|
|
81
|
+
|
|
78
82
|
it "does not add authenticate method to base class", active_record: true do
|
|
79
83
|
expect(ActiveRecord::Base).not_to respond_to(:authenticate) if defined?(ActiveRecord)
|
|
80
84
|
end
|
|
@@ -83,29 +87,42 @@ shared_examples_for "rails_3_core_model" do
|
|
|
83
87
|
expect(User).to respond_to :authenticate
|
|
84
88
|
end
|
|
85
89
|
|
|
86
|
-
|
|
87
|
-
|
|
90
|
+
describe "#authenticate" do
|
|
91
|
+
it "returns user if credentials are good" do
|
|
92
|
+
expect(User.authenticate user.email, 'secret').to eq user
|
|
93
|
+
end
|
|
88
94
|
|
|
89
|
-
|
|
90
|
-
|
|
95
|
+
it "returns nil if credentials are bad" do
|
|
96
|
+
expect(User.authenticate user.email, 'wrong!').to be nil
|
|
97
|
+
end
|
|
91
98
|
|
|
92
|
-
|
|
93
|
-
|
|
99
|
+
context "with empty credentials" do
|
|
100
|
+
before do
|
|
101
|
+
sorcery_model_property_set(:downcase_username_before_authenticating, true)
|
|
102
|
+
end
|
|
94
103
|
|
|
95
|
-
|
|
96
|
-
|
|
104
|
+
after do
|
|
105
|
+
sorcery_reload!
|
|
106
|
+
end
|
|
97
107
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
108
|
+
it "don't downcase empty credentials" do
|
|
109
|
+
expect(User.authenticate(nil, 'wrong!')).to be_falsy
|
|
110
|
+
end
|
|
101
111
|
end
|
|
102
112
|
|
|
103
|
-
|
|
104
|
-
sorcery_reload!
|
|
105
|
-
end
|
|
113
|
+
context "and model implements active_for_authentication?" do
|
|
106
114
|
|
|
107
|
-
|
|
108
|
-
|
|
115
|
+
it "authenticates returns user if active_for_authentication? returns true" do
|
|
116
|
+
allow_any_instance_of(User).to receive(:active_for_authentication?) { true }
|
|
117
|
+
|
|
118
|
+
expect(User.authenticate user.email, 'secret').to eq user
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "authenticate returns nil if active_for_authentication? returns false" do
|
|
122
|
+
allow_any_instance_of(User).to receive(:active_for_authentication?) { false }
|
|
123
|
+
|
|
124
|
+
expect(User.authenticate user.email, 'secret').to be_nil
|
|
125
|
+
end
|
|
109
126
|
end
|
|
110
127
|
end
|
|
111
128
|
|
|
@@ -131,7 +148,7 @@ shared_examples_for "rails_3_core_model" do
|
|
|
131
148
|
describe "registration" do
|
|
132
149
|
|
|
133
150
|
before(:all) { sorcery_reload! }
|
|
134
|
-
before(:each) { User.delete_all }
|
|
151
|
+
before(:each) { User.sorcery_adapter.delete_all }
|
|
135
152
|
|
|
136
153
|
it "by default, encryption_provider is not nil" do
|
|
137
154
|
expect(User.sorcery_config.encryption_provider).not_to be_nil
|
|
@@ -161,13 +178,10 @@ shared_examples_for "rails_3_core_model" do
|
|
|
161
178
|
user.password = '4blupush'
|
|
162
179
|
user.username = nil
|
|
163
180
|
|
|
164
|
-
|
|
181
|
+
expect(user).to receive(:save) { raise RuntimeError }
|
|
182
|
+
|
|
165
183
|
begin
|
|
166
|
-
|
|
167
|
-
user.save
|
|
168
|
-
else
|
|
169
|
-
user.save! # triggers validation exception since username field is required.
|
|
170
|
-
end
|
|
184
|
+
user.save
|
|
171
185
|
rescue
|
|
172
186
|
end
|
|
173
187
|
|
|
@@ -176,32 +190,21 @@ shared_examples_for "rails_3_core_model" do
|
|
|
176
190
|
|
|
177
191
|
it "does not encrypt the password twice when a user is updated" do
|
|
178
192
|
user.email = "blup@bla.com"
|
|
179
|
-
|
|
180
|
-
user.save
|
|
181
|
-
else
|
|
182
|
-
user.save!
|
|
183
|
-
end
|
|
193
|
+
user.save
|
|
184
194
|
|
|
185
195
|
expect(User.sorcery_config.encryption_provider.matches? crypted_password, 'secret', user.salt).to be true
|
|
186
196
|
end
|
|
187
197
|
|
|
188
198
|
it "replaces the crypted_password in case a new password is set" do
|
|
189
199
|
user.password = 'new_secret'
|
|
190
|
-
|
|
191
|
-
user.save
|
|
192
|
-
else
|
|
193
|
-
user.save!
|
|
194
|
-
end
|
|
200
|
+
user.save
|
|
195
201
|
|
|
196
202
|
expect(User.sorcery_config.encryption_provider.matches? crypted_password, 'secret', user.salt).to be false
|
|
197
203
|
end
|
|
198
204
|
|
|
199
205
|
describe "when user has password_confirmation_defined" do
|
|
200
206
|
before(:all) do
|
|
201
|
-
|
|
202
|
-
if defined?(DataMapper)
|
|
203
|
-
DataMapper.finalize
|
|
204
|
-
end
|
|
207
|
+
update_model { attr_accessor :password_confirmation }
|
|
205
208
|
end
|
|
206
209
|
|
|
207
210
|
after(:all) do
|
|
@@ -227,6 +230,21 @@ shared_examples_for "rails_3_core_model" do
|
|
|
227
230
|
end
|
|
228
231
|
end
|
|
229
232
|
|
|
233
|
+
describe "password validation" do
|
|
234
|
+
|
|
235
|
+
let(:user_with_pass) { create_new_user({:username => 'foo_bar', :email => "foo@bar.com", :password => 'foobar'})}
|
|
236
|
+
|
|
237
|
+
specify { expect(user_with_pass).to respond_to :valid_password? }
|
|
238
|
+
|
|
239
|
+
it "returns true if password is correct" do
|
|
240
|
+
expect(user_with_pass.valid_password?("foobar")).to be true
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
it "returns false if password is incorrect" do
|
|
244
|
+
expect(user_with_pass.valid_password?("foobug")).to be false
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
230
248
|
describe "special encryption cases" do
|
|
231
249
|
before(:all) do
|
|
232
250
|
sorcery_reload!()
|
|
@@ -234,7 +252,7 @@ shared_examples_for "rails_3_core_model" do
|
|
|
234
252
|
end
|
|
235
253
|
|
|
236
254
|
before(:each) do
|
|
237
|
-
User.delete_all
|
|
255
|
+
User.sorcery_adapter.delete_all
|
|
238
256
|
end
|
|
239
257
|
|
|
240
258
|
after(:each) do
|
|
@@ -344,13 +362,13 @@ shared_examples_for "rails_3_core_model" do
|
|
|
344
362
|
describe "ORM adapter" do
|
|
345
363
|
before(:all) do
|
|
346
364
|
sorcery_reload!()
|
|
347
|
-
User.delete_all
|
|
365
|
+
User.sorcery_adapter.delete_all
|
|
348
366
|
end
|
|
349
367
|
|
|
350
368
|
before(:each) { user }
|
|
351
369
|
|
|
352
370
|
after(:each) do
|
|
353
|
-
User.delete_all
|
|
371
|
+
User.sorcery_adapter.delete_all
|
|
354
372
|
User.sorcery_config.reset!
|
|
355
373
|
end
|
|
356
374
|
|
|
@@ -358,17 +376,17 @@ shared_examples_for "rails_3_core_model" do
|
|
|
358
376
|
it "find_by_username works as expected" do
|
|
359
377
|
sorcery_model_property_set(:username_attribute_names, [:username])
|
|
360
378
|
|
|
361
|
-
expect(User.find_by_username "gizmo").to eq user
|
|
379
|
+
expect(User.sorcery_adapter.find_by_username "gizmo").to eq user
|
|
362
380
|
end
|
|
363
381
|
|
|
364
382
|
it "find_by_username works as expected with multiple username attributes" do
|
|
365
383
|
sorcery_model_property_set(:username_attribute_names, [:username, :email])
|
|
366
384
|
|
|
367
|
-
expect(User.find_by_username "gizmo").to eq user
|
|
385
|
+
expect(User.sorcery_adapter.find_by_username "gizmo").to eq user
|
|
368
386
|
end
|
|
369
387
|
|
|
370
388
|
it "find_by_email works as expected" do
|
|
371
|
-
expect(User.find_by_email "bla@bla.com").to eq user
|
|
389
|
+
expect(User.sorcery_adapter.find_by_email "bla@bla.com").to eq user
|
|
372
390
|
end
|
|
373
391
|
end
|
|
374
392
|
end
|
|
@@ -378,7 +396,7 @@ shared_examples_for "external_user" do
|
|
|
378
396
|
let(:external_user) { create_new_external_user :twitter }
|
|
379
397
|
|
|
380
398
|
before(:each) do
|
|
381
|
-
User.delete_all
|
|
399
|
+
User.sorcery_adapter.delete_all
|
|
382
400
|
end
|
|
383
401
|
|
|
384
402
|
it "responds to 'external?'" do
|
|
@@ -392,4 +410,86 @@ shared_examples_for "external_user" do
|
|
|
392
410
|
it "external? is true for external users" do
|
|
393
411
|
expect(external_user.external?).to be true
|
|
394
412
|
end
|
|
413
|
+
|
|
414
|
+
describe ".create_from_provider" do
|
|
415
|
+
|
|
416
|
+
before(:all) do
|
|
417
|
+
if SORCERY_ORM == :active_record
|
|
418
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
419
|
+
User.reset_column_information
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
sorcery_reload!([:external])
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
after(:all) do
|
|
426
|
+
if SORCERY_ORM == :active_record
|
|
427
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
428
|
+
end
|
|
429
|
+
end
|
|
430
|
+
|
|
431
|
+
it 'supports nested attributes' do
|
|
432
|
+
sorcery_model_property_set(:authentications_class, Authentication)
|
|
433
|
+
|
|
434
|
+
expect { User.create_from_provider('facebook', '123', {username: 'Noam Ben Ari'}) }.to change { User.count }.by(1)
|
|
435
|
+
expect(User.first.username).to eq 'Noam Ben Ari'
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
context 'with block' do
|
|
439
|
+
it 'create user when block return true' do
|
|
440
|
+
expect {
|
|
441
|
+
User.create_from_provider('facebook', '123', {username: 'Noam Ben Ari'}) { true }
|
|
442
|
+
}.to change { User.count }.by(1)
|
|
443
|
+
end
|
|
444
|
+
|
|
445
|
+
it 'does not create user when block return false' do
|
|
446
|
+
expect {
|
|
447
|
+
User.create_from_provider('facebook', '123', {username: 'Noam Ben Ari'}) { false }
|
|
448
|
+
}.not_to change { User.count }
|
|
449
|
+
end
|
|
450
|
+
end
|
|
451
|
+
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
describe 'activation' do
|
|
455
|
+
before(:all) do
|
|
456
|
+
if SORCERY_ORM == :active_record
|
|
457
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/external")
|
|
458
|
+
ActiveRecord::Migrator.migrate("#{Rails.root}/db/migrate/activation")
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
sorcery_reload!([:user_activation,:external], :user_activation_mailer => ::SorceryMailer)
|
|
462
|
+
end
|
|
463
|
+
|
|
464
|
+
after(:all) do
|
|
465
|
+
if SORCERY_ORM == :active_record
|
|
466
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/activation")
|
|
467
|
+
ActiveRecord::Migrator.rollback("#{Rails.root}/db/migrate/external")
|
|
468
|
+
end
|
|
469
|
+
end
|
|
470
|
+
|
|
471
|
+
after(:each) do
|
|
472
|
+
User.sorcery_adapter.delete_all
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
[:facebook, :github, :google, :liveid].each do |provider|
|
|
476
|
+
|
|
477
|
+
it "does not send activation email to external users" do
|
|
478
|
+
old_size = ActionMailer::Base.deliveries.size
|
|
479
|
+
create_new_external_user(provider)
|
|
480
|
+
|
|
481
|
+
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
it "does not send external users an activation success email" do
|
|
485
|
+
sorcery_model_property_set(:activation_success_email_method_name, nil)
|
|
486
|
+
create_new_external_user(provider)
|
|
487
|
+
old_size = ActionMailer::Base.deliveries.size
|
|
488
|
+
@user.activate!
|
|
489
|
+
|
|
490
|
+
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
491
|
+
end
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
end
|
|
395
495
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -15,6 +15,9 @@ require 'rails/all'
|
|
|
15
15
|
require 'rspec/rails'
|
|
16
16
|
require 'timecop'
|
|
17
17
|
|
|
18
|
+
def setup_orm; end
|
|
19
|
+
def teardown_orm; end
|
|
20
|
+
|
|
18
21
|
require "orm/#{SORCERY_ORM}"
|
|
19
22
|
|
|
20
23
|
require "rails_app/config/environment"
|
|
@@ -27,33 +30,15 @@ RSpec.configure do |config|
|
|
|
27
30
|
config.include RSpec::Rails::ControllerExampleGroup, :file_path => /controller(.)*_spec.rb$/
|
|
28
31
|
config.filter_run_excluding :active_record => SORCERY_ORM.to_sym != :active_record
|
|
29
32
|
config.filter_run_excluding :mongo_mapper => SORCERY_ORM.to_sym != :mongo_mapper
|
|
30
|
-
config.filter_run_excluding :
|
|
33
|
+
config.filter_run_excluding :data_mapper => SORCERY_ORM.to_sym != :data_mapper
|
|
31
34
|
config.filter_run_excluding :mongoid => SORCERY_ORM.to_sym != :mongoid
|
|
32
35
|
config.mock_with :rspec
|
|
33
36
|
|
|
34
37
|
config.use_transactional_fixtures = true
|
|
35
38
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
config.before(:
|
|
39
|
-
if SORCERY_ORM.to_sym == :active_record
|
|
40
|
-
ActiveRecord::Migrator.migrate(migrations_path)
|
|
41
|
-
end
|
|
42
|
-
if SORCERY_ORM.to_sym == :datamapper
|
|
43
|
-
DataMapper.auto_migrate!
|
|
44
|
-
DataMapper.finalize
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
if defined?(Mongoid)
|
|
48
|
-
Mongoid.purge!
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
config.after(:suite) do
|
|
53
|
-
if SORCERY_ORM.to_sym == :active_record
|
|
54
|
-
ActiveRecord::Migrator.rollback(migrations_path)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
39
|
+
config.before(:suite) { setup_orm }
|
|
40
|
+
config.after(:suite) { teardown_orm }
|
|
41
|
+
config.before(:each) { ActionMailer::Base.deliveries.clear }
|
|
57
42
|
|
|
58
43
|
config.include ::Sorcery::TestHelpers::Internal
|
|
59
44
|
config.include ::Sorcery::TestHelpers::Internal::Rails
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sorcery
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.9.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Noam Ben Ari
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2015-04-05 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
name: oauth
|
|
@@ -39,9 +39,6 @@ dependencies:
|
|
|
39
39
|
- - ">="
|
|
40
40
|
- !ruby/object:Gem::Version
|
|
41
41
|
version: 0.8.0
|
|
42
|
-
- - "<"
|
|
43
|
-
- !ruby/object:Gem::Version
|
|
44
|
-
version: 1.0.0
|
|
45
42
|
type: :runtime
|
|
46
43
|
prerelease: false
|
|
47
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -49,9 +46,6 @@ dependencies:
|
|
|
49
46
|
- - ">="
|
|
50
47
|
- !ruby/object:Gem::Version
|
|
51
48
|
version: 0.8.0
|
|
52
|
-
- - "<"
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: 1.0.0
|
|
55
49
|
- !ruby/object:Gem::Dependency
|
|
56
50
|
name: bcrypt
|
|
57
51
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -177,14 +171,16 @@ files:
|
|
|
177
171
|
- ".travis.yml"
|
|
178
172
|
- CHANGELOG.md
|
|
179
173
|
- Gemfile
|
|
180
|
-
- Gemfile.rails4
|
|
181
174
|
- LICENSE.txt
|
|
182
175
|
- README.md
|
|
183
176
|
- Rakefile
|
|
184
|
-
-
|
|
177
|
+
- gemfiles/active_record-rails40.gemfile
|
|
185
178
|
- gemfiles/active_record-rails41.gemfile
|
|
179
|
+
- gemfiles/mongo_mapper-rails40.gemfile
|
|
186
180
|
- gemfiles/mongo_mapper-rails41.gemfile
|
|
181
|
+
- gemfiles/mongoid-rails40.gemfile
|
|
187
182
|
- gemfiles/mongoid-rails41.gemfile
|
|
183
|
+
- gemfiles/mongoid3-rails32.gemfile
|
|
188
184
|
- lib/generators/sorcery/USAGE
|
|
189
185
|
- lib/generators/sorcery/helpers.rb
|
|
190
186
|
- lib/generators/sorcery/install_generator.rb
|
|
@@ -197,7 +193,13 @@ files:
|
|
|
197
193
|
- lib/generators/sorcery/templates/migration/reset_password.rb
|
|
198
194
|
- lib/generators/sorcery/templates/migration/user_activation.rb
|
|
199
195
|
- lib/sorcery.rb
|
|
196
|
+
- lib/sorcery/adapters/active_record_adapter.rb
|
|
197
|
+
- lib/sorcery/adapters/base_adapter.rb
|
|
198
|
+
- lib/sorcery/adapters/data_mapper_adapter.rb
|
|
199
|
+
- lib/sorcery/adapters/mongo_mapper_adapter.rb
|
|
200
|
+
- lib/sorcery/adapters/mongoid_adapter.rb
|
|
200
201
|
- lib/sorcery/controller.rb
|
|
202
|
+
- lib/sorcery/controller/config.rb
|
|
201
203
|
- lib/sorcery/controller/submodules/activity_logging.rb
|
|
202
204
|
- lib/sorcery/controller/submodules/brute_force_protection.rb
|
|
203
205
|
- lib/sorcery/controller/submodules/external.rb
|
|
@@ -213,10 +215,7 @@ files:
|
|
|
213
215
|
- lib/sorcery/crypto_providers/sha512.rb
|
|
214
216
|
- lib/sorcery/engine.rb
|
|
215
217
|
- lib/sorcery/model.rb
|
|
216
|
-
- lib/sorcery/model/
|
|
217
|
-
- lib/sorcery/model/adapters/datamapper.rb
|
|
218
|
-
- lib/sorcery/model/adapters/mongo_mapper.rb
|
|
219
|
-
- lib/sorcery/model/adapters/mongoid.rb
|
|
218
|
+
- lib/sorcery/model/config.rb
|
|
220
219
|
- lib/sorcery/model/submodules/activity_logging.rb
|
|
221
220
|
- lib/sorcery/model/submodules/brute_force_protection.rb
|
|
222
221
|
- lib/sorcery/model/submodules/external.rb
|
|
@@ -231,27 +230,21 @@ files:
|
|
|
231
230
|
- lib/sorcery/providers/facebook.rb
|
|
232
231
|
- lib/sorcery/providers/github.rb
|
|
233
232
|
- lib/sorcery/providers/google.rb
|
|
233
|
+
- lib/sorcery/providers/heroku.rb
|
|
234
|
+
- lib/sorcery/providers/jira.rb
|
|
234
235
|
- lib/sorcery/providers/linkedin.rb
|
|
235
236
|
- lib/sorcery/providers/liveid.rb
|
|
237
|
+
- lib/sorcery/providers/salesforce.rb
|
|
236
238
|
- lib/sorcery/providers/twitter.rb
|
|
237
239
|
- lib/sorcery/providers/vk.rb
|
|
238
240
|
- lib/sorcery/providers/xing.rb
|
|
239
241
|
- lib/sorcery/railties/tasks.rake
|
|
240
242
|
- lib/sorcery/test_helpers/internal.rb
|
|
241
243
|
- lib/sorcery/test_helpers/internal/rails.rb
|
|
242
|
-
- lib/sorcery/test_helpers/rails.rb
|
|
243
244
|
- lib/sorcery/test_helpers/rails/controller.rb
|
|
244
245
|
- lib/sorcery/test_helpers/rails/integration.rb
|
|
246
|
+
- lib/sorcery/version.rb
|
|
245
247
|
- sorcery.gemspec
|
|
246
|
-
- spec/active_record/controller_activity_logging_spec.rb
|
|
247
|
-
- spec/active_record/controller_brute_force_protection_spec.rb
|
|
248
|
-
- spec/active_record/controller_http_basic_auth_spec.rb
|
|
249
|
-
- spec/active_record/controller_oauth2_spec.rb
|
|
250
|
-
- spec/active_record/controller_oauth_spec.rb
|
|
251
|
-
- spec/active_record/controller_remember_me_spec.rb
|
|
252
|
-
- spec/active_record/controller_session_timeout_spec.rb
|
|
253
|
-
- spec/active_record/controller_spec.rb
|
|
254
|
-
- spec/active_record/integration_spec.rb
|
|
255
248
|
- spec/active_record/user_activation_spec.rb
|
|
256
249
|
- spec/active_record/user_activity_logging_spec.rb
|
|
257
250
|
- spec/active_record/user_brute_force_protection_spec.rb
|
|
@@ -259,16 +252,21 @@ files:
|
|
|
259
252
|
- spec/active_record/user_remember_me_spec.rb
|
|
260
253
|
- spec/active_record/user_reset_password_spec.rb
|
|
261
254
|
- spec/active_record/user_spec.rb
|
|
262
|
-
- spec/
|
|
263
|
-
- spec/
|
|
264
|
-
- spec/
|
|
265
|
-
- spec/
|
|
266
|
-
- spec/
|
|
267
|
-
- spec/
|
|
268
|
-
- spec/
|
|
269
|
-
- spec/
|
|
270
|
-
- spec/
|
|
271
|
-
- spec/
|
|
255
|
+
- spec/controllers/controller_activity_logging_spec.rb
|
|
256
|
+
- spec/controllers/controller_brute_force_protection_spec.rb
|
|
257
|
+
- spec/controllers/controller_http_basic_auth_spec.rb
|
|
258
|
+
- spec/controllers/controller_oauth2_spec.rb
|
|
259
|
+
- spec/controllers/controller_oauth_spec.rb
|
|
260
|
+
- spec/controllers/controller_remember_me_spec.rb
|
|
261
|
+
- spec/controllers/controller_session_timeout_spec.rb
|
|
262
|
+
- spec/controllers/controller_spec.rb
|
|
263
|
+
- spec/data_mapper/user_activation_spec.rb
|
|
264
|
+
- spec/data_mapper/user_activity_logging_spec.rb
|
|
265
|
+
- spec/data_mapper/user_brute_force_protection_spec.rb
|
|
266
|
+
- spec/data_mapper/user_oauth_spec.rb
|
|
267
|
+
- spec/data_mapper/user_remember_me_spec.rb
|
|
268
|
+
- spec/data_mapper/user_reset_password_spec.rb
|
|
269
|
+
- spec/data_mapper/user_spec.rb
|
|
272
270
|
- spec/mongo_mapper/user_activation_spec.rb
|
|
273
271
|
- spec/mongo_mapper/user_activity_logging_spec.rb
|
|
274
272
|
- spec/mongo_mapper/user_brute_force_protection_spec.rb
|
|
@@ -276,8 +274,6 @@ files:
|
|
|
276
274
|
- spec/mongo_mapper/user_remember_me_spec.rb
|
|
277
275
|
- spec/mongo_mapper/user_reset_password_spec.rb
|
|
278
276
|
- spec/mongo_mapper/user_spec.rb
|
|
279
|
-
- spec/mongoid/controller_activity_logging_spec.rb
|
|
280
|
-
- spec/mongoid/controller_spec.rb
|
|
281
277
|
- spec/mongoid/user_activation_spec.rb
|
|
282
278
|
- spec/mongoid/user_activity_logging_spec.rb
|
|
283
279
|
- spec/mongoid/user_brute_force_protection_spec.rb
|
|
@@ -286,15 +282,15 @@ files:
|
|
|
286
282
|
- spec/mongoid/user_reset_password_spec.rb
|
|
287
283
|
- spec/mongoid/user_spec.rb
|
|
288
284
|
- spec/orm/active_record.rb
|
|
289
|
-
- spec/orm/
|
|
285
|
+
- spec/orm/data_mapper.rb
|
|
290
286
|
- spec/orm/mongo_mapper.rb
|
|
291
287
|
- spec/orm/mongoid.rb
|
|
292
288
|
- spec/rails_app/app/active_record/authentication.rb
|
|
293
289
|
- spec/rails_app/app/active_record/user.rb
|
|
294
290
|
- spec/rails_app/app/active_record/user_provider.rb
|
|
295
291
|
- spec/rails_app/app/controllers/sorcery_controller.rb
|
|
296
|
-
- spec/rails_app/app/
|
|
297
|
-
- spec/rails_app/app/
|
|
292
|
+
- spec/rails_app/app/data_mapper/authentication.rb
|
|
293
|
+
- spec/rails_app/app/data_mapper/user.rb
|
|
298
294
|
- spec/rails_app/app/helpers/application_helper.rb
|
|
299
295
|
- spec/rails_app/app/mailers/sorcery_mailer.rb
|
|
300
296
|
- spec/rails_app/app/mongo_mapper/authentication.rb
|
|
@@ -334,23 +330,6 @@ files:
|
|
|
334
330
|
- spec/rails_app/db/schema.rb
|
|
335
331
|
- spec/rails_app/db/seeds.rb
|
|
336
332
|
- spec/rails_app/log/development.log
|
|
337
|
-
- spec/rails_app/public/404.html
|
|
338
|
-
- spec/rails_app/public/422.html
|
|
339
|
-
- spec/rails_app/public/500.html
|
|
340
|
-
- spec/rails_app/public/favicon.ico
|
|
341
|
-
- spec/rails_app/public/images/rails.png
|
|
342
|
-
- spec/rails_app/public/javascripts/application.js
|
|
343
|
-
- spec/rails_app/public/javascripts/controls.js
|
|
344
|
-
- spec/rails_app/public/javascripts/dragdrop.js
|
|
345
|
-
- spec/rails_app/public/javascripts/effects.js
|
|
346
|
-
- spec/rails_app/public/javascripts/prototype.js
|
|
347
|
-
- spec/rails_app/public/javascripts/rails.js
|
|
348
|
-
- spec/rails_app/public/robots.txt
|
|
349
|
-
- spec/rails_app/public/stylesheets/.gitkeep
|
|
350
|
-
- spec/shared_examples/controller_activity_logging_shared_examples.rb
|
|
351
|
-
- spec/shared_examples/controller_oauth2_shared_examples.rb
|
|
352
|
-
- spec/shared_examples/controller_oauth_shared_examples.rb
|
|
353
|
-
- spec/shared_examples/controller_shared_examples.rb
|
|
354
333
|
- spec/shared_examples/user_activation_shared_examples.rb
|
|
355
334
|
- spec/shared_examples/user_activity_logging_shared_examples.rb
|
|
356
335
|
- spec/shared_examples/user_brute_force_protection_shared_examples.rb
|
|
@@ -381,7 +360,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
381
360
|
version: '0'
|
|
382
361
|
requirements: []
|
|
383
362
|
rubyforge_project:
|
|
384
|
-
rubygems_version: 2.2.
|
|
363
|
+
rubygems_version: 2.2.2
|
|
385
364
|
signing_key:
|
|
386
365
|
specification_version: 4
|
|
387
366
|
summary: Magical authentication for Rails 3 & 4 applications
|
data/Gemfile.rails4
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
source 'https://rubygems.org'
|
|
2
|
-
|
|
3
|
-
gem 'sqlite3'
|
|
4
|
-
|
|
5
|
-
group :mongomapper do
|
|
6
|
-
gem 'mongo_mapper', github: 'jnunemaker/mongomapper'
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
group :mongoid do
|
|
10
|
-
gem 'mongoid', github: 'mongoid/mongoid', ref: 'f91feef0a0c6b83a1b878e154f1014536aa1c298'
|
|
11
|
-
gem 'bson_ext'
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
group :datamapper do
|
|
15
|
-
gem 'mysql2'
|
|
16
|
-
gem 'data_mapper'
|
|
17
|
-
gem 'dm-mysql-adapter'
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
gem 'rails', '~> 4.0.1'
|
|
21
|
-
|
|
22
|
-
gemspec
|
data/VERSION
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.8.5
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
module Sorcery
|
|
2
|
-
module Model
|
|
3
|
-
module Adapters
|
|
4
|
-
module ActiveRecord
|
|
5
|
-
def self.included(klass)
|
|
6
|
-
klass.extend ClassMethods
|
|
7
|
-
klass.send(:include, InstanceMethods)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
module InstanceMethods
|
|
11
|
-
def update_many_attributes(attrs)
|
|
12
|
-
attrs.each do |name, value|
|
|
13
|
-
self.send(:"#{name}=", value)
|
|
14
|
-
end
|
|
15
|
-
primary_key = self.class.primary_key
|
|
16
|
-
self.class.where(:"#{primary_key}" => self.send(:"#{primary_key}")).update_all(attrs)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def update_single_attribute(name, value)
|
|
20
|
-
update_many_attributes(name => value)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def sorcery_save(options = {})
|
|
24
|
-
mthd = options.delete(:raise_on_failure) ? :save! : :save
|
|
25
|
-
self.send(mthd, options)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
module ClassMethods
|
|
30
|
-
def column_name(attribute)
|
|
31
|
-
return "LOWER(#{attribute})" if (@sorcery_config.downcase_username_before_authenticating)
|
|
32
|
-
attribute.to_s
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def find_by_credentials(credentials)
|
|
36
|
-
sql = @sorcery_config.username_attribute_names.map{|attribute| column_name(attribute) + " = :login"}
|
|
37
|
-
where(sql.join(' OR '), :login => credentials[0]).first
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def find_by_sorcery_token(token_attr_name, token)
|
|
41
|
-
where("#{token_attr_name} = ?", token).first
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def get_current_users
|
|
45
|
-
config = @sorcery_config
|
|
46
|
-
where("#{config.last_activity_at_attribute_name} IS NOT NULL") \
|
|
47
|
-
.where("#{config.last_logout_at_attribute_name} IS NULL OR #{config.last_activity_at_attribute_name} > #{config.last_logout_at_attribute_name}") \
|
|
48
|
-
.where("#{config.last_activity_at_attribute_name} > ? ", config.activity_timeout.seconds.ago.utc.to_s(:db))
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|