Fix password change/reset not immediately invalidating other sessions (#12928)

While making browser requests in the other sessions after a password
change or reset does not allow you to be logged in and correctly
invalidates the session making the request, sessions have API tokens
associated with them, which can still be used until that session
is invalidated.

This is a security issue for accounts that were already compromised
some other way because it makes it harder to throw out the hijacker.
th-downstream
Eugen Rochko 5 years ago committed by GitHub
parent 36b1dd934d
commit e4aa4a1c28

@ -6,6 +6,12 @@ class Auth::PasswordsController < Devise::PasswordsController
layout 'auth' layout 'auth'
def update
super do |resource|
resource.session_activations.destroy_all if resource.errors.empty?
end
end
private private
def check_validity_of_reset_password_token def check_validity_of_reset_password_token

@ -22,10 +22,17 @@ class Auth::RegistrationsController < Devise::RegistrationsController
not_found not_found
end end
def update
super do |resource|
resource.clear_other_sessions(current_session.session_id) if resource.saved_change_to_encrypted_password?
end
end
protected protected
def update_resource(resource, params) def update_resource(resource, params)
params[:password] = nil if Devise.pam_authentication && resource.encrypted_password.blank? params[:password] = nil if Devise.pam_authentication && resource.encrypted_password.blank?
super super
end end

@ -247,7 +247,7 @@ class User < ApplicationRecord
ip: request.remote_ip).session_id ip: request.remote_ip).session_id
end end
def exclusive_session(id) def clear_other_sessions(id)
session_activations.exclusive(id) session_activations.exclusive(id)
end end

Loading…
Cancel
Save