devise 3.5.3 → 3.5.10

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise might be problematic. Click here for more details.

@@ -25,8 +25,7 @@ module Devise
25
25
  end
26
26
 
27
27
  if validate(resource)
28
- remember_me(resource)
29
- extend_remember_me_period(resource)
28
+ remember_me(resource) if extend_remember_me?(resource)
30
29
  resource.after_remembered
31
30
  success!(resource)
32
31
  end
@@ -43,10 +42,8 @@ module Devise
43
42
 
44
43
  private
45
44
 
46
- def extend_remember_me_period(resource)
47
- if resource.respond_to?(:extend_remember_period=)
48
- resource.extend_remember_period = mapping.to.extend_remember_period
49
- end
45
+ def extend_remember_me?(resource)
46
+ resource.respond_to?(:extend_remember_period) && resource.extend_remember_period
50
47
  end
51
48
 
52
49
  def remember_me?
@@ -1,3 +1,3 @@
1
1
  module Devise
2
- VERSION = "3.5.3".freeze
2
+ VERSION = "3.5.10".freeze
3
3
  end
@@ -1,10 +1,15 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class RememberMeTest < ActionDispatch::IntegrationTest
4
+ if (Rails::VERSION::MAJOR < 4) || (Rails::VERSION::MAJOR >= 4 && Rails::VERSION::MINOR < 1)
5
+ require 'time_helpers'
6
+ include ActiveSupport::Testing::TimeHelpers
7
+ end
8
+
4
9
  def create_user_and_remember(add_to_token='')
5
10
  user = create_user
6
11
  user.remember_me!
7
- raw_cookie = User.serialize_into_cookie(user).tap { |a| a.last << add_to_token }
12
+ raw_cookie = User.serialize_into_cookie(user).tap { |a| a[1] << add_to_token }
8
13
  cookies['remember_user_token'] = generate_signed_cookie(raw_cookie)
9
14
  user
10
15
  end
@@ -92,7 +97,6 @@ class RememberMeTest < ActionDispatch::IntegrationTest
92
97
  assert_response :success
93
98
  assert warden.authenticated?(:user)
94
99
  assert warden.user(:user) == user
95
- 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."
96
100
  end
97
101
 
98
102
  test 'remember the user before sign up and redirect them to their home' do
@@ -118,6 +122,40 @@ class RememberMeTest < ActionDispatch::IntegrationTest
118
122
  end
119
123
  end
120
124
 
125
+ test 'extends remember period when extend remember period config is true' do
126
+ swap Devise, extend_remember_period: true, remember_for: 1.year do
127
+ user = create_user_and_remember
128
+ old_remember_token = nil
129
+
130
+ travel_to 1.day.ago do
131
+ get root_path
132
+ old_remember_token = request.cookies['remember_user_token']
133
+ end
134
+
135
+ get root_path
136
+ current_remember_token = request.cookies['remember_user_token']
137
+
138
+ refute_equal old_remember_token, current_remember_token
139
+ end
140
+ end
141
+
142
+ test 'does not extend remember period when extend period config is false' do
143
+ swap Devise, extend_remember_period: false, remember_for: 1.year do
144
+ user = create_user_and_remember
145
+ old_remember_token = nil
146
+
147
+ travel_to 1.day.ago do
148
+ get root_path
149
+ old_remember_token = request.cookies['remember_user_token']
150
+ end
151
+
152
+ get root_path
153
+ current_remember_token = request.cookies['remember_user_token']
154
+
155
+ assert_equal old_remember_token, current_remember_token
156
+ end
157
+ end
158
+
121
159
  test 'do not remember other scopes' do
122
160
  create_user_and_remember
123
161
  get root_path
@@ -135,7 +173,7 @@ class RememberMeTest < ActionDispatch::IntegrationTest
135
173
 
136
174
  test 'do not remember with expired token' do
137
175
  create_user_and_remember
138
- swap Devise, remember_for: 0 do
176
+ swap Devise, remember_for: 0.days do
139
177
  get users_path
140
178
  assert_not warden.authenticated?(:user)
141
179
  assert_redirected_to new_user_session_path
@@ -175,7 +175,7 @@ class SessionTimeoutTest < ActionDispatch::IntegrationTest
175
175
  assert warden.authenticated?(:user)
176
176
  end
177
177
 
