@@ -8,6 +8,8 @@ class Auth::SessionsController < Devise::SessionsController
88 skip_before_action :require_no_authentication , only : [ :create ]
99 skip_before_action :require_functional!
1010
11+ prepend_before_action :authenticate_with_two_factor , if : :two_factor_enabled? , only : [ :create ]
12+
1113 before_action :set_instance_presenter , only : [ :new ]
1214 before_action :set_body_classes
1315
@@ -20,22 +22,9 @@ def new
2022 end
2123
2224 def create
23- self . resource = begin
24- if user_params [ :email ] . blank? && session [ :otp_user_id ] . present?
25- User . find ( session [ :otp_user_id ] )
26- else
27- warden . authenticate! ( auth_options )
28- end
29- end
30-
31- if resource . otp_required_for_login?
32- if user_params [ :otp_attempt ] . present? && session [ :otp_user_id ] . present?
33- authenticate_with_two_factor_via_otp ( resource )
34- else
35- prompt_for_two_factor ( resource )
36- end
37- else
38- authenticate_and_respond ( resource )
25+ super do |resource |
26+ remember_me ( resource )
27+ flash . delete ( :notice )
3928 end
4029 end
4130
@@ -49,6 +38,16 @@ def destroy
4938
5039 protected
5140
41+ def find_user
42+ if session [ :otp_user_id ]
43+ User . find ( session [ :otp_user_id ] )
44+ else
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 ] )
48+ end
49+ end
50+
5251 def user_params
5352 params . require ( :user ) . permit ( :email , :password , :otp_attempt )
5453 end
@@ -71,17 +70,35 @@ def after_sign_out_path_for(_resource_or_scope)
7170 super
7271 end
7372
73+ def two_factor_enabled?
74+ find_user &.otp_required_for_login?
75+ end
76+
7477 def valid_otp_attempt? ( user )
7578 user . validate_and_consume_otp! ( user_params [ :otp_attempt ] ) ||
7679 user . invalidate_otp_backup_code! ( user_params [ :otp_attempt ] )
7780 rescue OpenSSL ::Cipher ::CipherError
7881 false
7982 end
8083
84+ def authenticate_with_two_factor
85+ user = self . resource = find_user
86+
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
92+
93+ prompt_for_two_factor ( user )
94+ end
95+ end
96+
8197 def authenticate_with_two_factor_via_otp ( user )
8298 if valid_otp_attempt? ( user )
8399 session . delete ( :otp_user_id )
84- authenticate_and_respond ( user )
100+ remember_me ( user )
101+ sign_in ( user )
85102 else
86103 flash . now [ :alert ] = I18n . t ( 'users.invalid_otp_token' )
87104 prompt_for_two_factor ( user )
@@ -90,16 +107,10 @@ def authenticate_with_two_factor_via_otp(user)
90107
91108 def prompt_for_two_factor ( user )
92109 session [ :otp_user_id ] = user . id
110+ @body_classes = 'lighter'
93111 render :two_factor
94112 end
95113
96- def authenticate_and_respond ( user )
97- sign_in ( user )
98- remember_me ( user )
99-
100- respond_with user , location : after_sign_in_path_for ( user )
101- end
102-
103114 private
104115
105116 def set_instance_presenter
@@ -112,11 +123,9 @@ def set_body_classes
112123
113124 def home_paths ( resource )
114125 paths = [ about_path ]
115-
116126 if single_user_mode? && resource . is_a? ( User )
117127 paths << short_account_path ( username : resource . account )
118128 end
119-
120129 paths
121130 end
122131
0 commit comments