devise 4.3.0 → 4.9.2

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 (259) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +205 -2
  3. data/MIT-LICENSE +2 -1
  4. data/README.md +214 -57
  5. data/app/controllers/devise/confirmations_controller.rb +3 -0
  6. data/app/controllers/devise/omniauth_callbacks_controller.rb +3 -1
  7. data/app/controllers/devise/passwords_controller.rb +5 -2
  8. data/app/controllers/devise/registrations_controller.rb +32 -12
  9. data/app/controllers/devise/sessions_controller.rb +4 -2
  10. data/app/controllers/devise/unlocks_controller.rb +3 -0
  11. data/app/controllers/devise_controller.rb +6 -3
  12. data/app/helpers/devise_helper.rb +23 -18
  13. data/app/mailers/devise/mailer.rb +7 -5
  14. data/app/views/devise/confirmations/new.html.erb +2 -2
  15. data/app/views/devise/passwords/edit.html.erb +3 -3
  16. data/app/views/devise/passwords/new.html.erb +2 -2
  17. data/app/views/devise/registrations/edit.html.erb +6 -6
  18. data/app/views/devise/registrations/new.html.erb +4 -4
  19. data/app/views/devise/sessions/new.html.erb +4 -4
  20. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  21. data/app/views/devise/shared/_links.html.erb +8 -8
  22. data/app/views/devise/unlocks/new.html.erb +2 -2
  23. data/config/locales/en.yml +3 -2
  24. data/lib/devise/controllers/helpers.rb +10 -8
  25. data/lib/devise/controllers/rememberable.rb +2 -0
  26. data/lib/devise/controllers/responder.rb +35 -0
  27. data/lib/devise/controllers/scoped_views.rb +2 -0
  28. data/lib/devise/controllers/sign_in_out.rb +14 -4
  29. data/lib/devise/controllers/store_location.rb +24 -6
  30. data/lib/devise/controllers/url_helpers.rb +3 -1
  31. data/lib/devise/delegator.rb +2 -0
  32. data/lib/devise/encryptor.rb +2 -0
  33. data/lib/devise/failure_app.rb +33 -7
  34. data/lib/devise/hooks/activatable.rb +2 -0
  35. data/lib/devise/hooks/csrf_cleaner.rb +8 -1
  36. data/lib/devise/hooks/forgetable.rb +2 -0
  37. data/lib/devise/hooks/lockable.rb +4 -5
  38. data/lib/devise/hooks/proxy.rb +2 -0
  39. data/lib/devise/hooks/rememberable.rb +2 -0
  40. data/lib/devise/hooks/timeoutable.rb +4 -2
  41. data/lib/devise/hooks/trackable.rb +2 -0
  42. data/lib/devise/mailers/helpers.rb +2 -0
  43. data/lib/devise/mapping.rb +3 -1
  44. data/lib/devise/models/authenticatable.rb +55 -50
  45. data/lib/devise/models/confirmable.rb +36 -40
  46. data/lib/devise/models/database_authenticatable.rb +57 -36
  47. data/lib/devise/models/lockable.rb +18 -4
  48. data/lib/devise/models/omniauthable.rb +4 -2
  49. data/lib/devise/models/recoverable.rb +10 -19
  50. data/lib/devise/models/registerable.rb +4 -0
  51. data/lib/devise/models/rememberable.rb +5 -3
  52. data/lib/devise/models/timeoutable.rb +3 -1
  53. data/lib/devise/models/trackable.rb +15 -1
  54. data/lib/devise/models/validatable.rb +7 -10
  55. data/lib/devise/models.rb +3 -0
  56. data/lib/devise/modules.rb +2 -0
  57. data/lib/devise/omniauth/config.rb +2 -0
  58. data/lib/devise/omniauth/url_helpers.rb +2 -0
  59. data/lib/devise/omniauth.rb +4 -5
  60. data/lib/devise/orm/active_record.rb +2 -0
  61. data/lib/devise/orm/mongoid.rb +2 -0
  62. data/lib/devise/orm.rb +71 -0
  63. data/lib/devise/parameter_filter.rb +4 -0
  64. data/lib/devise/parameter_sanitizer.rb +15 -1
  65. data/lib/devise/rails/deprecated_constant_accessor.rb +39 -0
  66. data/lib/devise/rails/routes.rb +8 -6
  67. data/lib/devise/rails/warden_compat.rb +2 -0
  68. data/lib/devise/rails.rb +3 -5
  69. data/lib/devise/secret_key_finder.rb +27 -0
  70. data/lib/devise/strategies/authenticatable.rb +3 -1
  71. data/lib/devise/strategies/base.rb +2 -0
  72. data/lib/devise/strategies/database_authenticatable.rb +8 -1
  73. data/lib/devise/strategies/rememberable.rb +2 -0
  74. data/lib/devise/test/controller_helpers.rb +6 -1
  75. data/lib/devise/test/integration_helpers.rb +3 -1
  76. data/lib/devise/test_helpers.rb +2 -0
  77. data/lib/devise/time_inflector.rb +2 -0
  78. data/lib/devise/token_generator.rb +2 -0
  79. data/lib/devise/version.rb +3 -1
  80. data/lib/devise.rb +38 -12
  81. data/lib/generators/active_record/devise_generator.rb +40 -12
  82. data/lib/generators/active_record/templates/migration.rb +3 -1
  83. data/lib/generators/active_record/templates/migration_existing.rb +2 -0
  84. data/lib/generators/devise/controllers_generator.rb +3 -1
  85. data/lib/generators/devise/devise_generator.rb +5 -3
  86. data/lib/generators/devise/install_generator.rb +3 -5
  87. data/lib/generators/devise/orm_helpers.rb +9 -3
  88. data/lib/generators/devise/views_generator.rb +8 -9
  89. data/lib/generators/mongoid/devise_generator.rb +7 -5
  90. data/lib/generators/templates/README +9 -1
  91. data/lib/generators/templates/controllers/confirmations_controller.rb +2 -0
  92. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +3 -1
  93. data/lib/generators/templates/controllers/passwords_controller.rb +2 -0
  94. data/lib/generators/templates/controllers/registrations_controller.rb +2 -0
  95. data/lib/generators/templates/controllers/sessions_controller.rb +2 -0
  96. data/lib/generators/templates/controllers/unlocks_controller.rb +2 -0
  97. data/lib/generators/templates/devise.rb +43 -7
  98. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +5 -1
  99. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +10 -2
  100. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +4 -1
  101. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +12 -4
  102. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +11 -3
  103. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +7 -2
  104. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +4 -1
  105. metadata +24 -307
  106. data/.gitignore +0 -10
  107. data/.travis.yml +0 -58
  108. data/.yardopts +0 -9
  109. data/CODE_OF_CONDUCT.md +0 -22
  110. data/CONTRIBUTING.md +0 -79
  111. data/Gemfile +0 -40
  112. data/Gemfile.lock +0 -194
  113. data/Rakefile +0 -36
  114. data/bin/test +0 -13
  115. data/devise.gemspec +0 -26
  116. data/devise.png +0 -0
  117. data/gemfiles/Gemfile.rails-4.1-stable +0 -30
  118. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -171
  119. data/gemfiles/Gemfile.rails-4.2-stable +0 -30
  120. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -192
  121. data/gemfiles/Gemfile.rails-5.0-stable +0 -34
  122. data/gemfiles/Gemfile.rails-5.0-stable.lock +0 -193
  123. data/guides/bug_report_templates/integration_test.rb +0 -104
  124. data/test/controllers/custom_registrations_controller_test.rb +0 -40
  125. data/test/controllers/custom_strategy_test.rb +0 -64
  126. data/test/controllers/helper_methods_test.rb +0 -22
  127. data/test/controllers/helpers_test.rb +0 -316
  128. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -51
  129. data/test/controllers/internal_helpers_test.rb +0 -127
  130. data/test/controllers/load_hooks_controller_test.rb +0 -19
  131. data/test/controllers/passwords_controller_test.rb +0 -32
  132. data/test/controllers/sessions_controller_test.rb +0 -106
  133. data/test/controllers/url_helpers_test.rb +0 -65
  134. data/test/delegator_test.rb +0 -19
  135. data/test/devise_test.rb +0 -107
  136. data/test/failure_app_test.rb +0 -338
  137. data/test/generators/active_record_generator_test.rb +0 -83
  138. data/test/generators/controllers_generator_test.rb +0 -48
  139. data/test/generators/devise_generator_test.rb +0 -39
  140. data/test/generators/install_generator_test.rb +0 -24
  141. data/test/generators/mongoid_generator_test.rb +0 -23
  142. data/test/generators/views_generator_test.rb +0 -103
  143. data/test/helpers/devise_helper_test.rb +0 -49
  144. data/test/integration/authenticatable_test.rb +0 -698
  145. data/test/integration/confirmable_test.rb +0 -324
  146. data/test/integration/database_authenticatable_test.rb +0 -95
  147. data/test/integration/http_authenticatable_test.rb +0 -106
  148. data/test/integration/lockable_test.rb +0 -240
  149. data/test/integration/mounted_engine_test.rb +0 -36
  150. data/test/integration/omniauthable_test.rb +0 -135
  151. data/test/integration/recoverable_test.rb +0 -347
  152. data/test/integration/registerable_test.rb +0 -363
  153. data/test/integration/rememberable_test.rb +0 -217
  154. data/test/integration/timeoutable_test.rb +0 -184
  155. data/test/integration/trackable_test.rb +0 -92
  156. data/test/mailers/confirmation_instructions_test.rb +0 -115
  157. data/test/mailers/email_changed_test.rb +0 -130
  158. data/test/mailers/mailer_test.rb +0 -18
  159. data/test/mailers/reset_password_instructions_test.rb +0 -96
  160. data/test/mailers/unlock_instructions_test.rb +0 -91
  161. data/test/mapping_test.rb +0 -134
  162. data/test/models/authenticatable_test.rb +0 -23
  163. data/test/models/confirmable_test.rb +0 -536
  164. data/test/models/database_authenticatable_test.rb +0 -281
  165. data/test/models/lockable_test.rb +0 -350
  166. data/test/models/omniauthable_test.rb +0 -7
  167. data/test/models/recoverable_test.rb +0 -261
  168. data/test/models/registerable_test.rb +0 -7
  169. data/test/models/rememberable_test.rb +0 -182
  170. data/test/models/serializable_test.rb +0 -54
  171. data/test/models/timeoutable_test.rb +0 -51
  172. data/test/models/trackable_test.rb +0 -41
  173. data/test/models/validatable_test.rb +0 -119
  174. data/test/models_test.rb +0 -153
  175. data/test/omniauth/config_test.rb +0 -59
  176. data/test/omniauth/url_helpers_test.rb +0 -51
  177. data/test/orm/active_record.rb +0 -17
  178. data/test/orm/mongoid.rb +0 -13
  179. data/test/parameter_sanitizer_test.rb +0 -75
  180. data/test/rails_app/Rakefile +0 -6
  181. data/test/rails_app/app/active_record/admin.rb +0 -6
  182. data/test/rails_app/app/active_record/shim.rb +0 -2
  183. data/test/rails_app/app/active_record/user.rb +0 -7
  184. data/test/rails_app/app/active_record/user_on_engine.rb +0 -7
  185. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -7
  186. data/test/rails_app/app/active_record/user_without_email.rb +0 -8
  187. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
  188. data/test/rails_app/app/controllers/admins_controller.rb +0 -6
  189. data/test/rails_app/app/controllers/application_controller.rb +0 -11
  190. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -30
  191. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -31
  192. data/test/rails_app/app/controllers/home_controller.rb +0 -29
  193. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
  194. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
  195. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
  196. data/test/rails_app/app/controllers/users_controller.rb +0 -31
  197. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  198. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -3
  199. data/test/rails_app/app/mailers/users/mailer.rb +0 -3
  200. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -4
  201. data/test/rails_app/app/mongoid/admin.rb +0 -29
  202. data/test/rails_app/app/mongoid/shim.rb +0 -23
  203. data/test/rails_app/app/mongoid/user.rb +0 -39
  204. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -39
  205. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -39
  206. data/test/rails_app/app/mongoid/user_without_email.rb +0 -33
  207. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  208. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  209. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  210. data/test/rails_app/app/views/home/index.html.erb +0 -1
  211. data/test/rails_app/app/views/home/join.html.erb +0 -1
  212. data/test/rails_app/app/views/home/private.html.erb +0 -1
  213. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  214. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  215. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  216. data/test/rails_app/app/views/users/index.html.erb +0 -1
  217. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  218. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  219. data/test/rails_app/bin/bundle +0 -3
  220. data/test/rails_app/bin/rails +0 -4
  221. data/test/rails_app/bin/rake +0 -4
  222. data/test/rails_app/config/application.rb +0 -44
  223. data/test/rails_app/config/boot.rb +0 -20
  224. data/test/rails_app/config/database.yml +0 -18
  225. data/test/rails_app/config/environment.rb +0 -5
  226. data/test/rails_app/config/environments/development.rb +0 -30
  227. data/test/rails_app/config/environments/production.rb +0 -86
  228. data/test/rails_app/config/environments/test.rb +0 -45
  229. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  230. data/test/rails_app/config/initializers/devise.rb +0 -180
  231. data/test/rails_app/config/initializers/inflections.rb +0 -2
  232. data/test/rails_app/config/initializers/secret_token.rb +0 -3
  233. data/test/rails_app/config/initializers/session_store.rb +0 -1
  234. data/test/rails_app/config/routes.rb +0 -126
  235. data/test/rails_app/config.ru +0 -4
  236. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -75
  237. data/test/rails_app/db/schema.rb +0 -55
  238. data/test/rails_app/lib/shared_admin.rb +0 -21
  239. data/test/rails_app/lib/shared_user.rb +0 -30
  240. data/test/rails_app/lib/shared_user_without_email.rb +0 -26
  241. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -13
  242. data/test/rails_app/public/404.html +0 -26
  243. data/test/rails_app/public/422.html +0 -26
  244. data/test/rails_app/public/500.html +0 -26
  245. data/test/rails_app/public/favicon.ico +0 -0
  246. data/test/rails_test.rb +0 -9
  247. data/test/routes_test.rb +0 -279
  248. data/test/support/action_controller/record_identifier.rb +0 -10
  249. data/test/support/assertions.rb +0 -28
  250. data/test/support/helpers.rb +0 -77
  251. data/test/support/http_method_compatibility.rb +0 -51
  252. data/test/support/integration.rb +0 -92
  253. data/test/support/locale/en.yml +0 -8
  254. data/test/support/mongoid.yml +0 -6
  255. data/test/support/webrat/integrations/rails.rb +0 -33
  256. data/test/test/controller_helpers_test.rb +0 -186
  257. data/test/test/integration_helpers_test.rb +0 -32
  258. data/test/test_helper.rb +0 -34
  259. data/test/test_models.rb +0 -33
