devise 3.5.10 → 4.6.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise might be problematic. Click here for more details.

Files changed (257) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +240 -1147
  3. data/MIT-LICENSE +1 -1
  4. data/README.md +240 -65
  5. data/app/controllers/devise/confirmations_controller.rb +3 -1
  6. data/app/controllers/devise/omniauth_callbacks_controller.rb +8 -6
  7. data/app/controllers/devise/passwords_controller.rb +7 -4
  8. data/app/controllers/devise/registrations_controller.rb +39 -18
  9. data/app/controllers/devise/sessions_controller.rb +9 -7
  10. data/app/controllers/devise/unlocks_controller.rb +4 -2
  11. data/app/controllers/devise_controller.rb +23 -10
  12. data/app/helpers/devise_helper.rb +12 -19
  13. data/app/mailers/devise/mailer.rb +6 -0
  14. data/app/views/devise/confirmations/new.html.erb +2 -2
  15. data/app/views/devise/mailer/email_changed.html.erb +7 -0
  16. data/app/views/devise/passwords/edit.html.erb +2 -2
  17. data/app/views/devise/passwords/new.html.erb +2 -2
  18. data/app/views/devise/registrations/edit.html.erb +9 -5
  19. data/app/views/devise/registrations/new.html.erb +4 -4
  20. data/app/views/devise/sessions/new.html.erb +4 -4
  21. data/app/views/devise/shared/_error_messages.html.erb +15 -0
  22. data/app/views/devise/shared/_links.html.erb +7 -7
  23. data/app/views/devise/unlocks/new.html.erb +2 -2
  24. data/config/locales/en.yml +3 -0
  25. data/lib/devise/controllers/helpers.rb +23 -20
  26. data/lib/devise/controllers/rememberable.rb +3 -1
  27. data/lib/devise/controllers/scoped_views.rb +2 -0
  28. data/lib/devise/controllers/sign_in_out.rb +34 -11
  29. data/lib/devise/controllers/store_location.rb +25 -7
  30. data/lib/devise/controllers/url_helpers.rb +2 -0
  31. data/lib/devise/delegator.rb +2 -0
  32. data/lib/devise/encryptor.rb +6 -4
  33. data/lib/devise/failure_app.rb +81 -37
  34. data/lib/devise/hooks/activatable.rb +2 -0
  35. data/lib/devise/hooks/csrf_cleaner.rb +2 -0
  36. data/lib/devise/hooks/forgetable.rb +2 -0
  37. data/lib/devise/hooks/lockable.rb +6 -1
  38. data/lib/devise/hooks/proxy.rb +3 -1
  39. data/lib/devise/hooks/rememberable.rb +2 -0
  40. data/lib/devise/hooks/timeoutable.rb +2 -0
  41. data/lib/devise/hooks/trackable.rb +2 -0
  42. data/lib/devise/mailers/helpers.rb +7 -4
  43. data/lib/devise/mapping.rb +2 -0
  44. data/lib/devise/models/authenticatable.rb +51 -25
  45. data/lib/devise/models/confirmable.rb +76 -27
  46. data/lib/devise/models/database_authenticatable.rb +91 -23
  47. data/lib/devise/models/lockable.rb +10 -4
  48. data/lib/devise/models/omniauthable.rb +2 -0
  49. data/lib/devise/models/recoverable.rb +31 -19
  50. data/lib/devise/models/registerable.rb +4 -0
  51. data/lib/devise/models/rememberable.rb +5 -10
  52. data/lib/devise/models/timeoutable.rb +2 -0
  53. data/lib/devise/models/trackable.rb +15 -1
  54. data/lib/devise/models/validatable.rb +10 -3
  55. data/lib/devise/models.rb +3 -1
  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 +14 -5
  59. data/lib/devise/omniauth.rb +2 -0
  60. data/lib/devise/orm/active_record.rb +5 -1
  61. data/lib/devise/orm/mongoid.rb +6 -2
  62. data/lib/devise/parameter_filter.rb +4 -0
  63. data/lib/devise/parameter_sanitizer.rb +139 -65
  64. data/lib/devise/rails/routes.rb +42 -31
  65. data/lib/devise/rails/warden_compat.rb +3 -10
  66. data/lib/devise/rails.rb +7 -16
  67. data/lib/devise/secret_key_finder.rb +27 -0
  68. data/lib/devise/strategies/authenticatable.rb +2 -0
  69. data/lib/devise/strategies/base.rb +2 -0
  70. data/lib/devise/strategies/database_authenticatable.rb +11 -4
  71. data/lib/devise/strategies/rememberable.rb +2 -0
  72. data/lib/devise/test/controller_helpers.rb +165 -0
  73. data/lib/devise/test/integration_helpers.rb +63 -0
  74. data/lib/devise/test_helpers.rb +7 -124
  75. data/lib/devise/time_inflector.rb +2 -0
  76. data/lib/devise/token_generator.rb +3 -41
  77. data/lib/devise/version.rb +3 -1
  78. data/lib/devise.rb +61 -40
  79. data/lib/generators/active_record/devise_generator.rb +29 -10
  80. data/lib/generators/active_record/templates/migration.rb +4 -2
  81. data/lib/generators/active_record/templates/migration_existing.rb +4 -2
  82. data/lib/generators/devise/controllers_generator.rb +3 -1
  83. data/lib/generators/devise/devise_generator.rb +4 -2
  84. data/lib/generators/devise/install_generator.rb +17 -0
  85. data/lib/generators/devise/orm_helpers.rb +10 -21
  86. data/lib/generators/devise/views_generator.rb +7 -8
  87. data/lib/generators/mongoid/devise_generator.rb +7 -5
  88. data/lib/generators/templates/README +1 -8
  89. data/lib/generators/templates/controllers/confirmations_controller.rb +2 -0
  90. data/lib/generators/templates/controllers/omniauth_callbacks_controller.rb +2 -0
  91. data/lib/generators/templates/controllers/passwords_controller.rb +2 -0
  92. data/lib/generators/templates/controllers/registrations_controller.rb +6 -4
  93. data/lib/generators/templates/controllers/sessions_controller.rb +4 -2
  94. data/lib/generators/templates/controllers/unlocks_controller.rb +2 -0
  95. data/lib/generators/templates/devise.rb +50 -20
  96. data/lib/generators/templates/markerb/email_changed.markerb +7 -0
  97. data/lib/generators/templates/markerb/password_change.markerb +2 -2
  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 +6 -1
  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 +11 -3
  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 +15 -307
  106. data/.gitignore +0 -10
  107. data/.travis.yml +0 -44
  108. data/.yardopts +0 -9
  109. data/CODE_OF_CONDUCT.md +0 -22
  110. data/CONTRIBUTING.md +0 -16
  111. data/Gemfile +0 -30
  112. data/Gemfile.lock +0 -187
  113. data/Rakefile +0 -36
  114. data/devise.gemspec +0 -27
  115. data/devise.png +0 -0
  116. data/gemfiles/Gemfile.rails-3.2-stable +0 -29
  117. data/gemfiles/Gemfile.rails-3.2-stable.lock +0 -172
  118. data/gemfiles/Gemfile.rails-4.0-stable +0 -30
  119. data/gemfiles/Gemfile.rails-4.0-stable.lock +0 -166
  120. data/gemfiles/Gemfile.rails-4.1-stable +0 -30
  121. data/gemfiles/Gemfile.rails-4.1-stable.lock +0 -171
  122. data/gemfiles/Gemfile.rails-4.2-stable +0 -30
  123. data/gemfiles/Gemfile.rails-4.2-stable.lock +0 -193
  124. data/script/cached-bundle +0 -49
  125. data/script/s3-put +0 -71
  126. data/test/controllers/custom_registrations_controller_test.rb +0 -40
  127. data/test/controllers/custom_strategy_test.rb +0 -62
  128. data/test/controllers/helper_methods_test.rb +0 -21
  129. data/test/controllers/helpers_test.rb +0 -316
  130. data/test/controllers/inherited_controller_i18n_messages_test.rb +0 -51
  131. data/test/controllers/internal_helpers_test.rb +0 -129
  132. data/test/controllers/load_hooks_controller_test.rb +0 -19
  133. data/test/controllers/passwords_controller_test.rb +0 -31
  134. data/test/controllers/sessions_controller_test.rb +0 -103
  135. data/test/controllers/url_helpers_test.rb +0 -65
  136. data/test/delegator_test.rb +0 -19
  137. data/test/devise_test.rb +0 -107
  138. data/test/failure_app_test.rb +0 -315
  139. data/test/generators/active_record_generator_test.rb +0 -109
  140. data/test/generators/controllers_generator_test.rb +0 -48
  141. data/test/generators/devise_generator_test.rb +0 -39
  142. data/test/generators/install_generator_test.rb +0 -13
  143. data/test/generators/mongoid_generator_test.rb +0 -23
  144. data/test/generators/views_generator_test.rb +0 -103
  145. data/test/helpers/devise_helper_test.rb +0 -49
  146. data/test/integration/authenticatable_test.rb +0 -729
  147. data/test/integration/confirmable_test.rb +0 -324
  148. data/test/integration/database_authenticatable_test.rb +0 -95
  149. data/test/integration/http_authenticatable_test.rb +0 -105
  150. data/test/integration/lockable_test.rb +0 -239
  151. data/test/integration/omniauthable_test.rb +0 -135
  152. data/test/integration/recoverable_test.rb +0 -347
  153. data/test/integration/registerable_test.rb +0 -359
  154. data/test/integration/rememberable_test.rb +0 -214
  155. data/test/integration/timeoutable_test.rb +0 -184
  156. data/test/integration/trackable_test.rb +0 -92
  157. data/test/mailers/confirmation_instructions_test.rb +0 -115
  158. data/test/mailers/reset_password_instructions_test.rb +0 -96
  159. data/test/mailers/unlock_instructions_test.rb +0 -91
  160. data/test/mapping_test.rb +0 -134
  161. data/test/models/authenticatable_test.rb +0 -23
  162. data/test/models/confirmable_test.rb +0 -511
  163. data/test/models/database_authenticatable_test.rb +0 -269
  164. data/test/models/lockable_test.rb +0 -350
  165. data/test/models/omniauthable_test.rb +0 -7
  166. data/test/models/recoverable_test.rb +0 -251
  167. data/test/models/registerable_test.rb +0 -7
  168. data/test/models/rememberable_test.rb +0 -169
  169. data/test/models/serializable_test.rb +0 -49
  170. data/test/models/timeoutable_test.rb +0 -51
  171. data/test/models/trackable_test.rb +0 -41
  172. data/test/models/validatable_test.rb +0 -127
  173. data/test/models_test.rb +0 -153
  174. data/test/omniauth/config_test.rb +0 -57
  175. data/test/omniauth/url_helpers_test.rb +0 -54
  176. data/test/orm/active_record.rb +0 -10
  177. data/test/orm/mongoid.rb +0 -13
  178. data/test/parameter_sanitizer_test.rb +0 -81
  179. data/test/rails_app/Rakefile +0 -6
  180. data/test/rails_app/app/active_record/admin.rb +0 -6
  181. data/test/rails_app/app/active_record/shim.rb +0 -2
  182. data/test/rails_app/app/active_record/user.rb +0 -6
  183. data/test/rails_app/app/active_record/user_on_engine.rb +0 -7
  184. data/test/rails_app/app/active_record/user_on_main_app.rb +0 -7
  185. data/test/rails_app/app/active_record/user_without_email.rb +0 -8
  186. data/test/rails_app/app/controllers/admins/sessions_controller.rb +0 -6
  187. data/test/rails_app/app/controllers/admins_controller.rb +0 -6
  188. data/test/rails_app/app/controllers/application_controller.rb +0 -12
  189. data/test/rails_app/app/controllers/application_with_fake_engine.rb +0 -30
  190. data/test/rails_app/app/controllers/custom/registrations_controller.rb +0 -31
  191. data/test/rails_app/app/controllers/home_controller.rb +0 -25
  192. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +0 -2
  193. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +0 -2
  194. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +0 -14
  195. data/test/rails_app/app/controllers/users_controller.rb +0 -31
  196. data/test/rails_app/app/helpers/application_helper.rb +0 -3
  197. data/test/rails_app/app/mailers/users/from_proc_mailer.rb +0 -3
  198. data/test/rails_app/app/mailers/users/mailer.rb +0 -3
  199. data/test/rails_app/app/mailers/users/reply_to_mailer.rb +0 -4
  200. data/test/rails_app/app/mongoid/admin.rb +0 -29
  201. data/test/rails_app/app/mongoid/shim.rb +0 -23
  202. data/test/rails_app/app/mongoid/user.rb +0 -39
  203. data/test/rails_app/app/mongoid/user_on_engine.rb +0 -39
  204. data/test/rails_app/app/mongoid/user_on_main_app.rb +0 -39
  205. data/test/rails_app/app/mongoid/user_without_email.rb +0 -33
  206. data/test/rails_app/app/views/admins/index.html.erb +0 -1
  207. data/test/rails_app/app/views/admins/sessions/new.html.erb +0 -2
  208. data/test/rails_app/app/views/home/admin_dashboard.html.erb +0 -1
  209. data/test/rails_app/app/views/home/index.html.erb +0 -1
  210. data/test/rails_app/app/views/home/join.html.erb +0 -1
  211. data/test/rails_app/app/views/home/private.html.erb +0 -1
  212. data/test/rails_app/app/views/home/user_dashboard.html.erb +0 -1
  213. data/test/rails_app/app/views/layouts/application.html.erb +0 -24
  214. data/test/rails_app/app/views/users/edit_form.html.erb +0 -1
  215. data/test/rails_app/app/views/users/index.html.erb +0 -1
  216. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +0 -1
  217. data/test/rails_app/app/views/users/sessions/new.html.erb +0 -1
  218. data/test/rails_app/bin/bundle +0 -3
  219. data/test/rails_app/bin/rails +0 -4
  220. data/test/rails_app/bin/rake +0 -4
  221. data/test/rails_app/config/application.rb +0 -40
  222. data/test/rails_app/config/boot.rb +0 -14
  223. data/test/rails_app/config/database.yml +0 -18
  224. data/test/rails_app/config/environment.rb +0 -5
  225. data/test/rails_app/config/environments/development.rb +0 -30
  226. data/test/rails_app/config/environments/production.rb +0 -84
  227. data/test/rails_app/config/environments/test.rb +0 -41
  228. data/test/rails_app/config/initializers/backtrace_silencers.rb +0 -7
  229. data/test/rails_app/config/initializers/devise.rb +0 -180
  230. data/test/rails_app/config/initializers/inflections.rb +0 -2
  231. data/test/rails_app/config/initializers/secret_token.rb +0 -8
  232. data/test/rails_app/config/initializers/session_store.rb +0 -1
  233. data/test/rails_app/config/routes.rb +0 -125
  234. data/test/rails_app/config.ru +0 -4
  235. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +0 -71
  236. data/test/rails_app/db/schema.rb +0 -55
  237. data/test/rails_app/lib/shared_admin.rb +0 -17
  238. data/test/rails_app/lib/shared_user.rb +0 -29
  239. data/test/rails_app/lib/shared_user_without_email.rb +0 -26
  240. data/test/rails_app/lib/shared_user_without_omniauth.rb +0 -13
  241. data/test/rails_app/public/404.html +0 -26
  242. data/test/rails_app/public/422.html +0 -26
  243. data/test/rails_app/public/500.html +0 -26
  244. data/test/rails_app/public/favicon.ico +0 -0
  245. data/test/rails_test.rb +0 -9
  246. data/test/routes_test.rb +0 -264
  247. data/test/support/action_controller/record_identifier.rb +0 -10
  248. data/test/support/assertions.rb +0 -39
  249. data/test/support/helpers.rb +0 -77
  250. data/test/support/integration.rb +0 -92
  251. data/test/support/locale/en.yml +0 -8
  252. data/test/support/mongoid.yml +0 -6
  253. data/test/support/webrat/integrations/rails.rb +0 -24
  254. data/test/test_helper.rb +0 -34
  255. data/test/test_helpers_test.rb +0 -178
  256. data/test/test_models.rb +0 -33
  257. data/test/time_helpers.rb +0 -137
