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,150 +0,0 @@
|
|
|
1
|
-
shared_examples_for 'magic_login_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!([:magic_login])
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
after(:each) do
|
|
15
|
-
User.sorcery_config.reset!
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe 'enables configuration options' do
|
|
19
|
-
it do
|
|
20
|
-
sorcery_model_property_set(:magic_login_token_attribute_name, :test_magic_login_token)
|
|
21
|
-
expect(config.magic_login_token_attribute_name).to eq :test_magic_login_token
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
it do
|
|
25
|
-
sorcery_model_property_set(:magic_login_token_expires_at_attribute_name, :test_magic_login_token_expires_at)
|
|
26
|
-
expect(config.magic_login_token_expires_at_attribute_name).to eq :test_magic_login_token_expires_at
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it do
|
|
30
|
-
sorcery_model_property_set(:magic_login_email_sent_at_attribute_name, :test_magic_login_email_sent_at)
|
|
31
|
-
expect(config.magic_login_email_sent_at_attribute_name).to eq :test_magic_login_email_sent_at
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it do
|
|
35
|
-
TestMailerClass = Class.new # need a mailer class to test
|
|
36
|
-
sorcery_model_property_set(:magic_login_mailer_class, TestMailerClass)
|
|
37
|
-
expect(config.magic_login_mailer_class).to eq TestMailerClass
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
it do
|
|
41
|
-
sorcery_model_property_set(:magic_login_mailer_disabled, false)
|
|
42
|
-
expect(config.magic_login_mailer_disabled).to eq false
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
it do
|
|
46
|
-
sorcery_model_property_set(:magic_login_email_method_name, :test_magic_login_email)
|
|
47
|
-
expect(config.magic_login_email_method_name).to eq :test_magic_login_email
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it do
|
|
51
|
-
sorcery_model_property_set(:magic_login_expiration_period, 100_000_000)
|
|
52
|
-
expect(config.magic_login_expiration_period).to eq 100_000_000
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
it do
|
|
56
|
-
sorcery_model_property_set(:magic_login_time_between_emails, 100_000_000)
|
|
57
|
-
expect(config.magic_login_time_between_emails).to eq 100_000_000
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
describe '#generate_magic_login_token!' do
|
|
62
|
-
context 'magic_login_token is nil' do
|
|
63
|
-
it "magic_login_token_expires_at and magic_login_email_sent_at aren't nil " do
|
|
64
|
-
user.generate_magic_login_token!
|
|
65
|
-
expect(user.magic_login_token_expires_at).not_to be_nil
|
|
66
|
-
expect(user.magic_login_email_sent_at).not_to be_nil
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it 'magic_login_token is different from the one before' do
|
|
70
|
-
token_before = user.magic_login_token
|
|
71
|
-
user.generate_magic_login_token!
|
|
72
|
-
expect(user.magic_login_token).not_to eq token_before
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
context 'magic_login_token is not nil' do
|
|
77
|
-
it 'changes `user.magic_login_token`' do
|
|
78
|
-
token_before = user.magic_login_token
|
|
79
|
-
user.generate_magic_login_token!
|
|
80
|
-
expect(user.magic_login_token).not_to eq token_before
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
describe '#deliver_magic_login_instructions!' do
|
|
86
|
-
context 'success' do
|
|
87
|
-
before do
|
|
88
|
-
sorcery_model_property_set(:magic_login_time_between_emails, 30 * 60)
|
|
89
|
-
sorcery_model_property_set(:magic_login_mailer_disabled, false)
|
|
90
|
-
Timecop.travel(10.days.ago) do
|
|
91
|
-
user.send(:"#{config.magic_login_email_sent_at_attribute_name}=", DateTime.now)
|
|
92
|
-
end
|
|
93
|
-
sorcery_model_property_set(:magic_login_mailer_class, ::SorceryMailer)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it do
|
|
97
|
-
user.deliver_magic_login_instructions!
|
|
98
|
-
expect(ActionMailer::Base.deliveries.size).to eq 1
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
it do
|
|
102
|
-
expect(user.deliver_magic_login_instructions!).to eq true
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
context 'failure' do
|
|
107
|
-
context 'magic_login_time_between_emails is nil' do
|
|
108
|
-
it 'returns false' do
|
|
109
|
-
sorcery_model_property_set(:magic_login_time_between_emails, nil)
|
|
110
|
-
expect(user.deliver_magic_login_instructions!).to eq false
|
|
111
|
-
end
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
context 'magic_login_email_sent_at is nil' do
|
|
115
|
-
it 'returns false' do
|
|
116
|
-
user.send(:"#{config.magic_login_email_sent_at_attribute_name}=", nil)
|
|
117
|
-
expect(user.deliver_magic_login_instructions!).to eq false
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
context 'now is before magic_login_email_sent_at plus the interval' do
|
|
122
|
-
it 'returns false' do
|
|
123
|
-
user.send(:"#{config.magic_login_email_sent_at_attribute_name}=", DateTime.now)
|
|
124
|
-
sorcery_model_property_set(:magic_login_time_between_emails, 30 * 60)
|
|
125
|
-
expect(user.deliver_magic_login_instructions!).to eq false
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
context 'magic_login_mailer_disabled is true' do
|
|
130
|
-
it 'returns false' do
|
|
131
|
-
sorcery_model_property_set(:magic_login_mailer_disabled, true)
|
|
132
|
-
expect(user.deliver_magic_login_instructions!).to eq false
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
describe '#clear_magic_login_token!' do
|
|
139
|
-
it 'makes magic_login_token_attribute_name and magic_login_token_expires_at_attribute_name nil' do
|
|
140
|
-
user.magic_login_token = 'test_token'
|
|
141
|
-
user.magic_login_token_expires_at = Time.now
|
|
142
|
-
|
|
143
|
-
user.clear_magic_login_token!
|
|
144
|
-
|
|
145
|
-
expect(user.magic_login_token).to eq nil
|
|
146
|
-
expect(user.magic_login_token_expires_at).to eq nil
|
|
147
|
-
end
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
end
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
shared_examples_for 'rails_3_oauth_model' do
|
|
2
|
-
# ----------------- PLUGIN CONFIGURATION -----------------------
|
|
3
|
-
|
|
4
|
-
let(:external_user) { create_new_external_user :twitter }
|
|
5
|
-
|
|
6
|
-
describe 'loaded plugin configuration' do
|
|
7
|
-
before(:all) do
|
|
8
|
-
Authentication.sorcery_adapter.delete_all
|
|
9
|
-
User.sorcery_adapter.delete_all
|
|
10
|
-
|
|
11
|
-
sorcery_reload!([:external])
|
|
12
|
-
sorcery_controller_property_set(:external_providers, [:twitter])
|
|
13
|
-
sorcery_model_property_set(:authentications_class, Authentication)
|
|
14
|
-
sorcery_controller_external_property_set(:twitter, :key, 'eYVNBjBDi33aa9GkA3w')
|
|
15
|
-
sorcery_controller_external_property_set(:twitter, :secret, 'XpbeSdCoaKSmQGSeokz5qcUATClRW5u08QWNfv71N8')
|
|
16
|
-
sorcery_controller_external_property_set(:twitter, :callback_url, 'http://blabla.com')
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "responds to 'load_from_provider'" do
|
|
20
|
-
expect(User).to respond_to(:load_from_provider)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
it "'load_from_provider' loads user if exists" do
|
|
24
|
-
external_user
|
|
25
|
-
expect(User.load_from_provider(:twitter, 123)).to eq external_user
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
it "'load_from_provider' returns nil if user doesn't exist" do
|
|
29
|
-
external_user
|
|
30
|
-
expect(User.load_from_provider(:twitter, 980_342)).to be_nil
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
shared_examples_for 'rails_3_remember_me_model' do
|
|
2
|
-
let(:user) { create_new_user }
|
|
3
|
-
|
|
4
|
-
describe 'loaded plugin configuration' do
|
|
5
|
-
before(:all) do
|
|
6
|
-
sorcery_reload!([:remember_me])
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
after(:each) do
|
|
10
|
-
User.sorcery_config.reset!
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "allows configuration option 'remember_me_token_attribute_name'" do
|
|
14
|
-
sorcery_model_property_set(:remember_me_token_attribute_name, :my_token)
|
|
15
|
-
|
|
16
|
-
expect(User.sorcery_config.remember_me_token_attribute_name).to eq :my_token
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
it "allows configuration option 'remember_me_token_expires_at_attribute_name'" do
|
|
20
|
-
sorcery_model_property_set(:remember_me_token_expires_at_attribute_name, :my_expires)
|
|
21
|
-
|
|
22
|
-
expect(User.sorcery_config.remember_me_token_expires_at_attribute_name).to eq :my_expires
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "allows configuration option 'remember_me_token_persist_globally'" do
|
|
26
|
-
sorcery_model_property_set(:remember_me_token_persist_globally, true)
|
|
27
|
-
|
|
28
|
-
expect(User.sorcery_config.remember_me_token_persist_globally).to eq true
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
specify { expect(user).to respond_to :remember_me! }
|
|
32
|
-
|
|
33
|
-
specify { expect(user).to respond_to :forget_me! }
|
|
34
|
-
|
|
35
|
-
specify { expect(user).to respond_to :force_forget_me! }
|
|
36
|
-
|
|
37
|
-
it "sets an expiration based on 'remember_me_for' attribute" do
|
|
38
|
-
sorcery_model_property_set(:remember_me_for, 2 * 60 * 60 * 24)
|
|
39
|
-
|
|
40
|
-
ts = Time.now.in_time_zone
|
|
41
|
-
Timecop.freeze(ts) do
|
|
42
|
-
user.remember_me!
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
expect(user.remember_me_token_expires_at.utc.to_s).to eq((ts + 2 * 60 * 60 * 24).utc.to_s)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
context 'when not persisting globally' do
|
|
49
|
-
before { sorcery_model_property_set(:remember_me_token_persist_globally, false) }
|
|
50
|
-
|
|
51
|
-
it "generates a new token on 'remember_me!' when a token doesn't exist" do
|
|
52
|
-
expect(user.remember_me_token).to be_nil
|
|
53
|
-
user.remember_me!
|
|
54
|
-
|
|
55
|
-
expect(user.remember_me_token).not_to be_nil
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "generates a new token on 'remember_me!' when a token exists" do
|
|
59
|
-
user.remember_me_token = 'abc123'
|
|
60
|
-
user.remember_me!
|
|
61
|
-
|
|
62
|
-
expect(user.remember_me_token).not_to be_nil
|
|
63
|
-
expect(user.remember_me_token).not_to eq('abc123')
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
it "deletes the token and expiration on 'forget_me!'" do
|
|
67
|
-
user.remember_me!
|
|
68
|
-
|
|
69
|
-
expect(user.remember_me_token).not_to be_nil
|
|
70
|
-
|
|
71
|
-
user.forget_me!
|
|
72
|
-
|
|
73
|
-
expect(user.remember_me_token).to be_nil
|
|
74
|
-
expect(user.remember_me_token_expires_at).to be_nil
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
it "deletes the token and expiration on 'force_forget_me!'" do
|
|
78
|
-
user.remember_me!
|
|
79
|
-
|
|
80
|
-
expect(user.remember_me_token).not_to be_nil
|
|
81
|
-
|
|
82
|
-
user.force_forget_me!
|
|
83
|
-
|
|
84
|
-
expect(user.remember_me_token).to be_nil
|
|
85
|
-
expect(user.remember_me_token_expires_at).to be_nil
|
|
86
|
-
end
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
context 'when persisting globally' do
|
|
90
|
-
before { sorcery_model_property_set(:remember_me_token_persist_globally, true) }
|
|
91
|
-
|
|
92
|
-
it "generates a new token on 'remember_me!' when a token doesn't exist" do
|
|
93
|
-
expect(user.remember_me_token).to be_nil
|
|
94
|
-
user.remember_me!
|
|
95
|
-
|
|
96
|
-
expect(user.remember_me_token).not_to be_nil
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
it "keeps existing token on 'remember_me!' when a token exists" do
|
|
100
|
-
user.remember_me_token = 'abc123'
|
|
101
|
-
user.remember_me!
|
|
102
|
-
|
|
103
|
-
expect(user.remember_me_token).to eq('abc123')
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
it "keeps the token and expiration on 'forget_me!'" do
|
|
107
|
-
user.remember_me!
|
|
108
|
-
|
|
109
|
-
expect(user.remember_me_token).not_to be_nil
|
|
110
|
-
|
|
111
|
-
user.forget_me!
|
|
112
|
-
|
|
113
|
-
expect(user.remember_me_token).to_not be_nil
|
|
114
|
-
expect(user.remember_me_token_expires_at).to_not be_nil
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
it "deletes the token and expiration on 'force_forget_me!'" do
|
|
118
|
-
user.remember_me!
|
|
119
|
-
|
|
120
|
-
expect(user.remember_me_token).not_to be_nil
|
|
121
|
-
|
|
122
|
-
user.force_forget_me!
|
|
123
|
-
|
|
124
|
-
expect(user.remember_me_token).to be_nil
|
|
125
|
-
expect(user.remember_me_token_expires_at).to be_nil
|
|
126
|
-
end
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
end
|
|
@@ -1,370 +0,0 @@
|
|
|
1
|
-
shared_examples_for 'rails_3_reset_password_model' do
|
|
2
|
-
# ----------------- PLUGIN CONFIGURATION -----------------------
|
|
3
|
-
let(:user) { create_new_user }
|
|
4
|
-
|
|
5
|
-
describe 'loaded plugin configuration' do
|
|
6
|
-
before(:all) do
|
|
7
|
-
sorcery_reload!([:reset_password], reset_password_mailer: ::SorceryMailer)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
after(:each) do
|
|
11
|
-
User.sorcery_config.reset!
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
context 'API' do
|
|
15
|
-
specify { expect(user).to respond_to :deliver_reset_password_instructions! }
|
|
16
|
-
|
|
17
|
-
specify { expect(user).to respond_to :change_password }
|
|
18
|
-
|
|
19
|
-
specify { expect(user).to respond_to :change_password! }
|
|
20
|
-
|
|
21
|
-
it 'responds to .load_from_reset_password_token' do
|
|
22
|
-
expect(User).to respond_to :load_from_reset_password_token
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it "allows configuration option 'reset_password_token_attribute_name'" do
|
|
27
|
-
sorcery_model_property_set(:reset_password_token_attribute_name, :my_code)
|
|
28
|
-
|
|
29
|
-
expect(User.sorcery_config.reset_password_token_attribute_name).to eq :my_code
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it "allows configuration option 'reset_password_mailer'" do
|
|
33
|
-
sorcery_model_property_set(:reset_password_mailer, TestUser)
|
|
34
|
-
|
|
35
|
-
expect(User.sorcery_config.reset_password_mailer).to eq TestUser
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
it "enables configuration option 'reset_password_mailer_disabled'" do
|
|
39
|
-
sorcery_model_property_set(:reset_password_mailer_disabled, :my_reset_password_mailer_disabled)
|
|
40
|
-
|
|
41
|
-
expect(User.sorcery_config.reset_password_mailer_disabled).to eq :my_reset_password_mailer_disabled
|
|
42
|
-
end
|
|
43
|
-
|
|
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
|
-
end
|
|
47
|
-
|
|
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
|
-
end
|
|
51
|
-
|
|
52
|
-
it "allows configuration option 'reset_password_email_method_name'" do
|
|
53
|
-
sorcery_model_property_set(:reset_password_email_method_name, :my_mailer_method)
|
|
54
|
-
|
|
55
|
-
expect(User.sorcery_config.reset_password_email_method_name).to eq :my_mailer_method
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
it "allows configuration option 'reset_password_expiration_period'" do
|
|
59
|
-
sorcery_model_property_set(:reset_password_expiration_period, 16)
|
|
60
|
-
|
|
61
|
-
expect(User.sorcery_config.reset_password_expiration_period).to eq 16
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it "allows configuration option 'reset_password_email_sent_at_attribute_name'" do
|
|
65
|
-
sorcery_model_property_set(:reset_password_email_sent_at_attribute_name, :blabla)
|
|
66
|
-
|
|
67
|
-
expect(User.sorcery_config.reset_password_email_sent_at_attribute_name).to eq :blabla
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it "allows configuration option 'reset_password_time_between_emails'" do
|
|
71
|
-
sorcery_model_property_set(:reset_password_time_between_emails, 16)
|
|
72
|
-
|
|
73
|
-
expect(User.sorcery_config.reset_password_time_between_emails).to eq 16
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
describe 'when activated with sorcery' do
|
|
78
|
-
before(:all) do
|
|
79
|
-
sorcery_reload!([:reset_password], reset_password_mailer: ::SorceryMailer)
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
before(:each) do
|
|
83
|
-
User.sorcery_adapter.delete_all
|
|
84
|
-
user
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
after(:each) do
|
|
88
|
-
Timecop.return
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
it 'load_from_reset_password_token returns user when token is found' do
|
|
92
|
-
user.generate_reset_password_token!
|
|
93
|
-
updated_user = User.sorcery_adapter.find(user.id)
|
|
94
|
-
|
|
95
|
-
expect(User.load_from_reset_password_token(user.reset_password_token)).to eq updated_user
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it 'load_from_reset_password_token does NOT return user when token is NOT found' do
|
|
99
|
-
user.generate_reset_password_token!
|
|
100
|
-
|
|
101
|
-
expect(User.load_from_reset_password_token('a')).to be_nil
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
it 'load_from_reset_password_token returns user when token is found and not expired' do
|
|
105
|
-
sorcery_model_property_set(:reset_password_expiration_period, 500)
|
|
106
|
-
user.generate_reset_password_token!
|
|
107
|
-
updated_user = User.sorcery_adapter.find(user.id)
|
|
108
|
-
|
|
109
|
-
expect(User.load_from_reset_password_token(user.reset_password_token)).to eq updated_user
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
it 'load_from_reset_password_token does NOT return user when token is found and expired' do
|
|
113
|
-
sorcery_model_property_set(:reset_password_expiration_period, 0.1)
|
|
114
|
-
user.generate_reset_password_token!
|
|
115
|
-
Timecop.travel(Time.now.in_time_zone + 0.5)
|
|
116
|
-
|
|
117
|
-
expect(User.load_from_reset_password_token(user.reset_password_token)).to be_nil
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
it 'load_from_reset_password_token is always valid if expiration period is nil' do
|
|
121
|
-
sorcery_model_property_set(:reset_password_expiration_period, nil)
|
|
122
|
-
user.generate_reset_password_token!
|
|
123
|
-
updated_user = User.sorcery_adapter.find(user.id)
|
|
124
|
-
|
|
125
|
-
expect(User.load_from_reset_password_token(user.reset_password_token)).to eq updated_user
|
|
126
|
-
end
|
|
127
|
-
|
|
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
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
it "'deliver_reset_password_instructions!' generates a reset_password_token" do
|
|
199
|
-
expect(user.reset_password_token).to be_nil
|
|
200
|
-
|
|
201
|
-
user.deliver_reset_password_instructions!
|
|
202
|
-
|
|
203
|
-
expect(user.reset_password_token).not_to be_nil
|
|
204
|
-
end
|
|
205
|
-
|
|
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
|
|
211
|
-
sorcery_model_property_set(:reset_password_time_between_emails, 0)
|
|
212
|
-
user.deliver_reset_password_instructions!
|
|
213
|
-
old_password_code = user.reset_password_token
|
|
214
|
-
user.deliver_reset_password_instructions!
|
|
215
|
-
|
|
216
|
-
expect(user.reset_password_token).not_to eq old_password_code
|
|
217
|
-
end
|
|
218
|
-
|
|
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
|
|
237
|
-
old_size = ActionMailer::Base.deliveries.size
|
|
238
|
-
user.deliver_reset_password_instructions!
|
|
239
|
-
|
|
240
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
it 'calls send_reset_password_email! on reset' do
|
|
244
|
-
expect(user).to receive(:send_reset_password_email!).once
|
|
245
|
-
|
|
246
|
-
user.deliver_reset_password_instructions!
|
|
247
|
-
end
|
|
248
|
-
|
|
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)
|
|
251
|
-
old_size = ActionMailer::Base.deliveries.size
|
|
252
|
-
user.deliver_reset_password_instructions!
|
|
253
|
-
|
|
254
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
|
|
255
|
-
|
|
256
|
-
user.deliver_reset_password_instructions!
|
|
257
|
-
|
|
258
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
|
|
259
|
-
end
|
|
260
|
-
|
|
261
|
-
it 'sends an email if time between emails has passed since last email' do
|
|
262
|
-
sorcery_model_property_set(:reset_password_time_between_emails, 0.5)
|
|
263
|
-
old_size = ActionMailer::Base.deliveries.size
|
|
264
|
-
user.deliver_reset_password_instructions!
|
|
265
|
-
|
|
266
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size + 1
|
|
267
|
-
|
|
268
|
-
Timecop.travel(Time.now.in_time_zone + 0.5)
|
|
269
|
-
user.deliver_reset_password_instructions!
|
|
270
|
-
|
|
271
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size + 2
|
|
272
|
-
end
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
context 'mailer is disabled' do
|
|
276
|
-
before(:all) do
|
|
277
|
-
sorcery_reload!([:reset_password], reset_password_mailer_disabled: true, reset_password_mailer: ::SorceryMailer)
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
it 'sends an email on reset' do
|
|
281
|
-
old_size = ActionMailer::Base.deliveries.size
|
|
282
|
-
user.deliver_reset_password_instructions!
|
|
283
|
-
|
|
284
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
285
|
-
end
|
|
286
|
-
|
|
287
|
-
it 'does not call send_reset_password_email! on reset' do
|
|
288
|
-
expect(user).to receive(:send_reset_password_email!).never
|
|
289
|
-
|
|
290
|
-
user.deliver_reset_password_instructions!
|
|
291
|
-
end
|
|
292
|
-
|
|
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)
|
|
295
|
-
old_size = ActionMailer::Base.deliveries.size
|
|
296
|
-
user.deliver_reset_password_instructions!
|
|
297
|
-
|
|
298
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
299
|
-
|
|
300
|
-
user.deliver_reset_password_instructions!
|
|
301
|
-
|
|
302
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
it 'sends an email if time between emails has passed since last email' do
|
|
306
|
-
sorcery_model_property_set(:reset_password_time_between_emails, 0.5)
|
|
307
|
-
old_size = ActionMailer::Base.deliveries.size
|
|
308
|
-
user.deliver_reset_password_instructions!
|
|
309
|
-
|
|
310
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
311
|
-
|
|
312
|
-
Timecop.travel(Time.now.in_time_zone + 0.5)
|
|
313
|
-
user.deliver_reset_password_instructions!
|
|
314
|
-
|
|
315
|
-
expect(ActionMailer::Base.deliveries.size).to eq old_size
|
|
316
|
-
end
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
it 'when change_password! is called, deletes reset_password_token and calls #save!' do
|
|
320
|
-
user.deliver_reset_password_instructions!
|
|
321
|
-
|
|
322
|
-
expect(user.reset_password_token).not_to be_nil
|
|
323
|
-
expect(user).to_not receive(:save)
|
|
324
|
-
expect(user).to receive(:save!)
|
|
325
|
-
|
|
326
|
-
user.change_password!('blabulsdf')
|
|
327
|
-
|
|
328
|
-
expect(user.reset_password_token).to be_nil
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
it 'when change_password! is called with empty argument, raise an exception' do
|
|
332
|
-
expect {
|
|
333
|
-
user.change_password!('')
|
|
334
|
-
}.to raise_error(ArgumentError, 'Blank password passed to change_password!')
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
it 'when change_password! is called with nil argument, raise an exception' do
|
|
338
|
-
expect {
|
|
339
|
-
user.change_password!(nil)
|
|
340
|
-
}.to raise_error(ArgumentError, 'Blank password passed to change_password!')
|
|
341
|
-
end
|
|
342
|
-
|
|
343
|
-
it 'when change_password is called, deletes reset_password_token and calls #save' do
|
|
344
|
-
new_password = 'blabulsdf'
|
|
345
|
-
|
|
346
|
-
user.deliver_reset_password_instructions!
|
|
347
|
-
expect(user.reset_password_token).not_to be_nil
|
|
348
|
-
expect(user).to_not receive(:save!)
|
|
349
|
-
expect(user).to receive(:save)
|
|
350
|
-
|
|
351
|
-
user.change_password(new_password)
|
|
352
|
-
|
|
353
|
-
expect(user.reset_password_token).to be_nil
|
|
354
|
-
end
|
|
355
|
-
|
|
356
|
-
it 'returns false if time between emails has not passed since last email' do
|
|
357
|
-
sorcery_model_property_set(:reset_password_time_between_emails, 10_000)
|
|
358
|
-
user.deliver_reset_password_instructions!
|
|
359
|
-
|
|
360
|
-
expect(user.deliver_reset_password_instructions!).to be false
|
|
361
|
-
end
|
|
362
|
-
|
|
363
|
-
it 'encrypts properly on reset' do
|
|
364
|
-
user.deliver_reset_password_instructions!
|
|
365
|
-
user.change_password!('blagu')
|
|
366
|
-
|
|
367
|
-
expect(Sorcery::CryptoProviders::BCrypt.matches?(user.crypted_password, 'blagu', user.salt)).to be true
|
|
368
|
-
end
|
|
369
|
-
end
|
|
370
|
-
end
|