sorcery 0.9.1 → 0.16.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. checksums.yaml +5 -5
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/ISSUE_TEMPLATE.md +24 -0
  4. data/.github/PULL_REQUEST_TEMPLATE.md +7 -0
  5. data/.github/workflows/ruby.yml +70 -0
  6. data/.gitignore +3 -0
  7. data/.rubocop.yml +55 -0
  8. data/.rubocop_todo.yml +163 -0
  9. data/CHANGELOG.md +132 -34
  10. data/CODE_OF_CONDUCT.md +14 -0
  11. data/Gemfile +3 -17
  12. data/{LICENSE.txt → LICENSE.md} +1 -1
  13. data/MAINTAINING.md +64 -0
  14. data/README.md +146 -269
  15. data/Rakefile +4 -2
  16. data/SECURITY.md +19 -0
  17. data/gemfiles/rails_52.gemfile +7 -0
  18. data/gemfiles/rails_60.gemfile +7 -0
  19. data/gemfiles/rails_61.gemfile +7 -0
  20. data/gemfiles/rails_70.gemfile +7 -0
  21. data/lib/generators/sorcery/USAGE +1 -1
  22. data/lib/generators/sorcery/helpers.rb +8 -4
  23. data/lib/generators/sorcery/install_generator.rb +41 -35
  24. data/lib/generators/sorcery/templates/initializer.rb +216 -112
  25. data/lib/generators/sorcery/templates/migration/activity_logging.rb +7 -7
  26. data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +5 -5
  27. data/lib/generators/sorcery/templates/migration/core.rb +5 -7
  28. data/lib/generators/sorcery/templates/migration/external.rb +4 -4
  29. data/lib/generators/sorcery/templates/migration/magic_login.rb +9 -0
  30. data/lib/generators/sorcery/templates/migration/remember_me.rb +5 -5
  31. data/lib/generators/sorcery/templates/migration/reset_password.rb +7 -6
  32. data/lib/generators/sorcery/templates/migration/user_activation.rb +6 -6
  33. data/lib/sorcery/adapters/active_record_adapter.rb +11 -21
  34. data/lib/sorcery/adapters/mongoid_adapter.rb +23 -11
  35. data/lib/sorcery/controller/config.rb +27 -23
  36. data/lib/sorcery/controller/submodules/activity_logging.rb +16 -18
  37. data/lib/sorcery/controller/submodules/brute_force_protection.rb +1 -2
  38. data/lib/sorcery/controller/submodules/external.rb +69 -44
  39. data/lib/sorcery/controller/submodules/http_basic_auth.rb +18 -19
  40. data/lib/sorcery/controller/submodules/remember_me.rb +16 -16
  41. data/lib/sorcery/controller/submodules/session_timeout.rb +33 -11
  42. data/lib/sorcery/controller.rb +50 -35
  43. data/lib/sorcery/crypto_providers/aes256.rb +17 -16
  44. data/lib/sorcery/crypto_providers/bcrypt.rb +26 -22
  45. data/lib/sorcery/crypto_providers/common.rb +1 -1
  46. data/lib/sorcery/crypto_providers/md5.rb +5 -5
  47. data/lib/sorcery/crypto_providers/sha1.rb +5 -5
  48. data/lib/sorcery/crypto_providers/sha256.rb +2 -2
  49. data/lib/sorcery/crypto_providers/sha512.rb +3 -3
  50. data/lib/sorcery/engine.rb +19 -11
  51. data/lib/sorcery/model/config.rb +73 -50
  52. data/lib/sorcery/model/submodules/activity_logging.rb +31 -12
  53. data/lib/sorcery/model/submodules/brute_force_protection.rb +38 -31
  54. data/lib/sorcery/model/submodules/external.rb +22 -10
  55. data/lib/sorcery/model/submodules/magic_login.rb +130 -0
  56. data/lib/sorcery/model/submodules/remember_me.rb +19 -7
  57. data/lib/sorcery/model/submodules/reset_password.rb +64 -42
  58. data/lib/sorcery/model/submodules/user_activation.rb +52 -54
  59. data/lib/sorcery/model/temporary_token.rb +30 -7
  60. data/lib/sorcery/model.rb +65 -40
  61. data/lib/sorcery/protocols/oauth.rb +4 -9
  62. data/lib/sorcery/protocols/oauth2.rb +0 -2
  63. data/lib/sorcery/providers/auth0.rb +46 -0
  64. data/lib/sorcery/providers/base.rb +4 -4
  65. data/lib/sorcery/providers/battlenet.rb +51 -0
  66. data/lib/sorcery/providers/discord.rb +52 -0
  67. data/lib/sorcery/providers/facebook.rb +8 -11
  68. data/lib/sorcery/providers/github.rb +5 -7
  69. data/lib/sorcery/providers/google.rb +3 -5
  70. data/lib/sorcery/providers/heroku.rb +7 -8
  71. data/lib/sorcery/providers/instagram.rb +73 -0
  72. data/lib/sorcery/providers/jira.rb +12 -17
  73. data/lib/sorcery/providers/line.rb +63 -0
  74. data/lib/sorcery/providers/linkedin.rb +44 -35
  75. data/lib/sorcery/providers/liveid.rb +4 -7
  76. data/lib/sorcery/providers/microsoft.rb +59 -0
  77. data/lib/sorcery/providers/paypal.rb +60 -0
  78. data/lib/sorcery/providers/salesforce.rb +3 -5
  79. data/lib/sorcery/providers/slack.rb +45 -0
  80. data/lib/sorcery/providers/twitter.rb +4 -6
  81. data/lib/sorcery/providers/vk.rb +8 -9
  82. data/lib/sorcery/providers/wechat.rb +81 -0
  83. data/lib/sorcery/providers/xing.rb +7 -10
  84. data/lib/sorcery/test_helpers/internal/rails.rb +25 -17
  85. data/lib/sorcery/test_helpers/internal.rb +15 -14
  86. data/lib/sorcery/test_helpers/rails/controller.rb +1 -1
  87. data/lib/sorcery/test_helpers/rails/integration.rb +5 -6
  88. data/lib/sorcery/test_helpers/rails/request.rb +20 -0
  89. data/lib/sorcery/version.rb +1 -1
  90. data/lib/sorcery.rb +4 -17
  91. data/sorcery.gemspec +43 -28
  92. data/spec/active_record/user_activation_spec.rb +4 -5
  93. data/spec/active_record/user_activity_logging_spec.rb +4 -6
  94. data/spec/active_record/user_brute_force_protection_spec.rb +5 -6
  95. data/spec/active_record/user_magic_login_spec.rb +15 -0
  96. data/spec/active_record/user_oauth_spec.rb +5 -6
  97. data/spec/active_record/user_remember_me_spec.rb +5 -6
  98. data/spec/active_record/user_reset_password_spec.rb +4 -5
  99. data/spec/active_record/user_spec.rb +7 -17
  100. data/spec/controllers/controller_activity_logging_spec.rb +13 -24
  101. data/spec/controllers/controller_brute_force_protection_spec.rb +8 -10
  102. data/spec/controllers/controller_http_basic_auth_spec.rb +20 -21
  103. data/spec/controllers/controller_oauth2_spec.rb +297 -158
  104. data/spec/controllers/controller_oauth_spec.rb +97 -71
  105. data/spec/controllers/controller_remember_me_spec.rb +49 -36
  106. data/spec/controllers/controller_session_timeout_spec.rb +106 -20
  107. data/spec/controllers/controller_spec.rb +87 -111
  108. data/spec/orm/active_record.rb +3 -3
  109. data/spec/providers/example_provider_spec.rb +17 -0
  110. data/spec/providers/example_spec.rb +17 -0
  111. data/spec/providers/examples_spec.rb +17 -0
  112. data/spec/providers/vk_spec.rb +42 -0
  113. data/spec/rails_app/app/active_record/authentication.rb +1 -1
  114. data/spec/rails_app/app/active_record/user.rb +2 -2
  115. data/spec/rails_app/app/assets/config/manifest.js +1 -0
  116. data/spec/rails_app/app/controllers/application_controller.rb +2 -0
  117. data/spec/rails_app/app/controllers/sorcery_controller.rb +250 -46
  118. data/spec/rails_app/app/mailers/sorcery_mailer.rb +23 -17
  119. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.html.erb +13 -0
  120. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.text.erb +6 -0
  121. data/spec/rails_app/config/application.rb +14 -9
  122. data/spec/rails_app/config/boot.rb +2 -2
  123. data/spec/rails_app/config/environment.rb +1 -1
  124. data/spec/rails_app/config/environments/test.rb +1 -1
  125. data/spec/rails_app/config/initializers/compatible_legacy_migration.rb +11 -0
  126. data/spec/rails_app/config/initializers/session_store.rb +3 -3
  127. data/spec/rails_app/config/routes.rb +31 -1
  128. data/spec/rails_app/config/secrets.yml +4 -0
  129. data/spec/rails_app/config.ru +1 -1
  130. data/spec/rails_app/db/migrate/activation/20101224223622_add_activation_to_users.rb +4 -4
  131. data/spec/rails_app/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +10 -10
  132. data/spec/rails_app/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +5 -5
  133. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +5 -5
  134. data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +3 -3
  135. data/spec/rails_app/db/migrate/invalidate_active_sessions/20180221093235_add_invalidate_active_sessions_before_to_users.rb +9 -0
  136. data/spec/rails_app/db/migrate/magic_login/20170924151831_add_magic_login_to_users.rb +17 -0
  137. data/spec/rails_app/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +6 -6
  138. data/spec/rails_app/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +7 -5
  139. data/spec/rails_app/db/schema.rb +7 -9
  140. data/spec/shared_examples/user_activation_shared_examples.rb +177 -58
  141. data/spec/shared_examples/user_activity_logging_shared_examples.rb +47 -41
  142. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +19 -24
  143. data/spec/shared_examples/user_magic_login_shared_examples.rb +150 -0
  144. data/spec/shared_examples/user_oauth_shared_examples.rb +7 -10
  145. data/spec/shared_examples/user_remember_me_shared_examples.rb +91 -22
  146. data/spec/shared_examples/user_reset_password_shared_examples.rb +153 -58
  147. data/spec/shared_examples/user_shared_examples.rb +328 -145
  148. data/spec/sorcery_crypto_providers_spec.rb +122 -75
  149. data/spec/sorcery_temporary_token_spec.rb +27 -0
  150. data/spec/spec.opts +1 -1
  151. data/spec/spec_helper.rb +19 -14
  152. data/spec/support/migration_helper.rb +29 -0
  153. data/spec/support/providers/example.rb +11 -0
  154. data/spec/support/providers/example_provider.rb +11 -0
  155. data/spec/support/providers/examples.rb +11 -0
  156. metadata +119 -89
  157. data/.travis.yml +0 -132
  158. data/gemfiles/active_record-rails40.gemfile +0 -7
  159. data/gemfiles/active_record-rails41.gemfile +0 -7
  160. data/gemfiles/mongo_mapper-rails40.gemfile +0 -9
  161. data/gemfiles/mongo_mapper-rails41.gemfile +0 -9
  162. data/gemfiles/mongoid-rails40.gemfile +0 -9
  163. data/gemfiles/mongoid-rails41.gemfile +0 -9
  164. data/gemfiles/mongoid3-rails32.gemfile +0 -9
  165. data/lib/sorcery/adapters/data_mapper_adapter.rb +0 -176
  166. data/lib/sorcery/adapters/mongo_mapper_adapter.rb +0 -110
  167. data/lib/sorcery/railties/tasks.rake +0 -6
  168. data/spec/data_mapper/user_activation_spec.rb +0 -10
  169. data/spec/data_mapper/user_activity_logging_spec.rb +0 -14
  170. data/spec/data_mapper/user_brute_force_protection_spec.rb +0 -9
  171. data/spec/data_mapper/user_oauth_spec.rb +0 -9
  172. data/spec/data_mapper/user_remember_me_spec.rb +0 -8
  173. data/spec/data_mapper/user_reset_password_spec.rb +0 -8
  174. data/spec/data_mapper/user_spec.rb +0 -27
  175. data/spec/mongo_mapper/user_activation_spec.rb +0 -9
  176. data/spec/mongo_mapper/user_activity_logging_spec.rb +0 -8
  177. data/spec/mongo_mapper/user_brute_force_protection_spec.rb +0 -8
  178. data/spec/mongo_mapper/user_oauth_spec.rb +0 -8
  179. data/spec/mongo_mapper/user_remember_me_spec.rb +0 -8
  180. data/spec/mongo_mapper/user_reset_password_spec.rb +0 -8
  181. data/spec/mongo_mapper/user_spec.rb +0 -37
  182. data/spec/mongoid/user_activation_spec.rb +0 -9
  183. data/spec/mongoid/user_activity_logging_spec.rb +0 -8
  184. data/spec/mongoid/user_brute_force_protection_spec.rb +0 -8
  185. data/spec/mongoid/user_oauth_spec.rb +0 -8
  186. data/spec/mongoid/user_remember_me_spec.rb +0 -8
  187. data/spec/mongoid/user_reset_password_spec.rb +0 -8
  188. data/spec/mongoid/user_spec.rb +0 -51
  189. data/spec/orm/data_mapper.rb +0 -48
  190. data/spec/orm/mongo_mapper.rb +0 -10
  191. data/spec/orm/mongoid.rb +0 -22
  192. data/spec/rails_app/app/data_mapper/authentication.rb +0 -8
  193. data/spec/rails_app/app/data_mapper/user.rb +0 -7
  194. data/spec/rails_app/app/mongo_mapper/authentication.rb +0 -6
  195. data/spec/rails_app/app/mongo_mapper/user.rb +0 -7
  196. data/spec/rails_app/app/mongoid/authentication.rb +0 -7
  197. data/spec/rails_app/app/mongoid/user.rb +0 -7
  198. data/spec/rails_app/config/initializers/secret_token.rb +0 -7
  199. data/spec/rails_app/log/development.log +0 -1791
