sorcery 0.17.0 → 0.18.0

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.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -1
  3. data/README.md +8 -5
  4. data/lib/generators/sorcery/helpers.rb +1 -1
  5. data/lib/generators/sorcery/install_generator.rb +9 -18
  6. data/lib/generators/sorcery/templates/initializer.rb +24 -10
  7. data/lib/sorcery/adapters/active_record_adapter.rb +12 -14
  8. data/lib/sorcery/adapters/mongoid_adapter.rb +6 -8
  9. data/lib/sorcery/controller/config.rb +27 -29
  10. data/lib/sorcery/controller/submodules/activity_logging.rb +4 -7
  11. data/lib/sorcery/controller/submodules/brute_force_protection.rb +4 -1
  12. data/lib/sorcery/controller/submodules/external.rb +11 -11
  13. data/lib/sorcery/controller/submodules/http_basic_auth.rb +7 -2
  14. data/lib/sorcery/controller/submodules/remember_me.rb +2 -1
  15. data/lib/sorcery/controller/submodules/session_timeout.rb +2 -2
  16. data/lib/sorcery/controller.rb +36 -18
  17. data/lib/sorcery/crypto_providers/aes256.rb +4 -2
  18. data/lib/sorcery/crypto_providers/bcrypt.rb +2 -1
  19. data/lib/sorcery/crypto_providers/md5.rb +1 -0
  20. data/lib/sorcery/crypto_providers/sha1.rb +1 -0
  21. data/lib/sorcery/crypto_providers/sha256.rb +1 -0
  22. data/lib/sorcery/crypto_providers/sha512.rb +1 -0
  23. data/lib/sorcery/engine.rb +6 -4
  24. data/lib/sorcery/errors.rb +10 -0
  25. data/lib/sorcery/model/config.rb +20 -31
  26. data/lib/sorcery/model/submodules/activity_logging.rb +8 -6
  27. data/lib/sorcery/model/submodules/brute_force_protection.rb +16 -14
  28. data/lib/sorcery/model/submodules/external.rb +8 -10
  29. data/lib/sorcery/model/submodules/magic_login.rb +8 -4
  30. data/lib/sorcery/model/submodules/remember_me.rb +3 -3
  31. data/lib/sorcery/model/submodules/reset_password.rb +21 -13
  32. data/lib/sorcery/model/submodules/user_activation.rb +19 -17
  33. data/lib/sorcery/model/temporary_token.rb +5 -5
  34. data/lib/sorcery/model.rb +21 -25
  35. data/lib/sorcery/providers/base.rb +1 -1
  36. data/lib/sorcery/providers/facebook.rb +2 -2
  37. data/lib/sorcery/providers/github.rb +3 -3
  38. data/lib/sorcery/providers/heroku.rb +1 -2
  39. data/lib/sorcery/providers/jira.rb +3 -2
  40. data/lib/sorcery/providers/line.rb +2 -4
  41. data/lib/sorcery/providers/microsoft.rb +1 -1
  42. data/lib/sorcery/providers/twitter.rb +2 -2
  43. data/lib/sorcery/providers/vk.rb +4 -4
  44. data/lib/sorcery/providers/xing.rb +3 -2
  45. data/lib/sorcery/test_helpers/internal/rails.rb +5 -22
  46. data/lib/sorcery/test_helpers/internal.rb +4 -6
  47. data/lib/sorcery/test_helpers/rails/integration.rb +1 -1
  48. data/lib/sorcery/test_helpers/rails/request.rb +1 -1
  49. data/lib/sorcery/version.rb +1 -1
  50. data/lib/sorcery.rb +6 -1
  51. metadata +21 -150
  52. data/.devcontainer/Dockerfile +0 -10
  53. data/.devcontainer/devcontainer.json +0 -29
  54. data/.devcontainer/postcreate.sh +0 -4
  55. data/.document +0 -5
  56. data/.github/FUNDING.yml +0 -1
  57. data/.github/ISSUE_TEMPLATE.md +0 -24
  58. data/.github/PULL_REQUEST_TEMPLATE.md +0 -7
  59. data/.github/workflows/ruby.yml +0 -54
  60. data/.gitignore +0 -60
  61. data/.rspec +0 -1
  62. data/.rubocop.yml +0 -55
  63. data/.rubocop_todo.yml +0 -163
  64. data/CODE_OF_CONDUCT.md +0 -14
  65. data/Gemfile +0 -8
  66. data/MAINTAINING.md +0 -64
  67. data/Rakefile +0 -8
  68. data/SECURITY.md +0 -19
  69. data/gemfiles/rails_61.gemfile +0 -7
  70. data/gemfiles/rails_70.gemfile +0 -7
  71. data/gemfiles/rails_71.gemfile +0 -7
  72. data/sorcery.gemspec +0 -49
  73. data/spec/active_record/user_activation_spec.rb +0 -17
  74. data/spec/active_record/user_activity_logging_spec.rb +0 -15
  75. data/spec/active_record/user_brute_force_protection_spec.rb +0 -15
  76. data/spec/active_record/user_magic_login_spec.rb +0 -15
  77. data/spec/active_record/user_oauth_spec.rb +0 -15
  78. data/spec/active_record/user_remember_me_spec.rb +0 -15
  79. data/spec/active_record/user_reset_password_spec.rb +0 -15
  80. data/spec/active_record/user_spec.rb +0 -27
  81. data/spec/controllers/controller_activity_logging_spec.rb +0 -113
  82. data/spec/controllers/controller_brute_force_protection_spec.rb +0 -41
  83. data/spec/controllers/controller_http_basic_auth_spec.rb +0 -67
  84. data/spec/controllers/controller_oauth2_spec.rb +0 -568
  85. data/spec/controllers/controller_oauth_spec.rb +0 -266
  86. data/spec/controllers/controller_remember_me_spec.rb +0 -130
  87. data/spec/controllers/controller_session_timeout_spec.rb +0 -168
  88. data/spec/controllers/controller_spec.rb +0 -200
  89. data/spec/orm/active_record.rb +0 -21
  90. data/spec/providers/example_provider_spec.rb +0 -17
  91. data/spec/providers/example_spec.rb +0 -17
  92. data/spec/providers/examples_spec.rb +0 -17
  93. data/spec/providers/vk_spec.rb +0 -42
  94. data/spec/rails_app/app/active_record/authentication.rb +0 -3
  95. data/spec/rails_app/app/active_record/user.rb +0 -5
  96. data/spec/rails_app/app/active_record/user_provider.rb +0 -3
  97. data/spec/rails_app/app/assets/config/manifest.js +0 -1
  98. data/spec/rails_app/app/controllers/application_controller.rb +0 -2
  99. data/spec/rails_app/app/controllers/sorcery_controller.rb +0 -489
  100. data/spec/rails_app/app/helpers/application_helper.rb +0 -2
  101. data/spec/rails_app/app/mailers/sorcery_mailer.rb +0 -38
  102. data/spec/rails_app/app/views/application/index.html.erb +0 -17
  103. data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
  104. data/spec/rails_app/app/views/sorcery_mailer/activation_email.html.erb +0 -17
  105. data/spec/rails_app/app/views/sorcery_mailer/activation_email.text.erb +0 -9
  106. data/spec/rails_app/app/views/sorcery_mailer/activation_needed_email.html.erb +0 -17
  107. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.html.erb +0 -17
  108. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
  109. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.html.erb +0 -13
  110. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.text.erb +0 -6
  111. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
  112. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
  113. data/spec/rails_app/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -1
  114. data/spec/rails_app/config/application.rb +0 -61
  115. data/spec/rails_app/config/boot.rb +0 -4
  116. data/spec/rails_app/config/database.yml +0 -22
  117. data/spec/rails_app/config/environment.rb +0 -5
  118. data/spec/rails_app/config/environments/test.rb +0 -37
  119. data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  120. data/spec/rails_app/config/initializers/compatible_legacy_migration.rb +0 -11
  121. data/spec/rails_app/config/initializers/inflections.rb +0 -10
  122. data/spec/rails_app/config/initializers/mime_types.rb +0 -5
  123. data/spec/rails_app/config/initializers/session_store.rb +0 -12
  124. data/spec/rails_app/config/locales/en.yml +0 -5
  125. data/spec/rails_app/config/routes.rb +0 -81
  126. data/spec/rails_app/config/secrets.yml +0 -4
  127. data/spec/rails_app/config.ru +0 -4
  128. data/spec/rails_app/db/migrate/activation/20101224223622_add_activation_to_users.rb +0 -17
  129. data/spec/rails_app/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -19
  130. data/spec/rails_app/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -13
  131. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +0 -16
  132. data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +0 -22
  133. data/spec/rails_app/db/migrate/invalidate_active_sessions/20180221093235_add_invalidate_active_sessions_before_to_users.rb +0 -9
  134. data/spec/rails_app/db/migrate/magic_login/20170924151831_add_magic_login_to_users.rb +0 -17
  135. data/spec/rails_app/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -15
  136. data/spec/rails_app/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -15
  137. data/spec/rails_app/db/schema.rb +0 -21
  138. data/spec/rails_app/db/seeds.rb +0 -7
  139. data/spec/shared_examples/user_activation_shared_examples.rb +0 -361
  140. data/spec/shared_examples/user_activity_logging_shared_examples.rb +0 -106
  141. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +0 -151
  142. data/spec/shared_examples/user_magic_login_shared_examples.rb +0 -150
  143. data/spec/shared_examples/user_oauth_shared_examples.rb +0 -33
  144. data/spec/shared_examples/user_remember_me_shared_examples.rb +0 -129
  145. data/spec/shared_examples/user_reset_password_shared_examples.rb +0 -370
  146. data/spec/shared_examples/user_shared_examples.rb +0 -678
  147. data/spec/sorcery_crypto_providers_spec.rb +0 -245
  148. data/spec/sorcery_temporary_token_spec.rb +0 -27
  149. data/spec/spec.opts +0 -2
  150. data/spec/spec_helper.rb +0 -50
  151. data/spec/support/migration_helper.rb +0 -29
  152. data/spec/support/providers/example.rb +0 -11
  153. data/spec/support/providers/example_provider.rb +0 -11
  154. data/spec/support/providers/examples.rb +0 -11
