diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-08-01 18:38:42 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-08-01 18:38:42 +0200 |
| commit | 45432cba9f524c99015c90b6b6aa381fe2b04984 (patch) | |
| tree | 35345a3efedeaa1bd63db09ff99ac23187c081e3 /test | |
| parent | 4175f26cc8b22ff5a07929fa2436c561022cccd2 (diff) | |
Require a second factor for elevation, not for holding admin
Diffstat (limited to 'test')
| -rw-r--r-- | test/controllers/users_controller_test.rb | 12 | ||||
| -rw-r--r-- | test/models/user_otp_test.rb | 32 |
2 files changed, 44 insertions, 0 deletions
diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb index 2dd0759a..0c517647 100644 --- a/test/controllers/users_controller_test.rb +++ b/test/controllers/users_controller_test.rb | |||
| @@ -273,4 +273,16 @@ class UsersControllerTest < ActionController::TestCase | |||
| 273 | 273 | ||
| 274 | assert_not user.reload.is_admin? | 274 | assert_not user.reload.is_admin? |
| 275 | end | 275 | end |
| 276 | |||
| 277 | test "clearing the factor closes an open elevation window" do | ||
| 278 | login_as :aaron | ||
| 279 | elevate_session! | ||
| 280 | get :new, params: { :locale => "de" } | ||
| 281 | assert_response :success | ||
| 282 | |||
| 283 | users(:aaron).update_column(:otp_secret, nil) | ||
| 284 | |||
| 285 | get :new, params: { :locale => "de" } | ||
| 286 | assert_redirected_to new_elevation_path | ||
| 287 | end | ||
| 276 | end | 288 | end |
diff --git a/test/models/user_otp_test.rb b/test/models/user_otp_test.rb index 81f25575..2044ac18 100644 --- a/test/models/user_otp_test.rb +++ b/test/models/user_otp_test.rb | |||
| @@ -74,6 +74,38 @@ class UserOtpTest < ActiveSupport::TestCase | |||
| 74 | assert_equal @user.login, action.metadata["target_login"] | 74 | assert_equal @user.login, action.metadata["target_login"] |
| 75 | end | 75 | end |
| 76 | 76 | ||
| 77 | test "an admin without a factor can start enrollment" do | ||
| 78 | admin = users(:aaron) | ||
| 79 | assert admin.is_admin? | ||
| 80 | assert_not admin.otp_enrolled? | ||
| 81 | |||
| 82 | uri = admin.begin_otp_enrollment! | ||
| 83 | |||
| 84 | assert admin.reload.otp_pending_secret.present? | ||
| 85 | assert uri.present? | ||
| 86 | end | ||
| 87 | |||
| 88 | test "an admin disabling their factor keeps the role" do | ||
| 89 | admin = users(:aaron) | ||
| 90 | admin.update_column(:otp_secret, ROTP::Base32.random) | ||
| 91 | |||
| 92 | admin.disable_otp!(:actor => admin) | ||
| 93 | |||
| 94 | assert_not admin.reload.otp_enrolled? | ||
| 95 | assert admin.is_admin? | ||
| 96 | end | ||
| 97 | |||
| 98 | test "a fellow admin can reset an admin's factor" do | ||
| 99 | admin = users(:aaron) | ||
| 100 | admin.update_column(:otp_secret, ROTP::Base32.random) | ||
| 101 | actor = users(:redella) | ||
| 102 | |||
| 103 | admin.disable_otp!(:actor => actor) | ||
| 104 | |||
| 105 | assert_not admin.reload.otp_enrolled? | ||
| 106 | assert_equal "otp_reset", NodeAction.last.action | ||
| 107 | end | ||
| 108 | |||
| 77 | private | 109 | private |
| 78 | 110 | ||
| 79 | def enroll!(user) | 111 | def enroll!(user) |
