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.
Files changed (157) hide show
  1. data/.gitignore +10 -0
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.rdoc +94 -0
  4. data/Gemfile +24 -13
  5. data/Gemfile.lock +119 -75
  6. data/MIT-LICENSE +1 -1
  7. data/README.rdoc +144 -101
  8. data/Rakefile +3 -24
  9. data/app/controllers/devise/confirmations_controller.rb +1 -1
  10. data/app/controllers/devise/omniauth_callbacks_controller.rb +26 -0
  11. data/app/controllers/devise/passwords_controller.rb +1 -1
  12. data/app/controllers/devise/registrations_controller.rb +60 -7
  13. data/app/controllers/devise/sessions_controller.rb +6 -4
  14. data/app/controllers/devise/unlocks_controller.rb +1 -1
  15. data/app/helpers/devise_helper.rb +10 -2
  16. data/app/mailers/devise/mailer.rb +27 -10
  17. data/app/views/devise/confirmations/new.html.erb +1 -1
  18. data/app/views/devise/passwords/edit.html.erb +2 -2
  19. data/app/views/devise/passwords/new.html.erb +1 -1
  20. data/app/views/devise/registrations/edit.html.erb +1 -1
  21. data/app/views/devise/registrations/new.html.erb +1 -1
  22. data/app/views/devise/sessions/new.html.erb +1 -1
  23. data/app/views/devise/shared/_links.erb +6 -0
  24. data/app/views/devise/unlocks/new.html.erb +1 -1
  25. data/config/locales/en.yml +11 -2
  26. data/devise.gemspec +25 -0
  27. data/lib/devise/controllers/helpers.rb +119 -116
  28. data/lib/devise/controllers/internal_helpers.rb +29 -8
  29. data/lib/devise/controllers/rememberable.rb +52 -0
  30. data/lib/devise/controllers/scoped_views.rb +4 -6
  31. data/lib/devise/controllers/url_helpers.rb +3 -5
  32. data/lib/devise/encryptors/authlogic_sha512.rb +1 -1
  33. data/lib/devise/encryptors/base.rb +1 -1
  34. data/lib/devise/encryptors/restful_authentication_sha1.rb +4 -4
  35. data/lib/devise/failure_app.rb +46 -10
  36. data/lib/devise/hooks/activatable.rb +2 -2
  37. data/lib/devise/hooks/forgetable.rb +1 -3
  38. data/lib/devise/hooks/rememberable.rb +5 -42
  39. data/lib/devise/hooks/timeoutable.rb +1 -1
  40. data/lib/devise/mapping.rb +18 -7
  41. data/lib/devise/models/authenticatable.rb +73 -31
  42. data/lib/devise/models/confirmable.rb +16 -20
  43. data/lib/devise/models/database_authenticatable.rb +27 -37
  44. data/lib/devise/models/encryptable.rb +72 -0
  45. data/lib/devise/models/lockable.rb +27 -21
  46. data/lib/devise/models/omniauthable.rb +23 -0
  47. data/lib/devise/models/recoverable.rb +13 -3
  48. data/lib/devise/models/registerable.rb +13 -0
  49. data/lib/devise/models/rememberable.rb +39 -34
  50. data/lib/devise/models/timeoutable.rb +20 -3
  51. data/lib/devise/models/token_authenticatable.rb +22 -10
  52. data/lib/devise/models/validatable.rb +16 -4
  53. data/lib/devise/models.rb +4 -16
  54. data/lib/devise/modules.rb +15 -8
  55. data/lib/devise/omniauth/config.rb +18 -0
  56. data/lib/devise/omniauth/url_helpers.rb +33 -0
  57. data/lib/devise/omniauth.rb +32 -0
  58. data/lib/devise/orm/active_record.rb +2 -0
  59. data/lib/devise/orm/mongoid.rb +4 -2
  60. data/lib/devise/rails/routes.rb +67 -20
  61. data/lib/devise/rails/warden_compat.rb +101 -15
  62. data/lib/devise/rails.rb +33 -44
  63. data/lib/devise/schema.rb +16 -16
  64. data/lib/devise/strategies/authenticatable.rb +48 -7
  65. data/lib/devise/strategies/database_authenticatable.rb +1 -1
  66. data/lib/devise/strategies/rememberable.rb +6 -5
  67. data/lib/devise/strategies/token_authenticatable.rb +6 -2
  68. data/lib/devise/test_helpers.rb +13 -3
  69. data/lib/devise/version.rb +1 -1
  70. data/lib/devise.rb +162 -50
  71. data/lib/generators/active_record/devise_generator.rb +2 -2
  72. data/lib/generators/active_record/templates/migration.rb +2 -0
  73. data/lib/generators/devise/devise_generator.rb +3 -1
  74. data/lib/generators/devise/orm_helpers.rb +1 -1
  75. data/lib/generators/devise/views_generator.rb +8 -45
  76. data/lib/generators/mongoid/devise_generator.rb +2 -2
  77. data/lib/generators/templates/devise.rb +82 -39
  78. data/test/controllers/helpers_test.rb +78 -72
  79. data/test/controllers/internal_helpers_test.rb +29 -8
  80. data/test/controllers/url_helpers_test.rb +2 -1
  81. data/test/devise_test.rb +10 -0
  82. data/test/failure_app_test.rb +86 -22
  83. data/test/generators/active_record_generator_test.rb +24 -0
  84. data/test/generators/devise_generator_test.rb +33 -0
  85. data/test/generators/install_generator_test.rb +13 -0
  86. data/test/generators/mongoid_generator_test.rb +22 -0
  87. data/test/generators/views_generator_test.rb +35 -0
  88. data/test/indifferent_hash.rb +33 -0
  89. data/test/integration/authenticatable_test.rb +165 -62
  90. data/test/integration/database_authenticatable_test.rb +22 -0
  91. data/test/integration/http_authenticatable_test.rb +12 -2
  92. data/test/integration/omniauthable_test.rb +138 -0
  93. data/test/integration/recoverable_test.rb +39 -20
  94. data/test/integration/registerable_test.rb +60 -4
  95. data/test/integration/rememberable_test.rb +72 -29
  96. data/test/integration/timeoutable_test.rb +10 -1
  97. data/test/integration/token_authenticatable_test.rb +55 -6
  98. data/test/mailers/confirmation_instructions_test.rb +4 -0
  99. data/test/mailers/reset_password_instructions_test.rb +4 -0
  100. data/test/mailers/unlock_instructions_test.rb +4 -0
  101. data/test/mapping_test.rb +37 -3
  102. data/test/models/confirmable_test.rb +32 -15
  103. data/test/models/database_authenticatable_test.rb +14 -71
  104. data/test/models/encryptable_test.rb +65 -0
  105. data/test/models/lockable_test.rb +48 -11
  106. data/test/models/recoverable_test.rb +28 -2
  107. data/test/models/rememberable_test.rb +186 -125
  108. data/test/models/token_authenticatable_test.rb +19 -1
  109. data/test/models_test.rb +12 -5
  110. data/test/omniauth/url_helpers_test.rb +54 -0
  111. data/test/orm/mongoid.rb +3 -2
  112. data/test/rails_app/Rakefile +10 -0
  113. data/test/rails_app/app/active_record/admin.rb +4 -1
  114. data/test/rails_app/app/active_record/user.rb +5 -4
  115. data/test/rails_app/app/controllers/{sessions_controller.rb → admins/sessions_controller.rb} +1 -1
  116. data/test/rails_app/app/controllers/application_controller.rb +0 -1
  117. data/test/rails_app/app/controllers/home_controller.rb +9 -0
  118. data/test/rails_app/app/controllers/users/omniauth_callbacks_controller.rb +14 -0
  119. data/test/rails_app/app/mongoid/admin.rb +4 -1
  120. data/test/rails_app/app/mongoid/shim.rb +16 -3
  121. data/test/rails_app/app/mongoid/user.rb +5 -5
  122. data/test/rails_app/app/views/admins/index.html.erb +1 -0
  123. data/test/rails_app/app/views/admins/sessions/new.html.erb +2 -0
  124. data/test/rails_app/app/views/home/index.html.erb +1 -0
  125. data/test/rails_app/app/views/home/private.html.erb +1 -0
  126. data/test/rails_app/app/views/layouts/application.html.erb +24 -0
  127. data/test/rails_app/app/views/users/index.html.erb +1 -0
  128. data/test/rails_app/app/views/users/mailer/confirmation_instructions.erb +1 -0
  129. data/test/rails_app/app/views/users/sessions/new.html.erb +1 -0
  130. data/test/rails_app/config/application.rb +5 -0
  131. data/test/rails_app/config/boot.rb +2 -2
  132. data/test/rails_app/config/database.yml +18 -0
  133. data/test/rails_app/config/initializers/devise.rb +71 -31
  134. data/test/rails_app/config/routes.rb +14 -6
  135. data/test/rails_app/config.ru +4 -0
  136. data/test/rails_app/db/migrate/20100401102949_create_tables.rb +21 -17
  137. data/test/rails_app/db/schema.rb +17 -51
  138. data/test/rails_app/lib/shared_admin.rb +9 -0
  139. data/test/rails_app/lib/shared_user.rb +23 -0
  140. data/test/rails_app/public/404.html +26 -0
  141. data/test/rails_app/public/422.html +26 -0
  142. data/test/rails_app/public/500.html +26 -0
  143. data/test/rails_app/public/favicon.ico +0 -0
  144. data/test/rails_app/script/rails +10 -0
  145. data/test/routes_test.rb +42 -9
  146. data/test/schema_test.rb +33 -0
  147. data/test/support/integration.rb +4 -4
  148. data/test/support/locale/en.yml +4 -0
  149. data/test/support/webrat/integrations/rails.rb +11 -19
  150. data/test/test_helper.rb +8 -2
  151. data/test/test_helpers_test.rb +64 -2
  152. metadata +106 -30
  153. data/TODO +0 -3
  154. data/lib/devise/encryptors/bcrypt.rb +0 -19
  155. data/lib/generators/devise_install_generator.rb +0 -4
  156. data/lib/generators/devise_views_generator.rb +0 -4
  157. data/test/support/test_silencer.rb +0 -5
