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,158 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class RememberMeTest < ActionController::IntegrationTest
|
|
4
|
+
def create_user_and_remember(add_to_token='')
|
|
5
|
+
user = create_user
|
|
6
|
+
user.remember_me!
|
|
7
|
+
raw_cookie = User.serialize_into_cookie(user).tap { |a| a.last << add_to_token }
|
|
8
|
+
cookies['remember_user_token'] = generate_signed_cookie(raw_cookie)
|
|
9
|
+
user
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def generate_signed_cookie(raw_cookie)
|
|
13
|
+
request = ActionDispatch::TestRequest.new
|
|
14
|
+
request.cookie_jar.signed['raw_cookie'] = raw_cookie
|
|
15
|
+
request.cookie_jar['raw_cookie']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def signed_cookie(key)
|
|
19
|
+
controller.send(:cookies).signed[key]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def cookie_expires(key)
|
|
23
|
+
cookie = response.headers["Set-Cookie"].split("\n").grep(/^#{key}/).first
|
|
24
|
+
expires = cookie.split(";").map(&:strip).grep(/^expires=/).first
|
|
25
|
+
Time.parse(expires).utc
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test 'do not remember the user if he has not checked remember me option' do
|
|
29
|
+
user = sign_in_as_user
|
|
30
|
+
assert_nil request.cookies["remember_user_cookie"]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test 'handles unverified requests gets rid of caches' do
|
|
34
|
+
swap UsersController, :allow_forgery_protection => true do
|
|
35
|
+
post exhibit_user_url(1)
|
|
36
|
+
assert_not warden.authenticated?(:user)
|
|
37
|
+
|
|
38
|
+
create_user_and_remember
|
|
39
|
+
post exhibit_user_url(1)
|
|
40
|
+
assert_equal "User is not authenticated", response.body
|
|
41
|
+
assert_not warden.authenticated?(:user)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
test 'generate remember token after sign in' do
|
|
46
|
+
user = sign_in_as_user :remember_me => true
|
|
47
|
+
assert request.cookies["remember_user_token"]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
test 'generate remember token after sign in setting cookie options' do
|
|
51
|
+
# We test this by asserting the cookie is not sent after the redirect
|
|
52
|
+
# since we changed the domain. This is the only difference with the
|
|
53
|
+
# previous test.
|
|
54
|
+
swap Devise, :cookie_options => { :domain => "omg.somewhere.com" } do
|
|
55
|
+
user = sign_in_as_user :remember_me => true
|
|
56
|
+
assert_nil request.cookies["remember_user_token"]
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
test 'generate remember token after sign in setting session options' do
|
|
61
|
+
begin
|
|
62
|
+
Rails.configuration.session_options[:domain] = "omg.somewhere.com"
|
|
63
|
+
user = sign_in_as_user :remember_me => true
|
|
64
|
+
assert_nil request.cookies["remember_user_token"]
|
|
65
|
+
ensure
|
|
66
|
+
Rails.configuration.session_options.delete(:domain)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
test 'remember the user before sign in' do
|
|
71
|
+
user = create_user_and_remember
|
|
72
|
+
get users_path
|
|
73
|
+
assert_response :success
|
|
74
|
+
assert warden.authenticated?(:user)
|
|
75
|
+
assert warden.user(:user) == user
|
|
76
|
+
assert_match /remember_user_token[^\n]*HttpOnly/, response.headers["Set-Cookie"], "Expected Set-Cookie header in response to set HttpOnly flag on remember_user_token cookie."
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
test 'remember the user before sign up and redirect him to his home' do
|
|
80
|
+
user = create_user_and_remember
|
|
81
|
+
get new_user_registration_path
|
|
82
|
+
assert warden.authenticated?(:user)
|
|
83
|
+
assert_redirected_to root_path
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
test 'cookies are destroyed on unverified requests' do
|
|
87
|
+
swap ApplicationController, :allow_forgery_protection => true do
|
|
88
|
+
user = create_user_and_remember
|
|
89
|
+
get users_path
|
|
90
|
+
assert warden.authenticated?(:user)
|
|
91
|
+
post root_path, :authenticity_token => 'INVALID'
|
|
92
|
+
assert_not warden.authenticated?(:user)
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
test 'does not extend remember period through sign in' do
|
|
97
|
+
swap Devise, :extend_remember_period => true, :remember_for => 1.year do
|
|
98
|
+
user = create_user
|
|
99
|
+
user.remember_me!
|
|
100
|
+
|
|
101
|
+
user.remember_created_at = old = 10.days.ago
|
|
102
|
+
user.save
|
|
103
|
+
|
|
104
|
+
sign_in_as_user :remember_me => true
|
|
105
|
+
user.reload
|
|
106
|
+
|
|
107
|
+
assert warden.user(:user) == user
|
|
108
|
+
assert_equal old.to_i, user.remember_created_at.to_i
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
test 'do not remember other scopes' do
|
|
113
|
+
user = create_user_and_remember
|
|
114
|
+
get root_path
|
|
115
|
+
assert_response :success
|
|
116
|
+
assert warden.authenticated?(:user)
|
|
117
|
+
assert_not warden.authenticated?(:admin)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
test 'do not remember with invalid token' do
|
|
121
|
+
user = create_user_and_remember('add')
|
|
122
|
+
get users_path
|
|
123
|
+
assert_not warden.authenticated?(:user)
|
|
124
|
+
assert_redirected_to new_user_session_path
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
test 'do not remember with expired token' do
|
|
128
|
+
user = create_user_and_remember
|
|
129
|
+
swap Devise, :remember_for => 0 do
|
|
130
|
+
get users_path
|
|
131
|
+
assert_not warden.authenticated?(:user)
|
|
132
|
+
assert_redirected_to new_user_session_path
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
test 'do not remember the user anymore after forget' do
|
|
137
|
+
user = create_user_and_remember
|
|
138
|
+
get users_path
|
|
139
|
+
assert warden.authenticated?(:user)
|
|
140
|
+
|
|
141
|
+
get destroy_user_session_path
|
|
142
|
+
assert_not warden.authenticated?(:user)
|
|
143
|
+
assert_nil warden.cookies['remember_user_token']
|
|
144
|
+
|
|
145
|
+
get users_path
|
|
146
|
+
assert_not warden.authenticated?(:user)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
test 'changing user password expires remember me token' do
|
|
150
|
+
user = create_user_and_remember
|
|
151
|
+
user.password = "another_password"
|
|
152
|
+
user.password_confirmation = "another_password"
|
|
153
|
+
user.save!
|
|
154
|
+
|
|
155
|
+
get users_path
|
|
156
|
+
assert_not warden.authenticated?(:user)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class SessionTimeoutTest < ActionController::IntegrationTest
|
|
4
|
+
|
|
5
|
+
def last_request_at
|
|
6
|
+
@controller.user_session['last_request_at']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
test 'set last request at in user session after each request' do
|
|
10
|
+
sign_in_as_user
|
|
11
|
+
old_last_request = last_request_at
|
|
12
|
+
assert_not_nil last_request_at
|
|
13
|
+
|
|
14
|
+
get users_path
|
|
15
|
+
assert_not_nil last_request_at
|
|
16
|
+
assert_not_equal old_last_request, last_request_at
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test 'set last request at in user session after each request is skipped if tracking is disabled' do
|
|
20
|
+
sign_in_as_user
|
|
21
|
+
old_last_request = last_request_at
|
|
22
|
+
assert_not_nil last_request_at
|
|
23
|
+
|
|
24
|
+
get users_path, {}, 'devise.skip_trackable' => true
|
|
25
|
+
assert_equal old_last_request, last_request_at
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test 'not time out user session before default limit time' do
|
|
29
|
+
sign_in_as_user
|
|
30
|
+
assert_response :success
|
|
31
|
+
assert warden.authenticated?(:user)
|
|
32
|
+
|
|
33
|
+
get users_path
|
|
34
|
+
assert_response :success
|
|
35
|
+
assert warden.authenticated?(:user)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test 'time out user session after default limit time' do
|
|
39
|
+
user = sign_in_as_user
|
|
40
|
+
get expire_user_path(user)
|
|
41
|
+
assert_not_nil last_request_at
|
|
42
|
+
|
|
43
|
+
get users_path
|
|
44
|
+
assert_redirected_to new_user_session_path
|
|
45
|
+
assert_not warden.authenticated?(:user)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
test 'time out is not triggered on sign out' do
|
|
49
|
+
user = sign_in_as_user
|
|
50
|
+
get expire_user_path(user)
|
|
51
|
+
|
|
52
|
+
get destroy_user_session_path
|
|
53
|
+
assert_response :redirect
|
|
54
|
+
assert_redirected_to root_path
|
|
55
|
+
|
|
56
|
+
follow_redirect!
|
|
57
|
+
assert_contain 'Signed out successfully'
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
test 'user configured timeout limit' do
|
|
61
|
+
swap Devise, :timeout_in => 8.minutes do
|
|
62
|
+
user = sign_in_as_user
|
|
63
|
+
|
|
64
|
+
get users_path
|
|
65
|
+
assert_not_nil last_request_at
|
|
66
|
+
assert_response :success
|
|
67
|
+
assert warden.authenticated?(:user)
|
|
68
|
+
|
|
69
|
+
get expire_user_path(user)
|
|
70
|
+
get users_path
|
|
71
|
+
assert_redirected_to new_user_session_path
|
|
72
|
+
assert_not warden.authenticated?(:user)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
test 'error message with i18n' do
|
|
77
|
+
store_translations :en, :devise => {
|
|
78
|
+
:failure => { :user => { :timeout => 'Session expired!' } }
|
|
79
|
+
} do
|
|
80
|
+
user = sign_in_as_user
|
|
81
|
+
|
|
82
|
+
get expire_user_path(user)
|
|
83
|
+
get users_path
|
|
84
|
+
follow_redirect!
|
|
85
|
+
assert_contain 'Session expired!'
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
test 'time out not triggered if remembered' do
|
|
90
|
+
user = sign_in_as_user :remember_me => true
|
|
91
|
+
get expire_user_path(user)
|
|
92
|
+
assert_not_nil last_request_at
|
|
93
|
+
|
|
94
|
+
get users_path
|
|
95
|
+
assert_response :success
|
|
96
|
+
assert warden.authenticated?(:user)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class TokenAuthenticationTest < ActionController::IntegrationTest
|
|
4
|
+
|
|
5
|
+
test 'authenticate with valid authentication token key and value through params' do
|
|
6
|
+
swap Devise, :token_authentication_key => :secret_token do
|
|
7
|
+
sign_in_as_new_user_with_token
|
|
8
|
+
|
|
9
|
+
assert_response :success
|
|
10
|
+
assert_current_url "/users?secret_token=#{VALID_AUTHENTICATION_TOKEN}"
|
|
11
|
+
assert_contain 'Welcome'
|
|
12
|
+
assert warden.authenticated?(:user)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
test 'authenticate with valid authentication token key and value through params, when params with the same key as scope exist' do
|
|
17
|
+
swap Devise, :token_authentication_key => :secret_token do
|
|
18
|
+
user = create_user_with_authentication_token
|
|
19
|
+
post exhibit_user_path(user), Devise.token_authentication_key => user.authentication_token, :user => { :some => "data" }
|
|
20
|
+
|
|
21
|
+
assert_response :success
|
|
22
|
+
assert_contain 'User is authenticated'
|
|
23
|
+
assert warden.authenticated?(:user)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
test 'authenticate with valid authentication token key but does not store if stateless' do
|
|
28
|
+
swap Devise, :token_authentication_key => :secret_token, :stateless_token => true do
|
|
29
|
+
sign_in_as_new_user_with_token
|
|
30
|
+
assert warden.authenticated?(:user)
|
|
31
|
+
|
|
32
|
+
get users_path
|
|
33
|
+
assert_redirected_to new_user_session_path
|
|
34
|
+
assert_not warden.authenticated?(:user)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test 'authenticate with valid authentication token key and value through http' do
|
|
39
|
+
swap Devise, :token_authentication_key => :secret_token do
|
|
40
|
+
sign_in_as_new_user_with_token(:http_auth => true)
|
|
41
|
+
|
|
42
|
+
assert_response :success
|
|
43
|
+
assert_match '<email>user@test.com</email>', response.body
|
|
44
|
+
assert warden.authenticated?(:user)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
test 'does authenticate with valid authentication token key and value through params if not configured' do
|
|
49
|
+
swap Devise, :token_authentication_key => :secret_token, :params_authenticatable => [:database] do
|
|
50
|
+
sign_in_as_new_user_with_token
|
|
51
|
+
|
|
52
|
+
assert_contain 'You need to sign in or sign up before continuing'
|
|
53
|
+
assert_contain 'Sign in'
|
|
54
|
+
assert_not warden.authenticated?(:user)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
test 'does authenticate with valid authentication token key and value through http if not configured' do
|
|
59
|
+
swap Devise, :token_authentication_key => :secret_token, :http_authenticatable => [:database] do
|
|
60
|
+
sign_in_as_new_user_with_token(:http_auth => true)
|
|
61
|
+
|
|
62
|
+
assert_response 401
|
|
63
|
+
assert_contain 'Invalid email or password.'
|
|
64
|
+
assert_not warden.authenticated?(:user)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
test 'does not authenticate with improper authentication token key' do
|
|
69
|
+
swap Devise, :token_authentication_key => :donald_duck_token do
|
|
70
|
+
sign_in_as_new_user_with_token(:auth_token_key => :secret_token)
|
|
71
|
+
assert_equal new_user_session_path, @request.path
|
|
72
|
+
|
|
73
|
+
assert_contain 'You need to sign in or sign up before continuing'
|
|
74
|
+
assert_contain 'Sign in'
|
|
75
|
+
assert_not warden.authenticated?(:user)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
test 'does not authenticate with improper authentication token value' do
|
|
80
|
+
store_translations :en, :devise => {:failure => {:invalid_token => 'LOL, that was not a single character correct.'}} do
|
|
81
|
+
sign_in_as_new_user_with_token(:auth_token => '*** INVALID TOKEN ***')
|
|
82
|
+
assert_equal new_user_session_path, @request.path
|
|
83
|
+
|
|
84
|
+
assert_contain 'LOL, that was not a single character correct.'
|
|
85
|
+
assert_contain 'Sign in'
|
|
86
|
+
assert_not warden.authenticated?(:user)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
test 'authenticate with valid authentication token key and do not store if stateless and timeoutable are enabled' do
|
|
91
|
+
swap Devise, :token_authentication_key => :secret_token, :stateless_token => true, :timeout_in => (0.1).second do
|
|
92
|
+
user = sign_in_as_new_user_with_token
|
|
93
|
+
assert warden.authenticated?(:user)
|
|
94
|
+
|
|
95
|
+
# Expiring does not work because we are setting the session value when accessing it
|
|
96
|
+
sleep 0.3
|
|
97
|
+
|
|
98
|
+
get_users_path_as_existing_user(user)
|
|
99
|
+
assert warden.authenticated?(:user)
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
test 'should not be subject to injection' do
|
|
104
|
+
swap Devise, :token_authentication_key => :secret_token do
|
|
105
|
+
user1 = create_user_with_authentication_token()
|
|
106
|
+
|
|
107
|
+
# Clean up user cache
|
|
108
|
+
@user = nil
|
|
109
|
+
|
|
110
|
+
user2 = create_user_with_authentication_token(:email => "another@test.com")
|
|
111
|
+
user2.update_attribute(:authentication_token, "ANOTHERTOKEN")
|
|
112
|
+
|
|
113
|
+
assert_not_equal user1, user2
|
|
114
|
+
visit users_path(Devise.token_authentication_key.to_s + '[$ne]' => user1.authentication_token)
|
|
115
|
+
assert_nil warden.user(:user)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
private
|
|
120
|
+
|
|
121
|
+
def sign_in_as_new_user_with_token(options = {})
|
|
122
|
+
user = options.delete(:user) || create_user_with_authentication_token(options)
|
|
123
|
+
|
|
124
|
+
options[:auth_token_key] ||= Devise.token_authentication_key
|
|
125
|
+
options[:auth_token] ||= user.authentication_token
|
|
126
|
+
|
|
127
|
+
if options[:http_auth]
|
|
128
|
+
header = "Basic #{ActiveSupport::Base64.encode64("#{VALID_AUTHENTICATION_TOKEN}:X")}"
|
|
129
|
+
get users_path(:format => :xml), {}, "HTTP_AUTHORIZATION" => header
|
|
130
|
+
else
|
|
131
|
+
visit users_path(options[:auth_token_key].to_sym => options[:auth_token])
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
user
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def create_user_with_authentication_token(options={})
|
|
138
|
+
user = create_user(options)
|
|
139
|
+
user.authentication_token = VALID_AUTHENTICATION_TOKEN
|
|
140
|
+
user.save
|
|
141
|
+
user
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def get_users_path_as_existing_user(user)
|
|
145
|
+
sign_in_as_new_user_with_token(:user => user)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class TrackableHooksTest < ActionController::IntegrationTest
|
|
4
|
+
|
|
5
|
+
test "current and last sign in timestamps are updated on each sign in" do
|
|
6
|
+
user = create_user
|
|
7
|
+
assert_nil user.current_sign_in_at
|
|
8
|
+
assert_nil user.last_sign_in_at
|
|
9
|
+
|
|
10
|
+
sign_in_as_user
|
|
11
|
+
user.reload
|
|
12
|
+
|
|
13
|
+
assert_kind_of Time, user.current_sign_in_at
|
|
14
|
+
assert_kind_of Time, user.last_sign_in_at
|
|
15
|
+
|
|
16
|
+
assert_equal user.current_sign_in_at, user.last_sign_in_at
|
|
17
|
+
assert user.current_sign_in_at >= user.created_at
|
|
18
|
+
|
|
19
|
+
visit destroy_user_session_path
|
|
20
|
+
new_time = 2.seconds.from_now
|
|
21
|
+
Time.stubs(:now).returns(new_time)
|
|
22
|
+
|
|
23
|
+
sign_in_as_user
|
|
24
|
+
user.reload
|
|
25
|
+
assert user.current_sign_in_at > user.last_sign_in_at
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test "current and last sign in remote ip are updated on each sign in" do
|
|
29
|
+
user = create_user
|
|
30
|
+
assert_nil user.current_sign_in_ip
|
|
31
|
+
assert_nil user.last_sign_in_ip
|
|
32
|
+
|
|
33
|
+
sign_in_as_user
|
|
34
|
+
user.reload
|
|
35
|
+
|
|
36
|
+
assert_equal "127.0.0.1", user.current_sign_in_ip
|
|
37
|
+
assert_equal "127.0.0.1", user.last_sign_in_ip
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test "current remote ip returns original ip behind a non transparent proxy" do
|
|
41
|
+
user = create_user
|
|
42
|
+
|
|
43
|
+
arbitrary_ip = '192.168.1.69'
|
|
44
|
+
sign_in_as_user do
|
|
45
|
+
header 'HTTP_X_FORWARDED_FOR', arbitrary_ip
|
|
46
|
+
end
|
|
47
|
+
user.reload
|
|
48
|
+
assert_equal arbitrary_ip, user.current_sign_in_ip
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
test "increase sign in count" do
|
|
52
|
+
user = create_user
|
|
53
|
+
assert_equal 0, user.sign_in_count
|
|
54
|
+
|
|
55
|
+
sign_in_as_user
|
|
56
|
+
user.reload
|
|
57
|
+
assert_equal 1, user.sign_in_count
|
|
58
|
+
|
|
59
|
+
visit destroy_user_session_path
|
|
60
|
+
sign_in_as_user
|
|
61
|
+
user.reload
|
|
62
|
+
assert_equal 2, user.sign_in_count
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
test "does not update anything if user has signed out along the way" do
|
|
66
|
+
swap Devise, :confirm_within => 0 do
|
|
67
|
+
user = create_user(:confirm => false)
|
|
68
|
+
sign_in_as_user
|
|
69
|
+
|
|
70
|
+
user.reload
|
|
71
|
+
assert_nil user.current_sign_in_at
|
|
72
|
+
assert_nil user.last_sign_in_at
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
test "do not track if devise.skip_trackable is set" do
|
|
77
|
+
user = create_user
|
|
78
|
+
sign_in_as_user do
|
|
79
|
+
header 'devise.skip_trackable', '1'
|
|
80
|
+
end
|
|
81
|
+
user.reload
|
|
82
|
+
assert_equal 0, user.sign_in_count
|
|
83
|
+
visit destroy_user_session_path
|
|
84
|
+
|
|
85
|
+
sign_in_as_user do
|
|
86
|
+
header 'devise.skip_trackable', false
|
|
87
|
+
end
|
|
88
|
+
user.reload
|
|
89
|
+
assert_equal 1, user.sign_in_count
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
end
|