cloudfoundry-devise 1.5.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.
- data/.gitignore +12 -0
- data/.travis.yml +13 -0
- data/CHANGELOG.rdoc +755 -0
- data/Gemfile +35 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +366 -0
- data/Rakefile +34 -0
- data/app/controllers/devise/confirmations_controller.rb +46 -0
- data/app/controllers/devise/omniauth_callbacks_controller.rb +26 -0
- data/app/controllers/devise/passwords_controller.rb +50 -0
- data/app/controllers/devise/registrations_controller.rb +114 -0
- data/app/controllers/devise/sessions_controller.rb +49 -0
- data/app/controllers/devise/unlocks_controller.rb +34 -0
- data/app/helpers/devise_helper.rb +25 -0
- data/app/mailers/devise/mailer.rb +15 -0
- data/app/views/devise/confirmations/new.html.erb +12 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +16 -0
- data/app/views/devise/passwords/new.html.erb +12 -0
- data/app/views/devise/registrations/edit.html.erb +25 -0
- data/app/views/devise/registrations/new.html.erb +18 -0
- data/app/views/devise/sessions/new.html.erb +17 -0
- data/app/views/devise/shared/_links.erb +25 -0
- data/app/views/devise/unlocks/new.html.erb +12 -0
- data/cloudfoundry-devise.gemspec +25 -0
- data/config/locales/en.yml +59 -0
- data/lib/devise.rb +453 -0
- data/lib/devise/controllers/helpers.rb +260 -0
- data/lib/devise/controllers/internal_helpers.rb +161 -0
- data/lib/devise/controllers/rememberable.rb +52 -0
- data/lib/devise/controllers/scoped_views.rb +33 -0
- data/lib/devise/controllers/shared_helpers.rb +26 -0
- data/lib/devise/controllers/url_helpers.rb +53 -0
- data/lib/devise/delegator.rb +16 -0
- data/lib/devise/encryptors/authlogic_sha512.rb +19 -0
- data/lib/devise/encryptors/base.rb +20 -0
- data/lib/devise/encryptors/clearance_sha1.rb +17 -0
- data/lib/devise/encryptors/restful_authentication_sha1.rb +22 -0
- data/lib/devise/encryptors/sha1.rb +25 -0
- data/lib/devise/encryptors/sha512.rb +25 -0
- data/lib/devise/failure_app.rb +149 -0
- data/lib/devise/hooks/activatable.rb +11 -0
- data/lib/devise/hooks/forgetable.rb +9 -0
- data/lib/devise/hooks/rememberable.rb +6 -0
- data/lib/devise/hooks/timeoutable.rb +24 -0
- data/lib/devise/hooks/trackable.rb +9 -0
- data/lib/devise/mailers/helpers.rb +86 -0
- data/lib/devise/mapping.rb +175 -0
- data/lib/devise/models.rb +91 -0
- data/lib/devise/models/authenticatable.rb +181 -0
- data/lib/devise/models/confirmable.rb +220 -0
- data/lib/devise/models/database_authenticatable.rb +122 -0
- data/lib/devise/models/encryptable.rb +72 -0
- data/lib/devise/models/lockable.rb +169 -0
- data/lib/devise/models/omniauthable.rb +23 -0
- data/lib/devise/models/recoverable.rb +136 -0
- data/lib/devise/models/registerable.rb +21 -0
- data/lib/devise/models/rememberable.rb +114 -0
- data/lib/devise/models/serializable.rb +43 -0
- data/lib/devise/models/timeoutable.rb +45 -0
- data/lib/devise/models/token_authenticatable.rb +72 -0
- data/lib/devise/models/trackable.rb +30 -0
- data/lib/devise/models/validatable.rb +62 -0
- data/lib/devise/modules.rb +30 -0
- data/lib/devise/omniauth.rb +28 -0
- data/lib/devise/omniauth/config.rb +45 -0
- data/lib/devise/omniauth/url_helpers.rb +33 -0
- data/lib/devise/orm/active_record.rb +44 -0
- data/lib/devise/orm/mongoid.rb +31 -0
- data/lib/devise/param_filter.rb +41 -0
- data/lib/devise/path_checker.rb +18 -0
- data/lib/devise/rails.rb +73 -0
- data/lib/devise/rails/routes.rb +385 -0
- data/lib/devise/rails/warden_compat.rb +120 -0
- data/lib/devise/schema.rb +109 -0
- data/lib/devise/strategies/authenticatable.rb +155 -0
- data/lib/devise/strategies/base.rb +15 -0
- data/lib/devise/strategies/database_authenticatable.rb +21 -0
- data/lib/devise/strategies/rememberable.rb +53 -0
- data/lib/devise/strategies/token_authenticatable.rb +57 -0
- data/lib/devise/test_helpers.rb +90 -0
- data/lib/devise/version.rb +3 -0
- data/lib/generators/active_record/devise_generator.rb +71 -0
- data/lib/generators/active_record/templates/migration.rb +29 -0
- data/lib/generators/active_record/templates/migration_existing.rb +26 -0
- data/lib/generators/devise/devise_generator.rb +22 -0
- data/lib/generators/devise/install_generator.rb +24 -0
- data/lib/generators/devise/orm_helpers.rb +31 -0
- data/lib/generators/devise/views_generator.rb +98 -0
- data/lib/generators/mongoid/devise_generator.rb +60 -0
- data/lib/generators/templates/README +32 -0
- data/lib/generators/templates/devise.rb +215 -0
- data/lib/generators/templates/markerb/confirmation_instructions.markerb +5 -0
- data/lib/generators/templates/markerb/reset_password_instructions.markerb +8 -0
- data/lib/generators/templates/markerb/unlock_instructions.markerb +7 -0
- data/lib/generators/templates/simple_form_for/confirmations/new.html.erb +15 -0
- data/lib/generators/templates/simple_form_for/passwords/edit.html.erb +19 -0
- data/lib/generators/templates/simple_form_for/passwords/new.html.erb +15 -0
- data/lib/generators/templates/simple_form_for/registrations/edit.html.erb +22 -0
- data/lib/generators/templates/simple_form_for/registrations/new.html.erb +17 -0
- data/lib/generators/templates/simple_form_for/sessions/new.html.erb +15 -0
- data/lib/generators/templates/simple_form_for/unlocks/new.html.erb +15 -0
- data/test/controllers/helpers_test.rb +254 -0
- data/test/controllers/internal_helpers_test.rb +96 -0
- data/test/controllers/sessions_controller_test.rb +16 -0
- data/test/controllers/url_helpers_test.rb +59 -0
- data/test/delegator_test.rb +19 -0
- data/test/devise_test.rb +72 -0
- data/test/encryptors_test.rb +30 -0
- data/test/failure_app_test.rb +207 -0
- data/test/generators/active_record_generator_test.rb +47 -0
- data/test/generators/devise_generator_test.rb +39 -0
- data/test/generators/install_generator_test.rb +13 -0
- data/test/generators/mongoid_generator_test.rb +23 -0
- data/test/generators/views_generator_test.rb +52 -0
- data/test/helpers/devise_helper_test.rb +51 -0
- data/test/indifferent_hash.rb +33 -0
- data/test/integration/authenticatable_test.rb +590 -0
- data/test/integration/confirmable_test.rb +262 -0
- data/test/integration/database_authenticatable_test.rb +82 -0
- data/test/integration/http_authenticatable_test.rb +82 -0
- data/test/integration/lockable_test.rb +212 -0
- data/test/integration/omniauthable_test.rb +133 -0
- data/test/integration/recoverable_test.rb +287 -0
- data/test/integration/registerable_test.rb +335 -0
- data/test/integration/rememberable_test.rb +158 -0
- data/test/integration/timeoutable_test.rb +98 -0
- data/test/integration/token_authenticatable_test.rb +148 -0
- data/test/integration/trackable_test.rb +92 -0
- data/test/mailers/confirmation_instructions_test.rb +95 -0
- data/test/mailers/reset_password_instructions_test.rb +83 -0
- data/test/mailers/unlock_instructions_test.rb +77 -0
- data/test/mapping_test.rb +128 -0
- data/test/models/confirmable_test.rb +334 -0
- data/test/models/database_authenticatable_test.rb +167 -0
- data/test/models/encryptable_test.rb +67 -0
- data/test/models/lockable_test.rb +225 -0
- data/test/models/recoverable_test.rb +198 -0
- data/test/models/rememberable_test.rb +168 -0
- data/test/models/serializable_test.rb +38 -0
- data/test/models/timeoutable_test.rb +42 -0
- data/test/models/token_authenticatable_test.rb +49 -0
- data/test/models/trackable_test.rb +5 -0
- data/test/models/validatable_test.rb +113 -0
- data/test/models_test.rb +109 -0
- data/test/omniauth/config_test.rb +57 -0
- data/test/omniauth/url_helpers_test.rb +58 -0
- data/test/orm/active_record.rb +9 -0
- data/test/orm/mongoid.rb +14 -0
- data/test/rails_app/Rakefile +10 -0
- data/test/rails_app/app/active_record/admin.rb +6 -0
- data/test/rails_app/app/active_record/shim.rb +2 -0
- data/test/rails_app/app/active_record/user.rb +6 -0
- data/test/rails_app/app/controllers/admins/sessions_controller.rb +6 -0
- data/test/rails_app/app/controllers/admins_controller.rb +6 -0
- data/test/rails_app/app/controllers/application_controller.rb +8 -0
- data/test/rails_app/app/controllers/home_controller.rb +25 -0
- data/test/rails_app/app/controllers/publisher/registrations_controller.rb +2 -0
- data/test/rails_app/app/controllers/publisher/sessions_controller.rb +2 -0
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
- data/test/rails_app/app/controllers/users_controller.rb +23 -0
- data/test/rails_app/app/helpers/application_helper.rb +3 -0
- data/test/rails_app/app/mailers/users/mailer.rb +3 -0
- data/test/rails_app/app/mongoid/admin.rb +24 -0
- data/test/rails_app/app/mongoid/shim.rb +24 -0
- data/test/rails_app/app/mongoid/user.rb +45 -0
- data/test/rails_app/app/views/admins/index.html.erb +1 -0
- data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
- data/test/rails_app/app/views/home/admin_dashboard.html.erb +1 -0
- data/test/rails_app/app/views/home/index.html.erb +1 -0
- data/test/rails_app/app/views/home/join.html.erb +1 -0
- data/test/rails_app/app/views/home/private.html.erb +1 -0
- data/test/rails_app/app/views/home/user_dashboard.html.erb +1 -0
- data/test/rails_app/app/views/layouts/application.html.erb +24 -0
- data/test/rails_app/app/views/users/index.html.erb +1 -0
- data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
- data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
- data/test/rails_app/config.ru +4 -0
- data/test/rails_app/config/application.rb +41 -0
- data/test/rails_app/config/boot.rb +8 -0
- data/test/rails_app/config/database.yml +18 -0
- data/test/rails_app/config/environment.rb +5 -0
- data/test/rails_app/config/environments/development.rb +18 -0
- data/test/rails_app/config/environments/production.rb +33 -0
- data/test/rails_app/config/environments/test.rb +33 -0
- data/test/rails_app/config/initializers/backtrace_silencers.rb +7 -0
- data/test/rails_app/config/initializers/devise.rb +197 -0
- data/test/rails_app/config/initializers/inflections.rb +2 -0
- data/test/rails_app/config/initializers/secret_token.rb +2 -0
- data/test/rails_app/config/routes.rb +87 -0
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +71 -0
- data/test/rails_app/db/schema.rb +52 -0
- data/test/rails_app/lib/shared_admin.rb +10 -0
- data/test/rails_app/lib/shared_user.rb +26 -0
- data/test/rails_app/public/404.html +26 -0
- data/test/rails_app/public/422.html +26 -0
- data/test/rails_app/public/500.html +26 -0
- data/test/rails_app/public/favicon.ico +0 -0
- data/test/rails_app/script/rails +10 -0
- data/test/routes_test.rb +240 -0
- data/test/support/assertions.rb +27 -0
- data/test/support/helpers.rb +109 -0
- data/test/support/integration.rb +88 -0
- data/test/support/locale/en.yml +4 -0
- data/test/support/webrat/integrations/rails.rb +24 -0
- data/test/test_helper.rb +27 -0
- data/test/test_helpers_test.rb +134 -0
- metadata +295 -0
|
@@ -0,0 +1,262 @@
|
|
|
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 should be redirected to a custom path after confirmation' do
|
|
54
|
+
Devise::ConfirmationsController.any_instance.stubs(:after_confirmation_path_for).returns("/?custom=1")
|
|
55
|
+
|
|
56
|
+
user = create_user(:confirm => false)
|
|
57
|
+
visit_user_confirmation_with_token(user.confirmation_token)
|
|
58
|
+
|
|
59
|
+
assert_current_url "/?custom=1"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
test 'already confirmed user should not be able to confirm the account again' do
|
|
63
|
+
user = create_user(:confirm => false)
|
|
64
|
+
user.confirmed_at = Time.now
|
|
65
|
+
user.save
|
|
66
|
+
visit_user_confirmation_with_token(user.confirmation_token)
|
|
67
|
+
|
|
68
|
+
assert_have_selector '#error_explanation'
|
|
69
|
+
assert_contain 'already confirmed'
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
test 'already confirmed user should not be able to confirm the account again neither request confirmation' do
|
|
73
|
+
user = create_user(:confirm => false)
|
|
74
|
+
user.confirmed_at = Time.now
|
|
75
|
+
user.save
|
|
76
|
+
|
|
77
|
+
visit_user_confirmation_with_token(user.confirmation_token)
|
|
78
|
+
assert_contain 'already confirmed'
|
|
79
|
+
|
|
80
|
+
fill_in 'email', :with => user.email
|
|
81
|
+
click_button 'Resend confirmation instructions'
|
|
82
|
+
assert_contain 'already confirmed'
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
test 'sign in user automatically after confirming its email' do
|
|
86
|
+
user = create_user(:confirm => false)
|
|
87
|
+
visit_user_confirmation_with_token(user.confirmation_token)
|
|
88
|
+
|
|
89
|
+
assert warden.authenticated?(:user)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
test 'increases sign count when signed in through confirmation' do
|
|
93
|
+
user = create_user(:confirm => false)
|
|
94
|
+
visit_user_confirmation_with_token(user.confirmation_token)
|
|
95
|
+
|
|
96
|
+
user.reload
|
|
97
|
+
assert_equal 1, user.sign_in_count
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
test 'not confirmed user with setup to block without confirmation should not be able to sign in' do
|
|
101
|
+
swap Devise, :confirm_within => 0.days do
|
|
102
|
+
sign_in_as_user(:confirm => false)
|
|
103
|
+
|
|
104
|
+
assert_contain 'You have to confirm your account before continuing'
|
|
105
|
+
assert_not warden.authenticated?(:user)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
test 'not confirmed user should not see confirmation message if invalid credentials are given' do
|
|
110
|
+
swap Devise, :confirm_within => 0.days do
|
|
111
|
+
sign_in_as_user(:confirm => false) do
|
|
112
|
+
fill_in 'password', :with => 'invalid'
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
assert_contain 'Invalid email or password'
|
|
116
|
+
assert_not warden.authenticated?(:user)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
test 'not confirmed user but configured with some days to confirm should be able to sign in' do
|
|
121
|
+
swap Devise, :confirm_within => 1.day do
|
|
122
|
+
sign_in_as_user(:confirm => false)
|
|
123
|
+
|
|
124
|
+
assert_response :success
|
|
125
|
+
assert warden.authenticated?(:user)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
test 'error message is configurable by resource name' do
|
|
130
|
+
store_translations :en, :devise => {
|
|
131
|
+
:failure => { :user => { :unconfirmed => "Not confirmed user" } }
|
|
132
|
+
} do
|
|
133
|
+
sign_in_as_user(:confirm => false)
|
|
134
|
+
assert_contain 'Not confirmed user'
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
test 'resent confirmation token with valid E-Mail in XML format should return valid response' do
|
|
139
|
+
user = create_user(:confirm => false)
|
|
140
|
+
post user_confirmation_path(:format => 'xml'), :user => { :email => user.email }
|
|
141
|
+
assert_response :success
|
|
142
|
+
assert_equal response.body, {}.to_xml
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
test 'resent confirmation token with invalid E-Mail in XML format should return invalid response' do
|
|
146
|
+
user = create_user(:confirm => false)
|
|
147
|
+
post user_confirmation_path(:format => 'xml'), :user => { :email => 'invalid.test@test.com' }
|
|
148
|
+
assert_response :unprocessable_entity
|
|
149
|
+
assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
test 'confirm account with valid confirmation token in XML format should return valid response' do
|
|
153
|
+
user = create_user(:confirm => false)
|
|
154
|
+
get user_confirmation_path(:confirmation_token => user.confirmation_token, :format => 'xml')
|
|
155
|
+
assert_response :success
|
|
156
|
+
assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
test 'confirm account with invalid confirmation token in XML format should return invalid response' do
|
|
160
|
+
user = create_user(:confirm => false)
|
|
161
|
+
get user_confirmation_path(:confirmation_token => 'invalid_confirmation', :format => 'xml')
|
|
162
|
+
assert_response :unprocessable_entity
|
|
163
|
+
assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
test 'request an account confirmation account with JSON, should return an empty JSON' do
|
|
167
|
+
user = create_user(:confirm => false)
|
|
168
|
+
|
|
169
|
+
post user_confirmation_path, :user => { :email => user.email }, :format => :json
|
|
170
|
+
assert_response :success
|
|
171
|
+
assert_equal response.body, {}.to_json
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
test "when in paranoid mode and with a valid e-mail, should not say that the e-mail is valid" do
|
|
175
|
+
swap Devise, :paranoid => true do
|
|
176
|
+
user = create_user(:confirm => false)
|
|
177
|
+
visit new_user_session_path
|
|
178
|
+
|
|
179
|
+
click_link "Didn't receive confirmation instructions?"
|
|
180
|
+
fill_in 'email', :with => user.email
|
|
181
|
+
click_button 'Resend confirmation instructions'
|
|
182
|
+
|
|
183
|
+
assert_contain "If your e-mail exists on our database, you will receive an email with instructions about how to confirm your account in a few minutes."
|
|
184
|
+
assert_current_url "/users/sign_in"
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
test "when in paranoid mode and with a invalid e-mail, should not say that the e-mail is invalid" do
|
|
189
|
+
swap Devise, :paranoid => true do
|
|
190
|
+
visit new_user_session_path
|
|
191
|
+
|
|
192
|
+
click_link "Didn't receive confirmation instructions?"
|
|
193
|
+
fill_in 'email', :with => "idonthavethisemail@gmail.com"
|
|
194
|
+
click_button 'Resend confirmation instructions'
|
|
195
|
+
|
|
196
|
+
assert_not_contain "1 error prohibited this user from being saved:"
|
|
197
|
+
assert_not_contain "Email not found"
|
|
198
|
+
|
|
199
|
+
assert_contain "If your e-mail exists on our database, you will receive an email with instructions about how to confirm your account in a few minutes."
|
|
200
|
+
assert_current_url "/users/sign_in"
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
class ConfirmationOnChangeTest < ConfirmationTest
|
|
206
|
+
|
|
207
|
+
def create_second_user(options={})
|
|
208
|
+
@user = nil
|
|
209
|
+
create_user(options)
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def setup
|
|
213
|
+
add_unconfirmed_email_column
|
|
214
|
+
Devise.reconfirmable = true
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
def teardown
|
|
218
|
+
remove_unconfirmed_email_column
|
|
219
|
+
Devise.reconfirmable = false
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
test 'user should be able to request a new confirmation after email changed' do
|
|
223
|
+
user = create_user(:confirm => true)
|
|
224
|
+
user.update_attributes(:email => 'new_test@example.com')
|
|
225
|
+
|
|
226
|
+
visit new_user_session_path
|
|
227
|
+
click_link "Didn't receive confirmation instructions?"
|
|
228
|
+
|
|
229
|
+
fill_in 'email', :with => user.unconfirmed_email
|
|
230
|
+
assert_difference "ActionMailer::Base.deliveries.size" do
|
|
231
|
+
click_button 'Resend confirmation instructions'
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
assert_current_url '/users/sign_in'
|
|
235
|
+
assert_contain 'You will receive an email with instructions about how to confirm your account in a few minutes'
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
test 'user with valid confirmation token should be able to confirm email after email changed' do
|
|
239
|
+
user = create_user(:confirm => true)
|
|
240
|
+
user.update_attributes(:email => 'new_test@example.com')
|
|
241
|
+
assert 'new_test@example.com', user.unconfirmed_email
|
|
242
|
+
visit_user_confirmation_with_token(user.confirmation_token)
|
|
243
|
+
|
|
244
|
+
assert_contain 'Your account was successfully confirmed.'
|
|
245
|
+
assert_current_url '/'
|
|
246
|
+
assert user.reload.confirmed?
|
|
247
|
+
assert_not user.reload.pending_reconfirmation?
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
test 'user email should be unique also within unconfirmed_email' do
|
|
251
|
+
user = create_user(:confirm => true)
|
|
252
|
+
user.update_attributes(:email => 'new_test@example.com')
|
|
253
|
+
assert 'new_test@example.com', user.unconfirmed_email
|
|
254
|
+
|
|
255
|
+
create_second_user(:email => "new_test@example.com")
|
|
256
|
+
|
|
257
|
+
visit_user_confirmation_with_token(user.confirmation_token)
|
|
258
|
+
assert_have_selector '#error_explanation'
|
|
259
|
+
assert_contain /Email.*already.*taken/
|
|
260
|
+
assert user.reload.pending_reconfirmation?
|
|
261
|
+
end
|
|
262
|
+
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,82 @@
|
|
|
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 #{ActiveSupport::Base64.encode64("user@test.com:123456")}"
|
|
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 :success
|
|
16
|
+
assert_match '<email>user@test.com</email>', response.body
|
|
17
|
+
assert warden.authenticated?(:user)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test 'returns a custom response with www-authenticate header on failures' do
|
|
21
|
+
sign_in_as_new_user_with_http("unknown")
|
|
22
|
+
assert_equal 401, status
|
|
23
|
+
assert_equal 'Basic realm="Application"', headers["WWW-Authenticate"]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test 'uses the request format as response content type' do
|
|
27
|
+
sign_in_as_new_user_with_http("unknown")
|
|
28
|
+
assert_equal 401, status
|
|
29
|
+
assert_equal "application/xml; charset=utf-8", headers["Content-Type"]
|
|
30
|
+
assert_match "<error>Invalid email or password.</error>", response.body
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test 'returns a custom response with www-authenticate and chosen realm' do
|
|
34
|
+
swap Devise, :http_authentication_realm => "MyApp" do
|
|
35
|
+
sign_in_as_new_user_with_http("unknown")
|
|
36
|
+
assert_equal 401, status
|
|
37
|
+
assert_equal 'Basic realm="MyApp"', headers["WWW-Authenticate"]
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
test 'sign in should authenticate with http even with specific authentication keys' do
|
|
42
|
+
swap Devise, :authentication_keys => [:username] do
|
|
43
|
+
sign_in_as_new_user_with_http("usertest")
|
|
44
|
+
assert_response :success
|
|
45
|
+
assert_match '<email>user@test.com</email>', response.body
|
|
46
|
+
assert warden.authenticated?(:user)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
test 'test request with oauth2 header doesnt get mistaken for basic authentication' do
|
|
51
|
+
swap Devise, :http_authenticatable => true do
|
|
52
|
+
add_oauth2_header
|
|
53
|
+
assert_equal 401, status
|
|
54
|
+
assert_equal 'Basic realm="Application"', headers["WWW-Authenticate"]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
test 'sign in should authenticate with really long token' do
|
|
59
|
+
token = "token_containing_so_many_characters_that_the_base64_encoding_will_wrap"
|
|
60
|
+
user = create_user
|
|
61
|
+
user.update_attribute :authentication_token, token
|
|
62
|
+
get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => "Basic #{ActiveSupport::Base64.encode64("#{token}:x")}"
|
|
63
|
+
assert_response :success
|
|
64
|
+
assert_match "<email>user@test.com</email>", response.body
|
|
65
|
+
assert warden.authenticated?(:user)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def sign_in_as_new_user_with_http(username="user@test.com", password="123456")
|
|
71
|
+
user = create_user
|
|
72
|
+
get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => "Basic #{ActiveSupport::Base64.encode64("#{username}:#{password}")}"
|
|
73
|
+
user
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Sign in with oauth2 token. This is just to test that it isn't misinterpreted as basic authentication
|
|
77
|
+
def add_oauth2_header
|
|
78
|
+
user = create_user
|
|
79
|
+
get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => "OAuth #{ActiveSupport::Base64.encode64("#{user.email}:123456")}"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
end
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class LockTest < ActionController::IntegrationTest
|
|
4
|
+
|
|
5
|
+
def visit_user_unlock_with_token(unlock_token)
|
|
6
|
+
visit user_unlock_path(:unlock_token => unlock_token)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def send_unlock_request
|
|
10
|
+
user = create_user(:locked => true)
|
|
11
|
+
ActionMailer::Base.deliveries.clear
|
|
12
|
+
|
|
13
|
+
visit new_user_session_path
|
|
14
|
+
click_link "Didn't receive unlock instructions?"
|
|
15
|
+
|
|
16
|
+
fill_in 'email', :with => user.email
|
|
17
|
+
click_button 'Resend unlock instructions'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test 'user should be able to request a new unlock token' do
|
|
21
|
+
send_unlock_request
|
|
22
|
+
|
|
23
|
+
assert_template 'sessions/new'
|
|
24
|
+
assert_contain 'You will receive an email with instructions about how to unlock 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 the instructions from a custom mailer' do
|
|
30
|
+
User.any_instance.stubs(:devise_mailer).returns(Users::Mailer)
|
|
31
|
+
|
|
32
|
+
send_unlock_request
|
|
33
|
+
|
|
34
|
+
assert_equal ['custom@example.com'], ActionMailer::Base.deliveries.first.from
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test 'unlocked user should not be able to request a unlock token' do
|
|
38
|
+
user = create_user(:locked => false)
|
|
39
|
+
ActionMailer::Base.deliveries.clear
|
|
40
|
+
|
|
41
|
+
visit new_user_session_path
|
|
42
|
+
click_link "Didn't receive unlock instructions?"
|
|
43
|
+
|
|
44
|
+
fill_in 'email', :with => user.email
|
|
45
|
+
click_button 'Resend unlock instructions'
|
|
46
|
+
|
|
47
|
+
assert_template 'unlocks/new'
|
|
48
|
+
assert_contain 'not locked'
|
|
49
|
+
assert_equal 0, ActionMailer::Base.deliveries.size
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test 'unlocked pages should not be available if email strategy is disabled' do
|
|
53
|
+
visit "/admin_area/sign_in"
|
|
54
|
+
|
|
55
|
+
assert_raise Webrat::NotFoundError do
|
|
56
|
+
click_link "Didn't receive unlock instructions?"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
assert_raise NameError do
|
|
60
|
+
visit new_admin_unlock_path
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
assert_raise ActionController::RoutingError do
|
|
64
|
+
visit "/admin_area/unlock/new"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
test 'user with invalid unlock token should not be able to unlock an account' do
|
|
69
|
+
visit_user_unlock_with_token('invalid_token')
|
|
70
|
+
|
|
71
|
+
assert_response :success
|
|
72
|
+
assert_current_url '/users/unlock?unlock_token=invalid_token'
|
|
73
|
+
assert_have_selector '#error_explanation'
|
|
74
|
+
assert_contain /Unlock token(.*)invalid/
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
test "locked user should be able to unlock account" do
|
|
78
|
+
user = create_user(:locked => true)
|
|
79
|
+
assert user.access_locked?
|
|
80
|
+
|
|
81
|
+
visit_user_unlock_with_token(user.unlock_token)
|
|
82
|
+
|
|
83
|
+
assert_current_url '/'
|
|
84
|
+
assert_contain 'Your account was successfully unlocked.'
|
|
85
|
+
|
|
86
|
+
assert_not user.reload.access_locked?
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
test "sign in user automatically after unlocking its account" do
|
|
90
|
+
user = create_user(:locked => true)
|
|
91
|
+
visit_user_unlock_with_token(user.unlock_token)
|
|
92
|
+
assert warden.authenticated?(:user)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
test "user should not be able to sign in when locked" do
|
|
96
|
+
user = sign_in_as_user(:locked => true)
|
|
97
|
+
assert_template 'sessions/new'
|
|
98
|
+
assert_contain 'Your account is locked.'
|
|
99
|
+
assert_not warden.authenticated?(:user)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
test "user should not send a new e-mail if already locked" do
|
|
103
|
+
user = create_user(:locked => true)
|
|
104
|
+
user.failed_attempts = User.maximum_attempts + 1
|
|
105
|
+
user.save!
|
|
106
|
+
|
|
107
|
+
ActionMailer::Base.deliveries.clear
|
|
108
|
+
|
|
109
|
+
sign_in_as_user(:password => "invalid")
|
|
110
|
+
assert_contain 'Your account is locked.'
|
|
111
|
+
assert ActionMailer::Base.deliveries.empty?
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
test 'error message is configurable by resource name' do
|
|
115
|
+
store_translations :en, :devise => {
|
|
116
|
+
:failure => { :user => { :locked => "You are locked!" } }
|
|
117
|
+
} do
|
|
118
|
+
user = sign_in_as_user(:locked => true)
|
|
119
|
+
assert_contain 'You are locked!'
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
test 'user should be able to request a new unlock token via XML request' do
|
|
124
|
+
user = create_user(:locked => true)
|
|
125
|
+
ActionMailer::Base.deliveries.clear
|
|
126
|
+
|
|
127
|
+
post user_unlock_path(:format => 'xml'), :user => {:email => user.email}
|
|
128
|
+
assert_response :success
|
|
129
|
+
assert_equal response.body, {}.to_xml
|
|
130
|
+
assert_equal 1, ActionMailer::Base.deliveries.size
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
test 'unlocked user should not be able to request a unlock token via XML request' do
|
|
134
|
+
user = create_user(:locked => false)
|
|
135
|
+
ActionMailer::Base.deliveries.clear
|
|
136
|
+
|
|
137
|
+
post user_unlock_path(:format => 'xml'), :user => {:email => user.email}
|
|
138
|
+
assert_response :unprocessable_entity
|
|
139
|
+
assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
|
|
140
|
+
assert_equal 0, ActionMailer::Base.deliveries.size
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
test 'user with valid unlock token should be able to unlock account via XML request' do
|
|
144
|
+
user = create_user(:locked => true)
|
|
145
|
+
assert user.access_locked?
|
|
146
|
+
get user_unlock_path(:format => 'xml', :unlock_token => user.unlock_token)
|
|
147
|
+
assert_response :success
|
|
148
|
+
assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<user>)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
test 'user with invalid unlock token should not be able to unlock the account via XML request' do
|
|
153
|
+
get user_unlock_path(:format => 'xml', :unlock_token => 'invalid_token')
|
|
154
|
+
assert_response :unprocessable_entity
|
|
155
|
+
assert response.body.include? %(<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<errors>)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
test "when using json to ask a unlock request, should not return the user" do
|
|
159
|
+
user = create_user(:locked => true)
|
|
160
|
+
post user_unlock_path(:format => "json", :user => {:email => user.email})
|
|
161
|
+
assert_response :success
|
|
162
|
+
assert_equal response.body, {}.to_json
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
test "in paranoid mode, when trying to unlock an user that exists it should not say that it exists if it is locked" do
|
|
166
|
+
swap Devise, :paranoid => true do
|
|
167
|
+
user = create_user(:locked => true)
|
|
168
|
+
|
|
169
|
+
visit new_user_session_path
|
|
170
|
+
click_link "Didn't receive unlock instructions?"
|
|
171
|
+
|
|
172
|
+
fill_in 'email', :with => user.email
|
|
173
|
+
click_button 'Resend unlock instructions'
|
|
174
|
+
|
|
175
|
+
assert_current_url "/users/sign_in"
|
|
176
|
+
assert_contain "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes."
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
test "in paranoid mode, when trying to unlock an user that exists it should not say that it exists if it is not locked" do
|
|
181
|
+
swap Devise, :paranoid => true do
|
|
182
|
+
user = create_user(:locked => false)
|
|
183
|
+
|
|
184
|
+
visit new_user_session_path
|
|
185
|
+
click_link "Didn't receive unlock instructions?"
|
|
186
|
+
|
|
187
|
+
fill_in 'email', :with => user.email
|
|
188
|
+
click_button 'Resend unlock instructions'
|
|
189
|
+
|
|
190
|
+
assert_current_url "/users/sign_in"
|
|
191
|
+
assert_contain "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes."
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
test "in paranoid mode, when trying to unlock an user that does not exists it should not say that it does not exists" do
|
|
196
|
+
swap Devise, :paranoid => true do
|
|
197
|
+
visit new_user_session_path
|
|
198
|
+
click_link "Didn't receive unlock instructions?"
|
|
199
|
+
|
|
200
|
+
fill_in 'email', :with => "arandomemail@hotmail.com"
|
|
201
|
+
click_button 'Resend unlock instructions'
|
|
202
|
+
|
|
203
|
+
assert_not_contain "1 error prohibited this user from being saved:"
|
|
204
|
+
assert_not_contain "Email not found"
|
|
205
|
+
assert_current_url "/users/sign_in"
|
|
206
|
+
|
|
207
|
+
assert_contain "If your account exists, you will receive an email with instructions about how to unlock it in a few minutes."
|
|
208
|
+
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
end
|