@@ -1,15 +1,15 @@
1
- shared_examples_for "rails_3_activation_model" do
1
+ shared_examples_for 'rails_3_activation_model' do
2
2
  let(:user) { create_new_user }
3
3
  let(:new_user) { build_new_user }
4
4
 
5
- context "loaded plugin configuration" do
5
+ context 'loaded plugin configuration' do
6
6
  before(:all) do
7
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
7
+ sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
8
8
  end
9
9
 
10
10
  after(:each) do
11
11
  User.sorcery_config.reset!
12
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
12
+ sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
13
13
  end
14
14
 
15
15
  it "enables configuration option 'activation_state_attribute_name'" do
@@ -48,23 +48,22 @@ shared_examples_for "rails_3_activation_model" do
48
48
  expect(User.sorcery_config.activation_mailer_disabled).to eq :my_activation_mailer_disabled
49
49
  end
50
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)
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
53
  end
54
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
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
57
  end
58
58
  end
59
59
 
60
-
61
- context "activation process" do
60
+ context 'activation process' do
62
61
  before(:all) do
63
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
62
+ sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
64
63
  end
65
64
 
66
65
  it "initializes user state to 'pending'" do
67
- expect(user.activation_state).to eq "pending"
66
+ expect(user.activation_state).to eq 'pending'
68
67
  end