178
- test 'does not crashes when the last_request_at is a String' do
178
+ test 'does not crash when the last_request_at is a String' do
179
179
  user = sign_in_as_user
180
180
 
181
181
  get edit_form_user_path(user, last_request_at: Time.now.utc.to_s)
@@ -114,7 +114,7 @@ class ConfirmableTest < ActiveSupport::TestCase
114
114
 
115
115
  assert_email_not_sent do
116
116
  user.save!
117
- assert !user.confirmed?
117
+ assert_not user.confirmed?
118
118
  end
119
119
  end
120
120
 
@@ -401,6 +401,14 @@ class ReconfirmableTest < ActiveSupport::TestCase
401
401
  assert_match "new_test@example.com", ActionMailer::Base.deliveries.last.body.encoded
402
402
  end
403
403
 
404
+ test 'should send confirmation instructions by email after changing email from nil' do
405
+ admin = create_admin(email: nil)
406
+ assert_email_sent "new_test@example.com" do
407
+ assert admin.update_attributes(email: 'new_test@example.com')
408
+ end
409
+ assert_match "new_test@example.com", ActionMailer::Base.deliveries.last.body.encoded
410
+ end
411
+
404
412
  test 'should not send confirmation by email after changing password' do
405
413
  admin = create_admin
406
414
  assert admin.confirm
@@ -486,4 +494,18 @@ class ReconfirmableTest < ActiveSupport::TestCase
486
494
  :unconfirmed_email
487
495
  ]
488
496
  end
497
+
498
+ test 'should not require reconfirmation after creating a record' do
499
+ admin = create_admin
500
+ assert !admin.pending_reconfirmation?
501
+ end
502
+
503
+ test 'should not require reconfirmation after creating a record with #save called in callback' do
504
+ class Admin::WithSaveInCallback < Admin
505
+ after_create :save
506
+ end
507
+
508
+ admin = Admin::WithSaveInCallback.create(valid_attributes.except(:username))
509
+ assert !admin.pending_reconfirmation?
510
+ end
489
511
  end
@@ -325,4 +325,26 @@ class LockableTest < ActiveSupport::TestCase
325
325
  user.lock_access!
326
326
  assert_equal :locked, user.unauthenticated_message
327
327
  end
328
+
329
+ test 'unlock_strategy_enabled? should return true for both, email, and time strategies if :both is used' do
330
+ swap Devise, unlock_strategy: :both do
331
+ user = create_user
332
+ assert_equal true, user.unlock_strategy_enabled?(:both)
333
+ assert_equal true, user.unlock_strategy_enabled?(:time)
334
+ assert_equal true, user.unlock_strategy_enabled?(:email)
335
+ assert_equal false, user.unlock_strategy_enabled?(:none)
336
+ assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
337
+ end
338
+ end
339
+
340
+ test 'unlock_strategy_enabled? should return true only for the configured strategy' do
341
+ swap Devise, unlock_strategy: :email do
342
+ user = create_user
343
+ assert_equal false, user.unlock_strategy_enabled?(:both)
344
+ assert_equal false, user.unlock_strategy_enabled?(:time)
345
+ assert_equal true, user.unlock_strategy_enabled?(:email)
346
+ assert_equal false, user.unlock_strategy_enabled?(:none)
347
+ assert_equal false, user.unlock_strategy_enabled?(:an_undefined_strategy)
348
+ end
349
+ end
328
350
  end
@@ -13,6 +13,19 @@ class RememberableTest < ActiveSupport::TestCase
13
13
  user = create_user
14
14
  user.expects(:valid?).never
15
15
  user.remember_me!
16
+ assert user.remember_created_at
17
+ end
18
+
19
+ test 'remember_me should not generate a new token if valid token exists' do
20
+ user = create_user
21
+ user.singleton_class.send(:attr_accessor, :remember_token)
22
+ User.to_adapter.expects(:find_first).returns(nil)
23
+
24
+ user.remember_me!
25
+ existing_token = user.remember_token
26
+
27
+ user.remember_me!
28
+ assert_equal existing_token, user.remember_token
16
29
  end
17
30
 
18
31
  test 'forget_me should not clear remember token if using salt' do
@@ -33,13 +46,57 @@ class RememberableTest < ActiveSupport::TestCase
33
46
  test 'serialize into cookie' do
34
47
  user = create_user
35
48
  user.remember_me!
