diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 25ca387a78e..f3b5a9659b2 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -4,10 +4,11 @@ var/global/file_uid = 0 var/filename = "NewFile" // Placeholder. No spacebars var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case var/size = 1 // File size in GQ. Integers only! - var/obj/item/computer_hardware/hard_drive/holder // Holder that contains this file. + var/obj/item/computer_hardware/hard_drive/holder // Holder that contains this file. var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means. var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc. var/uid // UID of this file + var/password = "" // Placeholder for password. /datum/computer_file/New() ..() @@ -36,4 +37,14 @@ var/global/file_uid = 0 else temp.filename = filename temp.filetype = filetype - return temp \ No newline at end of file + temp.password = password + return temp + +/datum/computer_file/proc/can_access_file(mob/user, input_password = "") + if(!password) + return TRUE + if(!input_password) + input_password = sanitize(input(user, "Please enter a password to access file '[filename]':")) + if(input_password == password) + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 89fea156510..23b2cdab7ab 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -55,7 +55,8 @@ "name" = F.filename, "type" = F.filetype, "size" = F.size, - "undeletable" = F.undeletable + "undeletable" = F.undeletable, + "encrypted" = !!F.password ))) data["files"] = files if(RHDD) @@ -66,7 +67,8 @@ "name" = F.filename, "type" = F.filetype, "size" = F.size, - "undeletable" = F.undeletable + "undeletable" = F.undeletable, + "encrypted" = !!F.password ))) data["usbfiles"] = usbfiles @@ -83,6 +85,9 @@ switch(href_list["action"]) if("PRG_openfile") . = 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"]) + if(!F.can_access_file(usr)) + return open_file = href_list["name"] if("PRG_newtextfile") . = 1 @@ -197,4 +202,27 @@ if(!F || !istype(F)) return 1 var/datum/computer_file/C = F.clone(0) - HDD.store_file(C) \ No newline at end of file + HDD.store_file(C) + if("PRG_encrypt") + . = 1 + if(!HDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"]) + if(!F || F.undeletable) + return 1 + if(F.password) + return + var/new_password = sanitize(input(usr, "Enter an encryption key:", "Encrypt File")) + if(!new_password) + to_chat(usr, "File not encrypted.") + return + F.password=new_password + if("PRG_decrypt") + . = 1 + if(!HDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"]) + if(!F || F.undeletable) + return 1 + if(F.can_access_file(usr)) + F.password = "" \ No newline at end of file diff --git a/nano/templates/file_manager.tmpl b/nano/templates/file_manager.tmpl index 1bdb0cd95c4..51d40b84475 100644 --- a/nano/templates/file_manager.tmpl +++ b/nano/templates/file_manager.tmpl @@ -32,6 +32,11 @@ {{:helper.link('DELETE', 'trash', {'action' : 'PRG_deletefile', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{:helper.link('RENAME', 'pencil', {'action' : 'PRG_rename', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{:helper.link('CLONE', 'files-o', {'action' : 'PRG_clone', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} + {{if !value.encrypted}} + {{:helper.link('ENCRYPT', null, {'action' : 'PRG_encrypt', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} + {{else}} + {{:helper.link('DECRYPT', null, {'action' : 'PRG_decrypt', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} + {{/if}} {{if data.usbconnected}} {{:helper.link('EXPORT', 'upload', {'action' : 'PRG_copytousb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{/if}}