@@ -1,218 +1,279 @@
1
1
  require 'test_helper'
2
2
 
3
- class RememberableTest < ActiveSupport::TestCase
4
- test 'should respond to remember_me attribute' do
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 'remember_me should generate a new token and save the record without validating' do
10
- user = create_user
11
- user.expects(:valid?).never
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
- user = create_user
30
- user.remember_me!
31
- assert_not user.remember_created_at.nil?
32
- user.forget_me!
33
- assert user.remember_created_at.nil?
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 'forget should do nothing if no remember token exists' do
37
- user = create_user
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 into cookie' do
43
- user = create_user
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 'serialize should return nil if no user is found' do
55
- assert_nil User.serialize_from_cookie(0, "123")
56
- end
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
- user = create_user
66
- user.remember_me!
67
- assert_not user.remember_expired?
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
- user = create_user
74
- user.remember_me!
75
- assert_equal 3.days.from_now.to_date, user.remember_expires_at.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, user.remember_expires_at.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
- user = create_user
86
- user.remember_me!
87
- assert user.remember_expired?
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
- user = create_user
94
- user.remember_me!
95
- user.remember_created_at = 2.days.ago
96
- user.save
97
- assert user.remember_expired?
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
- user = create_user
104
- user.remember_me!
105
- user.remember_created_at = (30.days.ago + 2.minutes)
106
- user.save
107
- assert_not user.remember_expired?
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
- user = create_user
114
- user.remember_me!(false)
115
- assert user.remember_created_at
82
+ resource = create_resource
83
+ resource.remember_me!(false)
84
+ assert resource.remember_created_at
116
85
 
