devise 1.1.3 → 1.2.0
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 +10 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.rdoc +94 -0
- data/Gemfile +24 -13
- data/Gemfile.lock +119 -75
- data/MIT-LICENSE +1 -1
- data/README.rdoc +144 -101
- data/Rakefile +3 -24
- data/app/controllers/devise/confirmations_controller.rb +1 -1
- data/app/controllers/devise/omniauth_callbacks_controller.rb +26 -0
- data/app/controllers/devise/passwords_controller.rb +1 -1
- data/app/controllers/devise/registrations_controller.rb +60 -7
- data/app/controllers/devise/sessions_controller.rb +6 -4
- data/app/controllers/devise/unlocks_controller.rb +1 -1
- data/app/helpers/devise_helper.rb +10 -2
- data/app/mailers/devise/mailer.rb +27 -10
- data/app/views/devise/confirmations/new.html.erb +1 -1
- data/app/views/devise/passwords/edit.html.erb +2 -2
- data/app/views/devise/passwords/new.html.erb +1 -1
- data/app/views/devise/registrations/edit.html.erb +1 -1
- data/app/views/devise/registrations/new.html.erb +1 -1
- data/app/views/devise/sessions/new.html.erb +1 -1
- data/app/views/devise/shared/_links.erb +6 -0
- data/app/views/devise/unlocks/new.html.erb +1 -1
- data/config/locales/en.yml +11 -2
- data/devise.gemspec +25 -0
- data/lib/devise/controllers/helpers.rb +119 -116
- data/lib/devise/controllers/internal_helpers.rb +29 -8
- data/lib/devise/controllers/rememberable.rb +52 -0
- data/lib/devise/controllers/scoped_views.rb +4 -6
- data/lib/devise/controllers/url_helpers.rb +3 -5
- data/lib/devise/encryptors/authlogic_sha512.rb +1 -1
- data/lib/devise/encryptors/base.rb +1 -1
- data/lib/devise/encryptors/restful_authentication_sha1.rb +4 -4
- data/lib/devise/failure_app.rb +46 -10
- data/lib/devise/hooks/activatable.rb +2 -2
- data/lib/devise/hooks/forgetable.rb +1 -3
- data/lib/devise/hooks/rememberable.rb +5 -42
- data/lib/devise/hooks/timeoutable.rb +1 -1
- data/lib/devise/mapping.rb +18 -7
- data/lib/devise/models/authenticatable.rb +73 -31
- data/lib/devise/models/confirmable.rb +16 -20
- data/lib/devise/models/database_authenticatable.rb +27 -37
- data/lib/devise/models/encryptable.rb +72 -0
- data/lib/devise/models/lockable.rb +27 -21
- data/lib/devise/models/omniauthable.rb +23 -0
- data/lib/devise/models/recoverable.rb +13 -3
- data/lib/devise/models/registerable.rb +13 -0
- data/lib/devise/models/rememberable.rb +39 -34
- data/lib/devise/models/timeoutable.rb +20 -3
- data/lib/devise/models/token_authenticatable.rb +22 -10
- data/lib/devise/models/validatable.rb +16 -4
- data/lib/devise/models.rb +4 -16
- data/lib/devise/modules.rb +15 -8
- data/lib/devise/omniauth/config.rb +18 -0
- data/lib/devise/omniauth/url_helpers.rb +33 -0
- data/lib/devise/omniauth.rb +32 -0
- data/lib/devise/orm/active_record.rb +2 -0
- data/lib/devise/orm/mongoid.rb +4 -2
- data/lib/devise/rails/routes.rb +67 -20
- data/lib/devise/rails/warden_compat.rb +101 -15
- data/lib/devise/rails.rb +33 -44
- data/lib/devise/schema.rb +16 -16
- data/lib/devise/strategies/authenticatable.rb +48 -7
- data/lib/devise/strategies/database_authenticatable.rb +1 -1
- data/lib/devise/strategies/rememberable.rb +6 -5
- data/lib/devise/strategies/token_authenticatable.rb +6 -2
- data/lib/devise/test_helpers.rb +13 -3
- data/lib/devise/version.rb +1 -1
- data/lib/devise.rb +162 -50
- data/lib/generators/active_record/devise_generator.rb +2 -2
- data/lib/generators/active_record/templates/migration.rb +2 -0
- data/lib/generators/devise/devise_generator.rb +3 -1
- data/lib/generators/devise/orm_helpers.rb +1 -1
- data/lib/generators/devise/views_generator.rb +8 -45
- data/lib/generators/mongoid/devise_generator.rb +2 -2
- data/lib/generators/templates/devise.rb +82 -39
- data/test/controllers/helpers_test.rb +78 -72
- data/test/controllers/internal_helpers_test.rb +29 -8
- data/test/controllers/url_helpers_test.rb +2 -1
- data/test/devise_test.rb +10 -0
- data/test/failure_app_test.rb +86 -22
- data/test/generators/active_record_generator_test.rb +24 -0
- data/test/generators/devise_generator_test.rb +33 -0
- data/test/generators/install_generator_test.rb +13 -0
- data/test/generators/mongoid_generator_test.rb +22 -0
- data/test/generators/views_generator_test.rb +35 -0
- data/test/indifferent_hash.rb +33 -0
- data/test/integration/authenticatable_test.rb +165 -62
- data/test/integration/database_authenticatable_test.rb +22 -0
- data/test/integration/http_authenticatable_test.rb +12 -2
- data/test/integration/omniauthable_test.rb +138 -0
- data/test/integration/recoverable_test.rb +39 -20
- data/test/integration/registerable_test.rb +60 -4
- data/test/integration/rememberable_test.rb +72 -29
- data/test/integration/timeoutable_test.rb +10 -1
- data/test/integration/token_authenticatable_test.rb +55 -6
- data/test/mailers/confirmation_instructions_test.rb +4 -0
- data/test/mailers/reset_password_instructions_test.rb +4 -0
- data/test/mailers/unlock_instructions_test.rb +4 -0
- data/test/mapping_test.rb +37 -3
- data/test/models/confirmable_test.rb +32 -15
- data/test/models/database_authenticatable_test.rb +14 -71
- data/test/models/encryptable_test.rb +65 -0
- data/test/models/lockable_test.rb +48 -11
- data/test/models/recoverable_test.rb +28 -2
- data/test/models/rememberable_test.rb +186 -125
- data/test/models/token_authenticatable_test.rb +19 -1
- data/test/models_test.rb +12 -5
- data/test/omniauth/url_helpers_test.rb +54 -0
- data/test/orm/mongoid.rb +3 -2
- data/test/rails_app/Rakefile +10 -0
- data/test/rails_app/app/active_record/admin.rb +4 -1
- data/test/rails_app/app/active_record/user.rb +5 -4
- data/test/rails_app/app/controllers/{sessions_controller.rb → admins/sessions_controller.rb} +1 -1
- data/test/rails_app/app/controllers/application_controller.rb +0 -1
- data/test/rails_app/app/controllers/home_controller.rb +9 -0
- data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
- data/test/rails_app/app/mongoid/admin.rb +4 -1
- data/test/rails_app/app/mongoid/shim.rb +16 -3
- data/test/rails_app/app/mongoid/user.rb +5 -5
- 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/index.html.erb +1 -0
- data/test/rails_app/app/views/home/private.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/application.rb +5 -0
- data/test/rails_app/config/boot.rb +2 -2
- data/test/rails_app/config/database.yml +18 -0
- data/test/rails_app/config/initializers/devise.rb +71 -31
- data/test/rails_app/config/routes.rb +14 -6
- data/test/rails_app/config.ru +4 -0
- data/test/rails_app/db/migrate/20100401102949_create_tables.rb +21 -17
- data/test/rails_app/db/schema.rb +17 -51
- data/test/rails_app/lib/shared_admin.rb +9 -0
- data/test/rails_app/lib/shared_user.rb +23 -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 +42 -9
- data/test/schema_test.rb +33 -0
- data/test/support/integration.rb +4 -4
- data/test/support/locale/en.yml +4 -0
- data/test/support/webrat/integrations/rails.rb +11 -19
- data/test/test_helper.rb +8 -2
- data/test/test_helpers_test.rb +64 -2
- metadata +106 -30
- data/TODO +0 -3
- data/lib/devise/encryptors/bcrypt.rb +0 -19
- data/lib/generators/devise_install_generator.rb +0 -4
- data/lib/generators/devise_views_generator.rb +0 -4
- data/test/support/test_silencer.rb +0 -5
|
@@ -1,218 +1,279 @@
|
|
|
1
1
|
require 'test_helper'
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
user = new_user
|
|
6
|
-
assert user.respond_to?(:remember_me)
|
|
7
|
-
end
|
|
3
|
+
module SharedRememberableTest
|
|
4
|
+
extend ActiveSupport::Testing::Declarative
|
|
8
5
|
|
|
9
|
-
test '
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
token = user.remember_token
|
|
13
|
-
user.remember_me!
|
|
14
|
-
assert_not_equal token, user.remember_token
|
|
15
|
-
assert_not user.changed?
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
test 'forget_me should clear remember token and save the record without validating' do
|
|
19
|
-
user = create_user
|
|
20
|
-
user.remember_me!
|
|
21
|
-
assert_not user.remember_token.nil?
|
|
22
|
-
user.expects(:valid?).never
|
|
23
|
-
user.forget_me!
|
|
24
|
-
assert user.remember_token.nil?
|
|
25
|
-
assert_not user.changed?
|
|
6
|
+
test 'should respond to remember_me attribute' do
|
|
7
|
+
assert resource_class.new.respond_to?(:remember_me)
|
|
8
|
+
assert resource_class.new.respond_to?(:remember_me=)
|
|
26
9
|
end
|
|
27
10
|
|
|
28
11
|
test 'forget_me should clear remember_created_at' do
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
assert_not
|
|
32
|
-
|
|
33
|
-
assert
|
|
12
|
+
resource = create_resource
|
|
13
|
+
resource.remember_me!
|
|
14
|
+
assert_not resource.remember_created_at.nil?
|
|
15
|
+
resource.forget_me!
|
|
16
|
+
assert resource.remember_created_at.nil?
|
|
34
17
|
end
|
|
35
18
|
|
|
36
|
-
test '
|
|
37
|
-
|
|
38
|
-
user.expects(:save).never
|
|
39
|
-
user.forget_me!
|
|
19
|
+
test 'remember is expired if not created at timestamp is set' do
|
|
20
|
+
assert create_resource.remember_expired?
|
|
40
21
|
end
|
|
41
22
|
|
|
42
|
-
test 'serialize
|
|
43
|
-
|
|
44
|
-
user.remember_me!
|
|
45
|
-
assert_equal [user.id, user.remember_token], User.serialize_into_cookie(user)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
test 'serialize from cookie' do
|
|
49
|
-
user = create_user
|
|
50
|
-
user.remember_me!
|
|
51
|
-
assert_equal user, User.serialize_from_cookie(user.id, user.remember_token)
|
|
23
|
+
test 'serialize should return nil if no resource is found' do
|
|
24
|
+
assert_nil resource_class.serialize_from_cookie([0], "123")
|
|
52
25
|
end
|
|
53
26
|
|
|
54
|
-
test '
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
test 'remember me return nil if is a valid user with invalid token' do
|
|
59
|
-
user = create_user
|
|
60
|
-
assert_nil User.serialize_from_cookie(user.id, "123")
|
|
27
|
+
test 'remember me return nil if is a valid resource with invalid token' do
|
|
28
|
+
resource = create_resource
|
|
29
|
+
assert_nil resource_class.serialize_from_cookie([resource.id], "123")
|
|
61
30
|
end
|
|
62
31
|
|
|
63
32
|
test 'remember for should fallback to devise remember for default configuration' do
|
|
64
33
|
swap Devise, :remember_for => 1.day do
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
assert_not
|
|
34
|
+
resource = create_resource
|
|
35
|
+
resource.remember_me!
|
|
36
|
+
assert_not resource.remember_expired?
|
|
68
37
|
end
|
|
69
38
|
end
|
|
70
39
|
|
|
71
40
|
test 'remember expires at should sum date of creation with remember for configuration' do
|
|
72
41
|
swap Devise, :remember_for => 3.days do
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
assert_equal 3.days.from_now.to_date,
|
|
42
|
+
resource = create_resource
|
|
43
|
+
resource.remember_me!
|
|
44
|
+
assert_equal 3.days.from_now.to_date, resource.remember_expires_at.to_date
|
|
76
45
|
|
|
77
46
|
Devise.remember_for = 5.days
|
|
78
|
-
assert_equal 5.days.from_now.to_date,
|
|
47
|
+
assert_equal 5.days.from_now.to_date, resource.remember_expires_at.to_date
|
|
79
48
|
end
|
|
80
49
|
end
|
|
81
50
|
|
|
82
51
|
test 'remember should be expired if remember_for is zero' do
|
|
83
52
|
swap Devise, :remember_for => 0.days do
|
|
84
53
|
Devise.remember_for = 0.days
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
assert
|
|
54
|
+
resource = create_resource
|
|
55
|
+
resource.remember_me!
|
|
56
|
+
assert resource.remember_expired?
|
|
88
57
|
end
|
|
89
58
|
end
|
|
90
59
|
|
|
91
60
|
test 'remember should be expired if it was created before limit time' do
|
|
92
61
|
swap Devise, :remember_for => 1.day do
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
assert
|
|
62
|
+
resource = create_resource
|
|
63
|
+
resource.remember_me!
|
|
64
|
+
resource.remember_created_at = 2.days.ago
|
|
65
|
+
resource.save
|
|
66
|
+
assert resource.remember_expired?
|
|
98
67
|
end
|
|
99
68
|
end
|
|
100
69
|
|
|
101
70
|
test 'remember should not be expired if it was created whitin the limit time' do
|
|
102
71
|
swap Devise, :remember_for => 30.days do
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
assert_not
|
|
72
|
+
resource = create_resource
|
|
73
|
+
resource.remember_me!
|
|
74
|
+
resource.remember_created_at = (30.days.ago + 2.minutes)
|
|
75
|
+
resource.save
|
|
76
|
+
assert_not resource.remember_expired?
|
|
108
77
|
end
|
|
109
78
|
end
|
|
110
79
|
|
|
111
80
|
test 'if extend_remember_period is false, remember_me! should generate a new timestamp if expired' do
|
|
112
81
|
swap Devise, :remember_for => 5.minutes do
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
assert
|
|
82
|
+
resource = create_resource
|
|
83
|
+
resource.remember_me!(false)
|
|
84
|
+
assert resource.remember_created_at
|
|
116
85
|
|
|
117
|
-
|
|
118
|
-
|
|
86
|
+
resource.remember_created_at = old = 10.minutes.ago
|
|
87
|
+
resource.save
|
|
119
88
|
|
|
120
|
-
|
|
121
|
-
assert_not_equal old.to_i,
|
|
89
|
+
resource.remember_me!(false)
|
|
90
|
+
assert_not_equal old.to_i, resource.remember_created_at.to_i
|
|
122
91
|
end
|
|
123
92
|
end
|
|
124
93
|
|
|
125
94
|
test 'if extend_remember_period is false, remember_me! should not generate a new timestamp' do
|
|
126
95
|
swap Devise, :remember_for => 1.year do
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
assert
|
|
96
|
+
resource = create_resource
|
|
97
|
+
resource.remember_me!(false)
|
|
98
|
+
assert resource.remember_created_at
|
|
130
99
|
|
|
131
|
-
|
|
132
|
-
|
|
100
|
+
resource.remember_created_at = old = 10.minutes.ago.utc
|
|
101
|
+
resource.save
|
|
133
102
|
|
|
134
|
-
|
|
135
|
-
assert_equal old.to_i,
|
|
103
|
+
resource.remember_me!(false)
|
|
104
|
+
assert_equal old.to_i, resource.remember_created_at.to_i
|
|
136
105
|
end
|
|
137
106
|
end
|
|
138
107
|
|
|
139
108
|
test 'if extend_remember_period is true, remember_me! should always generate a new timestamp' do
|
|
140
109
|
swap Devise, :remember_for => 1.year do
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
assert
|
|
110
|
+
resource = create_resource
|
|
111
|
+
resource.remember_me!(true)
|
|
112
|
+
assert resource.remember_created_at
|
|
144
113
|
|
|
145
|
-
|
|
146
|
-
|
|
114
|
+
resource.remember_created_at = old = 10.minutes.ago
|
|
115
|
+
resource.save
|
|
147
116
|
|
|
148
|
-
|
|
149
|
-
assert_not_equal old,
|
|
117
|
+
resource.remember_me!(true)
|
|
118
|
+
assert_not_equal old, resource.remember_created_at
|
|
150
119
|
end
|
|
151
120
|
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
class RememberableTest < ActiveSupport::TestCase
|
|
124
|
+
include SharedRememberableTest
|
|
125
|
+
|
|
126
|
+
def resource_class
|
|
127
|
+
Admin
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def create_resource
|
|
131
|
+
create_admin
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
test 'remember_me should generate a new token and save the record without validating' do
|
|
135
|
+
admin = create_admin
|
|
136
|
+
admin.expects(:valid?).never
|
|
137
|
+
token = admin.remember_token
|
|
138
|
+
admin.remember_me!
|
|
139
|
+
assert_not_equal token, admin.remember_token
|
|
140
|
+
assert_not admin.changed?
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
test 'forget_me should clear remember token and save the record without validating' do
|
|
144
|
+
admin = create_admin
|
|
145
|
+
admin.remember_me!
|
|
146
|
+
assert_not admin.remember_token.nil?
|
|
147
|
+
admin.expects(:valid?).never
|
|
148
|
+
admin.forget_me!
|
|
149
|
+
assert admin.remember_token.nil?
|
|
150
|
+
assert_not admin.changed?
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
test 'serialize into cookie' do
|
|
154
|
+
admin = create_admin
|
|
155
|
+
admin.remember_me!
|
|
156
|
+
assert_equal [admin.to_key, admin.remember_token], Admin.serialize_into_cookie(admin)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
test 'serialize from cookie' do
|
|
160
|
+
admin = create_admin
|
|
161
|
+
admin.remember_me!
|
|
162
|
+
assert_equal admin, Admin.serialize_from_cookie(admin.to_key, admin.remember_token)
|
|
163
|
+
end
|
|
152
164
|
|
|
153
165
|
test 'if remember_across_browsers is true, remember_me! should create a new token if no token exists' do
|
|
154
166
|
swap Devise, :remember_across_browsers => true, :remember_for => 1.year do
|
|
155
|
-
|
|
156
|
-
assert_equal nil,
|
|
157
|
-
|
|
158
|
-
assert_not_equal nil,
|
|
167
|
+
admin = create_admin
|
|
168
|
+
assert_equal nil, admin.remember_token
|
|
169
|
+
admin.remember_me!
|
|
170
|
+
assert_not_equal nil, admin.remember_token
|
|
159
171
|
end
|
|
160
172
|
end
|
|
161
173
|
|
|
162
174
|
test 'if remember_across_browsers is true, remember_me! should create a new token if a token exists but has expired' do
|
|
163
175
|
swap Devise, :remember_across_browsers => true, :remember_for => 1.day do
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
token =
|
|
169
|
-
|
|
170
|
-
assert_not_equal token,
|
|
176
|
+
admin = create_admin
|
|
177
|
+
admin.remember_me!
|
|
178
|
+
admin.remember_created_at = 2.days.ago
|
|
179
|
+
admin.save
|
|
180
|
+
token = admin.remember_token
|
|
181
|
+
admin.remember_me!
|
|
182
|
+
assert_not_equal token, admin.remember_token
|
|
171
183
|
end
|
|
172
184
|
end
|
|
173
185
|
|
|
174
186
|
test 'if remember_across_browsers is true, remember_me! should not create a new token if a token exists and has not expired' do
|
|
175
187
|
swap Devise, :remember_across_browsers => true, :remember_for => 2.days do
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
token =
|
|
181
|
-
|
|
182
|
-
assert_equal token,
|
|
188
|
+
admin = create_admin
|
|
189
|
+
admin.remember_me!
|
|
190
|
+
admin.remember_created_at = 1.day.ago
|
|
191
|
+
admin.save
|
|
192
|
+
token = admin.remember_token
|
|
193
|
+
admin.remember_me!
|
|
194
|
+
assert_equal token, admin.remember_token
|
|
183
195
|
end
|
|
184
196
|
end
|
|
185
197
|
|
|
186
198
|
test 'if remember_across_browsers is false, remember_me! should create a new token if no token exists' do
|
|
187
199
|
swap Devise, :remember_across_browsers => false do
|
|
188
|
-
|
|
189
|
-
assert_equal nil,
|
|
190
|
-
|
|
191
|
-
assert_not_equal nil,
|
|
200
|
+
admin = create_admin
|
|
201
|
+
assert_equal nil, admin.remember_token
|
|
202
|
+
admin.remember_me!
|
|
203
|
+
assert_not_equal nil, admin.remember_token
|
|
192
204
|
end
|
|
193
205
|
end
|
|
194
206
|
|
|
195
207
|
test 'if remember_across_browsers is false, remember_me! should create a new token if a token exists but has expired' do
|
|
196
208
|
swap Devise, :remember_across_browsers => false, :remember_for => 1.day do
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
token =
|
|
202
|
-
|
|
203
|
-
assert_not_equal token,
|
|
209
|
+
admin = create_admin
|
|
210
|
+
admin.remember_me!
|
|
211
|
+
admin.remember_created_at = 2.days.ago
|
|
212
|
+
admin.save
|
|
213
|
+
token = admin.remember_token
|
|
214
|
+
admin.remember_me!
|
|
215
|
+
assert_not_equal token, admin.remember_token
|
|
204
216
|
end
|
|
205
217
|
end
|
|
206
218
|
|
|
207
219
|
test 'if remember_across_browsers is false, remember_me! should create a new token if a token exists and has not expired' do
|
|
208
220
|
swap Devise, :remember_across_browsers => false, :remember_for => 2.days do
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
token =
|
|
214
|
-
|
|
215
|
-
assert_not_equal token,
|
|
221
|
+
admin = create_admin
|
|
222
|
+
admin.remember_me!
|
|
223
|
+
admin.remember_created_at = 1.day.ago
|
|
224
|
+
admin.save
|
|
225
|
+
token = admin.remember_token
|
|
226
|
+
admin.remember_me!
|
|
227
|
+
assert_not_equal token, admin.remember_token
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
class WithSaltRememberableTest < ActiveSupport::TestCase
|
|
233
|
+
include SharedRememberableTest
|
|
234
|
+
|
|
235
|
+
setup do
|
|
236
|
+
assert_not User.new.respond_to?(:remember_token)
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def resource_class
|
|
240
|
+
User
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def create_resource
|
|
244
|
+
create_user
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
test 'remember_me should not generate a new token if using salt' do
|
|
248
|
+
user = create_user
|
|
249
|
+
user.expects(:valid?).never
|
|
250
|
+
user.remember_me!
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
test 'forget_me should not clear remember token if using salt' do
|
|
254
|
+
user = create_user
|
|
255
|
+
user.remember_me!
|
|
256
|
+
user.expects(:valid?).never
|
|
257
|
+
user.forget_me!
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
test 'serialize into cookie' do
|
|
261
|
+
user = create_user
|
|
262
|
+
user.remember_me!
|
|
263
|
+
assert_equal [user.to_key, user.authenticatable_salt], User.serialize_into_cookie(user)
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
test 'serialize from cookie' do
|
|
267
|
+
user = create_user
|
|
268
|
+
user.remember_me!
|
|
269
|
+
assert_equal user, User.serialize_from_cookie(user.to_key, user.authenticatable_salt)
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
test 'raises a RuntimeError if authenticatable_salt is nil' do
|
|
273
|
+
user = User.new
|
|
274
|
+
user.encrypted_password = nil
|
|
275
|
+
assert_raise RuntimeError do
|
|
276
|
+
user.rememberable_value
|
|
216
277
|
end
|
|
217
278
|
end
|
|
218
279
|
end
|
|
@@ -27,6 +27,12 @@ class TokenAuthenticatableTest < ActiveSupport::TestCase
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
test 'should return nil when authenticating an invalid user by authentication token' do
|
|
30
|
+
if DEVISE_ORM == :mongoid
|
|
31
|
+
raise 'There is an incompatibility between Devise and Mongoid' <<
|
|
32
|
+
' that makes this test break. For more information, check' <<
|
|
33
|
+
' this issue: https://github.com/mongoid/mongoid/issues/725'
|
|
34
|
+
end
|
|
35
|
+
|
|
30
36
|
user = create_user
|
|
31
37
|
user.ensure_authentication_token!
|
|
32
38
|
user.confirm!
|
|
@@ -34,4 +40,16 @@ class TokenAuthenticatableTest < ActiveSupport::TestCase
|
|
|
34
40
|
assert_nil authenticated_user
|
|
35
41
|
end
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
test 'should not be subject to injection' do
|
|
44
|
+
user1 = create_user
|
|
45
|
+
user1.ensure_authentication_token!
|
|
46
|
+
user1.confirm!
|
|
47
|
+
|
|
48
|
+
user2 = create_user
|
|
49
|
+
user2.ensure_authentication_token!
|
|
50
|
+
user2.confirm!
|
|
51
|
+
|
|
52
|
+
user = User.find_for_token_authentication(:auth_token => {'$ne' => user1.authentication_token})
|
|
53
|
+
assert_nil user
|
|
54
|
+
end
|
|
55
|
+
end
|
data/test/models_test.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'test_helper'
|
|
2
2
|
|
|
3
3
|
class Configurable < User
|
|
4
|
-
devise :database_authenticatable, :confirmable, :rememberable, :timeoutable, :lockable,
|
|
4
|
+
devise :database_authenticatable, :encryptable, :confirmable, :rememberable, :timeoutable, :lockable,
|
|
5
5
|
:stretches => 15, :pepper => 'abcdef', :confirm_within => 5.days,
|
|
6
6
|
:remember_for => 7.days, :timeout_in => 15.minutes, :unlock_in => 10.days
|
|
7
7
|
end
|
|
@@ -26,16 +26,16 @@ class ActiveRecordTest < ActiveSupport::TestCase
|
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
test 'can cherry pick modules' do
|
|
29
|
-
assert_include_modules Admin, :database_authenticatable, :registerable, :timeoutable, :recoverable, :lockable
|
|
29
|
+
assert_include_modules Admin, :database_authenticatable, :registerable, :timeoutable, :recoverable, :lockable, :rememberable, :encryptable
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
test 'chosen modules are inheritable' do
|
|
33
|
-
assert_include_modules Inheritable, :database_authenticatable, :registerable, :timeoutable, :recoverable, :lockable
|
|
33
|
+
assert_include_modules Inheritable, :database_authenticatable, :registerable, :timeoutable, :recoverable, :lockable, :rememberable, :encryptable
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
test 'order of module inclusion' do
|
|
37
|
-
correct_module_order = [:database_authenticatable, :recoverable, :registerable, :lockable, :timeoutable]
|
|
38
|
-
incorrect_module_order = [:database_authenticatable, :timeoutable, :registerable, :recoverable, :lockable]
|
|
37
|
+
correct_module_order = [:database_authenticatable, :rememberable, :encryptable, :recoverable, :registerable, :lockable, :timeoutable]
|
|
38
|
+
incorrect_module_order = [:database_authenticatable, :timeoutable, :registerable, :recoverable, :lockable, :encryptable, :rememberable]
|
|
39
39
|
|
|
40
40
|
assert_include_modules Admin, *incorrect_module_order
|
|
41
41
|
|
|
@@ -47,6 +47,13 @@ class ActiveRecordTest < ActiveSupport::TestCase
|
|
|
47
47
|
assert_equal module_constants, (Admin.included_modules & module_constants).reverse
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
test 'raise error on invalid module' do
|
|
51
|
+
assert_raise NameError do
|
|
52
|
+
# Mix valid an invalid modules.
|
|
53
|
+
Configurable.class_eval { devise :database_authenticatable, :doesnotexit }
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
50
57
|
test 'set a default value for stretches' do
|
|
51
58
|
assert_equal 15, Configurable.stretches
|
|
52
59
|
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class OmniAuthRoutesTest < ActionController::TestCase
|
|
4
|
+
tests ApplicationController
|
|
5
|
+
|
|
6
|
+
def assert_path(action, provider, with_param=true)
|
|
7
|
+
# Resource param
|
|
8
|
+
assert_equal @controller.send(action, :user, provider),
|
|
9
|
+
@controller.send("user_#{action}", provider)
|
|
10
|
+
|
|
11
|
+
# With an object
|
|
12
|
+
assert_equal @controller.send(action, User.new, provider),
|
|
13
|
+
@controller.send("user_#{action}", provider)
|
|
14
|
+
|
|
15
|
+
if with_param
|
|
16
|
+
# Default url params
|
|
17
|
+
assert_equal @controller.send(action, :user, provider, :param => 123),
|
|
18
|
+
@controller.send("user_#{action}", provider, :param => 123)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
test 'should alias omniauth_callback to mapped user auth_callback' do
|
|
23
|
+
assert_path :omniauth_callback_path, :facebook
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test 'should alias omniauth_authorize to mapped user auth_authorize' do
|
|
27
|
+
assert_path :omniauth_authorize_path, :facebook, false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
test 'should generate authorization path' do
|
|
31
|
+
assert_match "/users/auth/facebook", @controller.omniauth_authorize_path(:user, :facebook)
|
|
32
|
+
|
|
33
|
+
assert_raise ArgumentError do
|
|
34
|
+
@controller.omniauth_authorize_path(:user, :github)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test 'should generate authorization path with params' do
|
|
39
|
+
assert_match "/users/auth/open_id?openid_url=http%3A%2F%2Fyahoo.com",
|
|
40
|
+
@controller.omniauth_authorize_path(:user, :open_id, :openid_url => "http://yahoo.com")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
test 'should not add a "?" if no param was sent' do
|
|
44
|
+
assert_equal "/users/auth/open_id",
|
|
45
|
+
@controller.omniauth_authorize_path(:user, :open_id)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
test 'should set script name in the path if present' do
|
|
49
|
+
@request.env['SCRIPT_NAME'] = '/q'
|
|
50
|
+
|
|
51
|
+
assert_equal "/q/users/auth/facebook",
|
|
52
|
+
@controller.omniauth_authorize_path(:user, :facebook)
|
|
53
|
+
end
|
|
54
|
+
end
|
data/test/orm/mongoid.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
Mongoid.configure do |config|
|
|
2
|
-
config.master
|
|
2
|
+
config.master = Mongo::Connection.new('127.0.0.1', 27017).db("devise-test-suite")
|
|
3
|
+
config.use_utc = true
|
|
3
4
|
end
|
|
4
5
|
|
|
5
6
|
class ActiveSupport::TestCase
|
|
@@ -7,4 +8,4 @@ class ActiveSupport::TestCase
|
|
|
7
8
|
User.delete_all
|
|
8
9
|
Admin.delete_all
|
|
9
10
|
end
|
|
10
|
-
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
|
2
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
|
3
|
+
|
|
4
|
+
require File.expand_path('../config/application', __FILE__)
|
|
5
|
+
|
|
6
|
+
require 'rake'
|
|
7
|
+
require 'rake/testtask'
|
|
8
|
+
require 'rake/rdoctask'
|
|
9
|
+
|
|
10
|
+
Rails.application.load_tasks
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
require 'shared_user'
|
|
2
|
+
|
|
1
3
|
class User < ActiveRecord::Base
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
:trackable, :validatable
|
|
4
|
+
include Shim
|
|
5
|
+
include SharedUser
|
|
5
6
|
|
|
6
|
-
attr_accessible :username, :email, :password, :password_confirmation
|
|
7
|
+
attr_accessible :username, :email, :password, :password_confirmation, :remember_me
|
|
7
8
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
|
|
2
|
+
def facebook
|
|
3
|
+
data = env["omniauth.auth"]
|
|
4
|
+
session["devise.facebook_data"] = data["extra"]["user_hash"]
|
|
5
|
+
render :json => data
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def sign_in_facebook
|
|
9
|
+
user = User.find_by_email('user@test.com')
|
|
10
|
+
user.remember_me = true
|
|
11
|
+
sign_in user
|
|
12
|
+
render :text => ""
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
require 'shared_admin'
|
|
2
|
+
|
|
1
3
|
class Admin
|
|
2
4
|
include Mongoid::Document
|
|
3
5
|
include Shim
|
|
6
|
+
include SharedAdmin
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
field :remember_token, :type => String
|
|
6
9
|
end
|
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
module Shim
|
|
2
2
|
extend ::ActiveSupport::Concern
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
included do
|
|
5
|
+
include ::Mongoid::Timestamps
|
|
6
|
+
field :created_at, :type => DateTime
|
|
7
|
+
end
|
|
4
8
|
|
|
5
9
|
module ClassMethods
|
|
6
10
|
def last(options={})
|
|
7
11
|
options.delete(:order) if options[:order] == "id"
|
|
8
12
|
super(options)
|
|
9
13
|
end
|
|
14
|
+
|
|
15
|
+
def find_by_email(email)
|
|
16
|
+
first(:conditions => { :email => email })
|
|
17
|
+
end
|
|
10
18
|
end
|
|
11
|
-
|
|
12
|
-
# overwrite equality (because some devise tests use this for asserting model equality)
|
|
19
|
+
|
|
20
|
+
# overwrite equality (because some devise tests use this for asserting model equality)
|
|
13
21
|
def ==(other)
|
|
14
22
|
other.is_a?(self.class) && _id == other._id
|
|
15
23
|
end
|
|
24
|
+
|
|
25
|
+
# Mongoid does not have this method in the current beta version (2.0.0.beta.20)
|
|
26
|
+
def update_attribute(attribute, value)
|
|
27
|
+
update_attributes(attribute => value)
|
|
28
|
+
end
|
|
16
29
|
end
|