sorcery 0.9.1 → 0.16.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/FUNDING.yml +1 -0
- data/.github/ISSUE_TEMPLATE.md +24 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +7 -0
- data/.github/workflows/ruby.yml +70 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +55 -0
- data/.rubocop_todo.yml +163 -0
- data/CHANGELOG.md +132 -34
- data/CODE_OF_CONDUCT.md +14 -0
- data/Gemfile +3 -17
- data/{LICENSE.txt → LICENSE.md} +1 -1
- data/MAINTAINING.md +64 -0
- data/README.md +146 -269
- data/Rakefile +4 -2
- data/SECURITY.md +19 -0
- data/gemfiles/rails_52.gemfile +7 -0
- data/gemfiles/rails_60.gemfile +7 -0
- data/gemfiles/rails_61.gemfile +7 -0
- data/gemfiles/rails_70.gemfile +7 -0
- data/lib/generators/sorcery/USAGE +1 -1
- data/lib/generators/sorcery/helpers.rb +8 -4
- data/lib/generators/sorcery/install_generator.rb +41 -35
- data/lib/generators/sorcery/templates/initializer.rb +216 -112
- data/lib/generators/sorcery/templates/migration/activity_logging.rb +7 -7
- data/lib/generators/sorcery/templates/migration/brute_force_protection.rb +5 -5
- data/lib/generators/sorcery/templates/migration/core.rb +5 -7
- data/lib/generators/sorcery/templates/migration/external.rb +4 -4
- data/lib/generators/sorcery/templates/migration/magic_login.rb +9 -0
- data/lib/generators/sorcery/templates/migration/remember_me.rb +5 -5
- data/lib/generators/sorcery/templates/migration/reset_password.rb +7 -6
- data/lib/generators/sorcery/templates/migration/user_activation.rb +6 -6
- data/lib/sorcery/adapters/active_record_adapter.rb +11 -21
- data/lib/sorcery/adapters/mongoid_adapter.rb +23 -11
- data/lib/sorcery/controller/config.rb +27 -23
- data/lib/sorcery/controller/submodules/activity_logging.rb +16 -18
- data/lib/sorcery/controller/submodules/brute_force_protection.rb +1 -2
- data/lib/sorcery/controller/submodules/external.rb +69 -44
- data/lib/sorcery/controller/submodules/http_basic_auth.rb +18 -19
- data/lib/sorcery/controller/submodules/remember_me.rb +16 -16
- data/lib/sorcery/controller/submodules/session_timeout.rb +33 -11
- data/lib/sorcery/controller.rb +50 -35
- data/lib/sorcery/crypto_providers/aes256.rb +17 -16
- data/lib/sorcery/crypto_providers/bcrypt.rb +26 -22
- data/lib/sorcery/crypto_providers/common.rb +1 -1
- data/lib/sorcery/crypto_providers/md5.rb +5 -5
- data/lib/sorcery/crypto_providers/sha1.rb +5 -5
- data/lib/sorcery/crypto_providers/sha256.rb +2 -2
- data/lib/sorcery/crypto_providers/sha512.rb +3 -3
- data/lib/sorcery/engine.rb +19 -11
- data/lib/sorcery/model/config.rb +73 -50
- data/lib/sorcery/model/submodules/activity_logging.rb +31 -12
- data/lib/sorcery/model/submodules/brute_force_protection.rb +38 -31
- data/lib/sorcery/model/submodules/external.rb +22 -10
- data/lib/sorcery/model/submodules/magic_login.rb +130 -0
- data/lib/sorcery/model/submodules/remember_me.rb +19 -7
- data/lib/sorcery/model/submodules/reset_password.rb +64 -42
- data/lib/sorcery/model/submodules/user_activation.rb +52 -54
- data/lib/sorcery/model/temporary_token.rb +30 -7
- data/lib/sorcery/model.rb +65 -40
- data/lib/sorcery/protocols/oauth.rb +4 -9
- data/lib/sorcery/protocols/oauth2.rb +0 -2
- data/lib/sorcery/providers/auth0.rb +46 -0
- data/lib/sorcery/providers/base.rb +4 -4
- data/lib/sorcery/providers/battlenet.rb +51 -0
- data/lib/sorcery/providers/discord.rb +52 -0
- data/lib/sorcery/providers/facebook.rb +8 -11
- data/lib/sorcery/providers/github.rb +5 -7
- data/lib/sorcery/providers/google.rb +3 -5
- data/lib/sorcery/providers/heroku.rb +7 -8
- data/lib/sorcery/providers/instagram.rb +73 -0
- data/lib/sorcery/providers/jira.rb +12 -17
- data/lib/sorcery/providers/line.rb +63 -0
- data/lib/sorcery/providers/linkedin.rb +44 -35
- data/lib/sorcery/providers/liveid.rb +4 -7
- data/lib/sorcery/providers/microsoft.rb +59 -0
- data/lib/sorcery/providers/paypal.rb +60 -0
- data/lib/sorcery/providers/salesforce.rb +3 -5
- data/lib/sorcery/providers/slack.rb +45 -0
- data/lib/sorcery/providers/twitter.rb +4 -6
- data/lib/sorcery/providers/vk.rb +8 -9
- data/lib/sorcery/providers/wechat.rb +81 -0
- data/lib/sorcery/providers/xing.rb +7 -10
- data/lib/sorcery/test_helpers/internal/rails.rb +25 -17
- data/lib/sorcery/test_helpers/internal.rb +15 -14
- data/lib/sorcery/test_helpers/rails/controller.rb +1 -1
- data/lib/sorcery/test_helpers/rails/integration.rb +5 -6
- data/lib/sorcery/test_helpers/rails/request.rb +20 -0
- data/lib/sorcery/version.rb +1 -1
- data/lib/sorcery.rb +4 -17
- data/sorcery.gemspec +43 -28
- data/spec/active_record/user_activation_spec.rb +4 -5
- data/spec/active_record/user_activity_logging_spec.rb +4 -6
- data/spec/active_record/user_brute_force_protection_spec.rb +5 -6
- data/spec/active_record/user_magic_login_spec.rb +15 -0
- data/spec/active_record/user_oauth_spec.rb +5 -6
- data/spec/active_record/user_remember_me_spec.rb +5 -6
- data/spec/active_record/user_reset_password_spec.rb +4 -5
- data/spec/active_record/user_spec.rb +7 -17
- data/spec/controllers/controller_activity_logging_spec.rb +13 -24
- data/spec/controllers/controller_brute_force_protection_spec.rb +8 -10
- data/spec/controllers/controller_http_basic_auth_spec.rb +20 -21
- data/spec/controllers/controller_oauth2_spec.rb +297 -158
- data/spec/controllers/controller_oauth_spec.rb +97 -71
- data/spec/controllers/controller_remember_me_spec.rb +49 -36
- data/spec/controllers/controller_session_timeout_spec.rb +106 -20
- data/spec/controllers/controller_spec.rb +87 -111
- data/spec/orm/active_record.rb +3 -3
- data/spec/providers/example_provider_spec.rb +17 -0
- data/spec/providers/example_spec.rb +17 -0
- data/spec/providers/examples_spec.rb +17 -0
- data/spec/providers/vk_spec.rb +42 -0
- data/spec/rails_app/app/active_record/authentication.rb +1 -1
- data/spec/rails_app/app/active_record/user.rb +2 -2
- data/spec/rails_app/app/assets/config/manifest.js +1 -0
- data/spec/rails_app/app/controllers/application_controller.rb +2 -0
- data/spec/rails_app/app/controllers/sorcery_controller.rb +250 -46
- data/spec/rails_app/app/mailers/sorcery_mailer.rb +23 -17
- data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.html.erb +13 -0
- data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.text.erb +6 -0
- data/spec/rails_app/config/application.rb +14 -9
- data/spec/rails_app/config/boot.rb +2 -2
- data/spec/rails_app/config/environment.rb +1 -1
- data/spec/rails_app/config/environments/test.rb +1 -1
- data/spec/rails_app/config/initializers/compatible_legacy_migration.rb +11 -0
- data/spec/rails_app/config/initializers/session_store.rb +3 -3
- data/spec/rails_app/config/routes.rb +31 -1
- data/spec/rails_app/config/secrets.yml +4 -0
- data/spec/rails_app/config.ru +1 -1
- data/spec/rails_app/db/migrate/activation/20101224223622_add_activation_to_users.rb +4 -4
- data/spec/rails_app/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +10 -10
- data/spec/rails_app/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +5 -5
- data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +5 -5
- data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +3 -3
- data/spec/rails_app/db/migrate/invalidate_active_sessions/20180221093235_add_invalidate_active_sessions_before_to_users.rb +9 -0
- data/spec/rails_app/db/migrate/magic_login/20170924151831_add_magic_login_to_users.rb +17 -0
- data/spec/rails_app/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +6 -6
- data/spec/rails_app/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +7 -5
- data/spec/rails_app/db/schema.rb +7 -9
- data/spec/shared_examples/user_activation_shared_examples.rb +177 -58
- data/spec/shared_examples/user_activity_logging_shared_examples.rb +47 -41
- data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +19 -24
- data/spec/shared_examples/user_magic_login_shared_examples.rb +150 -0
- data/spec/shared_examples/user_oauth_shared_examples.rb +7 -10
- data/spec/shared_examples/user_remember_me_shared_examples.rb +91 -22
- data/spec/shared_examples/user_reset_password_shared_examples.rb +153 -58
- data/spec/shared_examples/user_shared_examples.rb +328 -145
- data/spec/sorcery_crypto_providers_spec.rb +122 -75
- data/spec/sorcery_temporary_token_spec.rb +27 -0
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +19 -14
- data/spec/support/migration_helper.rb +29 -0
- data/spec/support/providers/example.rb +11 -0
- data/spec/support/providers/example_provider.rb +11 -0
- data/spec/support/providers/examples.rb +11 -0
- metadata +119 -89
- data/.travis.yml +0 -132
- data/gemfiles/active_record-rails40.gemfile +0 -7
- data/gemfiles/active_record-rails41.gemfile +0 -7
- data/gemfiles/mongo_mapper-rails40.gemfile +0 -9
- data/gemfiles/mongo_mapper-rails41.gemfile +0 -9
- data/gemfiles/mongoid-rails40.gemfile +0 -9
- data/gemfiles/mongoid-rails41.gemfile +0 -9
- data/gemfiles/mongoid3-rails32.gemfile +0 -9
- data/lib/sorcery/adapters/data_mapper_adapter.rb +0 -176
- data/lib/sorcery/adapters/mongo_mapper_adapter.rb +0 -110
- data/lib/sorcery/railties/tasks.rake +0 -6
- data/spec/data_mapper/user_activation_spec.rb +0 -10
- data/spec/data_mapper/user_activity_logging_spec.rb +0 -14
- data/spec/data_mapper/user_brute_force_protection_spec.rb +0 -9
- data/spec/data_mapper/user_oauth_spec.rb +0 -9
- data/spec/data_mapper/user_remember_me_spec.rb +0 -8
- data/spec/data_mapper/user_reset_password_spec.rb +0 -8
- data/spec/data_mapper/user_spec.rb +0 -27
- data/spec/mongo_mapper/user_activation_spec.rb +0 -9
- data/spec/mongo_mapper/user_activity_logging_spec.rb +0 -8
- data/spec/mongo_mapper/user_brute_force_protection_spec.rb +0 -8
- data/spec/mongo_mapper/user_oauth_spec.rb +0 -8
- data/spec/mongo_mapper/user_remember_me_spec.rb +0 -8
- data/spec/mongo_mapper/user_reset_password_spec.rb +0 -8
- data/spec/mongo_mapper/user_spec.rb +0 -37
- data/spec/mongoid/user_activation_spec.rb +0 -9
- data/spec/mongoid/user_activity_logging_spec.rb +0 -8
- data/spec/mongoid/user_brute_force_protection_spec.rb +0 -8
- data/spec/mongoid/user_oauth_spec.rb +0 -8
- data/spec/mongoid/user_remember_me_spec.rb +0 -8
- data/spec/mongoid/user_reset_password_spec.rb +0 -8
- data/spec/mongoid/user_spec.rb +0 -51
- data/spec/orm/data_mapper.rb +0 -48
- data/spec/orm/mongo_mapper.rb +0 -10
- data/spec/orm/mongoid.rb +0 -22
- data/spec/rails_app/app/data_mapper/authentication.rb +0 -8
- data/spec/rails_app/app/data_mapper/user.rb +0 -7
- data/spec/rails_app/app/mongo_mapper/authentication.rb +0 -6
- data/spec/rails_app/app/mongo_mapper/user.rb +0 -7
- data/spec/rails_app/app/mongoid/authentication.rb +0 -7
- data/spec/rails_app/app/mongoid/user.rb +0 -7
- data/spec/rails_app/config/initializers/secret_token.rb +0 -7
- data/spec/rails_app/log/development.log +0 -1791
@@ -1,24 +1,24 @@
|
|
1
|
-
shared_examples_for
|
1
|
+
shared_examples_for 'rails_3_reset_password_model' do
|
2
2
|
# ----------------- PLUGIN CONFIGURATION -----------------------
|
3
3
|
let(:user) { create_new_user }
|
4
4
|
|
5
|
-
describe
|
6
|
-
|
5
|
+
describe 'loaded plugin configuration' do
|
7
6
|
before(:all) do
|
8
|
-
sorcery_reload!([:reset_password], :
|
7
|
+
sorcery_reload!([:reset_password], reset_password_mailer: ::SorceryMailer)
|
9
8
|
end
|
10
9
|
|
11
10
|
after(:each) do
|
12
11
|
User.sorcery_config.reset!
|
13
12
|
end
|
14
13
|
|
15
|
-
context
|
16
|
-
|
14
|
+
context 'API' do
|
17
15
|
specify { expect(user).to respond_to :deliver_reset_password_instructions! }
|
18
16
|
|
17
|
+
specify { expect(user).to respond_to :change_password }
|
18
|
+
|
19
19
|
specify { expect(user).to respond_to :change_password! }
|
20
20
|
|
21
|
-
it
|
21
|
+
it 'responds to .load_from_reset_password_token' do
|
22
22
|
expect(User).to respond_to :load_from_reset_password_token
|
23
23
|
end
|
24
24
|
end
|
@@ -41,12 +41,12 @@ shared_examples_for "rails_3_reset_password_model" do
|
|
41
41
|
expect(User.sorcery_config.reset_password_mailer_disabled).to eq :my_reset_password_mailer_disabled
|
42
42
|
end
|
43
43
|
|
44
|
-
it
|
45
|
-
expect{sorcery_reload!([:reset_password], :
|
44
|
+
it 'if mailer is nil and mailer is enabled, throw exception!' do
|
45
|
+
expect { sorcery_reload!([:reset_password], reset_password_mailer_disabled: false) }.to raise_error(ArgumentError)
|
46
46
|
end
|
47
47
|
|
48
|
-
it
|
49
|
-
expect{sorcery_reload!([:reset_password], :
|
48
|
+
it 'if mailer is disabled and mailer is nil, do NOT throw exception' do
|
49
|
+
expect { sorcery_reload!([:reset_password], reset_password_mailer_disabled: true) }.to_not raise_error
|
50
50
|
end
|
51
51
|
|
52
52
|
it "allows configuration option 'reset_password_email_method_name'" do
|
@@ -74,11 +74,9 @@ shared_examples_for "rails_3_reset_password_model" do
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
|
78
|
-
describe "when activated with sorcery" do
|
79
|
-
|
77
|
+
describe 'when activated with sorcery' do
|
80
78
|
before(:all) do
|
81
|
-
sorcery_reload!([:reset_password], :
|
79
|
+
sorcery_reload!([:reset_password], reset_password_mailer: ::SorceryMailer)
|
82
80
|
end
|
83
81
|
|
84
82
|
before(:each) do
|
@@ -90,46 +88,111 @@ shared_examples_for "rails_3_reset_password_model" do
|
|
90
88
|
Timecop.return
|
91
89
|
end
|
92
90
|
|
93
|
-
it
|
91
|
+
it 'load_from_reset_password_token returns user when token is found' do
|
94
92
|
user.generate_reset_password_token!
|
95
|
-
updated_user
|
93
|
+
updated_user = User.sorcery_adapter.find(user.id)
|
96
94
|
|
97
|
-
expect(User.load_from_reset_password_token
|
95
|
+
expect(User.load_from_reset_password_token(user.reset_password_token)).to eq updated_user
|
98
96
|
end
|
99
97
|
|
100
|
-
it
|
98
|
+
it 'load_from_reset_password_token does NOT return user when token is NOT found' do
|
101
99
|
user.generate_reset_password_token!
|
102
100
|
|
103
|
-
expect(User.load_from_reset_password_token
|
101
|
+
expect(User.load_from_reset_password_token('a')).to be_nil
|
104
102
|
end
|
105
103
|
|
106
|
-
it
|
104
|
+
it 'load_from_reset_password_token returns user when token is found and not expired' do
|
107
105
|
sorcery_model_property_set(:reset_password_expiration_period, 500)
|
108
106
|
user.generate_reset_password_token!
|
109
|
-
updated_user
|
107
|
+
updated_user = User.sorcery_adapter.find(user.id)
|
110
108
|
|
111
|
-
expect(User.load_from_reset_password_token
|
109
|
+
expect(User.load_from_reset_password_token(user.reset_password_token)).to eq updated_user
|
112
110
|
end
|
113
111
|
|
114
|
-
it
|
112
|
+
it 'load_from_reset_password_token does NOT return user when token is found and expired' do
|
115
113
|
sorcery_model_property_set(:reset_password_expiration_period, 0.1)
|
116
114
|
user.generate_reset_password_token!
|
117
|
-
Timecop.travel(Time.now.in_time_zone+0.5)
|
115
|
+
Timecop.travel(Time.now.in_time_zone + 0.5)
|
118
116
|
|
119
|
-
expect(User.load_from_reset_password_token
|
117
|
+
expect(User.load_from_reset_password_token(user.reset_password_token)).to be_nil
|
120
118
|
end
|
121
119
|
|
122
|
-
it
|
120
|
+
it 'load_from_reset_password_token is always valid if expiration period is nil' do
|
123
121
|
sorcery_model_property_set(:reset_password_expiration_period, nil)
|
124
122
|
user.generate_reset_password_token!
|
125
|
-
updated_user
|
123
|
+
updated_user = User.sorcery_adapter.find(user.id)
|
126
124
|
|
127
|
-
expect(User.load_from_reset_password_token
|
125
|
+
expect(User.load_from_reset_password_token(user.reset_password_token)).to eq updated_user
|
128
126
|
end
|
129
127
|
|
130
|
-
it
|
131
|
-
expect(User.load_from_reset_password_token
|
132
|
-
expect(User.load_from_reset_password_token
|
128
|
+
it 'load_from_reset_password_token returns nil if token is blank' do
|
129
|
+
expect(User.load_from_reset_password_token(nil)).to be_nil
|
130
|
+
expect(User.load_from_reset_password_token('')).to be_nil
|
131
|
+
end
|
132
|
+
|
133
|
+
describe '#load_from_reset_password_token' do
|
134
|
+
context 'in block mode' do
|
135
|
+
it 'yields user when token is found' do
|
136
|
+
user.generate_reset_password_token!
|
137
|
+
updated_user = User.sorcery_adapter.find(user.id)
|
138
|
+
|
139
|
+
User.load_from_reset_password_token(user.reset_password_token) do |user2, failure|
|
140
|
+
expect(user2).to eq updated_user
|
141
|
+
expect(failure).to be_nil
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'does NOT yield user when token is NOT found' do
|
146
|
+
user.generate_reset_password_token!
|
147
|
+
|
148
|
+
User.load_from_reset_password_token('a') do |user2, failure|
|
149
|
+
expect(user2).to be_nil
|
150
|
+
expect(failure).to eq :user_not_found
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'yields user when token is found and not expired' do
|
155
|
+
sorcery_model_property_set(:reset_password_expiration_period, 500)
|
156
|
+
user.generate_reset_password_token!
|
157
|
+
updated_user = User.sorcery_adapter.find(user.id)
|
158
|
+
|
159
|
+
User.load_from_reset_password_token(user.reset_password_token) do |user2, failure|
|
160
|
+
expect(user2).to eq updated_user
|
161
|
+
expect(failure).to be_nil
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'yields user and failure reason when token is found and expired' do
|
166
|
+
sorcery_model_property_set(:reset_password_expiration_period, 0.1)
|
167
|
+
user.generate_reset_password_token!
|
168
|
+
Timecop.travel(Time.now.in_time_zone + 0.5)
|
169
|
+
|
170
|
+
User.load_from_reset_password_token(user.reset_password_token) do |user2, failure|
|
171
|
+
expect(user2).to eq user
|
172
|
+
expect(failure).to eq :token_expired
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'is always valid if expiration period is nil' do
|
177
|
+
sorcery_model_property_set(:reset_password_expiration_period, nil)
|
178
|
+
user.generate_reset_password_token!
|
179
|
+
updated_user = User.sorcery_adapter.find(user.id)
|
180
|
+
|
181
|
+
User.load_from_reset_password_token(user.reset_password_token) do |user2, failure|
|
182
|
+
expect(user2).to eq updated_user
|
183
|
+
expect(failure).to be_nil
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
it 'returns nil if token is blank' do
|
188
|
+
[nil, ''].each do |token|
|
189
|
+
User.load_from_reset_password_token(token) do |user2, failure|
|
190
|
+
expect(user2).to be_nil
|
191
|
+
expect(failure).to eq :invalid_token
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
133
196
|
end
|
134
197
|
|
135
198
|
it "'deliver_reset_password_instructions!' generates a reset_password_token" do
|
@@ -140,7 +203,11 @@ shared_examples_for "rails_3_reset_password_model" do
|
|
140
203
|
expect(user.reset_password_token).not_to be_nil
|
141
204
|
end
|
142
205
|
|
143
|
-
it "
|
206
|
+
it "'deliver_reset_password_instructions! returns a Mail::Message object" do
|
207
|
+
expect(user.deliver_reset_password_instructions!).to be_an_instance_of Mail::Message
|
208
|
+
end
|
209
|
+
|
210
|
+
it 'the reset_password_token is random' do
|
144
211
|
sorcery_model_property_set(:reset_password_time_between_emails, 0)
|
145
212
|
user.deliver_reset_password_instructions!
|
146
213
|
old_password_code = user.reset_password_token
|
@@ -149,22 +216,38 @@ shared_examples_for "rails_3_reset_password_model" do
|
|
149
216
|
expect(user.reset_password_token).not_to eq old_password_code
|
150
217
|
end
|
151
218
|
|
152
|
-
|
153
|
-
it
|
219
|
+
describe '#increment_password_reset_page_access_counter' do
|
220
|
+
it 'increments reset_password_page_access_count_attribute_name' do
|
221
|
+
expected_count = user.access_count_to_reset_password_page + 1
|
222
|
+
user.increment_password_reset_page_access_counter
|
223
|
+
expect(user.access_count_to_reset_password_page).to eq expected_count
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
describe '#reset_password_reset_page_access_counter' do
|
228
|
+
it 'reset reset_password_page_access_count_attribute_name into 0' do
|
229
|
+
user.update(access_count_to_reset_password_page: 10)
|
230
|
+
user.reset_password_reset_page_access_counter
|
231
|
+
expect(user.access_count_to_reset_password_page).to eq 0
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'mailer is enabled' do
|
236
|
+
it 'sends an email on reset' do
|
154
237
|
old_size = ActionMailer::Base.deliveries.size
|
155
238
|
user.deliver_reset_password_instructions!
|
156
239
|
|
157
240
|
expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
|
158
241
|
end
|
159
242
|
|
160
|
-
it
|
243
|
+
it 'calls send_reset_password_email! on reset' do
|
161
244
|
expect(user).to receive(:send_reset_password_email!).once
|
162
245
|
|
163
246
|
user.deliver_reset_password_instructions!
|
164
247
|
end
|
165
248
|
|
166
|
-
it
|
167
|
-
sorcery_model_property_set(:reset_password_time_between_emails,
|
249
|
+
it 'does not send an email if time between emails has not passed since last email' do
|
250
|
+
sorcery_model_property_set(:reset_password_time_between_emails, 10_000)
|
168
251
|
old_size = ActionMailer::Base.deliveries.size
|
169
252
|
user.deliver_reset_password_instructions!
|
170
253
|
|
@@ -175,41 +258,40 @@ shared_examples_for "rails_3_reset_password_model" do
|
|
175
258
|
expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
|
176
259
|
end
|
177
260
|
|
178
|
-
it
|
261
|
+
it 'sends an email if time between emails has passed since last email' do
|
179
262
|
sorcery_model_property_set(:reset_password_time_between_emails, 0.5)
|
180
263
|
old_size = ActionMailer::Base.deliveries.size
|
181
264
|
user.deliver_reset_password_instructions!
|
182
265
|
|
183
266
|
expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
|
184
267
|
|
185
|
-
Timecop.travel(Time.now.in_time_zone+0.5)
|
268
|
+
Timecop.travel(Time.now.in_time_zone + 0.5)
|
186
269
|
user.deliver_reset_password_instructions!
|
187
270
|
|
188
271
|
expect(ActionMailer::Base.deliveries.size).to eq old_size + 2
|
189
272
|
end
|
190
273
|
end
|
191
274
|
|
192
|
-
context
|
193
|
-
|
275
|
+
context 'mailer is disabled' do
|
194
276
|
before(:all) do
|
195
|
-
sorcery_reload!([:reset_password], :
|
277
|
+
sorcery_reload!([:reset_password], reset_password_mailer_disabled: true, reset_password_mailer: ::SorceryMailer)
|
196
278
|
end
|
197
279
|
|
198
|
-
it
|
280
|
+
it 'sends an email on reset' do
|
199
281
|
old_size = ActionMailer::Base.deliveries.size
|
200
282
|
user.deliver_reset_password_instructions!
|
201
283
|
|
202
284
|
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
203
285
|
end
|
204
286
|
|
205
|
-
it
|
287
|
+
it 'does not call send_reset_password_email! on reset' do
|
206
288
|
expect(user).to receive(:send_reset_password_email!).never
|
207
289
|
|
208
290
|
user.deliver_reset_password_instructions!
|
209
291
|
end
|
210
292
|
|
211
|
-
it
|
212
|
-
sorcery_model_property_set(:reset_password_time_between_emails,
|
293
|
+
it 'does not send an email if time between emails has not passed since last email' do
|
294
|
+
sorcery_model_property_set(:reset_password_time_between_emails, 10_000)
|
213
295
|
old_size = ActionMailer::Base.deliveries.size
|
214
296
|
user.deliver_reset_password_instructions!
|
215
297
|
|
@@ -220,44 +302,57 @@ shared_examples_for "rails_3_reset_password_model" do
|
|
220
302
|
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
221
303
|
end
|
222
304
|
|
223
|
-
it
|
305
|
+
it 'sends an email if time between emails has passed since last email' do
|
224
306
|
sorcery_model_property_set(:reset_password_time_between_emails, 0.5)
|
225
307
|
old_size = ActionMailer::Base.deliveries.size
|
226
308
|
user.deliver_reset_password_instructions!
|
227
309
|
|
228
310
|
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
229
311
|
|
230
|
-
Timecop.travel(Time.now.in_time_zone+0.5)
|
312
|
+
Timecop.travel(Time.now.in_time_zone + 0.5)
|
231
313
|
user.deliver_reset_password_instructions!
|
232
314
|
|
233
315
|
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
234
316
|
end
|
235
317
|
end
|
236
318
|
|
237
|
-
it
|
319
|
+
it 'when change_password! is called, deletes reset_password_token and calls #save!' do
|
238
320
|
user.deliver_reset_password_instructions!
|
239
321
|
|
240
322
|
expect(user.reset_password_token).not_to be_nil
|
323
|
+
expect(user).to_not receive(:save)
|
324
|
+
expect(user).to receive(:save!)
|
241
325
|
|
242
|
-
user.change_password!(
|
243
|
-
user.save!
|
326
|
+
user.change_password!('blabulsdf')
|
244
327
|
|
245
328
|
expect(user.reset_password_token).to be_nil
|
246
329
|
end
|
247
330
|
|
248
|
-
it
|
249
|
-
|
331
|
+
it 'when change_password is called, deletes reset_password_token and calls #save' do
|
332
|
+
new_password = 'blabulsdf'
|
333
|
+
|
250
334
|
user.deliver_reset_password_instructions!
|
335
|
+
expect(user.reset_password_token).not_to be_nil
|
336
|
+
expect(user).to_not receive(:save!)
|
337
|
+
expect(user).to receive(:save)
|
251
338
|
|
252
|
-
|
339
|
+
user.change_password(new_password)
|
340
|
+
|
341
|
+
expect(user.reset_password_token).to be_nil
|
253
342
|
end
|
254
343
|
|
255
|
-
it
|
344
|
+
it 'returns false if time between emails has not passed since last email' do
|
345
|
+
sorcery_model_property_set(:reset_password_time_between_emails, 10_000)
|
256
346
|
user.deliver_reset_password_instructions!
|
257
|
-
user.change_password!("blagu")
|
258
347
|
|
259
|
-
expect(
|
348
|
+
expect(user.deliver_reset_password_instructions!).to be false
|
260
349
|
end
|
261
350
|
|
351
|
+
it 'encrypts properly on reset' do
|
352
|
+
user.deliver_reset_password_instructions!
|
353
|
+
user.change_password!('blagu')
|
354
|
+
|
355
|
+
expect(Sorcery::CryptoProviders::BCrypt.matches?(user.crypted_password, 'blagu', user.salt)).to be true
|
356
|
+
end
|
262
357
|
end
|
263
358
|
end
|