summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-08-01 18:38:42 +0200
committererdgeist <erdgeist@erdgeist.org>2026-08-01 18:38:42 +0200
commit45432cba9f524c99015c90b6b6aa381fe2b04984 (patch)
tree35345a3efedeaa1bd63db09ff99ac23187c081e3 /test
parent4175f26cc8b22ff5a07929fa2436c561022cccd2 (diff)
Require a second factor for elevation, not for holding admin
Diffstat (limited to 'test')
-rw-r--r--test/controllers/users_controller_test.rb12
-rw-r--r--test/models/user_otp_test.rb32
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
276end 288end
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)