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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -1
- data/README.md +8 -5
- data/lib/generators/sorcery/helpers.rb +1 -1
- data/lib/generators/sorcery/install_generator.rb +9 -18
- data/lib/generators/sorcery/templates/initializer.rb +24 -10
- data/lib/sorcery/adapters/active_record_adapter.rb +12 -14
- data/lib/sorcery/adapters/mongoid_adapter.rb +6 -8
- data/lib/sorcery/controller/config.rb +27 -29
- data/lib/sorcery/controller/submodules/activity_logging.rb +4 -7
- data/lib/sorcery/controller/submodules/brute_force_protection.rb +4 -1
- data/lib/sorcery/controller/submodules/external.rb +11 -11
- data/lib/sorcery/controller/submodules/http_basic_auth.rb +7 -2
- data/lib/sorcery/controller/submodules/remember_me.rb +2 -1
- data/lib/sorcery/controller/submodules/session_timeout.rb +2 -2
- data/lib/sorcery/controller.rb +36 -18
- data/lib/sorcery/crypto_providers/aes256.rb +4 -2
- data/lib/sorcery/crypto_providers/bcrypt.rb +2 -1
- data/lib/sorcery/crypto_providers/md5.rb +1 -0
- data/lib/sorcery/crypto_providers/sha1.rb +1 -0
- data/lib/sorcery/crypto_providers/sha256.rb +1 -0
- data/lib/sorcery/crypto_providers/sha512.rb +1 -0
- data/lib/sorcery/engine.rb +6 -4
- data/lib/sorcery/errors.rb +10 -0
- data/lib/sorcery/model/config.rb +20 -31
- data/lib/sorcery/model/submodules/activity_logging.rb +8 -6
- data/lib/sorcery/model/submodules/brute_force_protection.rb +16 -14
- data/lib/sorcery/model/submodules/external.rb +8 -10
- data/lib/sorcery/model/submodules/magic_login.rb +8 -4
- data/lib/sorcery/model/submodules/remember_me.rb +3 -3
- data/lib/sorcery/model/submodules/reset_password.rb +21 -13
- data/lib/sorcery/model/submodules/user_activation.rb +19 -17
- data/lib/sorcery/model/temporary_token.rb +5 -5
- data/lib/sorcery/model.rb +21 -25
- data/lib/sorcery/providers/base.rb +1 -1
- data/lib/sorcery/providers/facebook.rb +2 -2
- data/lib/sorcery/providers/github.rb +3 -3
- data/lib/sorcery/providers/heroku.rb +1 -2
- data/lib/sorcery/providers/jira.rb +3 -2
- data/lib/sorcery/providers/line.rb +2 -4
- data/lib/sorcery/providers/microsoft.rb +1 -1
- data/lib/sorcery/providers/twitter.rb +2 -2
- data/lib/sorcery/providers/vk.rb +4 -4
- data/lib/sorcery/providers/xing.rb +3 -2
- data/lib/sorcery/test_helpers/internal/rails.rb +5 -22
- data/lib/sorcery/test_helpers/internal.rb +4 -6
- data/lib/sorcery/test_helpers/rails/integration.rb +1 -1
- data/lib/sorcery/test_helpers/rails/request.rb +1 -1
- data/lib/sorcery/version.rb +1 -1
- data/lib/sorcery.rb +6 -1
- metadata +21 -150
- data/.devcontainer/Dockerfile +0 -10
- data/.devcontainer/devcontainer.json +0 -29
- data/.devcontainer/postcreate.sh +0 -4
- data/.document +0 -5
- data/.github/FUNDING.yml +0 -1
- data/.github/ISSUE_TEMPLATE.md +0 -24
- data/.github/PULL_REQUEST_TEMPLATE.md +0 -7
- data/.github/workflows/ruby.yml +0 -54
- data/.gitignore +0 -60
- data/.rspec +0 -1
- data/.rubocop.yml +0 -55
- data/.rubocop_todo.yml +0 -163
- data/CODE_OF_CONDUCT.md +0 -14
- data/Gemfile +0 -8
- data/MAINTAINING.md +0 -64
- data/Rakefile +0 -8
- data/SECURITY.md +0 -19
- data/gemfiles/rails_61.gemfile +0 -7
- data/gemfiles/rails_70.gemfile +0 -7
- data/gemfiles/rails_71.gemfile +0 -7
- data/sorcery.gemspec +0 -49
- data/spec/active_record/user_activation_spec.rb +0 -17
- data/spec/active_record/user_activity_logging_spec.rb +0 -15
- data/spec/active_record/user_brute_force_protection_spec.rb +0 -15
- data/spec/active_record/user_magic_login_spec.rb +0 -15
- data/spec/active_record/user_oauth_spec.rb +0 -15
- data/spec/active_record/user_remember_me_spec.rb +0 -15
- data/spec/active_record/user_reset_password_spec.rb +0 -15
- data/spec/active_record/user_spec.rb +0 -27
- data/spec/controllers/controller_activity_logging_spec.rb +0 -113
- data/spec/controllers/controller_brute_force_protection_spec.rb +0 -41
- data/spec/controllers/controller_http_basic_auth_spec.rb +0 -67
- data/spec/controllers/controller_oauth2_spec.rb +0 -568
- data/spec/controllers/controller_oauth_spec.rb +0 -266
- data/spec/controllers/controller_remember_me_spec.rb +0 -130
- data/spec/controllers/controller_session_timeout_spec.rb +0 -168
- data/spec/controllers/controller_spec.rb +0 -200
- data/spec/orm/active_record.rb +0 -21
- data/spec/providers/example_provider_spec.rb +0 -17
- data/spec/providers/example_spec.rb +0 -17
- data/spec/providers/examples_spec.rb +0 -17
- data/spec/providers/vk_spec.rb +0 -42
- data/spec/rails_app/app/active_record/authentication.rb +0 -3
- data/spec/rails_app/app/active_record/user.rb +0 -5
- data/spec/rails_app/app/active_record/user_provider.rb +0 -3
- data/spec/rails_app/app/assets/config/manifest.js +0 -1
- data/spec/rails_app/app/controllers/application_controller.rb +0 -2
- data/spec/rails_app/app/controllers/sorcery_controller.rb +0 -489
- data/spec/rails_app/app/helpers/application_helper.rb +0 -2
- data/spec/rails_app/app/mailers/sorcery_mailer.rb +0 -38
- data/spec/rails_app/app/views/application/index.html.erb +0 -17
- data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
- data/spec/rails_app/app/views/sorcery_mailer/activation_email.html.erb +0 -17
- data/spec/rails_app/app/views/sorcery_mailer/activation_email.text.erb +0 -9
- data/spec/rails_app/app/views/sorcery_mailer/activation_needed_email.html.erb +0 -17
- data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.html.erb +0 -17
- data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
- data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.html.erb +0 -13
- data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.text.erb +0 -6
- data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
- data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
- data/spec/rails_app/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -1
- data/spec/rails_app/config/application.rb +0 -61
- data/spec/rails_app/config/boot.rb +0 -4
- data/spec/rails_app/config/database.yml +0 -22
- data/spec/rails_app/config/environment.rb +0 -5
- data/spec/rails_app/config/environments/test.rb +0 -37
- data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/rails_app/config/initializers/compatible_legacy_migration.rb +0 -11
- data/spec/rails_app/config/initializers/inflections.rb +0 -10
- data/spec/rails_app/config/initializers/mime_types.rb +0 -5
- data/spec/rails_app/config/initializers/session_store.rb +0 -12
- data/spec/rails_app/config/locales/en.yml +0 -5
- data/spec/rails_app/config/routes.rb +0 -81
- data/spec/rails_app/config/secrets.yml +0 -4
- data/spec/rails_app/config.ru +0 -4
- data/spec/rails_app/db/migrate/activation/20101224223622_add_activation_to_users.rb +0 -17
- data/spec/rails_app/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -19
- data/spec/rails_app/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -13
- data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +0 -16
- data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +0 -22
- data/spec/rails_app/db/migrate/invalidate_active_sessions/20180221093235_add_invalidate_active_sessions_before_to_users.rb +0 -9
- data/spec/rails_app/db/migrate/magic_login/20170924151831_add_magic_login_to_users.rb +0 -17
- data/spec/rails_app/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -15
- data/spec/rails_app/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -15
- data/spec/rails_app/db/schema.rb +0 -21
- data/spec/rails_app/db/seeds.rb +0 -7
- data/spec/shared_examples/user_activation_shared_examples.rb +0 -361
- data/spec/shared_examples/user_activity_logging_shared_examples.rb +0 -106
- data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +0 -151
- data/spec/shared_examples/user_magic_login_shared_examples.rb +0 -150
- data/spec/shared_examples/user_oauth_shared_examples.rb +0 -33
- data/spec/shared_examples/user_remember_me_shared_examples.rb +0 -129
- data/spec/shared_examples/user_reset_password_shared_examples.rb +0 -370
- data/spec/shared_examples/user_shared_examples.rb +0 -678
- data/spec/sorcery_crypto_providers_spec.rb +0 -245
- data/spec/sorcery_temporary_token_spec.rb +0 -27
- data/spec/spec.opts +0 -2
- data/spec/spec_helper.rb +0 -50
- data/spec/support/migration_helper.rb +0 -29
- data/spec/support/providers/example.rb +0 -11
- data/spec/support/providers/example_provider.rb +0 -11
- 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
|