mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-14 03:32:00 +00:00
* [s] Fixed admins being able to bypass proccall protections via remote sdql and circuits. (#61482) About The Pull Request Admins can bypass IsAdminAdvancedProcCall checks by using these methods of proccall because proccall protection is kinda dumb. This has been tweaked so that there is proper proccall protection for these methods of proccall. Code is hacky, but there's not much of a choice if we want procs to be properly protected from admin proccalls from any sort of remote source. If anyone has a better idea on how to implement this, feel free to hit me up. We need a special global mob that handles proccalls from sources that may not have a usr/client to refer back to. IsAdminAdvancedProcCall() relies usr being defined, so if no usr is defined, then this will always return false. This has been adjusted so that proccalls without a usr/client to refer back to will instead set usr to this special mob, which will then let the IsAdminAdvancedProcCall() return true by comparing whether usr == this special global mob. Why It's Good For The Game Admins can no longer bypass IsAdminAdvancedProcCall checks. Changelog cl admin: Admins are no longer able to bypass proccall protections using remote methods of proccalling. /cl * [s] Fixed admins being able to bypass proccall protections via remote sdql and circuits. Co-authored-by: Watermelon914 <37270891+Watermelon914@users.noreply.github.com>
104 lines
3.8 KiB
Plaintext
104 lines
3.8 KiB
Plaintext
#define TGS_STATUS_THROTTLE 5
|
|
|
|
/datum/tgs_chat_command/tgsstatus
|
|
name = "status"
|
|
help_text = "Gets the admincount, playercount, gamemode, and true game mode of the server"
|
|
admin_only = TRUE
|
|
|
|
/datum/tgs_chat_command/tgsstatus/Run(datum/tgs_chat_user/sender, params)
|
|
var/list/adm = get_admin_counts()
|
|
var/list/allmins = adm["total"]
|
|
var/status = "Admins: [allmins.len] (Active: [english_list(adm["present"])] AFK: [english_list(adm["afk"])] Stealth: [english_list(adm["stealth"])] Skipped: [english_list(adm["noflags"])]). "
|
|
status += "Players: [GLOB.clients.len] (Active: [get_active_player_count(0,1,0)]). Round has [SSticker.HasRoundStarted() ? "" : "not "]started."
|
|
return status
|
|
|
|
/datum/tgs_chat_command/tgscheck
|
|
name = "check"
|
|
help_text = "Gets the playercount, gamemode, and address of the server"
|
|
|
|
/datum/tgs_chat_command/tgscheck/Run(datum/tgs_chat_user/sender, params)
|
|
var/server = CONFIG_GET(string/server)
|
|
return "[GLOB.round_id ? "Round #[GLOB.round_id]: " : ""][GLOB.clients.len] players on [SSmapping.config.map_name]; Round [SSticker.HasRoundStarted() ? (SSticker.IsRoundInProgress() ? "Active" : "Finishing") : "Starting"] -- [server ? server : "[world.internet_address]:[world.port]"]"
|
|
|
|
/datum/tgs_chat_command/ahelp
|
|
name = "ahelp"
|
|
help_text = "<ckey|ticket #> <message|ticket <close|resolve|icissue|reject|reopen <ticket #>|list>>"
|
|
admin_only = TRUE
|
|
|
|
/datum/tgs_chat_command/ahelp/Run(datum/tgs_chat_user/sender, params)
|
|
var/list/all_params = splittext(params, " ")
|
|
if(all_params.len < 2)
|
|
return "Insufficient parameters"
|
|
var/target = all_params[1]
|
|
all_params.Cut(1, 2)
|
|
var/id = text2num(target)
|
|
if(id != null)
|
|
var/datum/admin_help/AH = GLOB.ahelp_tickets.TicketByID(id)
|
|
if(AH)
|
|
target = AH.initiator_ckey
|
|
else
|
|
return "Ticket #[id] not found!"
|
|
return TgsPm(target, all_params.Join(" "), sender.friendly_name)
|
|
|
|
/datum/tgs_chat_command/namecheck
|
|
name = "namecheck"
|
|
help_text = "Returns info on the specified target"
|
|
admin_only = TRUE
|
|
|
|
/datum/tgs_chat_command/namecheck/Run(datum/tgs_chat_user/sender, params)
|
|
params = trim(params)
|
|
if(!params)
|
|
return "Insufficient parameters"
|
|
log_admin("Chat Name Check: [sender.friendly_name] on [params]")
|
|
message_admins("Name checking [params] from [sender.friendly_name]")
|
|
return keywords_lookup(params, 1)
|
|
|
|
/datum/tgs_chat_command/adminwho
|
|
name = "adminwho"
|
|
help_text = "Lists administrators currently on the server"
|
|
admin_only = TRUE
|
|
|
|
/datum/tgs_chat_command/adminwho/Run(datum/tgs_chat_user/sender, params)
|
|
return tgsadminwho()
|
|
|
|
GLOBAL_LIST(round_end_notifiees)
|
|
|
|
/datum/tgs_chat_command/endnotify
|
|
name = "endnotify"
|
|
help_text = "Pings the invoker when the round ends"
|
|
admin_only = TRUE
|
|
|
|
/datum/tgs_chat_command/endnotify/Run(datum/tgs_chat_user/sender, params)
|
|
if(!SSticker.IsRoundInProgress() && SSticker.HasRoundStarted())
|
|
return "[sender.mention], the round has already ended!"
|
|
LAZYINITLIST(GLOB.round_end_notifiees)
|
|
GLOB.round_end_notifiees[sender.mention] = TRUE
|
|
return "I will notify [sender.mention] when the round ends."
|
|
|
|
/datum/tgs_chat_command/sdql
|
|
name = "sdql"
|
|
help_text = "Runs an SDQL query"
|
|
admin_only = TRUE
|
|
|
|
/datum/tgs_chat_command/sdql/Run(datum/tgs_chat_user/sender, params)
|
|
var/list/results = HandleUserlessSDQL(sender.friendly_name, params)
|
|
if(!results)
|
|
return "Query produced no output"
|
|
var/list/text_res = results.Copy(1, 3)
|
|
var/list/refs = results.len > 3 ? results.Copy(4) : null
|
|
. = "[text_res.Join("\n")][refs ? "\nRefs: [refs.Join(" ")]" : ""]"
|
|
|
|
/datum/tgs_chat_command/reload_admins
|
|
name = "reload_admins"
|
|
help_text = "Forces the server to reload admins."
|
|
admin_only = TRUE
|
|
|
|
/datum/tgs_chat_command/reload_admins/Run(datum/tgs_chat_user/sender, params)
|
|
ReloadAsync()
|
|
log_admin("[sender.friendly_name] reloaded admins via chat command.")
|
|
return "Admins reloaded."
|
|
|
|
/datum/tgs_chat_command/reload_admins/proc/ReloadAsync()
|
|
set waitfor = FALSE
|
|
load_admins()
|