69
68
 
70
69
  specify { expect(user).to respond_to :activate! }
@@ -75,35 +74,34 @@ shared_examples_for "rails_3_activation_model" do
75
74
  user2 = User.sorcery_adapter.find(user.id) # go to db to make sure it was saved and not just in memory
76
75
 
77
76
  expect(user2.activation_token).to be_nil
78
- expect(user2.activation_state).to eq "active"
79
- expect(User.sorcery_adapter.find_by_activation_token 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
80
79
  end
81
80
 
82
-
83
- context "mailer is enabled" do
84
- it "sends the user an activation email" do
81
+ context 'mailer is enabled' do
82
+ it 'sends the user an activation email' do
85
83
  old_size = ActionMailer::Base.deliveries.size
86
84
  create_new_user
87
85
 
88
86
  expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
89
87
  end
90
88
 
91
- it "calls send_activation_needed_email! method of user" do
89
+ it 'calls send_activation_needed_email! method of user' do
92
90
  expect(new_user).to receive(:send_activation_needed_email!).once
93
91
 
94
- new_user.sorcery_adapter.save(:raise_on_failure => true)
92
+ new_user.sorcery_adapter.save(raise_on_failure: true)
95
93
  end
96
94
 
97
- it "subsequent saves do not send activation email" do
95
+ it 'subsequent saves do not send activation email' do
98
96
  user
99
97
  old_size = ActionMailer::Base.deliveries.size
100
- user.email = "Shauli"
101
- user.sorcery_adapter.save(:raise_on_failure => true)
98
+ user.email = 'Shauli'
99
+ user.sorcery_adapter.save(raise_on_failure: true)
102
100
 
103
101
  expect(ActionMailer::Base.deliveries.size).to eq old_size
104
102
  end
105
103
 
106
- it "sends the user an activation success email on successful activation" do
104
+ it 'sends the user an activation success email on successful activation' do
107
105
  user
108
106
  old_size = ActionMailer::Base.deliveries.size
109
107
  user.activate!
@@ -111,64 +109,107 @@ shared_examples_for "rails_3_activation_model" do
111
109
  expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
112
110
  end
113
111
 
114
- it "calls send_activation_success_email! method of user on activation" do
112
+ it 'calls send_activation_success_email! method of user on activation' do
115
113
  expect(user).to receive(:send_activation_success_email!).once
116
114
 
117
115
  user.activate!
118
116
  end
119
117
 
120
- it "subsequent saves do not send activation success email" do
118
+ it 'subsequent saves do not send activation success email' do
121
119
  user.activate!
122
120
  old_size = ActionMailer::Base.deliveries.size
123
- user.email = "Shauli"
124
- user.sorcery_adapter.save(:raise_on_failure => true)
121
+ user.email = 'Shauli'
122
+ user.sorcery_adapter.save(raise_on_failure: true)
125
123
 
126
124
  expect(ActionMailer::Base.deliveries.size).to eq old_size
127
125
  end
128
126
 
129
- it "activation needed email is optional" do
127
+ it 'activation needed email is optional' do
130
128
  sorcery_model_property_set(:activation_needed_email_method_name, nil)
131
129
  old_size = ActionMailer::Base.deliveries.size
132
130
 
133
131
  expect(ActionMailer::Base.deliveries.size).to eq old_size
134
132
  end
135
133
 
136
- it "activation success email is optional" do
134
+ it 'activation success email is optional' do
137
135
  sorcery_model_property_set(:activation_success_email_method_name, nil)
138
136
  old_size = ActionMailer::Base.deliveries.size
139
137
  user.activate!
140
138
 
141
139
  expect(ActionMailer::Base.deliveries.size).to eq old_size
142
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
143
183
  end
144
184
 
145
- context "mailer has been disabled" do
185
+ context 'mailer has been disabled' do
146
186
  before(:each) do
147
- sorcery_reload!([:user_activation], :activation_mailer_disabled => true, :user_activation_mailer => ::SorceryMailer)
187
+ sorcery_reload!([:user_activation], activation_mailer_disabled: true, user_activation_mailer: ::SorceryMailer)
148
188
  end
149
189
 
150
- it "does not send the user an activation email" do
190
+ it 'does not send the user an activation email' do
151
191
  old_size = ActionMailer::Base.deliveries.size
192
+ create_new_user
152
193
 
153
194
  expect(ActionMailer::Base.deliveries.size).to eq old_size
154
195
  end
155
196
 
156
- it "does not call send_activation_needed_email! method of user" do
197
+ it 'does not call send_activation_needed_email! method of user' do
157
198
  user = build_new_user
158
199
 
159
200
  expect(user).to receive(:send_activation_needed_email!).never
160
201
 
161
- user.sorcery_adapter.save(:raise_on_failure => true)
202
+ user.sorcery_adapter.save(raise_on_failure: true)
162
203
  end
163
204
 
164
- it "does not send the user an activation success email on successful activation" do
205
+ it 'does not send the user an activation success email on successful activation' do
165
206
  old_size = ActionMailer::Base.deliveries.size
166
207
  user.activate!
167
208
 
168
209
  expect(ActionMailer::Base.deliveries.size).to eq old_size
169
210
  end
170
211
 
171
- it "calls send_activation_success_email! method of user on activation" do
212
+ it 'calls send_activation_success_email! method of user on activation' do
172
213
  expect(user).to receive(:send_activation_success_email!).never
173
214
 
174
215
  user.activate!
@@ -176,67 +217,145 @@ shared_examples_for "rails_3_activation_model" do
176
217
  end
177
218
  end
178
219
 
179
- describe "prevent non-active login feature" do
220
+ describe 'prevent non-active login feature' do
180
221
  before(:all) do
181
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
222
+ sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
182
223
  end
183
224
 
184
225
  before(:each) do
185
226
  User.sorcery_adapter.delete_all
186
227
  end
187
228
 
188
- it "does not allow a non-active user to authenticate" do
189
- expect(User.authenticate user.email, 'secret').to be_falsy
229
+ it 'does not allow a non-active user to authenticate' do
230
+ expect(User.authenticate(user.email, 'secret')).to be_falsy
190
231
  end
191
232
 
192
- it "allows a non-active user to authenticate if configured so" do
233
+ it 'allows a non-active user to authenticate if configured so' do
193
234
  sorcery_model_property_set(:prevent_non_active_users_to_login, false)
194
235
 
195
- expect(User.authenticate user.email, 'secret').to be_truthy
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
196
258
  end
197
259
  end
198
260
 
199
- describe "load_from_activation_token" do
261
+ describe 'load_from_activation_token' do
200
262
  before(:all) do
201
- sorcery_reload!([:user_activation], :user_activation_mailer => ::SorceryMailer)
263
+ sorcery_reload!([:user_activation], user_activation_mailer: ::SorceryMailer)
202
264
  end
203
265
 
204
266
  after(:each) do
205
267
  Timecop.return
206
268
  end
207
269
 
208
- it "load_from_activation_token returns user when token is found" do
209
- expect(User.load_from_activation_token user.activation_token).to eq user
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
210
272
  end
211
273
 
212
- it "load_from_activation_token does NOT return user when token is NOT found" do
213
- expect(User.load_from_activation_token "a").to be_nil
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
214
276
  end
215
277
 
216
- it "load_from_activation_token returas user when token is found and not expired" do
278
+ it 'load_from_activation_token returas user when token is found and not expired' do
217
279
  sorcery_model_property_set(:activation_token_expiration_period, 500)
218
280
 
219
- expect(User.load_from_activation_token user.activation_token).to eq user
281
+ expect(User.load_from_activation_token(user.activation_token)).to eq user
220
282
  end
221
283
 
222
- it "load_from_activation_token does NOT return user when token is found and expired" do
284
+ it 'load_from_activation_token does NOT return user when token is found and expired' do
223
285
  sorcery_model_property_set(:activation_token_expiration_period, 0.1)
224
286
  user
225
287
 
226
- Timecop.travel(Time.now.in_time_zone+0.5)
288
+ Timecop.travel(Time.now.in_time_zone + 0.5)
227
289
 
228
- expect(User.load_from_activation_token user.activation_token).to be_nil
290
+ expect(User.load_from_activation_token(user.activation_token)).to be_nil
229
291
  end
230
292
 
231
- it "load_from_activation_token returns nil if token is blank" do
232
- expect(User.load_from_activation_token nil).to be_nil
233
- expect(User.load_from_activation_token "").to be_nil
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
234
296
  end
235
297
 
236
- it "load_from_activation_token is always valid if expiration period is nil" do
298
+ it 'load_from_activation_token is always valid if expiration period is nil' do
237
299
  sorcery_model_property_set(:activation_token_expiration_period, nil)
238
300
 
239
- expect(User.load_from_activation_token user.activation_token).to eq user
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
240
359
  end
241
360
  end
242
361
  end
@@ -1,5 +1,5 @@
1
- shared_examples_for "rails_3_activity_logging_model" do
2
- context "loaded plugin configuration" do
1
+ shared_examples_for 'rails_3_activity_logging_model' do
2
+ context 'loaded plugin configuration' do
3
3
  before(:all) do
4
4
  sorcery_reload!([:activity_logging])
5
5
  end
@@ -29,43 +29,6 @@ shared_examples_for "rails_3_activity_logging_model" do
29
29
  expect(User.sorcery_config.last_login_from_ip_address_name).to eq :ip_address
30
30
  end
31
31
 
32
- describe ".current_users" do
33
- let(:user) { create_new_user }
34
-
35
- it "is empty when no users are logged in" do
36
- skip('unavailable in MongoMapper') if SORCERY_ORM == :mongo_mapper
37
- expect(User.current_users).to be_empty
38
- end
39
-
40
- it "holds the user object when 1 user is logged in" do
41
- skip('unavailable in MongoMapper') if SORCERY_ORM == :mongo_mapper
42
- user.set_last_activity_at(Time.now.in_time_zone)
43
-
44
- expect(User.current_users).to match([User.sorcery_adapter.find(user.id)])
45
- end
46
-
47
- it "'current_users' shows all current_users, whether they have logged out before or not." do
48
- skip('unavailable in MongoMapper') if SORCERY_ORM == :mongo_mapper
49
- User.sorcery_adapter.delete_all
50
- user1 = create_new_user({:username => 'gizmo1', :email => "bla1@bla.com", :password => 'secret1'})
51
- user2 = create_new_user({:username => 'gizmo2', :email => "bla2@bla.com", :password => 'secret2'})
52
- user3 = create_new_user({:username => 'gizmo3', :email => "bla3@bla.com", :password => 'secret3'})
53
-
54
- now = Time.now.in_time_zone
55
- [user1, user2, user3].each do |user|
56
- user.set_last_login_at(now)
57
- user.set_last_activity_at(now)
58
- end
59
-
60
- expect(User.current_users.map(&:id)).to match_array([user1, user2, user3].map(&:id))
61
- Timecop.travel now + 5
62
- user1.set_last_logout_at(Time.now.in_time_zone)
63
- expect(User.current_users.map(&:id)).to match_array([user2, user3].map(&:id))
64
- Timecop.return
65
- end
66
-
67
- end
68
-
69
32
  it '.set_last_login_at update last_login_at' do
70
33
  user = create_new_user
71
34
  now = Time.now.in_time_zone
@@ -90,11 +53,54 @@ shared_examples_for "rails_3_activity_logging_model" do
90
53
  user.set_last_activity_at(now)
91
54
  end
92
55
 
93
- it '.set_last_ip_addess update last_login_from_ip_address' do
56
+ it '.set_last_ip_address update last_login_from_ip_address' do
94
57
  user = create_new_user
95
58
  expect(user.sorcery_adapter).to receive(:update_attribute).with(:last_login_from_ip_address, '0.0.0.0')
96
59
 
97
- user.set_last_ip_addess('0.0.0.0')
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)
98
104
  end
