Patch #44368 » 0001-Revert-Removes-ignored-and-unnecessary-scope-in-twof.patch
| lib/redmine/twofa/base.rb | ||
|---|---|---|
| 112 | 112 |
code = code.to_s.remove(/[[:space:]]/).downcase |
| 113 | 113 |
user_from_code = Token.find_active_user('twofa_backup_code', code)
|
| 114 | 114 |
# invalidate backup code after usage |
| 115 |
Token.find_token('twofa_backup_code', code).try(:delete)
|
|
| 115 |
Token.where(user_id: @user.id).find_token('twofa_backup_code', code).try(:delete)
|
|
| 116 | 116 |
# make sure the user using the backup code is the same it's been issued to |
| 117 | 117 |
return false unless @user.present? && @user == user_from_code |
| 118 | 118 | |
| test/unit/lib/redmine/twofa_test.rb | ||
|---|---|---|
| 1 |
# frozen_string_literal: true |
|
| 2 | ||
| 3 |
require File.expand_path('../../../../test_helper', __FILE__)
|
|
| 4 | ||
| 5 |
class Redmine::TwofaTest < ActiveSupport::TestCase |
|
| 6 |
fixtures :users, :email_addresses |
|
| 7 | ||
| 8 |
def setup |
|
| 9 |
@user = User.find_by_login 'jsmith' |
|
| 10 |
@other_user = User.find_by_login 'dlopper' |
|
| 11 |
end |
|
| 12 | ||
| 13 |
test "verify_backup_code! accepts and invalidates the user's own backup code" do |
|
| 14 |
token = backup_code_for @user, 'abcdef123456' |
|
| 15 | ||
| 16 |
assert Redmine::Twofa::Totp.new(@user).verify_backup_code!('abcdef123456')
|
|
| 17 |
assert_nil Token.find_by_id(token.id) |
|
| 18 |
end |
|
| 19 | ||
| 20 |
test "verify_backup_code! rejects but keeps another user's backup code" do |
|
| 21 |
token = backup_code_for @other_user, 'abcdef654321' |
|
| 22 | ||
| 23 |
assert_not Redmine::Twofa::Totp.new(@user).verify_backup_code!('abcdef654321')
|
|
| 24 |
assert Token.find_by_id(token.id), "backup code of another user must not be deleted" |
|
| 25 |
end |
|
| 26 | ||
| 27 |
private |
|
| 28 | ||
| 29 |
# creates a backup code token the same way Redmine::Twofa::Base#init_backup_codes! does |
|
| 30 |
def backup_code_for(user, value) |
|
| 31 |
token = Token.create!(user_id: user.id, action: 'twofa_backup_code') |
|
| 32 |
token.update_columns value: value |
|
| 33 |
token |
|
| 34 |
end |
|
| 35 |
end |
|