36
- assert_equal [user.to_key, user.authenticatable_salt], User.serialize_into_cookie(user)
49
+ id, token, date = User.serialize_into_cookie(user)
50
+ assert_equal id, user.to_key
51
+ assert_equal token, user.authenticatable_salt
52
+ assert date.is_a?(String)
37
53
  end
38
54
 
39
55
  test 'serialize from cookie' do
40
56
  user = create_user
41
57
  user.remember_me!
42
- assert_equal user, User.serialize_from_cookie(user.to_key, user.authenticatable_salt)
58
+ assert_equal user, User.serialize_from_cookie(user.to_key, user.authenticatable_salt, Time.now.utc)
59
+ end
60
+
61
+ test 'serialize from cookie should accept a String with the datetime seconds and microseconds' do
62
+ user = create_user
63
+ user.remember_me!
64
+ assert_equal user, User.serialize_from_cookie(user.to_key, user.authenticatable_salt, Time.now.utc.to_f.to_json)
65
+ end
66
+
67
+ test 'serialize from cookie should return nil with invalid datetime' do
68
+ user = create_user
69
+ user.remember_me!
70
+ assert_nil User.serialize_from_cookie(user.to_key, user.authenticatable_salt, "2013")
71
+ end
72
+
73
+ test 'serialize from cookie should return nil if no resource is found' do
74
+ assert_nil resource_class.serialize_from_cookie([0], "123", Time.now.utc)
75
+ end
76
+
77
+ test 'serialize from cookie should return nil if no timestamp' do
78
+ user = create_user
79
+ user.remember_me!
80
+ assert_nil User.serialize_from_cookie(user.to_key, user.authenticatable_salt)
81
+ end
82
+
83
+ test 'serialize from cookie should return nil if timestamp is earlier than token creation' do
84
+ user = create_user
85
+ user.remember_me!
86
+ assert_nil User.serialize_from_cookie(user.to_key, user.authenticatable_salt, 1.day.ago)
87
+ end
88
+
89
+ test 'serialize from cookie should return nil if timestamp is older than remember_for' do
90
+ user = create_user
91
+ user.remember_created_at = 1.month.ago
92
+ user.remember_me!
93
+ assert_nil User.serialize_from_cookie(user.to_key, user.authenticatable_salt, 3.weeks.ago)
94
+ end
95
+
96
+ test 'serialize from cookie me return nil if is a valid resource with invalid token' do
97
+ user = create_user
98
+ user.remember_me!
99
+ assert_nil User.serialize_from_cookie(user.to_key, "123", Time.now.utc)
43
100
  end
44
101
 
45
102
  test 'raises a RuntimeError if authenticatable_salt is nil or empty' do
@@ -93,28 +150,7 @@ class RememberableTest < ActiveSupport::TestCase
93
150
  resource.forget_me!
94
151
  end
95
152
 
96
- test 'remember is expired if not created at timestamp is set' do
97
- assert create_resource.remember_expired?
98
- end
99
-
100
- test 'serialize should return nil if no resource is found' do
101
- assert_nil resource_class.serialize_from_cookie([0], "123")
102
- end
103
-
104
- test 'remember me return nil if is a valid resource with invalid token' do
105
- resource = create_resource
106
- assert_nil resource_class.serialize_from_cookie([resource.id], "123")
107
- end
108
-
109
- test 'remember for should fallback to devise remember for default configuration' do
110
- swap Devise, remember_for: 1.day do
111
- resource = create_resource
112
- resource.remember_me!
113
- assert_not resource.remember_expired?
114
- end
115
- end
116
-
117
- test 'remember expires at should sum date of creation with remember for configuration' do
153
+ test 'remember expires at uses remember for configuration' do
118
154
  swap Devise, remember_for: 3.days do
119
155
  resource = create_resource
120
156
  resource.remember_me!
@@ -125,77 +161,6 @@ class RememberableTest < ActiveSupport::TestCase
125
161
  end
126
162
  end
127
163
 
