From 9dd566a5867c821c4f5f17ad141ec5e3ea5ce4c0 Mon Sep 17 00:00:00 2001
From: Jordie <4343468+Jordie0608@users.noreply.github.com>
Date: Fri, 27 Jul 2018 16:15:41 +1000
Subject: [PATCH] Change +everything admin flag to not use ALL define (#39142)
* change +everything admin flag to not use ALL define
* add proc to handle max flag value changing update to db
---
code/__DEFINES/admin.dm | 2 +-
code/__HELPERS/roundend.dm | 25 +++++++++++++++++++++++++
code/controllers/subsystem/ticker.dm | 1 +
code/modules/admin/admin_ranks.dm | 12 +++++++++---
code/modules/admin/holder2.dm | 2 +-
code/modules/client/client_procs.dm | 2 +-
6 files changed, 38 insertions(+), 6 deletions(-)
diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 255464d4068..811761c582b 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -38,7 +38,7 @@
#define R_DEFAULT R_AUTOLOGIN
-#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
+#define R_EVERYTHING (1<<15)-1 //the sum of all other rank permissions, used for +EVERYTHING
#define ADMIN_QUE(user) "(?)"
#define ADMIN_FLW(user) "(FLW)"
diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm
index e86c57ac24b..5c2a4c42529 100644
--- a/code/__HELPERS/roundend.dm
+++ b/code/__HELPERS/roundend.dm
@@ -543,3 +543,28 @@
file_data["admins"]["[i]"] = A.rank.name
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
+
+/datum/controller/subsystem/ticker/proc/update_everything_flag_in_db()
+ for(var/datum/admin_rank/R in GLOB.admin_ranks)
+ var/list/flags = list()
+ if(R.include_rights == R_EVERYTHING)
+ flags += "flags"
+ if(R.exclude_rights == R_EVERYTHING)
+ flags += "exclude_flags"
+ if(R.can_edit_rights == R_EVERYTHING)
+ flags += "can_edit_flags"
+ if(!flags.len)
+ continue
+ var/flags_to_check = flags.Join(" != [R_EVERYTHING] AND ") + " != [R_EVERYTHING]"
+ var/datum/DBQuery/query_check_everything_ranks = SSdbcore.NewQuery("SELECT flags, exclude_flags, can_edit_flags FROM [format_table_name("admin_ranks")] WHERE rank = '[R.name]' AND ([flags_to_check])")
+ if(!query_check_everything_ranks.Execute())
+ qdel(query_check_everything_ranks)
+ return
+ if(query_check_everything_ranks.NextRow()) //no row is returned if the rank already has the correct flag value
+ var/flags_to_update = flags.Join(" = [R_EVERYTHING], ") + " = [R_EVERYTHING]"
+ var/datum/DBQuery/query_update_everything_ranks = SSdbcore.NewQuery("UPDATE [format_table_name("admin_ranks")] SET [flags_to_update] WHERE rank = '[R.name]'")
+ if(!query_update_everything_ranks.Execute())
+ qdel(query_update_everything_ranks)
+ return
+ qdel(query_update_everything_ranks)
+ qdel(query_check_everything_ranks)
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 02af7be0d83..0f93ddfb1cc 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -626,6 +626,7 @@ SUBSYSTEM_DEF(ticker)
/datum/controller/subsystem/ticker/Shutdown()
gather_newscaster() //called here so we ensure the log is created even upon admin reboot
save_admin_data()
+ update_everything_flag_in_db()
if(!round_end_sound)
round_end_sound = pick(\
'sound/roundend/newroundsexy.ogg',
diff --git a/code/modules/admin/admin_ranks.dm b/code/modules/admin/admin_ranks.dm
index 9fcde1f5014..bfd4ec54941 100644
--- a/code/modules/admin/admin_ranks.dm
+++ b/code/modules/admin/admin_ranks.dm
@@ -71,7 +71,7 @@ GLOBAL_PROTECT(protected_ranks)
if("varedit")
flag = R_VAREDIT
if("everything","host","all")
- flag = ALL
+ flag = R_EVERYTHING
if("sound","sounds")
flag = R_SOUNDS
if("spawn","create")
@@ -182,9 +182,12 @@ GLOBAL_PROTECT(protected_ranks)
return FALSE
var/list/json = json_decode(backup_file)
for(var/J in json["ranks"])
+ var/skip
for(var/datum/admin_rank/R in GLOB.admin_ranks)
if(R.name == "[J]") //this rank was already loaded from txt override
- continue
+ skip = TRUE
+ if(skip)
+ continue
var/datum/admin_rank/R = new("[J]", json["ranks"]["[J]"]["include rights"], json["ranks"]["[J]"]["exclude rights"], json["ranks"]["[J]"]["can edit rights"])
if(!R)
continue
@@ -266,9 +269,12 @@ GLOBAL_PROTECT(protected_ranks)
return
backup_file_json = json_decode(backup_file)
for(var/J in backup_file_json["admins"])
+ var/skip
for(var/A in GLOB.admin_datums + GLOB.deadmins)
if(A == "[J]") //this admin was already loaded from txt override
- continue
+ skip = TRUE
+ if(skip)
+ continue
new /datum/admins(rank_names[ckeyEx(backup_file_json["admins"]["[J]"])], ckey("[J]"))
#ifdef TESTING
var/msg = "Admins Built:\n"
diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm
index 321142376ad..11fb4e7a8b0 100644
--- a/code/modules/admin/holder2.dm
+++ b/code/modules/admin/holder2.dm
@@ -137,7 +137,7 @@ GLOBAL_PROTECT(href_token)
/datum/admins/proc/check_if_greater_rights_than_holder(datum/admins/other)
if(!other)
return 1 //they have no rights
- if(rank.rights == 65535)
+ if(rank.rights == R_EVERYTHING)
return 1 //we have all the rights
if(src == other)
return 1 //you always have more rights than yourself
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 22879e35d90..626b5eb6998 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -188,7 +188,7 @@ GLOBAL_LIST_EMPTY(external_rsc_urls)
if(CONFIG_GET(flag/enable_localhost_rank) && !connecting_admin)
var/localhost_addresses = list("127.0.0.1", "::1")
if(isnull(address) || (address in localhost_addresses))
- var/datum/admin_rank/localhost_rank = new("!localhost!", 65535, 16384, 65535) //+EVERYTHING -DBRANKS *EVERYTHING
+ var/datum/admin_rank/localhost_rank = new("!localhost!", R_EVERYTHING, R_DBRANKS, R_EVERYTHING) //+EVERYTHING -DBRANKS *EVERYTHING
new /datum/admins(localhost_rank, ckey, 1, 1)
//preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum)
prefs = GLOB.preferences_datums[ckey]