From 34a4bb26bdb1721bb1affd62c9639dac3125046e Mon Sep 17 00:00:00 2001 From: PsiOmega Date: Wed, 18 Mar 2015 08:17:46 +0100 Subject: [PATCH] Silicon law management update. Adds missing Topic/href checks, reducing risk of exploits. Ensures a silicon cannot get stuck on the second law management page should it suddenly be un-malfed. Changes Malf definition. This allows borgs to view and state alternative law sets, while disallowing law edits (for as long as they are slaved/not traitors themselves). --- code/modules/nano/modules/law_manager.dm | 50 ++++++++++++++++-------- nano/templates/law_manager.tmpl | 8 ++-- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index 2f1d6d95782..a152411283f 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -34,7 +34,7 @@ return 1 if(href_list["set_view"]) - if(is_malf(usr)) + if(is_malf(usr) || owner.is_ai_malf()) current_view = text2num(href_list["set_view"]) else current_view = 0 @@ -71,7 +71,7 @@ return 1 if(href_list["add_supplied_law"]) - if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER) + if(supplied_law && supplied_law_position >= 1 && MIN_SUPPLIED_LAW_NUMBER <= MAX_SUPPLIED_LAW_NUMBER && is_malf(usr)) log_and_message_admins("has given [owner] a new supplied law: [supplied_law]") owner.add_supplied_law(supplied_law_position, supplied_law) return 1 @@ -135,11 +135,12 @@ return 1 if(href_list["transfer_laws"]) - var/datum/ai_laws/ALs = locate(href_list["transfer_laws"]) in (is_admin(usr) ? admin_laws : player_laws) - if(ALs) - log_and_message_admins("has transfered the [ALs.name] laws to [owner].") - ALs.sync(owner, 0) - current_view = 0 + if(is_malf(usr)) + var/datum/ai_laws/ALs = locate(href_list["transfer_laws"]) in (is_admin(usr) ? admin_laws : player_laws) + if(ALs) + log_and_message_admins("has transfered the [ALs.name] laws to [owner].") + ALs.sync(owner, 0) + current_view = 0 return 1 if(href_list["sync_laws"]) @@ -167,8 +168,6 @@ var/data[0] owner.laws.sort_laws() - data["view"] = current_view - data["ion_law_nr"] = ionnum() data["ion_law"] = ion_law data["zeroth_law"] = zeroth_law @@ -183,16 +182,21 @@ data["isAI"] = owner.isAI() data["isMalf"] = is_malf(user) - data["isSlaved"] = is_slaved() + data["isAIMalf"] = owner.is_ai_malf() + data["isSlaved"] = owner.is_slaved() data["isAdmin"] = is_admin(user) + if(!(data["isMalf"] || data["isAIMalf"])) + current_view = 0 + data["view"] = current_view + var/channels[0] for (var/ch_name in owner.law_channels()) channels[++channels.len] = list("channel" = ch_name) data["channel"] = owner.lawchannel data["channels"] = channels - if(data["isMalf"]) + if(data["isMalf"] || data["isAIMalf"]) data["law_sets"] = package_multiple_laws(data["isAdmin"] ? admin_laws : player_laws) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) @@ -222,13 +226,25 @@ return law_sets /obj/nano_module/law_manager/proc/is_malf(var/mob/user) - return is_admin(user) || (owner.mind && (owner.mind.special_role == "malfunction" || owner.mind.special_role == "traitor")) + return (is_admin(user) && !owner.is_slaved()) || owner.is_malf_loose() -/obj/nano_module/law_manager/proc/is_slaved() - if(owner.isRobot()) - var/mob/living/silicon/robot/R = owner - return R.lawupdate && R.connected_ai ? sanitize(R.connected_ai.name) : null - return null +/mob/living/silicon/proc/is_malf_loose() + return mind && (mind.special_role == "malfunction" || mind.special_role == "traitor") + +/mob/living/silicon/proc/is_ai_malf() + return 0 + +/mob/living/silicon/robot/is_ai_malf() + return is_slaved() && connected_ai.is_malf_loose() + +/mob/living/silicon/ai/is_ai_malf() + return 0 + +/mob/living/silicon/proc/is_slaved() + return 0 + +/mob/living/silicon/robot/is_slaved() + return lawupdate && connected_ai ? sanitize(connected_ai.name) : null /obj/nano_module/law_manager/proc/sync_laws(var/mob/living/silicon/ai/AI) if(!AI) diff --git a/nano/templates/law_manager.tmpl b/nano/templates/law_manager.tmpl index 9b0ed3a8187..4dcc756b7db 100644 --- a/nano/templates/law_manager.tmpl +++ b/nano/templates/law_manager.tmpl @@ -41,11 +41,11 @@ } -{{if data.isSlaved != null && data.isMalf}} - This unit is slaved to {{:data.isSlaved}}. Any law changes will be reset on sync. +{{if data.isSlaved && data.isAdmin}} + This unit is law synced to {{:data.isSlaved}}. Any law differences will be lost upon sync. {{/if}} -{{if data.isMalf}} +{{if data.isMalf || data.isAIMalf}}
{{:helper.link('Law Management', null, {'set_view' : 0}, data.view == 0 ? 'selected' : null)}} @@ -255,7 +255,7 @@

- {{:helper.link('Load Laws', null, {'transfer_laws' : value.ref})}}{{:helper.link('State Laws', null, {'state_law_set' : value.ref})}} + {{:helper.link('Load Laws', null, {'transfer_laws' : value.ref}, data.isSlaved ? 'disabled' : null)}}{{:helper.link('State Laws', null, {'state_law_set' : value.ref})}}
{{/for}}