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
:require_functional!
11 prepend_before_action
:authenticate_with_two_factor, if: :two_factor_enabled?, only
: [:create]
13 before_action
:set_instance_presenter, only
: [:new]
14 before_action
:set_body_classes
17 Devise
.omniauth_configs
.each
do |provider
, config
|
18 return redirect_to(omniauth_authorize_path(resource_name
, provider
)) if config
.strategy
.redirect_at_sign_in
32 tmp_stored_location
= stored_location_for(:user)
34 session
.delete(:challenge_passed_at)
36 store_location_for(:user, tmp_stored_location
) if continue_after
?
42 if session
[:otp_user_id]
43 User
.find(session
[:otp_user_id])
45 user
= User
.authenticate_with_ldap(user_params
) if Devise
.ldap_authentication
46 user
||= User
.authenticate_with_pam(user_params
) if Devise
.pam_authentication
47 user
||= User
.find_for_authentication(email
: user_params
[:email])
52 params
.require(:user).permit(:email, :password, :otp_attempt)
55 def after_sign_in_path_for(resource
)
56 last_url
= stored_location_for(:user)
58 if home_paths(resource
).include?(last_url
)
65 def after_sign_out_path_for(_resource_or_scope
)
66 Devise
.omniauth_configs
.each_value
do |config
|
67 return root_path
if config
.strategy
.redirect_at_sign_in
73 def two_factor_enabled
?
74 find_user
&.otp_required_for_login
?
77 def valid_otp_attempt
?(user
)
78 user
.validate_and_consume_otp!
(user_params
[:otp_attempt]) ||
79 user
.invalidate_otp_backup_code!
(user_params
[:otp_attempt])
80 rescue OpenSSL
::Cipher::CipherError
84 def authenticate_with_two_factor
85 user
= self.resource
= find_user
87 if user_params
[:otp_attempt].present
? && session
[:otp_user_id]
88 authenticate_with_two_factor_via_otp(user
)
89 elsif user
.present
? && (user
.encrypted_password
.blank
? || user
.valid_password
?(user_params
[:password]))
90 # If encrypted_password is blank, we got the user from LDAP or PAM,
91 # so credentials are already valid
93 prompt_for_two_factor(user
)
97 def authenticate_with_two_factor_via_otp(user
)
98 if valid_otp_attempt
?(user
)
99 session
.delete(:otp_user_id)
103 flash
.now
[:alert] = I18n
.t('users.invalid_otp_token')
104 prompt_for_two_factor(user
)
108 def prompt_for_two_factor(user
)
109 session
[:otp_user_id] = user
.id
110 @body_classes = 'lighter'
116 def set_instance_presenter
117 @instance_presenter = InstancePresenter
.new
121 @body_classes = 'lighter'
124 def home_paths(resource
)
126 if single_user_mode
? && resource
.is_a
?(User
)
127 paths
<< short_account_path(username
: resource
.account
)
133 truthy_param
?(:continue)