117
- user.remember_created_at = old = 10.minutes.ago
118
- user.save
86
+ resource.remember_created_at = old = 10.minutes.ago
87
+ resource.save
119
88
 
120
- user.remember_me!(false)
121
- assert_not_equal old.to_i, user.remember_created_at.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
- user = create_user
128
- user.remember_me!(false)
129
- assert user.remember_created_at
96
+ resource = create_resource
97
+ resource.remember_me!(false)
98
+ assert resource.remember_created_at
130
99
 
131
- user.remember_created_at = old = 10.minutes.ago.utc
132
- user.save
100
+ resource.remember_created_at = old = 10.minutes.ago.utc
101
+ resource.save
133
102
 
134
- user.remember_me!(false)
135
- assert_equal old.to_i, user.remember_created_at.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
- user = create_user
142
- user.remember_me!(true)
143
- assert user.remember_created_at
110
+ resource = create_resource
111
+ resource.remember_me!(true)
112
+ assert resource.remember_created_at
144
113
 
145
- user.remember_created_at = old = 10.minutes.ago
146
- user.save
114
+ resource.remember_created_at = old = 10.minutes.ago
115
+ resource.save
147
116
 
148
- user.remember_me!(true)
149
- assert_not_equal old, user.remember_created_at
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
- user = create_user
156
- assert_equal nil, user.remember_token
157
- user.remember_me!
158
- assert_not_equal nil, user.remember_token
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
- user = create_user
165
- user.remember_me!
166
- user.remember_created_at = 2.days.ago
167
- user.save
168
- token = user.remember_token
169
- user.remember_me!
170
- assert_not_equal token, user.remember_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
- user = create_user
177
- user.remember_me!
178
- user.remember_created_at = 1.day.ago
179
- user.save
180
- token = user.remember_token
181
- user.remember_me!
182
- assert_equal token, user.remember_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
- user = create_user
189
- assert_equal nil, user.remember_token
190
- user.remember_me!
191
- assert_not_equal nil, user.remember_token
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
- user = create_user
198
- user.remember_me!
199
- user.remember_created_at = 2.days.ago
200
- user.save
201
- token = user.remember_token
202
- user.remember_me!
203
- assert_not_equal token, user.remember_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
- user = create_user
210
- user.remember_me!
211
- user.remember_created_at = 1.day.ago
212
- user.save
213
- token = user.remember_token
214
- user.remember_me!
215
- assert_not_equal token, user.remember_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
- end
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 = Mongo::Connection.new('127.0.0.1', 27017).db("devise-test-suite")
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,3 +1,6 @@
1
+ require 'shared_admin'
2
+
1
3
  class Admin < ActiveRecord::Base