99
105
  end
100
106
  end
@@ -1,12 +1,10 @@
1
- shared_examples_for "rails_3_brute_force_protection_model" do
1
+ shared_examples_for 'rails_3_brute_force_protection_model' do
2
2
  let(:user) { create_new_user }
3
3
  before(:each) do
4
4
  User.sorcery_adapter.delete_all
5
5
  end
6
6
 
7
-
8
- context "loaded plugin configuration" do
9
-
7
+ context 'loaded plugin configuration' do
10
8
  let(:config) { User.sorcery_config }
11
9
 
12
10
  before(:all) do
@@ -40,21 +38,21 @@ shared_examples_for "rails_3_brute_force_protection_model" do
40
38
  expect(config.login_lock_time_period).to eq 2.hours
41
39
  end
42
40
 
43
- describe "#locked?" do
44
- it "is locked" do
41
+ describe '#login_locked?' do
42
+ it 'is locked' do
45
43
  user.send("#{config.lock_expires_at_attribute_name}=", Time.now + 5.days)
46
- expect(user).to be_locked
44
+ expect(user).to be_login_locked
47
45
  end
48
46
 
49
47
  it "isn't locked" do
50
48
  user.send("#{config.lock_expires_at_attribute_name}=", nil)
51
- expect(user).not_to be_locked
49
+ expect(user).not_to be_login_locked
52
50
  end
