Project

General

Profile

Patch #44368 » 0001-Revert-Removes-ignored-and-unnecessary-scope-in-twof.patch

Jens Krämer, 2026-08-24 11:21

View differences:

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
    (1-1/1)