@@ -1,324 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ConfirmationTest < Devise::IntegrationTest
4
-
5
- def visit_user_confirmation_with_token(confirmation_token)
6
- visit user_confirmation_path(confirmation_token: confirmation_token)
7
- end
8
-
9
- def resend_confirmation
10
- user = create_user(confirm: false)
11
- ActionMailer::Base.deliveries.clear
12
-
13
- visit new_user_session_path
14
- click_link "Didn't receive confirmation instructions?"
15
-
16
- fill_in 'email', with: user.email
17
- click_button 'Resend confirmation instructions'
18
- end
19
-
20
- test 'user should be able to request a new confirmation' do
21
- resend_confirmation
22
-
23
- assert_current_url '/users/sign_in'
24
- assert_contain 'You will receive an email with instructions for how to confirm your email address in a few minutes'
25
- assert_equal 1, ActionMailer::Base.deliveries.size
26
- assert_equal ['please-change-me@config-initializers-devise.com'], ActionMailer::Base.deliveries.first.from
27
- end
28
-
29
- test 'user should receive a confirmation from a custom mailer' do
30
- User.any_instance.stubs(:devise_mailer).returns(Users::Mailer)
31
- resend_confirmation
32
- assert_equal ['custom@example.com'], ActionMailer::Base.deliveries.first.from
33
- end
34
-
35
- test 'user with invalid confirmation token should not be able to confirm an account' do
36
- visit_user_confirmation_with_token('invalid_confirmation')
37
- assert_have_selector '#error_explanation'
38
- assert_contain %r{Confirmation token(.*)invalid}
39
- end
40
-
41
- test 'user with valid confirmation token should not be able to confirm an account after the token has expired' do
42
- swap Devise, confirm_within: 3.days do
43
- user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
44
- refute user.confirmed?
45
- visit_user_confirmation_with_token(user.raw_confirmation_token)
46
-
47
- assert_have_selector '#error_explanation'
48
- assert_contain %r{needs to be confirmed within 3 days}
49
- refute user.reload.confirmed?
50
- assert_current_url "/users/confirmation?confirmation_token=#{user.raw_confirmation_token}"
51
- end
52
- end
53
-
54
- test 'user with valid confirmation token where the token has expired and with application router_name set to a different engine it should raise an error' do
55
- user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
56
-
57
- swap Devise, confirm_within: 3.days, router_name: :fake_engine do
58
- assert_raise ActionView::Template::Error do
59
- visit_user_confirmation_with_token(user.raw_confirmation_token)
60
- end
61
- end
62
- end
63
-
64
- test 'user with valid confirmation token where the token has expired and with application router_name set to a different engine and route overrides back to main it shows the path' do
65
- user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
66
-
67
- swap Devise, confirm_within: 3.days, router_name: :fake_engine do
68
- visit user_on_main_app_confirmation_path(confirmation_token: user.raw_confirmation_token)
69
-
70
- assert_current_url "/user_on_main_apps/confirmation?confirmation_token=#{user.raw_confirmation_token}"
71
- end
72
- end
73
-
74
- test 'user with valid confirmation token where the token has expired with router overrides different engine it shows the path' do
75
- user = create_user(confirm: false, confirmation_sent_at: 4.days.ago)
76
-
77
- swap Devise, confirm_within: 3.days do
78
- visit user_on_engine_confirmation_path(confirmation_token: user.raw_confirmation_token)
79
-
80
- assert_current_url "/user_on_engines/confirmation?confirmation_token=#{user.raw_confirmation_token}"
81
- end
82
- end
83
-
84
- test 'user with valid confirmation token should be able to confirm an account before the token has expired' do
85
- swap Devise, confirm_within: 3.days do
86
- user = create_user(confirm: false, confirmation_sent_at: 2.days.ago)
87
- refute user.confirmed?
88
- visit_user_confirmation_with_token(user.raw_confirmation_token)
89
-
90
- assert_contain 'Your email address has been successfully confirmed.'
91
- assert_current_url '/users/sign_in'
92
- assert user.reload.confirmed?
93
- end
94
- end
95
-
96
- test 'user should be redirected to a custom path after confirmation' do
97
- Devise::ConfirmationsController.any_instance.stubs(:after_confirmation_path_for).returns("/?custom=1")
98
-
99
- user = create_user(confirm: false)
100
- visit_user_confirmation_with_token(user.raw_confirmation_token)
101
-
102
- assert_current_url "/?custom=1"
103
- end
104
-
105
- test 'already confirmed user should not be able to confirm the account again' do
106
- user = create_user(confirm: false)
107
- user.confirmed_at = Time.now
108
- user.save
109
- visit_user_confirmation_with_token(user.raw_confirmation_token)
110
-
111
- assert_have_selector '#error_explanation'
112
- assert_contain 'already confirmed'
113
- end
114
-
115
- test 'already confirmed user should not be able to confirm the account again neither request confirmation' do
116
- user = create_user(confirm: false)
117
- user.confirmed_at = Time.now
118
- user.save
119
-
120
- visit_user_confirmation_with_token(user.raw_confirmation_token)
121
- assert_contain 'already confirmed'
122
-
123
- fill_in 'email', with: user.email
124
- click_button 'Resend confirmation instructions'
125
- assert_contain 'already confirmed'
126
- end
127
-
128
- test 'not confirmed user with setup to block without confirmation should not be able to sign in' do
129
- swap Devise, allow_unconfirmed_access_for: 0.days do
130
- sign_in_as_user(confirm: false)
131
-
132
- assert_contain 'You have to confirm your email address before continuing'
133
- refute warden.authenticated?(:user)
134
- end
135
- end
136
-
137
- test 'not confirmed user should not see confirmation message if invalid credentials are given' do
138
- swap Devise, allow_unconfirmed_access_for: 0.days do
139
- sign_in_as_user(confirm: false) do
140
- fill_in 'password', with: 'invalid'
141
- end
142
-
143
- assert_contain 'Invalid Email or password'
144
- refute warden.authenticated?(:user)
145
- end
146
- end
147
-
148
- test 'not confirmed user but configured with some days to confirm should be able to sign in' do
149
- swap Devise, allow_unconfirmed_access_for: 1.day do
150
- sign_in_as_user(confirm: false)
151
-
152
- assert_response :success
153
- assert warden.authenticated?(:user)
154
- end
155
- end
156
-
157
- test 'unconfirmed but signed in user should be redirected to their root path' do
158
- swap Devise, allow_unconfirmed_access_for: 1.day do
159
- user = sign_in_as_user(confirm: false)
160
-
161
- visit_user_confirmation_with_token(user.raw_confirmation_token)
162
- assert_contain 'Your email address has been successfully confirmed.'
163
- assert_current_url '/'
164
- end
165
- end
166
-
167
- test 'user should be redirected to sign in page whenever signed in as another resource at same session already' do
168
- sign_in_as_admin
169
-
170
- user = create_user(confirm: false)
171
- visit_user_confirmation_with_token(user.raw_confirmation_token)
172
-
173
- assert_current_url '/users/sign_in'
174
- end
175
-
176
- test 'error message is configurable by resource name' do
177
- store_translations :en, devise: {
178
- failure: { user: { unconfirmed: "Not confirmed user" } }
179
- } do
180
- sign_in_as_user(confirm: false)
181
- assert_contain 'Not confirmed user'
182
- end
183
- end
184
-
185
- test 'resent confirmation token with valid E-Mail in XML format should return valid response' do
186
- user = create_user(confirm: false)
187
- post user_confirmation_path(format: 'xml'), params: { user: { email: user.email } }
188
- assert_response :success
189
- assert_equal response.body, {}.to_xml
190
- end
191
-
192
- test 'resent confirmation token with invalid E-Mail in XML format should return invalid response' do
193
- create_user(confirm: false)
194
- post user_confirmation_path(format: 'xml'), params: { user: { email: 'invalid.test@test.com' } }
195
- assert_response :unprocessable_entity
196
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
197
- end
198
-
199
- test 'confirm account with valid confirmation token in XML format should return valid response' do
200
- user = create_user(confirm: false)
201
- get user_confirmation_path(confirmation_token: user.raw_confirmation_token, format: 'xml')
202
- assert_response :success
203
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
204
- end
205
-
206
- test 'confirm account with invalid confirmation token in XML format should return invalid response' do
207
- create_user(confirm: false)
208
- get user_confirmation_path(confirmation_token: 'invalid_confirmation', format: 'xml')
209
- assert_response :unprocessable_entity
210
- assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
211
- end
212
-
213
- test 'request an account confirmation account with JSON, should return an empty JSON' do
214
- user = create_user(confirm: false)
215
-
216
- post user_confirmation_path, params: { user: { email: user.email }, format: :json }
217
- assert_response :success
218
- assert_equal response.body, {}.to_json
219
- end
220
-
221
- test "when in paranoid mode and with a valid e-mail, should not say that the e-mail is valid" do
222
- swap Devise, paranoid: true do
223
- user = create_user(confirm: false)
224
- visit new_user_session_path
225
-
226
- click_link "Didn't receive confirmation instructions?"
227
- fill_in 'email', with: user.email
228
- click_button 'Resend confirmation instructions'
229
-
230
- assert_contain "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
231
- assert_current_url "/users/sign_in"
232
- end
233
- end
234
-
235
- test "when in paranoid mode and with a invalid e-mail, should not say that the e-mail is invalid" do
236
- swap Devise, paranoid: true do
237
- visit new_user_session_path
238
-
239
- click_link "Didn't receive confirmation instructions?"
240
- fill_in 'email', with: "idonthavethisemail@gmail.com"
241
- click_button 'Resend confirmation instructions'
242
-
243
- assert_not_contain "1 error prohibited this user from being saved:"
244
- assert_not_contain "Email not found"
245
-
246
- assert_contain "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
247
- assert_current_url "/users/sign_in"
248
- end
249
- end
250
- end
251
-
252
- class ConfirmationOnChangeTest < Devise::IntegrationTest
253
- def create_second_admin(options={})
254
- @admin = nil
255
- create_admin(options)
256
- end
257
-
258
- def visit_admin_confirmation_with_token(confirmation_token)
259
- visit admin_confirmation_path(confirmation_token: confirmation_token)
260
- end
261
-
262
- test 'admin should be able to request a new confirmation after email changed' do
263
- admin = create_admin
264
- admin.update_attributes(email: 'new_test@example.com')
265
-
266
- visit new_admin_session_path
267
- click_link "Didn't receive confirmation instructions?"
268
-
269
- fill_in 'email', with: admin.unconfirmed_email
270
- assert_difference "ActionMailer::Base.deliveries.size" do
271
- click_button 'Resend confirmation instructions'
272
- end
273
-
274
- assert_current_url '/admin_area/sign_in'
275
- assert_contain 'You will receive an email with instructions for how to confirm your email address in a few minutes'
276
- end
277
-
278
- test 'admin with valid confirmation token should be able to confirm email after email changed' do
279
- admin = create_admin
280
- admin.update_attributes(email: 'new_test@example.com')
281
- assert_equal 'new_test@example.com', admin.unconfirmed_email
282
- visit_admin_confirmation_with_token(admin.raw_confirmation_token)
283
-
284
- assert_contain 'Your email address has been successfully confirmed.'
285
- assert_current_url '/admin_area/sign_in'
286
- assert admin.reload.confirmed?
287
- refute admin.reload.pending_reconfirmation?
288
- end
289
-
290
- test 'admin with previously valid confirmation token should not be able to confirm email after email changed again' do
291
- admin = create_admin
292
- admin.update_attributes(email: 'first_test@example.com')
293
- assert_equal 'first_test@example.com', admin.unconfirmed_email
294
-
295
- raw_confirmation_token = admin.raw_confirmation_token
296
- admin = Admin.find(admin.id)
297
-
298
- admin.update_attributes(email: 'second_test@example.com')
299
- assert_equal 'second_test@example.com', admin.unconfirmed_email
300
-
301
- visit_admin_confirmation_with_token(raw_confirmation_token)
302
- assert_have_selector '#error_explanation'
303
- assert_contain(/Confirmation token(.*)invalid/)
304
-
305
- visit_admin_confirmation_with_token(admin.raw_confirmation_token)
306
- assert_contain 'Your email address has been successfully confirmed.'
307
- assert_current_url '/admin_area/sign_in'
308
- assert admin.reload.confirmed?
309
- refute admin.reload.pending_reconfirmation?
310
- end
311
-
312
- test 'admin email should be unique also within unconfirmed_email' do
313
- admin = create_admin
314
- admin.update_attributes(email: 'new_admin_test@example.com')
315
- assert_equal 'new_admin_test@example.com', admin.unconfirmed_email
316
-
317
- create_second_admin(email: "new_admin_test@example.com")
318
-
319
- visit_admin_confirmation_with_token(admin.raw_confirmation_token)
320
- assert_have_selector '#error_explanation'
321
- assert_contain(/Email.*already.*taken/)
322
- assert admin.reload.pending_reconfirmation?
323
- end
324
- end
@@ -1,95 +0,0 @@
1
- require 'test_helper'
2
-
3
- class DatabaseAuthenticationTest < Devise::IntegrationTest
4
- test 'sign in with email of different case should succeed when email is in the list of case insensitive keys' do
5
- create_user(email: 'Foo@Bar.com')
6
-
7
- sign_in_as_user do
8
- fill_in 'email', with: 'foo@bar.com'
9
- end
10
-
11
- assert warden.authenticated?(:user)
12
- end
13
-
14
- test 'sign in with email of different case should fail when email is NOT the list of case insensitive keys' do
15
- swap Devise, case_insensitive_keys: [] do
16
- create_user(email: 'Foo@Bar.com')
17
-
18
- sign_in_as_user do
19
- fill_in 'email', with: 'foo@bar.com'
20
- end
21
-
22
- refute warden.authenticated?(:user)
23
- end
24
- end
25
-
26
- test 'sign in with email including extra spaces should succeed when email is in the list of strip whitespace keys' do
27
- create_user(email: ' foo@bar.com ')
28
-
29
- sign_in_as_user do
30
- fill_in 'email', with: 'foo@bar.com'
31
- end
32
-
33
- assert warden.authenticated?(:user)
34
- end
35
-
36
- test 'sign in with email including extra spaces should fail when email is NOT the list of strip whitespace keys' do
37
- swap Devise, strip_whitespace_keys: [] do
38
- create_user(email: 'foo@bar.com')
39
-
40
- sign_in_as_user do
41
- fill_in 'email', with: ' foo@bar.com '
42
- end
43
-
44
- refute warden.authenticated?(:user)
45
- end
46
- end
47
-
48
- test 'sign in should not authenticate if not using proper authentication keys' do
49
- swap Devise, authentication_keys: [:username] do
50
- sign_in_as_user
51
- refute warden.authenticated?(:user)
52
- end
53
- end
54
-
55
- test 'sign in with invalid email should return to sign in form with error message' do
56
- store_translations :en, devise: { failure: { admin: { not_found_in_database: 'Invalid email address' } } } do
57
- sign_in_as_admin do
58
- fill_in 'email', with: 'wrongemail@test.com'
59
- end
60
-
61
- assert_contain 'Invalid email address'
62
- refute warden.authenticated?(:admin)
63
- end
64
- end
65
-
66
- test 'sign in with invalid pasword should return to sign in form with error message' do
67
- sign_in_as_admin do
68
- fill_in 'password', with: 'abcdef'
69
- end
70
-
71
- assert_contain 'Invalid Email or password'
72
- refute warden.authenticated?(:admin)
73
- end
74
-
75
- test 'error message is configurable by resource name' do
76
- store_translations :en, devise: { failure: { admin: { invalid: "Invalid credentials" } } } do
77
- sign_in_as_admin do
78
- fill_in 'password', with: 'abcdef'
79
- end
80
-
81
- assert_contain 'Invalid credentials'
82
- end
83
- end
84
-
85
- test 'valid sign in calls after_database_authentication callback' do
86
- user = create_user(email: ' foo@bar.com ')
87
-
88
- User.expects(:find_for_database_authentication).returns user
89
- user.expects :after_database_authentication
90
-
91
- sign_in_as_user do
92
- fill_in 'email', with: 'foo@bar.com'
93
- end
94
- end
95
- end
@@ -1,106 +0,0 @@
1
- require 'test_helper'
2
-
3
- class HttpAuthenticationTest < Devise::IntegrationTest
4
- test 'handles unverified requests gets rid of caches but continues signed in' do
5
- swap ApplicationController, allow_forgery_protection: true do
6
- create_user
7
- post exhibit_user_url(1), headers: { "HTTP_AUTHORIZATION" => "Basic #{Base64.encode64("user@test.com:12345678")}" }
8
- assert warden.authenticated?(:user)
9
- assert_equal "User is authenticated", response.body
10
- end
11
- end
12
-
13
- test 'sign in should authenticate with http' do
14
- swap Devise, skip_session_storage: [] do
15
- sign_in_as_new_user_with_http
16
- assert_response 200
17
- assert_match '<email>user@test.com</email>', response.body
18
- assert warden.authenticated?(:user)
19
-
20
- get users_path(format: :xml)
21
- assert_response 200
22
- end
23
- end
24
-
25
- test 'sign in should authenticate with http but not emit a cookie if skipping session storage' do
26
- swap Devise, skip_session_storage: [:http_auth] do
27
- sign_in_as_new_user_with_http
28
- assert_response 200
29
- assert_match '<email>user@test.com</email>', response.body
30
- assert warden.authenticated?(:user)
31
-
32
- get users_path(format: :xml)
33
- assert_response 401
34
- end
35
- end
36
-
37
- test 'returns a custom response with www-authenticate header on failures' do
38
- sign_in_as_new_user_with_http("unknown")
39
- assert_equal 401, status
40
- assert_equal 'Basic realm="Application"', headers["WWW-Authenticate"]
41
- end
42
-
43
- test 'uses the request format as response content type' do
44
- sign_in_as_new_user_with_http("unknown")
45
- assert_equal 401, status
46
- assert_equal "application/xml; charset=utf-8", headers["Content-Type"]
47
- assert_match "<error>Invalid Email or password.</error>", response.body
48
- end
49
-
50
- test 'returns a custom response with www-authenticate and chosen realm' do
51
- swap Devise, http_authentication_realm: "MyApp" do
52
- sign_in_as_new_user_with_http("unknown")
53
- assert_equal 401, status
54
- assert_equal 'Basic realm="MyApp"', headers["WWW-Authenticate"]
55
- end
56
- end
57
-
58
- test 'sign in should authenticate with http even with specific authentication keys' do
59
- swap Devise, authentication_keys: [:username] do
60
- sign_in_as_new_user_with_http("usertest")
61
- assert_response :success
62
- assert_match '<email>user@test.com</email>', response.body
63
- assert warden.authenticated?(:user)
64
- end
65
- end
66
-
67
- test 'it uses appropriate authentication_keys when configured with hash' do
68
- swap Devise, authentication_keys: { username: false, email: false } do
69
- sign_in_as_new_user_with_http("usertest")
70
- assert_response :success
71
- assert_match '<email>user@test.com</email>', response.body
72
- assert warden.authenticated?(:user)
73
- end
74
- end
75
-
76
- test 'it uses the appropriate key when configured explicitly' do
77
- swap Devise, authentication_keys: { email: false, username: false }, http_authentication_key: :username do
78
- sign_in_as_new_user_with_http("usertest")
79
- assert_response :success
80
- assert_match '<email>user@test.com</email>', response.body
81
- assert warden.authenticated?(:user)
82
- end
83
- end
84
-
85
- test 'test request with oauth2 header doesnt get mistaken for basic authentication' do
86
- swap Devise, http_authenticatable: true do
87
- add_oauth2_header
88
- assert_equal 401, status
89
- assert_equal 'Basic realm="Application"', headers["WWW-Authenticate"]
90
- end
91
- end
92
-
93
- private
94
- def sign_in_as_new_user_with_http(username="user@test.com", password="12345678")
95
- user = create_user
96
- get users_path(format: :xml), headers: { "HTTP_AUTHORIZATION" => "Basic #{Base64.encode64("#{username}:#{password}")}" }
97
- user
98
- end
99
-
100
- # Sign in with oauth2 token. This is just to test that it isn't misinterpreted as basic authentication
101
- def add_oauth2_header
102
- user = create_user
103
- get users_path(format: :xml), headers: { "HTTP_AUTHORIZATION" => "OAuth #{Base64.encode64("#{user.email}:12345678")}" }
104
- end
105
-
106
- end