Skip to content

Commit

Permalink
Fix remember me always extending the period
Browse files Browse the repository at this point in the history
Now the config `extend_remember_period` is used to:

`true` - Every time the user authentication is validated, the
cookie expiration is updated.
`false` - Does not updates the cookie expiration.

Closes #3994
  • Loading branch information
ulissesalmeida committed Apr 15, 2016
1 parent c87d8fd commit 4a4b5ba
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 12 deletions.
1 change: 0 additions & 1 deletion lib/devise.rb
Expand Up @@ -115,7 +115,6 @@ module Strategies
mattr_accessor :remember_for
@@remember_for = 2.weeks

# TODO: extend_remember_period is no longer used
# If true, extends the user's remember period when remembered via cookie.
mattr_accessor :extend_remember_period
@@extend_remember_period = false
Expand Down
9 changes: 5 additions & 4 deletions lib/devise/models/rememberable.rb
Expand Up @@ -39,7 +39,7 @@ module Models
module Rememberable
extend ActiveSupport::Concern

attr_accessor :remember_me, :extend_remember_period
attr_accessor :remember_me

def self.required_fields(klass)
[:remember_created_at]
Expand All @@ -66,6 +66,10 @@ def remember_expires_at
self.class.remember_for.from_now
end

def extend_remember_period
self.class.extend_remember_period
end

def rememberable_value
if respond_to?(:remember_token)
remember_token
Expand Down Expand Up @@ -147,9 +151,6 @@ def remember_token #:nodoc:
end
end

private

# TODO: extend_remember_period is no longer used
Devise::Models.config(self, :remember_for, :extend_remember_period, :rememberable_options, :expire_all_remember_me_on_sign_out)
end
end
Expand Down
9 changes: 3 additions & 6 deletions lib/devise/strategies/rememberable.rb
Expand Up @@ -25,8 +25,7 @@ def authenticate!
end

if validate(resource)
remember_me(resource)
extend_remember_me_period(resource)
remember_me(resource) if extend_remember_me?(resource)
resource.after_remembered
success!(resource)
end
Expand All @@ -43,10 +42,8 @@ def clean_up_csrf?

private

def extend_remember_me_period(resource)
if resource.respond_to?(:extend_remember_period=)
resource.extend_remember_period = mapping.to.extend_remember_period
end
def extend_remember_me?(resource)
resource.respond_to?(:extend_remember_period) && resource.extend_remember_period
end

def remember_me?
Expand Down
35 changes: 34 additions & 1 deletion test/integration/rememberable_test.rb
Expand Up @@ -94,7 +94,6 @@ def cookie_expires(key)
assert_response :success
assert warden.authenticated?(:user)
assert warden.user(:user) == user
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."
end

test 'remember the user before sign up and redirect them to their home' do
Expand All @@ -120,6 +119,40 @@ def cookie_expires(key)
end
end

test 'extends remember period when extend remember period config is true' do
swap Devise, extend_remember_period: true, remember_for: 1.year do
user = create_user_and_remember
old_remember_token = nil

travel_to 1.day.ago do
get root_path
old_remember_token = request.cookies['remember_user_token']
end

get root_path
current_remember_token = request.cookies['remember_user_token']

refute_equal old_remember_token, current_remember_token
end
end

test 'does not extend remember period when extend period config is false' do
swap Devise, extend_remember_period: false, remember_for: 1.year do
user = create_user_and_remember
old_remember_token = nil

travel_to 1.day.ago do
get root_path
old_remember_token = request.cookies['remember_user_token']
end

get root_path
current_remember_token = request.cookies['remember_user_token']

assert_equal old_remember_token, current_remember_token
end
end

test 'do not remember other scopes' do
create_user_and_remember
get root_path
Expand Down

0 comments on commit 4a4b5ba

Please sign in to comment.