@@ -1,324 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ConfirmationTest < ActionDispatch::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 /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
- assert_not user.confirmed?
45
- visit_user_confirmation_with_token(user.raw_confirmation_token)
46
-
47
- assert_have_selector '#error_explanation'
48
- assert_contain /needs to be confirmed within 3 days/
49
- assert_not 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
- assert_not 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
- assert_not 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
- assert_not 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'), 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'), 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, 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 < ActionDispatch::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
- assert_not 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
- assert_not 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 < ActionDispatch::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
- assert_not 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
- assert_not 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
- assert_not 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
- assert_not 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
- assert_not 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,105 +0,0 @@
1
- require 'test_helper'
2
-
3
- class HttpAuthenticationTest < ActionDispatch::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), {}, "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
- sign_in_as_new_user_with_http
15
- assert_response 200
16
- assert_match '<email>user@test.com</email>', response.body
17
- assert warden.authenticated?(:user)
18
-
19
- get users_path(format: :xml)
20
- assert_response 200
21
- end
22
-
23
- test 'sign in should authenticate with http but not emit a cookie if skipping session storage' do
24
- swap Devise, skip_session_storage: [:http_auth] do
25
- sign_in_as_new_user_with_http
26
- assert_response 200
27
- assert_match '<email>user@test.com</email>', response.body
28
- assert warden.authenticated?(:user)
29
-
30
- get users_path(format: :xml)
31
- assert_response 401
32
- end
33
- end
34
-
35
- test 'returns a custom response with www-authenticate header on failures' do
36
- sign_in_as_new_user_with_http("unknown")
37
- assert_equal 401, status
38
- assert_equal 'Basic realm="Application"', headers["WWW-Authenticate"]
39
- end
40
-
41
- test 'uses the request format as response content type' do
42
- sign_in_as_new_user_with_http("unknown")
43
- assert_equal 401, status
44
- assert_equal "application/xml; charset=utf-8", headers["Content-Type"]
45
- assert_match "<error>Invalid email or password.</error>", response.body
46
- end
47
-
48
- test 'returns a custom response with www-authenticate and chosen realm' do
49
- swap Devise, http_authentication_realm: "MyApp" do
50
- sign_in_as_new_user_with_http("unknown")
51
- assert_equal 401, status
52
- assert_equal 'Basic realm="MyApp"', headers["WWW-Authenticate"]
53
- end
54
- end
55
-
56
- test 'sign in should authenticate with http even with specific authentication keys' do
57
- swap Devise, authentication_keys: [:username] do
58
- sign_in_as_new_user_with_http("usertest")
59
- assert_response :success
60
- assert_match '<email>user@test.com</email>', response.body
61
- assert warden.authenticated?(:user)
62
- end
63
- end
64
-
65
- test 'it uses appropriate authentication_keys when configured with hash' do
66
- swap Devise, authentication_keys: ActiveSupport::OrderedHash[:username, false, :email, false] do
67
- sign_in_as_new_user_with_http("usertest")
68
- assert_response :success
69
- assert_match '<email>user@test.com</email>', response.body
70
- assert warden.authenticated?(:user)
71
- end
72
- end
73
-
74
- test 'it uses the appropriate key when configured explicitly' do
75
- swap Devise, authentication_keys: ActiveSupport::OrderedHash[:email, false, :username, false], http_authentication_key: :username do
76
- sign_in_as_new_user_with_http("usertest")
77
- assert_response :success
78
- assert_match '<email>user@test.com</email>', response.body
79
- assert warden.authenticated?(:user)
80
- end
81
- end
82
-
83
- test 'test request with oauth2 header doesnt get mistaken for basic authentication' do
84
- swap Devise, http_authenticatable: true do
85
- add_oauth2_header
86
- assert_equal 401, status
87
- assert_equal 'Basic realm="Application"', headers["WWW-Authenticate"]
88
- end
89
- end
90
-
91
- private
92
-
93
- def sign_in_as_new_user_with_http(username="user@test.com", password="12345678")
94
- user = create_user
95
- get users_path(format: :xml), {}, "HTTP_AUTHORIZATION" => "Basic #{Base64.encode64("#{username}:#{password}")}"
96
- user
97
- end
98
-
99
- # Sign in with oauth2 token. This is just to test that it isn't misinterpreted as basic authentication
100
- def add_oauth2_header
101
- user = create_user
102
- get users_path(format: :xml), {}, "HTTP_AUTHORIZATION" => "OAuth #{Base64.encode64("#{user.email}:12345678")}"
103
- end
104
-
105
- end