sorcery 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -1
  3. data/README.md +8 -5
  4. data/lib/generators/sorcery/helpers.rb +1 -1
  5. data/lib/generators/sorcery/install_generator.rb +9 -18
  6. data/lib/generators/sorcery/templates/initializer.rb +24 -10
  7. data/lib/sorcery/adapters/active_record_adapter.rb +12 -14
  8. data/lib/sorcery/adapters/mongoid_adapter.rb +6 -8
  9. data/lib/sorcery/controller/config.rb +27 -29
  10. data/lib/sorcery/controller/submodules/activity_logging.rb +4 -7
  11. data/lib/sorcery/controller/submodules/brute_force_protection.rb +4 -1
  12. data/lib/sorcery/controller/submodules/external.rb +11 -11
  13. data/lib/sorcery/controller/submodules/http_basic_auth.rb +7 -2
  14. data/lib/sorcery/controller/submodules/remember_me.rb +2 -1
  15. data/lib/sorcery/controller/submodules/session_timeout.rb +2 -2
  16. data/lib/sorcery/controller.rb +36 -18
  17. data/lib/sorcery/crypto_providers/aes256.rb +4 -2
  18. data/lib/sorcery/crypto_providers/bcrypt.rb +2 -1
  19. data/lib/sorcery/crypto_providers/md5.rb +1 -0
  20. data/lib/sorcery/crypto_providers/sha1.rb +1 -0
  21. data/lib/sorcery/crypto_providers/sha256.rb +1 -0
  22. data/lib/sorcery/crypto_providers/sha512.rb +1 -0
  23. data/lib/sorcery/engine.rb +6 -4
  24. data/lib/sorcery/errors.rb +10 -0
  25. data/lib/sorcery/model/config.rb +20 -31
  26. data/lib/sorcery/model/submodules/activity_logging.rb +8 -6
  27. data/lib/sorcery/model/submodules/brute_force_protection.rb +16 -14
  28. data/lib/sorcery/model/submodules/external.rb +8 -10
  29. data/lib/sorcery/model/submodules/magic_login.rb +8 -4
  30. data/lib/sorcery/model/submodules/remember_me.rb +3 -3
  31. data/lib/sorcery/model/submodules/reset_password.rb +21 -13
  32. data/lib/sorcery/model/submodules/user_activation.rb +19 -17
  33. data/lib/sorcery/model/temporary_token.rb +5 -5
  34. data/lib/sorcery/model.rb +21 -25
  35. data/lib/sorcery/providers/base.rb +1 -1
  36. data/lib/sorcery/providers/facebook.rb +2 -2
  37. data/lib/sorcery/providers/github.rb +3 -3
  38. data/lib/sorcery/providers/heroku.rb +1 -2
  39. data/lib/sorcery/providers/jira.rb +3 -2
  40. data/lib/sorcery/providers/line.rb +2 -4
  41. data/lib/sorcery/providers/microsoft.rb +1 -1
  42. data/lib/sorcery/providers/twitter.rb +2 -2
  43. data/lib/sorcery/providers/vk.rb +4 -4
  44. data/lib/sorcery/providers/xing.rb +3 -2
  45. data/lib/sorcery/test_helpers/internal/rails.rb +5 -22
  46. data/lib/sorcery/test_helpers/internal.rb +4 -6
  47. data/lib/sorcery/test_helpers/rails/integration.rb +1 -1
  48. data/lib/sorcery/test_helpers/rails/request.rb +1 -1
  49. data/lib/sorcery/version.rb +1 -1
  50. data/lib/sorcery.rb +6 -1
  51. metadata +21 -150
  52. data/.devcontainer/Dockerfile +0 -10
  53. data/.devcontainer/devcontainer.json +0 -29
  54. data/.devcontainer/postcreate.sh +0 -4
  55. data/.document +0 -5
  56. data/.github/FUNDING.yml +0 -1
  57. data/.github/ISSUE_TEMPLATE.md +0 -24
  58. data/.github/PULL_REQUEST_TEMPLATE.md +0 -7
  59. data/.github/workflows/ruby.yml +0 -54
  60. data/.gitignore +0 -60
  61. data/.rspec +0 -1
  62. data/.rubocop.yml +0 -55
  63. data/.rubocop_todo.yml +0 -163
  64. data/CODE_OF_CONDUCT.md +0 -14
  65. data/Gemfile +0 -8
  66. data/MAINTAINING.md +0 -64
  67. data/Rakefile +0 -8
  68. data/SECURITY.md +0 -19
  69. data/gemfiles/rails_61.gemfile +0 -7
  70. data/gemfiles/rails_70.gemfile +0 -7
  71. data/gemfiles/rails_71.gemfile +0 -7
  72. data/sorcery.gemspec +0 -49
  73. data/spec/active_record/user_activation_spec.rb +0 -17
  74. data/spec/active_record/user_activity_logging_spec.rb +0 -15
  75. data/spec/active_record/user_brute_force_protection_spec.rb +0 -15
  76. data/spec/active_record/user_magic_login_spec.rb +0 -15
  77. data/spec/active_record/user_oauth_spec.rb +0 -15
  78. data/spec/active_record/user_remember_me_spec.rb +0 -15
  79. data/spec/active_record/user_reset_password_spec.rb +0 -15
  80. data/spec/active_record/user_spec.rb +0 -27
  81. data/spec/controllers/controller_activity_logging_spec.rb +0 -113
  82. data/spec/controllers/controller_brute_force_protection_spec.rb +0 -41
  83. data/spec/controllers/controller_http_basic_auth_spec.rb +0 -67
  84. data/spec/controllers/controller_oauth2_spec.rb +0 -568
  85. data/spec/controllers/controller_oauth_spec.rb +0 -266
  86. data/spec/controllers/controller_remember_me_spec.rb +0 -130
  87. data/spec/controllers/controller_session_timeout_spec.rb +0 -168
  88. data/spec/controllers/controller_spec.rb +0 -200
  89. data/spec/orm/active_record.rb +0 -21
  90. data/spec/providers/example_provider_spec.rb +0 -17
  91. data/spec/providers/example_spec.rb +0 -17
  92. data/spec/providers/examples_spec.rb +0 -17
  93. data/spec/providers/vk_spec.rb +0 -42
  94. data/spec/rails_app/app/active_record/authentication.rb +0 -3
  95. data/spec/rails_app/app/active_record/user.rb +0 -5
  96. data/spec/rails_app/app/active_record/user_provider.rb +0 -3
  97. data/spec/rails_app/app/assets/config/manifest.js +0 -1
  98. data/spec/rails_app/app/controllers/application_controller.rb +0 -2
  99. data/spec/rails_app/app/controllers/sorcery_controller.rb +0 -489
  100. data/spec/rails_app/app/helpers/application_helper.rb +0 -2
  101. data/spec/rails_app/app/mailers/sorcery_mailer.rb +0 -38
  102. data/spec/rails_app/app/views/application/index.html.erb +0 -17
  103. data/spec/rails_app/app/views/layouts/application.html.erb +0 -14
  104. data/spec/rails_app/app/views/sorcery_mailer/activation_email.html.erb +0 -17
  105. data/spec/rails_app/app/views/sorcery_mailer/activation_email.text.erb +0 -9
  106. data/spec/rails_app/app/views/sorcery_mailer/activation_needed_email.html.erb +0 -17
  107. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.html.erb +0 -17
  108. data/spec/rails_app/app/views/sorcery_mailer/activation_success_email.text.erb +0 -9
  109. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.html.erb +0 -13
  110. data/spec/rails_app/app/views/sorcery_mailer/magic_login_email.text.erb +0 -6
  111. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.html.erb +0 -16
  112. data/spec/rails_app/app/views/sorcery_mailer/reset_password_email.text.erb +0 -8
  113. data/spec/rails_app/app/views/sorcery_mailer/send_unlock_token_email.text.erb +0 -1
  114. data/spec/rails_app/config/application.rb +0 -61
  115. data/spec/rails_app/config/boot.rb +0 -4
  116. data/spec/rails_app/config/database.yml +0 -22
  117. data/spec/rails_app/config/environment.rb +0 -5
  118. data/spec/rails_app/config/environments/test.rb +0 -37
  119. data/spec/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  120. data/spec/rails_app/config/initializers/compatible_legacy_migration.rb +0 -11
  121. data/spec/rails_app/config/initializers/inflections.rb +0 -10
  122. data/spec/rails_app/config/initializers/mime_types.rb +0 -5
  123. data/spec/rails_app/config/initializers/session_store.rb +0 -12
  124. data/spec/rails_app/config/locales/en.yml +0 -5
  125. data/spec/rails_app/config/routes.rb +0 -81
  126. data/spec/rails_app/config/secrets.yml +0 -4
  127. data/spec/rails_app/config.ru +0 -4
  128. data/spec/rails_app/db/migrate/activation/20101224223622_add_activation_to_users.rb +0 -17
  129. data/spec/rails_app/db/migrate/activity_logging/20101224223624_add_activity_logging_to_users.rb +0 -19
  130. data/spec/rails_app/db/migrate/brute_force_protection/20101224223626_add_brute_force_protection_to_users.rb +0 -13
  131. data/spec/rails_app/db/migrate/core/20101224223620_create_users.rb +0 -16
  132. data/spec/rails_app/db/migrate/external/20101224223628_create_authentications_and_user_providers.rb +0 -22
  133. data/spec/rails_app/db/migrate/invalidate_active_sessions/20180221093235_add_invalidate_active_sessions_before_to_users.rb +0 -9
  134. data/spec/rails_app/db/migrate/magic_login/20170924151831_add_magic_login_to_users.rb +0 -17
  135. data/spec/rails_app/db/migrate/remember_me/20101224223623_add_remember_me_token_to_users.rb +0 -15
  136. data/spec/rails_app/db/migrate/reset_password/20101224223622_add_reset_password_to_users.rb +0 -15
  137. data/spec/rails_app/db/schema.rb +0 -21
  138. data/spec/rails_app/db/seeds.rb +0 -7
  139. data/spec/shared_examples/user_activation_shared_examples.rb +0 -361
  140. data/spec/shared_examples/user_activity_logging_shared_examples.rb +0 -106
  141. data/spec/shared_examples/user_brute_force_protection_shared_examples.rb +0 -151
  142. data/spec/shared_examples/user_magic_login_shared_examples.rb +0 -150
  143. data/spec/shared_examples/user_oauth_shared_examples.rb +0 -33
  144. data/spec/shared_examples/user_remember_me_shared_examples.rb +0 -129
  145. data/spec/shared_examples/user_reset_password_shared_examples.rb +0 -370
  146. data/spec/shared_examples/user_shared_examples.rb +0 -678
  147. data/spec/sorcery_crypto_providers_spec.rb +0 -245
  148. data/spec/sorcery_temporary_token_spec.rb +0 -27
  149. data/spec/spec.opts +0 -2
  150. data/spec/spec_helper.rb +0 -50
  151. data/spec/support/migration_helper.rb +0 -29
  152. data/spec/support/providers/example.rb +0 -11
  153. data/spec/support/providers/example_provider.rb +0 -11
  154. data/spec/support/providers/examples.rb +0 -11
@@ -1,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