af-devise 2.1.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 (207) hide show
  1. data/.gitignore +10 -0
  2. data/.travis.yml +15 -0
  3. data/CHANGELOG.rdoc +885 -0
  4. data/CONTRIBUTING.md +14 -0
  5. data/Gemfile +29 -0
  6. data/Gemfile.lock +155 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +394 -0
  9. data/Rakefile +34 -0
  10. data/app/controllers/devise/confirmations_controller.rb +43 -0
  11. data/app/controllers/devise/omniauth_callbacks_controller.rb +30 -0
  12. data/app/controllers/devise/passwords_controller.rb +65 -0
  13. data/app/controllers/devise/registrations_controller.rb +119 -0
  14. data/app/controllers/devise/sessions_controller.rb +50 -0
  15. data/app/controllers/devise/unlocks_controller.rb +44 -0
  16. data/app/controllers/devise_controller.rb +184 -0
  17. data/app/helpers/devise_helper.rb +25 -0
  18. data/app/mailers/devise/mailer.rb +15 -0
  19. data/app/views/devise/_links.erb +3 -0
  20. data/app/views/devise/confirmations/new.html.erb +12 -0
  21. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  22. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  23. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  24. data/app/views/devise/passwords/edit.html.erb +16 -0
  25. data/app/views/devise/passwords/new.html.erb +12 -0
  26. data/app/views/devise/registrations/edit.html.erb +25 -0
  27. data/app/views/devise/registrations/new.html.erb +18 -0
  28. data/app/views/devise/sessions/new.html.erb +17 -0
  29. data/app/views/devise/shared/_links.erb +25 -0
  30. data/app/views/devise/unlocks/new.html.erb +12 -0
  31. data/config/locales/en.yml +59 -0
  32. data/devise.gemspec +25 -0
  33. data/gemfiles/Gemfile.rails-3.1.x +35 -0
  34. data/gemfiles/Gemfile.rails-3.1.x.lock +167 -0
  35. data/lib/devise.rb +444 -0
  36. data/lib/devise/controllers/helpers.rb +285 -0
  37. data/lib/devise/controllers/rememberable.rb +52 -0
  38. data/lib/devise/controllers/scoped_views.rb +17 -0
  39. data/lib/devise/controllers/url_helpers.rb +67 -0
  40. data/lib/devise/delegator.rb +16 -0
  41. data/lib/devise/failure_app.rb +187 -0
  42. data/lib/devise/hooks/activatable.rb +11 -0
  43. data/lib/devise/hooks/forgetable.rb +9 -0
  44. data/lib/devise/hooks/lockable.rb +7 -0
  45. data/lib/devise/hooks/rememberable.rb +6 -0
  46. data/lib/devise/hooks/timeoutable.rb +25 -0
  47. data/lib/devise/hooks/trackable.rb +9 -0
  48. data/lib/devise/mailers/helpers.rb +91 -0
  49. data/lib/devise/mapping.rb +172 -0
  50. data/lib/devise/models.rb +128 -0
  51. data/lib/devise/models/authenticatable.rb +268 -0
  52. data/lib/devise/models/confirmable.rb +270 -0
  53. data/lib/devise/models/database_authenticatable.rb +127 -0
  54. data/lib/devise/models/lockable.rb +193 -0
  55. data/lib/devise/models/omniauthable.rb +27 -0
  56. data/lib/devise/models/recoverable.rb +140 -0
  57. data/lib/devise/models/registerable.rb +25 -0
  58. data/lib/devise/models/rememberable.rb +125 -0
  59. data/lib/devise/models/timeoutable.rb +49 -0
  60. data/lib/devise/models/token_authenticatable.rb +89 -0
  61. data/lib/devise/models/trackable.rb +35 -0
  62. data/lib/devise/models/validatable.rb +66 -0
  63. data/lib/devise/modules.rb +29 -0
  64. data/lib/devise/omniauth.rb +28 -0
  65. data/lib/devise/omniauth/config.rb +45 -0
  66. data/lib/devise/omniauth/url_helpers.rb +18 -0
  67. data/lib/devise/orm/active_record.rb +3 -0
  68. data/lib/devise/orm/mongoid.rb +3 -0
  69. data/lib/devise/param_filter.rb +41 -0
  70. data/lib/devise/rails.rb +54 -0
  71. data/lib/devise/rails/routes.rb +446 -0
  72. data/lib/devise/rails/warden_compat.rb +43 -0
  73. data/lib/devise/strategies/authenticatable.rb +176 -0
  74. data/lib/devise/strategies/base.rb +20 -0
  75. data/lib/devise/strategies/database_authenticatable.rb +20 -0
  76. data/lib/devise/strategies/rememberable.rb +55 -0
  77. data/lib/devise/strategies/token_authenticatable.rb +56 -0
  78. data/lib/devise/test_helpers.rb +131 -0
  79. data/lib/devise/time_inflector.rb +14 -0
  80. data/lib/devise/version.rb +3 -0
  81. data/lib/generators/active_record/devise_generator.rb +79 -0
  82. data/lib/generators/active_record/templates/migration.rb +19 -0
  83. data/lib/generators/active_record/templates/migration_existing.rb +26 -0
  84. data/lib/generators/devise/devise_generator.rb +24 -0
  85. data/lib/generators/devise/install_generator.rb +24 -0
  86. data/lib/generators/devise/orm_helpers.rb +32 -0
  87. data/lib/generators/devise/views_generator.rb +116 -0
  88. data/lib/generators/mongoid/devise_generator.rb +57 -0
  89. data/lib/generators/templates/README +35 -0
  90. data/lib/generators/templates/devise.rb +240 -0
  91. data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
  92. data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
  93. data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
  94. data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +15 -0
  95. data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
  96. data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
  97. data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +22 -0
  98. data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
  99. data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
  100. data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +15 -0
  101. data/test/controllers/custom_strategy_test.rb +62 -0
  102. data/test/controllers/helpers_test.rb +253 -0
  103. data/test/controllers/internal_helpers_test.rb +110 -0
  104. data/test/controllers/sessions_controller_test.rb +85 -0
  105. data/test/controllers/url_helpers_test.rb +59 -0
  106. data/test/delegator_test.rb +19 -0
  107. data/test/devise_test.rb +72 -0
  108. data/test/failure_app_test.rb +221 -0
  109. data/test/generators/active_record_generator_test.rb +75 -0
  110. data/test/generators/devise_generator_test.rb +39 -0
  111. data/test/generators/install_generator_test.rb +13 -0
  112. data/test/generators/mongoid_generator_test.rb +23 -0
  113. data/test/generators/views_generator_test.rb +52 -0
  114. data/test/helpers/devise_helper_test.rb +51 -0
  115. data/test/integration/authenticatable_test.rb +633 -0
  116. data/test/integration/confirmable_test.rb +298 -0
  117. data/test/integration/database_authenticatable_test.rb +82 -0
  118. data/test/integration/http_authenticatable_test.rb +97 -0
  119. data/test/integration/lockable_test.rb +242 -0
  120. data/test/integration/omniauthable_test.rb +133 -0
  121. data/test/integration/recoverable_test.rb +334 -0
  122. data/test/integration/registerable_test.rb +345 -0
  123. data/test/integration/rememberable_test.rb +158 -0
  124. data/test/integration/timeoutable_test.rb +140 -0
  125. data/test/integration/token_authenticatable_test.rb +161 -0
  126. data/test/integration/trackable_test.rb +92 -0
  127. data/test/mailers/confirmation_instructions_test.rb +102 -0
  128. data/test/mailers/reset_password_instructions_test.rb +83 -0
  129. data/test/mailers/unlock_instructions_test.rb +77 -0
  130. data/test/mapping_test.rb +127 -0
  131. data/test/models/authenticatable_test.rb +7 -0
  132. data/test/models/confirmable_test.rb +391 -0
  133. data/test/models/database_authenticatable_test.rb +196 -0
  134. data/test/models/lockable_test.rb +273 -0
  135. data/test/models/omniauthable_test.rb +7 -0
  136. data/test/models/recoverable_test.rb +205 -0
  137. data/test/models/registerable_test.rb +7 -0
  138. data/test/models/rememberable_test.rb +174 -0
  139. data/test/models/serializable_test.rb +49 -0
  140. data/test/models/timeoutable_test.rb +46 -0
  141. data/test/models/token_authenticatable_test.rb +55 -0
  142. data/test/models/trackable_test.rb +13 -0
  143. data/test/models/validatable_test.rb +117 -0
  144. data/test/models_test.rb +179 -0
  145. data/test/omniauth/config_test.rb +57 -0
  146. data/test/omniauth/url_helpers_test.rb +51 -0
  147. data/test/orm/active_record.rb +9 -0
  148. data/test/orm/mongoid.rb +13 -0
  149. data/test/rails_app/Rakefile +10 -0
  150. data/test/rails_app/app/active_record/admin.rb +6 -0
  151. data/test/rails_app/app/active_record/shim.rb +2 -0
  152. data/test/rails_app/app/active_record/user.rb +6 -0
  153. data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
  154. data/test/rails_app/app/controllers/admins_controller.rb +11 -0
  155. data/test/rails_app/app/controllers/application_controller.rb +8 -0
  156. data/test/rails_app/app/controllers/home_controller.rb +25 -0
  157. data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
  158. data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
  159. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  160. data/test/rails_app/app/controllers/users_controller.rb +23 -0
  161. data/test/rails_app/app/helpers/application_helper.rb +3 -0
  162. data/test/rails_app/app/mailers/users/mailer.rb +8 -0
  163. data/test/rails_app/app/mongoid/admin.rb +29 -0
  164. data/test/rails_app/app/mongoid/shim.rb +24 -0
  165. data/test/rails_app/app/mongoid/user.rb +42 -0
  166. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  167. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  168. data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
  169. data/test/rails_app/app/views/home/index.html.erb +1 -0
  170. data/test/rails_app/app/views/home/join.html.erb +1 -0
  171. data/test/rails_app/app/views/home/private.html.erb +1 -0
  172. data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
  173. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  174. data/test/rails_app/app/views/users/index.html.erb +1 -0
  175. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  176. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  177. data/test/rails_app/config.ru +4 -0
  178. data/test/rails_app/config/application.rb +41 -0
  179. data/test/rails_app/config/boot.rb +8 -0
  180. data/test/rails_app/config/database.yml +18 -0
  181. data/test/rails_app/config/environment.rb +5 -0
  182. data/test/rails_app/config/environments/development.rb +18 -0
  183. data/test/rails_app/config/environments/production.rb +33 -0
  184. data/test/rails_app/config/environments/test.rb +33 -0
  185. data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
  186. data/test/rails_app/config/initializers/devise.rb +178 -0
  187. data/test/rails_app/config/initializers/inflections.rb +2 -0
  188. data/test/rails_app/config/initializers/secret_token.rb +2 -0
  189. data/test/rails_app/config/routes.rb +100 -0
  190. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +74 -0
  191. data/test/rails_app/db/schema.rb +52 -0
  192. data/test/rails_app/lib/shared_admin.rb +14 -0
  193. data/test/rails_app/lib/shared_user.rb +26 -0
  194. data/test/rails_app/public/404.html +26 -0
  195. data/test/rails_app/public/422.html +26 -0
  196. data/test/rails_app/public/500.html +26 -0
  197. data/test/rails_app/public/favicon.ico +0 -0
  198. data/test/rails_app/script/rails +10 -0
  199. data/test/routes_test.rb +248 -0
  200. data/test/support/assertions.rb +40 -0
  201. data/test/support/helpers.rb +91 -0
  202. data/test/support/integration.rb +92 -0
  203. data/test/support/locale/en.yml +4 -0
  204. data/test/support/webrat/integrations/rails.rb +24 -0
  205. data/test/test_helper.rb +27 -0
  206. data/test/test_helpers_test.rb +151 -0
  207. metadata +421 -0