2
- devise :database_authenticatable, :registerable, :timeoutable, :recoverable, :lockable, :unlock_strategy => :time
4
+ include Shim
5
+ include SharedAdmin
3
6
  end
@@ -1,7 +1,8 @@
1
+ require 'shared_user'
2
+
1
3
  class User < ActiveRecord::Base
2
- devise :database_authenticatable, :confirmable, :lockable, :recoverable,
3
- :registerable, :rememberable, :timeoutable, :token_authenticatable,
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
@@ -1,4 +1,4 @@
1
- class SessionsController < Devise::SessionsController
1
+ class Admins::SessionsController < Devise::SessionsController
2
2
  def new
3
3
  flash[:special] = "Welcome to #{controller_path.inspect} controller!"
4
4
  super
@@ -3,7 +3,6 @@
3
3
 
4
4
  class ApplicationController < ActionController::Base
5
5
  protect_from_forgery
6
-
7
6
  before_filter :current_user
8
7
  before_filter :authenticate_user!, :if => :devise_controller?
9
8
  end
@@ -4,4 +4,13 @@ class HomeController < ApplicationController
4
4
 
5
5
  def private
6
6
  end
7
+
8
+ def set
9
+ session["devise.foo_bar"] = "something"
10
+ head :ok
11
+ end
12
+
13
+ def unauthenticated
14
+ render :text => "unauthenticated", :status => :unauthorized
15
+ end
7
16
  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
- devise :database_authenticatable, :timeoutable, :registerable, :recoverable, :lockable, :unlock_strategy => :time
8
+ field :remember_token, :type => String
6
9
  end
@@ -1,16 +1,29 @@
1
1
  module Shim
2
2
  extend ::ActiveSupport::Concern
3
- include ::Mongoid::Timestamps
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