53
51
  end
54
52
  end
55
53
 
56
- describe "#register_failed_login!" do
57
- it "locks user when number of retries reached the limit" do
54
+ describe '#register_failed_login!' do
55
+ it 'locks user when number of retries reached the limit' do
58
56
  expect(user.lock_expires_at).to be_nil
59
57
 
60
58
  sorcery_model_property_set(:consecutive_login_retries_amount_limit, 1)
@@ -64,8 +62,8 @@ shared_examples_for "rails_3_brute_force_protection_model" do
64
62
  expect(lock_expires_at).not_to be_nil
65
63
  end
66
64
 
67
- context "unlock_token_mailer_disabled is true" do
68
- it "does not automatically send unlock email" do
65
+ context 'unlock_token_mailer_disabled is true' do
66
+ it 'does not automatically send unlock email' do
69
67
  sorcery_model_property_set(:unlock_token_mailer_disabled, true)
70
68
  sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
71
69
  sorcery_model_property_set(:login_lock_time_period, 0)
@@ -74,11 +72,10 @@ shared_examples_for "rails_3_brute_force_protection_model" do
74
72
  3.times { user.register_failed_login! }
75
73
 
76
74
  expect(ActionMailer::Base.deliveries.size).to eq 0
77
-
78
75
  end
79
76
  end