@@ -0,0 +1,298 @@
1
+ require 'test_helper'
2
+
3
+ class ConfirmationTest < ActionController::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 about how to confirm your account 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
+
32
+ resend_confirmation
33
+
34
+ assert_equal ['custom@example.com'], ActionMailer::Base.deliveries.first.from
35
+ end
36
+
37
+ test 'user with invalid confirmation token should not be able to confirm an account' do
38
+ visit_user_confirmation_with_token('invalid_confirmation')
39
+ assert_have_selector '#error_explanation'
40
+ assert_contain /Confirmation token(.*)invalid/
41
+ end
42
+
43
+ test 'user with valid confirmation token should be able to confirm an account' do
44
+ user = create_user(:confirm => false)
45
+ assert_not user.confirmed?
46
+ visit_user_confirmation_with_token(user.confirmation_token)
47
+
48
+ assert_contain 'Your account was successfully confirmed.'
49
+ assert_current_url '/'
50
+ assert user.reload.confirmed?
51
+ end
52
+
53
+ test 'user with valid confirmation token should not be able to confirm an account after the token has expired' do
54
+ swap Devise, :confirm_within => 3.days do
55
+ user = create_user(:confirm => false, :confirmation_sent_at => 4.days.ago)
56
+ assert_not user.confirmed?
57
+ visit_user_confirmation_with_token(user.confirmation_token)
58
+
59
+ assert_have_selector '#error_explanation'
60
+ assert_contain /needs to be confirmed within 3 days/
61
+ assert_not user.reload.confirmed?
62
+ end
63
+ end
64
+
65
+ test 'user with valid confirmation token should be able to confirm an account before the token has expired' do
66
+ swap Devise, :confirm_within => 3.days do
67
+ user = create_user(:confirm => false, :confirmation_sent_at => 2.days.ago)
68
+ assert_not user.confirmed?
69
+ visit_user_confirmation_with_token(user.confirmation_token)
70
+
71
+ assert_contain 'Your account was successfully confirmed.'
72
+ assert_current_url '/'
73
+ assert user.reload.confirmed?
74
+ end
75
+ end
76
+
77
+ test 'user should be redirected to a custom path after confirmation' do
78
+ Devise::ConfirmationsController.any_instance.stubs(:after_confirmation_path_for).returns("/?custom=1")
79
+
80
+ user = create_user(:confirm => false)
81
+ visit_user_confirmation_with_token(user.confirmation_token)
82
+
83
+ assert_current_url "/?custom=1"
84
+ end
85
+
86
+ test 'already confirmed user should not be able to confirm the account again' do
87
+ user = create_user(:confirm => false)
88
+ user.confirmed_at = Time.now
89
+ user.save
90
+ visit_user_confirmation_with_token(user.confirmation_token)
91
+
92
+ assert_have_selector '#error_explanation'
93
+ assert_contain 'already confirmed'
94
+ end
95
+
96
+ test 'already confirmed user should not be able to confirm the account again neither request confirmation' do
97
+ user = create_user(:confirm => false)
98
+ user.confirmed_at = Time.now
99
+ user.save
100
+
101
+ visit_user_confirmation_with_token(user.confirmation_token)
102
+ assert_contain 'already confirmed'
103
+
104
+ fill_in 'email', :with => user.email
105
+ click_button 'Resend confirmation instructions'
106
+ assert_contain 'already confirmed'
107
+ end
108
+
109
+ test 'sign in user automatically after confirming its email' do
110
+ user = create_user(:confirm => false)
111
+ visit_user_confirmation_with_token(user.confirmation_token)
112
+
113
+ assert warden.authenticated?(:user)
114
+ end
115
+
116
+ test 'increases sign count when signed in through confirmation' do
117
+ user = create_user(:confirm => false)
118
+ visit_user_confirmation_with_token(user.confirmation_token)
119
+
120
+ user.reload
121
+ assert_equal 1, user.sign_in_count
122
+ end
123
+
124
+ test 'not confirmed user with setup to block without confirmation should not be able to sign in' do
125
+ swap Devise, :allow_unconfirmed_access_for => 0.days do
126
+ sign_in_as_user(:confirm => false)
127
+
128
+ assert_contain 'You have to confirm your account before continuing'
129
+ assert_not warden.authenticated?(:user)
130
+ end
131
+ end
132
+
133
+ test 'not confirmed user should not see confirmation message if invalid credentials are given' do
134
+ swap Devise, :allow_unconfirmed_access_for => 0.days do
135
+ sign_in_as_user(:confirm => false) do
136
+ fill_in 'password', :with => 'invalid'
137
+ end
138
+
139
+ assert_contain 'Invalid email or password'
140
+ assert_not warden.authenticated?(:user)
141
+ end
142
+ end
143
+
144
+ test 'not confirmed user but configured with some days to confirm should be able to sign in' do
145
+ swap Devise, :allow_unconfirmed_access_for => 1.day do
146
+ sign_in_as_user(:confirm => false)
147
+
148
+ assert_response :success
149
+ assert warden.authenticated?(:user)
150
+ end
151
+ end
152
+
153
+ test 'error message is configurable by resource name' do
154
+ store_translations :en, :devise => {
155
+ :failure => { :user => { :unconfirmed => "Not confirmed user" } }
156
+ } do
157
+ sign_in_as_user(:confirm => false)
158
+ assert_contain 'Not confirmed user'
159
+ end
160
+ end
161
+
162
+ test 'resent confirmation token with valid E-Mail in XML format should return valid response' do
163
+ user = create_user(:confirm => false)
164
+ post user_confirmation_path(:format => 'xml'), :user => { :email => user.email }
165
+ assert_response :success
166
+ assert_equal response.body, {}.to_xml
167
+ end
168
+
169
+ test 'resent confirmation token with invalid E-Mail in XML format should return invalid response' do
170
+ user = create_user(:confirm => false)
171
+ post user_confirmation_path(:format => 'xml'), :user => { :email => 'invalid.test@test.com' }
172
+ assert_response :unprocessable_entity
173
+ assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
174
+ end
175
+
176
+ test 'confirm account with valid confirmation token in XML format should return valid response' do
177
+ user = create_user(:confirm => false)
178
+ get user_confirmation_path(:confirmation_token => user.confirmation_token, :format => 'xml')
179
+ assert_response :success
180
+ assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
181
+ end
182
+
183
+ test 'confirm account with invalid confirmation token in XML format should return invalid response' do
184
+ user = create_user(:confirm => false)
185
+ get user_confirmation_path(:confirmation_token => 'invalid_confirmation', :format => 'xml')
186
+ assert_response :unprocessable_entity
187
+ assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
188
+ end
189
+
190
+ test 'request an account confirmation account with JSON, should return an empty JSON' do
191
+ user = create_user(:confirm => false)
192
+
193
+ post user_confirmation_path, :user => { :email => user.email }, :format => :json
194
+ assert_response :success
195
+ assert_equal response.body, {}.to_json
196
+ end
197
+
198
+ test "when in paranoid mode and with a valid e-mail, should not say that the e-mail is valid" do
199
+ swap Devise, :paranoid => true do
200
+ user = create_user(:confirm => false)
201
+ visit new_user_session_path
202
+
203
+ click_link "Didn't receive confirmation instructions?"
204
+ fill_in 'email', :with => user.email
205
+ click_button 'Resend confirmation instructions'
206
+
207
+ assert_contain "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes."
208
+ assert_current_url "/users/sign_in"
209
+ end
210
+ end
211
+
212
+ test "when in paranoid mode and with a invalid e-mail, should not say that the e-mail is invalid" do
213
+ swap Devise, :paranoid => true do
214
+ visit new_user_session_path
215
+
216
+ click_link "Didn't receive confirmation instructions?"
217
+ fill_in 'email', :with => "idonthavethisemail@gmail.com"
218
+ click_button 'Resend confirmation instructions'
219
+
220
+ assert_not_contain "1 error prohibited this user from being saved:"
221
+ assert_not_contain "Email not found"
222
+
223
+ assert_contain "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes."
224
+ assert_current_url "/users/sign_in"
225
+ end
226
+ end
227
+ end
228
+
229
+ class ConfirmationOnChangeTest < ActionController::IntegrationTest
230
+ def create_second_admin(options={})
231
+ @admin = nil
232
+ create_admin(options)
233
+ end
234
+
235
+ def visit_admin_confirmation_with_token(confirmation_token)
236
+ visit admin_confirmation_path(:confirmation_token => confirmation_token)
237
+ end
238
+
239
+ test 'admin should be able to request a new confirmation after email changed' do
240
+ admin = create_admin
241
+ admin.update_attributes(:email => 'new_test@example.com')
242
+
243
+ visit new_admin_session_path
244
+ click_link "Didn't receive confirmation instructions?"
245
+
246
+ fill_in 'email', :with => admin.unconfirmed_email
247
+ assert_difference "ActionMailer::Base.deliveries.size" do
248
+ click_button 'Resend confirmation instructions'
249
+ end
250
+
251
+ assert_current_url '/admin_area/sign_in'
252
+ assert_contain 'You will receive an email with instructions about how to confirm your account in a few minutes'
253
+ end
254
+
255
+ test 'admin with valid confirmation token should be able to confirm email after email changed' do
256
+ admin = create_admin
257
+ admin.update_attributes(:email => 'new_test@example.com')
258
+ assert_equal 'new_test@example.com', admin.unconfirmed_email
259
+ visit_admin_confirmation_with_token(admin.confirmation_token)
260
+
261
+ assert_contain 'Your account was successfully confirmed.'
262
+ assert_current_url '/admin_area/home'
263
+ assert admin.reload.confirmed?
264
+ assert_not admin.reload.pending_reconfirmation?
265
+ end
266
+
267
+ test 'admin with previously valid confirmation token should not be able to confirm email after email changed again' do
268
+ admin = create_admin
269
+ admin.update_attributes(:email => 'first_test@example.com')
270
+ assert_equal 'first_test@example.com', admin.unconfirmed_email
271
+ confirmation_token = admin.confirmation_token
272
+ admin.update_attributes(:email => 'second_test@example.com')
273
+ assert_equal 'second_test@example.com', admin.unconfirmed_email
274
+
275
+ visit_admin_confirmation_with_token(confirmation_token)
276
+ assert_have_selector '#error_explanation'
277
+ assert_contain /Confirmation token(.*)invalid/
278
+
279
+ visit_admin_confirmation_with_token(admin.confirmation_token)
280
+ assert_contain 'Your account was successfully confirmed.'
281
+ assert_current_url '/admin_area/home'
282
+ assert admin.reload.confirmed?
283
+ assert_not admin.reload.pending_reconfirmation?
284
+ end
285
+
286
+ test 'admin email should be unique also within unconfirmed_email' do
287
+ admin = create_admin
288
+ admin.update_attributes(:email => 'new_admin_test@example.com')
289
+ assert_equal 'new_admin_test@example.com', admin.unconfirmed_email
290
+
291
+ create_second_admin(:email => "new_admin_test@example.com")
292
+
293
+ visit_admin_confirmation_with_token(admin.confirmation_token)
294
+ assert_have_selector '#error_explanation'
295
+ assert_contain /Email.*already.*taken/
296
+ assert admin.reload.pending_reconfirmation?
297
+ end
298
+ end
@@ -0,0 +1,82 @@
1
+ require 'test_helper'
2
+
3
+ class DatabaseAuthenticationTest < ActionController::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
+ sign_in_as_admin do
57
+ fill_in 'email', :with => 'wrongemail@test.com'
58
+ end
59
+
60
+ assert_contain 'Invalid email or password'
61
+ assert_not warden.authenticated?(:admin)
62
+ end
63
+
64
+ test 'sign in with invalid pasword should return to sign in form with error message' do
65
+ sign_in_as_admin do
66
+ fill_in 'password', :with => 'abcdef'
67
+ end
68
+
69
+ assert_contain 'Invalid email or password'
70
+ assert_not warden.authenticated?(:admin)
71
+ end
72
+
73
+ test 'error message is configurable by resource name' do
74
+ store_translations :en, :devise => { :failure => { :admin => { :invalid => "Invalid credentials" } } } do
75
+ sign_in_as_admin do
76
+ fill_in 'password', :with => 'abcdef'
77
+ end
78
+
79
+ assert_contain 'Invalid credentials'
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,97 @@
1
+ require 'test_helper'
2
+
3
+ class HttpAuthenticationTest < ActionController::IntegrationTest
4
+ test 'handles unverified requests gets rid of caches but continues signed in' do
5
+ swap UsersController, :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 'test request with oauth2 header doesnt get mistaken for basic authentication' do
66
+ swap Devise, :http_authenticatable => true do
67
+ add_oauth2_header
68
+ assert_equal 401, status
69
+ assert_equal 'Basic realm="Application"', headers["WWW-Authenticate"]
70
+ end
71
+ end
72
+
73
+ test 'sign in should authenticate with really long token' do
74
+ token = "token_containing_so_many_characters_that_the_base64_encoding_will_wrap"
75
+ user = create_user
76
+ user.update_attribute :authentication_token, token
77
+ get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => "Basic #{Base64.encode64("#{token}:x")}"
78
+ assert_response :success
79
+ assert_match "<email>user@test.com</email>", response.body
80
+ assert warden.authenticated?(:user)
81
+ end
82
+
83
+ private
84
+
85
+ def sign_in_as_new_user_with_http(username="user@test.com", password="12345678")
86
+ user = create_user
87
+ get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => "Basic #{Base64.encode64("#{username}:#{password}")}"
88
+ user
89
+ end
90
+
91
+ # Sign in with oauth2 token. This is just to test that it isn't misinterpreted as basic authentication
92
+ def add_oauth2_header
93
+ user = create_user
94
+ get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => "OAuth #{Base64.encode64("#{user.email}:12345678")}"
95
+ end
96
+
97
+ end