Granular admin perms (#66368)

* Granular admin perms

* Implement temporary user specific permissions menu

* Restore config

* Fix TESTING
This commit is contained in:
Mothblocks
2022-05-03 21:59:22 -07:00
committed by GitHub
parent e985312f0d
commit 0204332c8d
14 changed files with 239 additions and 199 deletions
+34 -12
View File
@@ -10,7 +10,7 @@ GLOBAL_PROTECT(href_token)
#define RESULT_2FA_ID 2
/datum/admins
var/datum/admin_rank/rank
var/list/datum/admin_rank/ranks
var/target
var/name = "nobody's admin datum (no rank)" //Makes for better runtimes
@@ -43,7 +43,7 @@ GLOBAL_PROTECT(href_token)
/// A lazylist of tagged datums, for quick reference with the View Tags verb
var/list/tagged_datums
/datum/admins/New(datum/admin_rank/R, ckey, force_active = FALSE, protected)
/datum/admins/New(list/datum/admin_rank/ranks, ckey, force_active = FALSE, protected)
if(IsAdminAdvancedProcCall())
var/msg = " has tried to elevate permissions!"
message_admins("[key_name_admin(usr)][msg]")
@@ -55,21 +55,21 @@ GLOBAL_PROTECT(href_token)
if(!ckey)
QDEL_IN(src, 0)
CRASH("Admin datum created without a ckey")
if(!istype(R))
if(!istype(ranks))
QDEL_IN(src, 0)
CRASH("Admin datum created without a rank")
CRASH("Admin datum created with invalid ranks: [ranks] ([json_encode(ranks)])")
target = ckey
name = "[ckey]'s admin datum ([R])"
rank = R
name = "[ckey]'s admin datum ([join_admin_ranks(ranks)])"
src.ranks = ranks
admin_signature = "Nanotrasen Officer #[rand(0,9)][rand(0,9)][rand(0,9)]"
href_token = GenerateToken()
if(!CONFIG_GET(flag/forbid_admin_profiling))
if(R.rights & R_DEBUG) //grant profile access, assuming admin profile access is enabled
if(rank_flags() & R_DEBUG) //grant profile access, assuming admin profile access is enabled
world.SetConfig("APP/admin", ckey, "role=admin")
//only admins with +ADMIN start admined
if(protected)
GLOB.protected_admins[target] = src
if (force_active || (R.rights & R_AUTOADMIN))
if (force_active || (rank_flags() & R_AUTOADMIN))
activate()
else
deactivate()
@@ -166,7 +166,7 @@ GLOBAL_PROTECT(href_token)
owner = null
/datum/admins/proc/check_for_rights(rights_required)
if(rights_required && !(rights_required & rank.rights))
if(rights_required && !(rights_required & rank_flags()))
return FALSE
return TRUE
@@ -174,12 +174,12 @@ GLOBAL_PROTECT(href_token)
/datum/admins/proc/check_if_greater_rights_than_holder(datum/admins/other)
if(!other)
return TRUE //they have no rights
if(rank.rights == R_EVERYTHING)
if(rank_flags() == R_EVERYTHING)
return TRUE //we have all the rights
if(src == other)
return TRUE //you always have more rights than yourself
if(rank.rights != other.rank.rights)
if( (rank.rights & other.rank.rights) == other.rank.rights )
if(rank_flags() != other.rank_flags())
if( (rank_flags() & other.rank_flags()) == other.rank_flags() )
return TRUE //we have all the rights they have and more
return FALSE
@@ -331,6 +331,28 @@ GLOBAL_PROTECT(href_token)
confidential = TRUE,
)
/// Get the rank name of the admin
/datum/admins/proc/rank_names()
return join_admin_ranks(ranks)
/// Get the rank flags of the admin
/datum/admins/proc/rank_flags()
var/combined_flags = NONE
for (var/datum/admin_rank/rank as anything in ranks)
combined_flags |= rank.rights
return combined_flags
/// Get the permissions this admin is allowed to edit on other ranks
/datum/admins/proc/can_edit_rights_flags()
var/combined_flags = NONE
for (var/datum/admin_rank/rank as anything in ranks)
combined_flags |= rank.can_edit_rights
return combined_flags
/datum/admins/vv_edit_var(var_name, var_value)
return FALSE //nice try trialmin