128
- test 'remember should be expired if remember_for is zero' do
129
- swap Devise, remember_for: 0.days do
130
- Devise.remember_for = 0.days
131
- resource = create_resource
132
- resource.remember_me!
133
- assert resource.remember_expired?
134
- end
135
- end
136
-
137
- test 'remember should be expired if it was created before limit time' do
138
- swap Devise, remember_for: 1.day do
139
- resource = create_resource
140
- resource.remember_me!
141
- resource.remember_created_at = 2.days.ago
142
- resource.save
143
- assert resource.remember_expired?
144
- end
145
- end
146
-
147
- test 'remember should not be expired if it was created within the limit time' do
148
- swap Devise, remember_for: 30.days do
149
- resource = create_resource
150
- resource.remember_me!
151
- resource.remember_created_at = (30.days.ago + 2.minutes)
152
- resource.save
153
- assert_not resource.remember_expired?
154
- end
155
- end
156
-
157
- test 'if extend_remember_period is false, remember_me! should generate a new timestamp if expired' do
158
- swap Devise, remember_for: 5.minutes do
159
- resource = create_resource
160
- resource.remember_me!(false)
161
- assert resource.remember_created_at
162
-
163
- resource.remember_created_at = old = 10.minutes.ago
164
- resource.save
165
-
166
- resource.remember_me!(false)
167
- assert_not_equal old.to_i, resource.remember_created_at.to_i
168
- end
169
- end
170
-
171
- test 'if extend_remember_period is false, remember_me! should not generate a new timestamp' do
172
- swap Devise, remember_for: 1.year do
173
- resource = create_resource
174
- resource.remember_me!(false)
175
- assert resource.remember_created_at
176
-
177
- resource.remember_created_at = old = 10.minutes.ago.utc
178
- resource.save
179
-
180
- resource.remember_me!(false)
181
- assert_equal old.to_i, resource.remember_created_at.to_i
182
- end
183
- end
184
-
185
- test 'if extend_remember_period is true, remember_me! should always generate a new timestamp' do
186
- swap Devise, remember_for: 1.year do
187
- resource = create_resource
188
- resource.remember_me!(true)
189
- assert resource.remember_created_at
190
-
191
- resource.remember_created_at = old = 10.minutes.ago
192
- resource.save
193
-
194
- resource.remember_me!(true)
195
- assert_not_equal old, resource.remember_created_at
196
- end
197
- end
198
-
199
164
  test 'should have the required_fields array' do