@@ -1,361 +0,0 @@
1
- shared_examples_for 'rails_3_activation_model' do
2
- let(:user) { create_new_user }
3
- let(:new_user) { build_new_user }
4
-
5
- context 'loaded plugin configuration' do
6
- before(:all) do
7
- sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
8
- end
9
-
10
- after(:each) do
11
- User.sorcery_config.reset!
12
- sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
13
- end
14
-
15
- it "enables configuration option 'activation_state_attribute_name'" do
16
- sorcery_model_property_set(:activation_state_attribute_name, :status)
17
-
18
- expect(User.sorcery_config.activation_state_attribute_name).to eq :status
19
- end
20
-
21
- it "enables configuration option 'activation_token_attribute_name'" do
22
- sorcery_model_property_set(:activation_token_attribute_name, :code)
23
-
24
- expect(User.sorcery_config.activation_token_attribute_name).to eql :code
25
- end
26
-
27
- it "enables configuration option 'user_activation_mailer'" do
28
- sorcery_model_property_set(:user_activation_mailer, TestMailer)
29
-
30
- expect(User.sorcery_config.user_activation_mailer).to equal(TestMailer)
31
- end
32
-
33
- it "enables configuration option 'activation_needed_email_method_name'" do
34
- sorcery_model_property_set(:activation_needed_email_method_name, :my_activation_email)
35
-
36
- expect(User.sorcery_config.activation_needed_email_method_name).to eq :my_activation_email
37
- end
38
-
39
- it "enables configuration option 'activation_success_email_method_name'" do
40
- sorcery_model_property_set(:activation_success_email_method_name, :my_activation_email)
41
-
42
- expect(User.sorcery_config.activation_success_email_method_name).to eq :my_activation_email
43
- end
44
-
45
- it "enables configuration option 'activation_mailer_disabled'" do
46
- sorcery_model_property_set(:activation_mailer_disabled, :my_activation_mailer_disabled)
47
-
48
- expect(User.sorcery_config.activation_mailer_disabled).to eq :my_activation_mailer_disabled
49
- end
50
-
51
- it 'if mailer is nil and mailer is enabled, throw exception!' do
52
- expect { sorcery_reload!([:user_activation], activation_mailer_disabled: false) }.to raise_error(ArgumentError)
53
- end
54
-
55
- it 'if mailer is disabled and mailer is nil, do NOT throw exception' do
56
- expect { sorcery_reload!([:user_activation], activation_mailer_disabled: true) }.to_not raise_error
57
- end
58
- end
59
-
60
- context 'activation process' do
61
- before(:all) do
62
- sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
63
- end
64
-
65
- it "initializes user state to 'pending'" do
66
- expect(user.activation_state).to eq 'pending'
67
- end
68
-
69
- specify { expect(user).to respond_to :activate! }
70
-
71
- it "clears activation code and change state to 'active' on activation" do
72
- activation_token = user.activation_token
73
- user.activate!
74
- user2 = User.sorcery_adapter.find(user.id) # go to db to make sure it was saved and not just in memory
75
-
76
- expect(user2.activation_token).to be_nil
77
- expect(user2.activation_state).to eq 'active'
78
- expect(User.sorcery_adapter.find_by_activation_token(activation_token)).to be_nil
79
- end
80
-
81
- context 'mailer is enabled' do
82
- it 'sends the user an activation email' do
83
- old_size = ActionMailer::Base.deliveries.size
84
- create_new_user
85
-
86
- expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
87
- end
88
-
89
- it 'calls send_activation_needed_email! method of user' do
90
- expect(new_user).to receive(:send_activation_needed_email!).once
91
-
92
- new_user.sorcery_adapter.save(raise_on_failure: true)
93
- end
94
-
95
- it 'subsequent saves do not send activation email' do
96
- user
97
- old_size = ActionMailer::Base.deliveries.size
98
- user.email = 'Shauli'
99
- user.sorcery_adapter.save(raise_on_failure: true)
100
-
101
- expect(ActionMailer::Base.deliveries.size).to eq old_size
102
- end
103
-
104
- it 'sends the user an activation success email on successful activation' do
105
- user
106
- old_size = ActionMailer::Base.deliveries.size
107
- user.activate!
108
-
109
- expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
110
- end
111
-
112
- it 'calls send_activation_success_email! method of user on activation' do
113
- expect(user).to receive(:send_activation_success_email!).once
114
-
115
- user.activate!
116
- end
117
-
118
- it 'subsequent saves do not send activation success email' do
119
- user.activate!
120
- old_size = ActionMailer::Base.deliveries.size
121
- user.email = 'Shauli'
122
- user.sorcery_adapter.save(raise_on_failure: true)
123
-
124
- expect(ActionMailer::Base.deliveries.size).to eq old_size
125
- end
126
-
127
- it 'activation needed email is optional' do
128
- sorcery_model_property_set(:activation_needed_email_method_name, nil)
129
- old_size = ActionMailer::Base.deliveries.size
130
-
131
- expect(ActionMailer::Base.deliveries.size).to eq old_size
132
- end
133
-
134
- it 'activation success email is optional' do
135
- sorcery_model_property_set(:activation_success_email_method_name, nil)
136
- old_size = ActionMailer::Base.deliveries.size
137
- user.activate!
138
-
139
- expect(ActionMailer::Base.deliveries.size).to eq old_size
140
- end
141
-
142
- context 'activation_needed_email is skipped' do
143
- before(:each) do
144
- @user = build_new_user
145
- @user.skip_activation_needed_email = true
146
- end
147
-
148
- it 'does not send the user an activation email' do
149
- old_size = ActionMailer::Base.deliveries.size
150
-
151
- @user.sorcery_adapter.save(raise_on_failure: true)
152
-
153
- expect(ActionMailer::Base.deliveries.size).to eq old_size
154
- end
155
-
156
- it 'does not call send_activation_needed_email! method of user' do
157
- expect(@user).to receive(:send_activation_needed_email!).never
158
-
159
- @user.sorcery_adapter.save(raise_on_failure: true)
160
- end
161
-
162
- it 'calls send_activation_success_email! method of user on activation' do
163
- expect(@user).to receive(:send_activation_success_email!).never
164
-
165
- @user.activate!
166
- end
167
- end
168
-
169
- context 'activation_success_email is skipped' do
170
- before(:each) do
171
- @user = build_new_user
172
- @user.skip_activation_success_email = true
173
- end
174
-
175
- it 'does not send the user an activation success email on successful activation' do
176
- old_size = ActionMailer::Base.deliveries.size
177
-
178
- @user.activate!
179
-
180
- expect(ActionMailer::Base.deliveries.size).to eq old_size
181
- end
182
- end
183
- end
184
-
185
- context 'mailer has been disabled' do
186
- before(:each) do
187
- sorcery_reload!([:user_activation], activation_mailer_disabled: true, user_activation_mailer: ::SorceryMailer)
188
- end
189
-
190
- it 'does not send the user an activation email' do
191
- old_size = ActionMailer::Base.deliveries.size
192
- create_new_user
193
-
194
- expect(ActionMailer::Base.deliveries.size).to eq old_size
195
- end
196
-
197
- it 'does not call send_activation_needed_email! method of user' do
198
- user = build_new_user
199
-
200
- expect(user).to receive(:send_activation_needed_email!).never
201
-
202
- user.sorcery_adapter.save(raise_on_failure: true)
203
- end
204
-
205
- it 'does not send the user an activation success email on successful activation' do
206
- old_size = ActionMailer::Base.deliveries.size
207
- user.activate!
208
-
209
- expect(ActionMailer::Base.deliveries.size).to eq old_size
210
- end
211
-
212
- it 'calls send_activation_success_email! method of user on activation' do
213
- expect(user).to receive(:send_activation_success_email!).never
214
-
215
- user.activate!
216
- end
217
- end
218
- end
219
-
220
- describe 'prevent non-active login feature' do
221
- before(:all) do
222
- sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
223
- end
224
-
225
- before(:each) do
226
- User.sorcery_adapter.delete_all
227
- end
228
-
229
- it 'does not allow a non-active user to authenticate' do
230
- expect(User.authenticate(user.email, 'secret')).to be_falsy
231
- end
232
-
233
- it 'allows a non-active user to authenticate if configured so' do
234
- sorcery_model_property_set(:prevent_non_active_users_to_login, false)
235
-
236
- expect(User.authenticate(user.email, 'secret')).to be_truthy
237
- end
238
-
239
- context 'in block mode' do
240
- it 'does not allow a non-active user to authenticate' do
241
- sorcery_model_property_set(:prevent_non_active_users_to_login, true)
242
-
243
- User.authenticate(user.email, 'secret') do |user2, failure|
244
- expect(user2).to eq user
245
- expect(user2.activation_state).to eq 'pending'
246
- expect(failure).to eq :inactive
247
- end
248
- end
249
-
250
- it 'allows a non-active user to authenticate if configured so' do
251
- sorcery_model_property_set(:prevent_non_active_users_to_login, false)
252
-
253
- User.authenticate(user.email, 'secret') do |user2, failure|
254
- expect(user2).to eq user
255
- expect(failure).to be_nil
256
- end
257
- end
258
- end
259
- end
260
-
261
- describe 'load_from_activation_token' do
262
- before(:all) do
263
- sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
264
- end
265
-
266
- after(:each) do
267
- Timecop.return
268
- end
269
-
270
- it 'load_from_activation_token returns user when token is found' do
271
- expect(User.load_from_activation_token(user.activation_token)).to eq user
272
- end
273
-
274
- it 'load_from_activation_token does NOT return user when token is NOT found' do
275
- expect(User.load_from_activation_token('a')).to be_nil
276
- end
277
-
278
- it 'load_from_activation_token returas user when token is found and not expired' do
279
- sorcery_model_property_set(:activation_token_expiration_period, 500)
280
-
281
- expect(User.load_from_activation_token(user.activation_token)).to eq user
282
- end
283
-
284
- it 'load_from_activation_token does NOT return user when token is found and expired' do
285
- sorcery_model_property_set(:activation_token_expiration_period, 0.1)
286
- user
287
-
288
- Timecop.travel(Time.now.in_time_zone + 0.5)
289
-
290
- expect(User.load_from_activation_token(user.activation_token)).to be_nil
291
- end
292
-
293
- it 'load_from_activation_token returns nil if token is blank' do
294
- expect(User.load_from_activation_token(nil)).to be_nil
295
- expect(User.load_from_activation_token('')).to be_nil
296
- end
297
-
298
- it 'load_from_activation_token is always valid if expiration period is nil' do
299
- sorcery_model_property_set(:activation_token_expiration_period, nil)
300
-
301
- expect(User.load_from_activation_token(user.activation_token)).to eq user
302
- end
303
-
304
- describe '#load_from_activation_token' do
305
- context 'in block mode' do
306
- it 'yields user when token is found' do
307
- User.load_from_activation_token(user.activation_token) do |user2, failure|
308
- expect(user2).to eq user
309
- expect(failure).to be_nil
310
- end
311
- end
312
-
313
- it 'does NOT yield user when token is NOT found' do
314
- User.load_from_activation_token('a') do |user2, failure|
315
- expect(user2).to be_nil
316
- expect(failure).to eq :user_not_found
317
- end
318
- end
319
-
320
- it 'yields user when token is found and not expired' do
321
- sorcery_model_property_set(:activation_token_expiration_period, 500)
322
-
323
- User.load_from_activation_token(user.activation_token) do |user2, failure|
324
- expect(user2).to eq user
325
- expect(failure).to be_nil
326
- end
327
- end
328
-
329
- it 'yields the user and failure reason when token is found and expired' do
330
- sorcery_model_property_set(:activation_token_expiration_period, 0.1)
331
- user
332
-
333
- Timecop.travel(Time.now.in_time_zone + 0.5)
334
-
335
- User.load_from_activation_token(user.activation_token) do |user2, failure|
336
- expect(user2).to eq user
337
- expect(failure).to eq :token_expired
338
- end
339
- end
340
-
341
- it 'yields a failure reason if token is blank' do
342
- [nil, ''].each do |token|
343
- User.load_from_activation_token(token) do |user2, failure|
344
- expect(user2).to be_nil
345
- expect(failure).to eq :invalid_token
346
- end
347
- end
348
- end
349
-
350
- it 'is always valid if expiration period is nil' do
351
- sorcery_model_property_set(:activation_token_expiration_period, nil)
352
-
353
- User.load_from_activation_token(user.activation_token) do |user2, failure|
354
- expect(user2).to eq user
355
- expect(failure).to be_nil
356
- end
357
- end
358
- end
359
- end
360
- end
361
- end
@@ -1,106 +0,0 @@
1
- shared_examples_for 'rails_3_activity_logging_model' do
2
- context 'loaded plugin configuration' do
3
- before(:all) do
4
- sorcery_reload!([:activity_logging])
5
- end
6
-
7
- after(:each) do
8
- User.sorcery_config.reset!
9
- end
10
-
11
- it "allows configuration option 'last_login_at_attribute_name'" do
12
- sorcery_model_property_set(:last_login_at_attribute_name, :login_time)
13
-
14
- expect(User.sorcery_config.last_login_at_attribute_name).to eq :login_time
15
- end
16
-
17
- it "allows configuration option 'last_logout_at_attribute_name'" do
18
- sorcery_model_property_set(:last_logout_at_attribute_name, :logout_time)
19
- expect(User.sorcery_config.last_logout_at_attribute_name).to eq :logout_time
20
- end
21
-
22
- it "allows configuration option 'last_activity_at_attribute_name'" do
23
- sorcery_model_property_set(:last_activity_at_attribute_name, :activity_time)
24
- expect(User.sorcery_config.last_activity_at_attribute_name).to eq :activity_time
25
- end
26
-
27
- it "allows configuration option 'last_login_from_ip_adress'" do
28
- sorcery_model_property_set(:last_login_from_ip_address_name, :ip_address)
29
- expect(User.sorcery_config.last_login_from_ip_address_name).to eq :ip_address
30
- end
31
-
32
- it '.set_last_login_at update last_login_at' do
33
- user = create_new_user
34
- now = Time.now.in_time_zone
35
- expect(user.sorcery_adapter).to receive(:update_attribute).with(:last_login_at, now)
36
-
37
- user.set_last_login_at(now)
38
- end
39
-
40
- it '.set_last_logout_at update last_logout_at' do
41
- user = create_new_user
42
- now = Time.now.in_time_zone
43
- expect(user.sorcery_adapter).to receive(:update_attribute).with(:last_logout_at, now)
44
-
45
- user.set_last_logout_at(now)
46
- end
47
-
48
- it '.set_last_activity_at update last_activity_at' do
49
- user = create_new_user
50
- now = Time.now.in_time_zone
51
- expect(user.sorcery_adapter).to receive(:update_attribute).with(:last_activity_at, now)
52
-
53
- user.set_last_activity_at(now)
54
- end
55
-
56
- it '.set_last_ip_address update last_login_from_ip_address' do
57
- user = create_new_user
58
- expect(user.sorcery_adapter).to receive(:update_attribute).with(:last_login_from_ip_address, '0.0.0.0')
59
-
60
- user.set_last_ip_address('0.0.0.0')
61
- end
62
-
63
- it 'show if user logged in' do
64
- user = create_new_user
65
- expect(user.logged_in?).to eq(false)
66
-
67
- now = Time.now.in_time_zone
68
- user.set_last_login_at(now)
69
- expect(user.logged_in?).to eq(true)
70
-
71
- now = Time.now.in_time_zone
72
- user.set_last_logout_at(now)
73
- expect(user.logged_in?).to eq(false)
74
- end
75
-
76
- it 'show if user logged out' do
77
- user = create_new_user
78
- expect(user.logged_out?).to eq(true)
79
-
80
- now = Time.now.in_time_zone
81
- user.set_last_login_at(now)
82
- expect(user.logged_out?).to eq(false)
83
-
84
- now = Time.now.in_time_zone
85
- user.set_last_logout_at(now)
86
- expect(user.logged_out?).to eq(true)
87
- end
88
-
89
- it 'show online status of user' do
90
- user = create_new_user
91
- expect(user.online?).to eq(false)
92
-
93
- now = Time.now.in_time_zone
94
- user.set_last_login_at(now)
95
- user.set_last_activity_at(now)
96
- expect(user.online?).to eq(true)
97
-
98
- user.set_last_activity_at(now - 1.day)
99
- expect(user.online?).to eq(false)
100
-
101
- now = Time.now.in_time_zone
102
- user.set_last_logout_at(now)
103
- expect(user.online?).to eq(false)
104
- end
105
- end
106
- end
@@ -1,151 +0,0 @@
1
- shared_examples_for 'rails_3_brute_force_protection_model' do
2
- let(:user) { create_new_user }
3
- before(:each) do
4
- User.sorcery_adapter.delete_all
5
- end
6
-
7
- context 'loaded plugin configuration' do
8
- let(:config) { User.sorcery_config }
9
-
10
- before(:all) do
11
- sorcery_reload!([:brute_force_protection])
12
- end
13
-
14
- after(:each) do
15
- User.sorcery_config.reset!
16
- end
17
-
18
- specify { expect(user).to respond_to(:failed_logins_count) }
19
- specify { expect(user).to respond_to(:lock_expires_at) }
20
-
21
- it "enables configuration option 'failed_logins_count_attribute_name'" do
22
- sorcery_model_property_set(:failed_logins_count_attribute_name, :my_count)
23
- expect(config.failed_logins_count_attribute_name).to eq :my_count
24
- end
25
-
26
- it "enables configuration option 'lock_expires_at_attribute_name'" do
27
- sorcery_model_property_set(:lock_expires_at_attribute_name, :expires)
28
- expect(config.lock_expires_at_attribute_name).to eq :expires
29
- end
30
-
31
- it "enables configuration option 'consecutive_login_retries_amount_allowed'" do
32
- sorcery_model_property_set(:consecutive_login_retries_amount_limit, 34)
33
- expect(config.consecutive_login_retries_amount_limit).to eq 34
34
- end
35
-
36
- it "enables configuration option 'login_lock_time_period'" do
37
- sorcery_model_property_set(:login_lock_time_period, 2.hours)
38
- expect(config.login_lock_time_period).to eq 2.hours
39
- end
40
-
41
- describe '#login_locked?' do
42
- it 'is locked' do
43
- user.send("#{config.lock_expires_at_attribute_name}=", Time.now + 5.days)
44
- expect(user).to be_login_locked
45
- end
46
-
47
- it "isn't locked" do
48
- user.send("#{config.lock_expires_at_attribute_name}=", nil)
49
- expect(user).not_to be_login_locked
50
- end
51
- end
52
- end
53
-
54
- describe '#register_failed_login!' do
55
- it 'locks user when number of retries reached the limit' do
56
- expect(user.lock_expires_at).to be_nil
57
-
58
- sorcery_model_property_set(:consecutive_login_retries_amount_limit, 1)
59
- user.register_failed_login!
60
- lock_expires_at = User.sorcery_adapter.find_by_id(user.id).lock_expires_at
61
-
62
- expect(lock_expires_at).not_to be_nil
63
- end
64
-
65
- context 'unlock_token_mailer_disabled is true' do
66
- it 'does not automatically send unlock email' do
67
- sorcery_model_property_set(:unlock_token_mailer_disabled, true)
68
- sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
69
- sorcery_model_property_set(:login_lock_time_period, 0)
70
- sorcery_model_property_set(:unlock_token_mailer, SorceryMailer)
71
-
72
- 3.times { user.register_failed_login! }
73
-
74
- expect(ActionMailer::Base.deliveries.size).to eq 0
75
- end
76
- end
77
-
78
- context 'unlock_token_mailer_disabled is false' do
79
- before do
80
- sorcery_model_property_set(:unlock_token_mailer_disabled, false)
81
- sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
82
- sorcery_model_property_set(:login_lock_time_period, 0)
83
- sorcery_model_property_set(:unlock_token_mailer, SorceryMailer)
84
- end
85
-
86
- it 'does not automatically send unlock email' do
87
- 3.times { user.register_failed_login! }
88
-
89
- expect(ActionMailer::Base.deliveries.size).to eq 1
90
- end
91
-
92
- it 'generates unlock token before mail is sent' do
93
- 3.times { user.register_failed_login! }
94
-
95
- expect(ActionMailer::Base.deliveries.last.body.to_s.match(user.unlock_token)).not_to be_nil
96
- end
97
- end
98
- end
99
-
100
- context '.authenticate' do
101
- it 'unlocks after lock time period passes' do
102
- sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
103
- sorcery_model_property_set(:login_lock_time_period, 0.2)
104
- 2.times { user.register_failed_login! }
105
-
106
- lock_expires_at = User.sorcery_adapter.find_by_id(user.id).lock_expires_at
107
- expect(lock_expires_at).not_to be_nil
108
-
109
- Timecop.travel(Time.now.in_time_zone + 0.3)
110
- User.authenticate('bla@bla.com', 'secret')
111
-
112
- lock_expires_at = User.sorcery_adapter.find_by_id(user.id).lock_expires_at
113
- expect(lock_expires_at).to be_nil
114
- Timecop.return
115
- end
116
-
117
- it 'doest not unlock if time period is 0 (permanent lock)' do
118
- sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
119
- sorcery_model_property_set(:login_lock_time_period, 0)
120
-
121
- 2.times { user.register_failed_login! }
122
-
123
- unlock_date = user.lock_expires_at
124
- Timecop.travel(Time.now.in_time_zone + 1)
125
-
126
- user.register_failed_login!
127
-
128
- expect(user.lock_expires_at.to_s).to eq unlock_date.to_s
129
- Timecop.return
130
- end
131
- end
132
-
133
- describe '#login_unlock!' do
134
- it 'unlocks after entering unlock token' do
135
- sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
136
- sorcery_model_property_set(:login_lock_time_period, 0)
137
- sorcery_model_property_set(:unlock_token_mailer, SorceryMailer)
138
- 3.times { user.register_failed_login! }
139
-
140
- expect(user.unlock_token).not_to be_nil
141
-
142
- token = user.unlock_token
143
- user = User.load_from_unlock_token(token)
144
-
145
- expect(user).not_to be_nil
146
-
147
- user.login_unlock!
148
- expect(User.load_from_unlock_token(user.unlock_token)).to be_nil
149
- end
150
- end
151
- end