mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 06:41:25 +08:00
DEV: Hash tokens stored from email_tokens (#14493)
This commit adds token_hash and scopes columns to email_tokens table. token_hash is a replacement for the token column to avoid storing email tokens in plaintext as it can pose a security risk. The new scope column ensures that email tokens cannot be used to perform a different action than the one intended. To sum up, this commit: * Adds token_hash and scope to email_tokens * Reuses code that schedules critical_user_email * Refactors EmailToken.confirm and EmailToken.atomic_confirm methods * Periodically cleans old, unconfirmed or expired email tokens
This commit is contained in:
@ -339,7 +339,7 @@ class SessionController < ApplicationController
|
||||
|
||||
def email_login_info
|
||||
token = params[:token]
|
||||
matched_token = EmailToken.confirmable(token)
|
||||
matched_token = EmailToken.confirmable(token, scope: EmailToken.scopes[:email_login])
|
||||
user = matched_token&.user
|
||||
|
||||
check_local_login_allowed(user: user, check_login_via_email: true)
|
||||
@ -377,7 +377,7 @@ class SessionController < ApplicationController
|
||||
|
||||
def email_login
|
||||
token = params[:token]
|
||||
matched_token = EmailToken.confirmable(token)
|
||||
matched_token = EmailToken.confirmable(token, scope: EmailToken.scopes[:email_login])
|
||||
user = matched_token&.user
|
||||
|
||||
check_local_login_allowed(user: user, check_login_via_email: true)
|
||||
@ -388,7 +388,7 @@ class SessionController < ApplicationController
|
||||
return render(json: @second_factor_failure_payload)
|
||||
end
|
||||
|
||||
if user = EmailToken.confirm(token)
|
||||
if user = EmailToken.confirm(token, scope: EmailToken.scopes[:email_login])
|
||||
if login_not_approved_for?(user)
|
||||
return render json: login_not_approved
|
||||
elsif payload = login_error_check(user)
|
||||
@ -444,7 +444,7 @@ class SessionController < ApplicationController
|
||||
|
||||
user_presence = user.present? && user.human? && !user.staged
|
||||
if user_presence
|
||||
email_token = user.email_tokens.create(email: user.email)
|
||||
email_token = user.email_tokens.create!(email: user.email, scope: EmailToken.scopes[:password_reset])
|
||||
Jobs.enqueue(:critical_user_email, type: :forgot_password, user_id: user.id, email_token: email_token.token)
|
||||
end
|
||||
|
||||
|
Reference in New Issue
Block a user