80
77
 
81
- context "unlock_token_mailer_disabled is false" do
78
+ context 'unlock_token_mailer_disabled is false' do
82
79
  before do
83
80
  sorcery_model_property_set(:unlock_token_mailer_disabled, false)
84
81
  sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
@@ -86,13 +83,13 @@ shared_examples_for "rails_3_brute_force_protection_model" do
86
83
  sorcery_model_property_set(:unlock_token_mailer, SorceryMailer)
87
84
  end
88
85
 
89
- it "does not automatically send unlock email" do
86
+ it 'does not automatically send unlock email' do
90
87
  3.times { user.register_failed_login! }
91
88
 
92
89
  expect(ActionMailer::Base.deliveries.size).to eq 1
93
90
  end
94
91
 
95
- it "generates unlock token before mail is sent" do
92
+ it 'generates unlock token before mail is sent' do
96
93
  3.times { user.register_failed_login! }
97
94
 
98
95
  expect(ActionMailer::Base.deliveries.last.body.to_s.match(user.unlock_token)).not_to be_nil
@@ -100,9 +97,8 @@ shared_examples_for "rails_3_brute_force_protection_model" do
100
97
  end
101
98
  end
102
99
 
103
- context ".authenticate" do
104
-
105
- it "unlocks after lock time period passes" do
100
+ context '.authenticate' do
101
+ it 'unlocks after lock time period passes' do
106
102
  sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
