summaryrefslogtreecommitdiff
path: root/app/controllers/users_controller.rb
diff options
context:
space:
mode:
authorerdgeist <erdgeist@erdgeist.org>2026-08-01 04:14:00 +0200
committererdgeist <erdgeist@erdgeist.org>2026-08-01 04:14:00 +0200
commitabd7ee1fc2ecc15b50944db30c59bedc26ec41b6 (patch)
tree821bb8ca610664c57d9065bf62285166243500a4 /app/controllers/users_controller.rb
parent6df48c1413a14516e7ee8919f33fbc13f0141966 (diff)
Let Redaktion grant and revoke its own role
Any holder may add or remove another account, witnessed as redaktion_grant/revoke so the vouching is legible. Not behind elevation: onboarding must not wait for a keyholder, and a compromised Redaktion account can already publish.
Diffstat (limited to 'app/controllers/users_controller.rb')
-rw-r--r--app/controllers/users_controller.rb30
1 files changed, 26 insertions, 4 deletions
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 583ebac0..9b9d64e5 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -5,17 +5,17 @@ class UsersController < ApplicationController
5 # Private 5 # Private
6 6
7 before_action :login_required 7 before_action :login_required
8 before_action :find_user, :only => [:show, :edit, :update, :reset_otp, :deactivate, :reactivate] 8 before_action :find_user, :only => [:show, :edit, :update, :reset_otp, :deactivate, :reactivate, :grant_redaktion, :revoke_redaktion]
9 before_action :require_admin, :only => [:index, :new, :create, :reset_otp, :deactivate, :reactivate] 9 before_action :require_redaktion, :only => [:index]
10 before_action :require_admin, :only => [:new, :create, :reset_otp, :deactivate, :reactivate]
10 before_action :require_elevation, :only => [:new, :create, :reset_otp, :deactivate, :reactivate] 11 before_action :require_elevation, :only => [:new, :create, :reset_otp, :deactivate, :reactivate]
11 before_action :verify_status, :except => [:index] 12 before_action :verify_status, :except => [:index, :grant_redaktion, :revoke_redaktion]
12 13
13 layout 'admin' 14 layout 'admin'
14 15
15 ROLE_PRESETS = { 16 ROLE_PRESETS = {
16 "editor" => [], 17 "editor" => [],
17 "redaktion" => ["redaktion"], 18 "redaktion" => ["redaktion"],
18 "admin" => ["admin", "redaktion"]
19 }.freeze 19 }.freeze
20 20
21 GROUP_ORDER = [:admin, :redaktion, :editor, :alumni].freeze 21 GROUP_ORDER = [:admin, :redaktion, :editor, :alumni].freeze
@@ -74,6 +74,28 @@ class UsersController < ApplicationController
74 redirect_to users_path 74 redirect_to users_path
75 end 75 end
76 76
77 def grant_redaktion
78 return deny_role_access(:redaktion_required) unless current_user.redaktion?
79
80 case @user.grant_redaktion!(:actor => current_user)
81 when :granted then flash[:notice] = t("flash.users.redaktion_granted", :login => @user.login)
82 when :no_second_factor then flash[:error] = t("flash.users.redaktion_needs_otp", :login => @user.login)
83 end
84
85 redirect_to users_path
86 end
87
88 def revoke_redaktion
89 return deny_role_access(:redaktion_required) unless current_user.redaktion?
90
91 case @user.revoke_redaktion!(:actor => current_user)
92 when :revoked then flash[:notice] = t("flash.users.redaktion_revoked", :login => @user.login)
93 when :self then flash[:error] = t("flash.users.redaktion_not_self")
94 end
95
96 redirect_to users_path
97 end
98
77 def reset_otp 99 def reset_otp
78 @user.disable_otp!(:actor => current_user) 100 @user.disable_otp!(:actor => current_user)
79 flash[:notice] = t("flash.users.otp_reset", :login => @user.login) 101 flash[:notice] = t("flash.users.otp_reset", :login => @user.login)