1 # frozen_string_literal: true
3 class Auth
::SessionsController < Devise
::SessionsController
4 include Devise
::Controllers::Rememberable
8 skip_before_action
:require_no_authentication, only
: [:create]
9 skip_before_action
:check_suspension, only
: [:destroy]
10 prepend_before_action
:authenticate_with_two_factor, if: :two_factor_enabled?, only
: [:create]
27 if session
[:otp_user_id]
28 User
.find(session
[:otp_user_id])
29 elsif user_params
[:email]
30 User
.find_by(email
: user_params
[:email])
35 params
.require(:user).permit(:email, :password, :otp_attempt)
38 def after_sign_in_path_for(_resource
)
39 last_url
= stored_location_for(:user)
41 if [about_path
].include?(last_url
)
48 def two_factor_enabled
?
49 find_user
.try(:otp_required_for_login?)
52 def valid_otp_attempt
?(user
)
53 user
.validate_and_consume_otp!
(user_params
[:otp_attempt]) ||
54 user
.invalidate_otp_backup_code!
(user_params
[:otp_attempt])
55 rescue OpenSSL
::Cipher::CipherError => _error
59 def authenticate_with_two_factor
60 user
= self.resource
= find_user
62 if user_params
[:otp_attempt].present
? && session
[:otp_user_id]
63 authenticate_with_two_factor_via_otp(user
)
64 elsif user
&& user
.valid_password
?(user_params
[:password])
65 prompt_for_two_factor(user
)
69 def authenticate_with_two_factor_via_otp(user
)
70 if valid_otp_attempt
?(user
)
71 session
.delete(:otp_user_id)
75 flash
.now
[:alert] = I18n
.t('users.invalid_otp_token')
76 prompt_for_two_factor(user
)
80 def prompt_for_two_factor(user
)
81 session
[:otp_user_id] = user
.id