107
103
  sorcery_model_property_set(:login_lock_time_period, 0.2)
108
104
  2.times { user.register_failed_login! }
@@ -118,7 +114,7 @@ shared_examples_for "rails_3_brute_force_protection_model" do
118
114
  Timecop.return
119
115
  end
120
116
 
121
- it "doest not unlock if time period is 0 (permanent lock)" do
117
+ it 'doest not unlock if time period is 0 (permanent lock)' do
122
118
  sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
123
119
  sorcery_model_property_set(:login_lock_time_period, 0)
124
120
 
@@ -132,11 +128,10 @@ shared_examples_for "rails_3_brute_force_protection_model" do
132
128
  expect(user.lock_expires_at.to_s).to eq unlock_date.to_s
133
129
  Timecop.return
134
130
  end
135
-
136
131
  end
137
132
 
138
- describe "#unlock!" do
139
- it "unlocks after entering unlock token" do
133
+ describe '#login_unlock!' do
134
+ it 'unlocks after entering unlock token' do
140
135
  sorcery_model_property_set(:consecutive_login_retries_amount_limit, 2)
141
136
  sorcery_model_property_set(:login_lock_time_period, 0)
142
137
  sorcery_model_property_set(:unlock_token_mailer, SorceryMailer)
@@ -149,7 +144,7 @@ shared_examples_for "rails_3_brute_force_protection_model" do
149
144
 
150
145
  expect(user).not_to be_nil
151
146
 
152
- user.unlock!
147
+ user.login_unlock!
153
148
  expect(User.load_from_unlock_token(user.unlock_token)).to be_nil
154
149
  end
155
150
  end