Skip to content

Commit 6651c4d

Browse files
authored
Merge pull request #1951 from codidact/0valt/1119/2fa-confirmation-fix
Fix premature confirmation of sign in for users with app 2FA set up
2 parents 072a25c + 1bd0c37 commit 6651c4d

3 files changed

Lines changed: 25 additions & 4 deletions

File tree

app/controllers/users/sessions_controller.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,17 @@ def post_sign_in(user, remember_me = false)
106106

107107
def handle_2fa_login(user, remember_me = false)
108108
sign_out user
109+
110+
# prevents premature sign in confirmation
111+
flash[:notice] = nil
112+
109113
case user.two_factor_method
110114
when 'app'
111115
id = user.id
112116
@@first_factor << id
113117
redirect_to login_verify_2fa_path(uid: id, remember_me: remember_me)
114118
when 'email'
115119
TwoFactorMailer.with(user: user, host: request.hostname).login_email.deliver_now
116-
flash[:notice] = nil
117120
flash[:info] = 'Please check your email inbox for a link to sign in.'
118121
redirect_to after_sign_in_path_for(user)
119122
end

test/controllers/users/sessions_controller_test.rb

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ class Users::SessionsControllerTest < ActionController::TestCase
44
include Devise::Test::ControllerHelpers
55
include ApplicationHelper
66

7+
setup :set_mapping
8+
79
test 'should sign in with 2fa backup code' do
8-
@request.env['devise.mapping'] = Devise.mappings[:user]
910
Users::SessionsController.first_factor << users(:enabled_2fa).id
1011

1112
try_verify_2fa_code(users(:enabled_2fa))
@@ -18,7 +19,6 @@ class Users::SessionsControllerTest < ActionController::TestCase
1819
end
1920

2021
test 'should remember users with 2FA if requested' do
21-
@request.env['devise.mapping'] = Devise.mappings[:user]
2222
Users::SessionsController.first_factor << users(:enabled_2fa).id
2323

2424
try_verify_2fa_code(users(:enabled_2fa), remember_me: true)
@@ -28,9 +28,26 @@ class Users::SessionsControllerTest < ActionController::TestCase
2828
assert @controller.remember_me_is_active?(current_user)
2929
end
3030

31+
test 'should redirect users with code-based 2FA to code verification' do
32+
pass = 'temp password for testing manual 2FA signin'
33+
user = users(:enabled_2fa)
34+
user.update!(password: pass)
35+
36+
post :create, params: { user: { email: user.email, password: pass } }
37+
38+
assert_response(:found)
39+
assert_nil flash[:notice]
40+
assert_redirected_to(login_verify_2fa_path(uid: user.id, remember_me: false))
41+
end
42+
3143
private
3244

33-
# @param user [User] user to very code for
45+
def set_mapping
46+
@request.env['devise.mapping'] = Devise.mappings[:user]
47+
end
48+
49+
# @param user [User] user to verify code for
50+
# @param opts [Hash] options hash - any additional optional params to merge in
3451
def try_verify_2fa_code(user, **opts)
3552
post :verify_code, params: { uid: user.id, code: 'M8lENyehyCvo9F9MbyTl1aOL' }.merge(opts)
3653
end

test/fixtures/users.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ enabled_2fa:
155155
username: enabled_2fa
156156
confirmed_at: 2020-01-01T00:00:00.000000Z
157157
enabled_2fa: true
158+
two_factor_method: app
158159
two_factor_token: WT65ANYXBB2SBR7III7IVWNJDS4PQF2T
159160
backup_2fa_code: M8lENyehyCvo9F9MbyTl1aOL
160161

0 commit comments

Comments
 (0)