200
165
  assert_same_content Devise::Models::Rememberable.required_fields(User), [
201
166
  :remember_created_at
@@ -0,0 +1,137 @@
1
+ # A copy of Rails time helpers. With this file we can support the `travel_to`
2
+ # helper for Rails versions prior 4.1.
3
+ # File origin: https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/activesupport/lib/active_support/testing/time_helpers.rb
4
+ module ActiveSupport
5
+ module Testing
6
+ class SimpleStubs # :nodoc:
7
+ Stub = Struct.new(:object, :method_name, :original_method)
8
+
9
+ def initialize
10
+ @stubs = {}
11
+ end
12
+
13
+ def stub_object(object, method_name, return_value)
14
+ key = [object.object_id, method_name]
15
+
16
+ if stub = @stubs[key]
17
+ unstub_object(stub)
18
+ end
19
+
20
+ new_name = "__simple_stub__#{method_name}"
21
+
22
+ @stubs[key] = Stub.new(object, method_name, new_name)
23
+
24
+ object.singleton_class.send :alias_method, new_name, method_name
25
+ object.define_singleton_method(method_name) { return_value }
26
+ end
27
+
28
+ def unstub_all!
29
+ @stubs.each_value do |stub|
30
+ unstub_object(stub)
31
+ end
32
+ @stubs = {}
33
+ end
34
+
35
+ private
36
+
37
+ def unstub_object(stub)
38
+ singleton_class = stub.object.singleton_class
39
+ singleton_class.send :undef_method, stub.method_name
40
+ singleton_class.send :alias_method, stub.method_name, stub.original_method
41
+ singleton_class.send :undef_method, stub.original_method
42
+ end
43
+ end
44
+
45
+ # Contains helpers that help you test passage of time.
46
+ module TimeHelpers
47
+ # Changes current time to the time in the future or in the past by a given time difference by
48
+ # stubbing +Time.now+, +Date.today+, and +DateTime.now+.
49
+ #
50
+ # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
51
+ # travel 1.day
52
+ # Time.current # => Sun, 10 Nov 2013 15:34:49 EST -05:00
53
+ # Date.current # => Sun, 10 Nov 2013
54
+ # DateTime.current # => Sun, 10 Nov 2013 15:34:49 -0500
55
+ #
56
+ # This method also accepts a block, which will return the current time back to its original
57
+ # state at the end of the block:
58
+ #
59
+ # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
60
+ # travel 1.day do
61
+ # User.create.created_at # => Sun, 10 Nov 2013 15:34:49 EST -05:00
62
+ # end
63
+ # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
64
+ def travel(duration, &block)
65
+ travel_to Time.now + duration, &block
66
+ end
67
+
68
+ # Changes current time to the given time by stubbing +Time.now+,
69
+ # +Date.today+, and +DateTime.now+ to return the time or date passed into this method.
70
+ #
71
+ # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
72
+ # travel_to Time.new(2004, 11, 24, 01, 04, 44)
73
+ # Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
74
+ # Date.current # => Wed, 24 Nov 2004
75
+ # DateTime.current # => Wed, 24 Nov 2004 01:04:44 -0500
76
+ #
77
+ # Dates are taken as their timestamp at the beginning of the day in the
78
+ # application time zone. <tt>Time.current</tt> returns said timestamp,
79
+ # and <tt>Time.now</tt> its equivalent in the system time zone. Similarly,
80
+ # <tt>Date.current</tt> returns a date equal to the argument, and
81
+ # <tt>Date.today</tt> the date according to <tt>Time.now</tt>, which may
82
+ # be different. (Note that you rarely want to deal with <tt>Time.now</tt>,
83
+ # or <tt>Date.today</tt>, in order to honor the application time zone
84
+ # please always use <tt>Time.current</tt> and <tt>Date.current</tt>.)
85
+ #
86
+ # Note that the usec for the time passed will be set to 0 to prevent rounding
87
+ # errors with external services, like MySQL (which will round instead of floor,
88
+ # leading to off-by-one-second errors).
89
+ #
90
+ # This method also accepts a block, which will return the current time back to its original
91
+ # state at the end of the block:
92
+ #
93
+ # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
94
+ # travel_to Time.new(2004, 11, 24, 01, 04, 44) do
95
+ # Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
96
+ # end
97
+ # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
98
+ def travel_to(date_or_time)
99
+ if date_or_time.is_a?(Date) && !date_or_time.is_a?(DateTime)
100
+ now = date_or_time.midnight.to_time
101
+ else
102
+ now = date_or_time.to_time.change(usec: 0)
103
+ end
104
+
105
+ simple_stubs.stub_object(Time, :now, now)
106
+ simple_stubs.stub_object(Date, :today, now.to_date)
107
+ simple_stubs.stub_object(DateTime, :now, now.to_datetime)
108
+
109
+ if block_given?
110
+ begin
111
+ yield
112
+ ensure
113
+ travel_back
114
+ end
115
+ end
116
+ end
117
+
118
+ # Returns the current time back to its original state, by removing the stubs added by
119
+ # `travel` and `travel_to`.
120
+ #
121
+ # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
122
+ # travel_to Time.new(2004, 11, 24, 01, 04, 44)
123
+ # Time.current # => Wed, 24 Nov 2004 01:04:44 EST -05:00
124
+ # travel_back
125
+ # Time.current # => Sat, 09 Nov 2013 15:34:49 EST -05:00
126
+ def travel_back
127
+ simple_stubs.unstub_all!
128
+ end
129
+
130
+ private
131
+
132
+ def simple_stubs
133
+ @simple_stubs ||= SimpleStubs.new
134
+ end
135
+ end
136
+ end
137
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devise
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.3
4
+ version: 3.5.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - José Valim
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-12-10 00:00:00.000000000 Z
12
+ date: 2016-05-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: warden
@@ -363,6 +363,7 @@ files:
363
363
  - test/test_helper.rb
364
364
  - test/test_helpers_test.rb
365
365
  - test/test_models.rb
366
+ - test/time_helpers.rb
366
367
  homepage: https://github.com/plataformatec/devise
367
368
  licenses:
368
369
  - MIT
@@ -383,7 +384,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
383
384
  version: '0'
384
385
  requirements: []
385
386
  rubyforge_project:
386
- rubygems_version: 2.4.5
387
+ rubygems_version: 2.5.1
387
388
  signing_key:
388
389
  specification_version: 4
389
390
  summary: Flexible authentication solution for Rails with Warden
@@ -519,3 +520,4 @@ test_files:
519
520
  - test/test_helper.rb
520
521
  - test/test_helpers_test.rb
521
522
  - test/test_models.rb
523
+ - test/time_helpers.rb