From ec159814e2b3b875ee3fe47b192c972a6b9310c9 Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Fri, 15 Sep 2017 17:27:33 -0700 Subject: [PATCH] Add vv_can_delete, kill last vestiges of 'forbidden objects' --- code/datums/datumvars.dm | 12 +++++++++++ code/modules/admin/holder2.dm | 5 ++++- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 23 ++++++++------------ code/modules/admin/verbs/modifyvariables.dm | 14 ------------ code/modules/admin/verbs/randomverbs.dm | 24 ++++++++++++++------- code/modules/research/message_server.dm | 7 ++++++ 6 files changed, 48 insertions(+), 37 deletions(-) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index e97de99feff..b7ac60b84d7 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -39,6 +39,8 @@ return debug_variable(var_name, list(), 0, src) return debug_variable(var_name, vars[var_name], 0, src) +/datum/proc/can_vv_delete() + return TRUE //please call . = ..() first and append to the result, that way parent items are always at the top and child items are further down //add seperaters by doing . += "---" @@ -722,6 +724,16 @@ to_chat(M, "There were no ghosts willing to take control.") message_admins("No ghosts were willing to take control of [key_name_admin(M)])") + else if(href_list["delete"]) + if(!check_rights(R_DEBUG, 0)) + return + + var/datum/D = locateUID(href_list["delete"]) + if(!D) + to_chat(usr, "Unable to locate item!") + admin_delete(D) + href_list["datumrefresh"] = href_list["delete"] + else if(href_list["delall"]) if(!check_rights(R_DEBUG|R_SERVER)) return diff --git a/code/modules/admin/holder2.dm b/code/modules/admin/holder2.dm index d2d0a6c7ab5..f3715eaab31 100644 --- a/code/modules/admin/holder2.dm +++ b/code/modules/admin/holder2.dm @@ -102,4 +102,7 @@ you will have to do something like if(client.holder.rights & R_ADMIN) yourself. return 0 /datum/admins/vv_edit_var(var_name, var_value) - return FALSE // no admin abuse \ No newline at end of file + return FALSE // no admin abuse + +/datum/admins/can_vv_delete() + return FALSE // don't break shit either \ No newline at end of file diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 7b111e8ed20..859ff3ecf2b 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -89,8 +89,12 @@ if("delete") for(var/d in objs) - if(!datum_is_forbidden(d)) - qdel(d) + if(istype(d, /datum)) + var/datum/D = d + if(!D.can_vv_delete()) + to_chat(usr, "[D] rejected your deletion") + continue + qdel(d) if("select") var/text = "" @@ -118,9 +122,6 @@ if("set" in query_tree) var/list/set_list = query_tree["set"] for(var/d in objs) - // Forbid explicitly modifying an admin datum's vars - if(datum_is_forbidden(d)) - return for(var/list/sets in set_list) var/datum/temp = d var/i = 0 @@ -128,11 +129,10 @@ if(++i == sets.len) if(istype(temp, /turf) && (v == "x" || v == "y" || v == "z")) continue - if(!datum_is_forbidden(temp.vars[v])) - return - temp.vars[v] = SDQL_expression(d, set_list[sets]) + if(!temp.vv_edit_var(v, SDQL_expression(d, set_list[sets]))) + to_chat(usr, "[temp] rejected your varedit.") break - if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client)) && !datum_is_forbidden(temp.vars[v])) + if(temp.vars.Find(v) && (istype(temp.vars[v], /datum) || istype(temp.vars[v], /client))) temp = temp.vars[v] else break @@ -440,11 +440,6 @@ for(var/arg in arguments) new_args[++new_args.len] = SDQL_expression(source, arg) - for(var/p in forbidden_varedit_object_types) - if(istype(object, p)) - to_chat(usr, "It is forbidden to run this object's procs.") - return - if(object == world) // Global proc. procname = "/proc/[procname]" return call(procname)(arglist(new_args)) diff --git a/code/modules/admin/verbs/modifyvariables.dm b/code/modules/admin/verbs/modifyvariables.dm index 3ffdc455045..0ad266ecaa1 100644 --- a/code/modules/admin/verbs/modifyvariables.dm +++ b/code/modules/admin/verbs/modifyvariables.dm @@ -1,21 +1,7 @@ -var/list/forbidden_varedit_object_types = list( - /datum/admins, //Admins editing their own admin-power object? Yup, sounds like a good idea. - /obj/machinery/blackbox_recorder, //Prevents people messing with feedback gathering - /datum/feedback_variable //Prevents people messing with feedback gathering - ) - var/list/VVlocked = list("vars", "var_edited", "client", "firemut", "ishulk", "telekinesis", "xray", "ka", "virus", "viruses", "cuffed", "last_eaten", "unlock_content") // R_DEBUG var/list/VVicon_edit_lock = list("icon", "icon_state", "overlays", "underlays", "resize") // R_EVENT | R_DEBUG var/list/VVckey_edit = list("key", "ckey") // R_EVENT | R_DEBUG var/list/VVpixelmovement = list("step_x", "step_y", "bound_height", "bound_width", "bound_x", "bound_y") // R_DEBUG + warning - -/proc/datum_is_forbidden(type) - for(var/p in forbidden_varedit_object_types) - if(istype(type, p)) - to_chat(usr, "It is forbidden to tamper with this object.") - return FALSE - return TRUE - /client/proc/vv_get_class(var/var_value) if(isnull(var_value)) . = VV_NULL diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index fdfbdfba6b2..ccae0db2988 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -588,22 +588,30 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view()) +/client/proc/cmd_admin_delete(atom/A as obj|mob|turf in view()) set category = "Admin" set name = "Delete" if(!check_rights(R_ADMIN)) return - if(alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No") == "Yes") - log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])") - message_admins("[key_name_admin(usr)] deleted [O] at ([O.x],[O.y],[O.z])", 1) + admin_delete(A) + +/client/proc/admin_delete(datum/D) + if(istype(D) && !D.can_vv_delete()) + to_chat(src, "[D] rejected your deletion") + return + var/atom/A = D + var/coords = istype(A) ? "at ([A.x], [A.y], [A.z])" : "" + if(alert(src, "Are you sure you want to delete:\n[D]\n[coords]?", "Confirmation", "Yes", "No") == "Yes") + log_admin("[key_name(usr)] deleted [D][coords]") + message_admins("[key_name_admin(usr)] deleted [D][coords]", 1) feedback_add_details("admin_verb","DEL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(istype(O, /turf)) - var/turf/T = O + if(isturf(D)) + var/turf/T = D T.ChangeTurf(/turf/space) - return - qdel(O) + else + qdel(D) /client/proc/cmd_admin_list_open_jobs() set category = "Admin" diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm index 52fa9596d92..86d507d34de 100644 --- a/code/modules/research/message_server.dm +++ b/code/modules/research/message_server.dm @@ -140,6 +140,9 @@ var/global/list/obj/machinery/message_server/message_servers = list() variable = param_variable value = param_value +/datum/feedback_variable/vv_edit_var(var_name, var_value) + return FALSE // come on guys don't break the stats + /datum/feedback_variable/proc/inc(var/num = 1) if(isnum(value)) value += num @@ -189,6 +192,7 @@ var/global/list/obj/machinery/message_server/message_servers = list() var/obj/machinery/blackbox_recorder/blackbox +//TODO: kill whoever designed this cancer /obj/machinery/blackbox_recorder icon = 'icons/obj/stationobjs.dmi' icon_state = "blackbox" @@ -314,6 +318,9 @@ var/obj/machinery/blackbox_recorder/blackbox var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() +/obj/machinery/blackbox_recorder/vv_edit_var(var_name, var_value) + return FALSE // don't fuck with the stupid blackbox shit + proc/feedback_set(var/variable,var/value) if(!blackbox) return