Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /obj/machinery/computer/exonet/access_directory
- name = "EXONET Access Controller"
- desc = "A very complex machine that manages the security for an EXONET system. Looks fragile."
- active_power_usage = 4 KILOWATTS
- ui_template = "exonet_access_directory.tmpl"
- // These are program stateful variables.
- var/file_server // What file_server we're viewing. This is a net_tag or other.
- var/editing_user // If we're editing a user, it's assigned here.
- var/awaiting_cortical_scan // If this is true, we're waiting for someone to touch the stupid interface so that'll add a new user record.
- var/last_scan // The UID of the person last scanned by this machine. Do not deserialize this. It's worthless.
- var/list/initial_grants // List of initial grants the machine can try to make on first loadup.
- var/error // Currently displayed error.
- /obj/machinery/computer/exonet/access_directory/on_update_icon()
- if(operable())
- icon_state = "bus"
- else
- icon_state = "bus_off"
- /obj/machinery/computer/exonet/access_directory/Initialize()
- ..()
- return INITIALIZE_HINT_LATELOAD
- /obj/machinery/computer/exonet/access_directory/LateInitialize()
- if(initial_grants)
- var/datum/extension/exonet_device/exonet = get_extension(src, /datum/extension/exonet_device)
- if(!file_server)
- var/list/mainframes = exonet.get_mainframes()
- if(mainframes.len <= 0)
- .["error"] = "NETWORK ERROR: No mainframes are available for storing security records."
- return .
- var/obj/machinery/computer/exonet/mainframe/MF = mainframes[1]
- file_server = exonet.get_network_tag(MF)
- for(var/initial_grant in initial_grants)
- var/datum/computer_file/data/grant_record/GR = new()
- GR.set_value(initial_grant)
- MF.store_file(GR)
- initial_grants = null
- // Gets all grants on the machine we're currently linked to.
- /obj/machinery/computer/exonet/access_directory/proc/get_all_grants()
- var/datum/extension/exonet_device/exonet = get_extension(src, /datum/extension/exonet_device)
- var/obj/machinery/computer/exonet/mainframe/mainframe = exonet.get_device_by_tag(file_server)
- if(!mainframe)
- return list() // No connection.
- var/list/grants = list()
- for(var/datum/computer_file/data/grant_record/GR in mainframe.stored_files)
- LAZYDISTINCTADD(grants, GR)
- return grants
- // Get the access record for the user we're *currently* editing.
- /obj/machinery/computer/exonet/access_directory/proc/get_access_record()
- var/datum/extension/exonet_device/exonet = get_extension(src, /datum/extension/exonet_device)
- var/obj/machinery/computer/exonet/mainframe/mainframe = exonet.get_device_by_tag(file_server)
- if(!mainframe)
- return
- for(var/datum/computer_file/data/access_record/AR in mainframe.stored_files)
- if(AR.user_id != editing_user)
- continue
- return AR
- /obj/machinery/computer/exonet/access_directory/Topic(href, href_list)
- if(..())
- return 1
- var/datum/extension/exonet_device/exonet = get_extension(src, /datum/extension/exonet_device)
- if(href_list["PRG_back"])
- error = null
- editing_user = null
- if(href_list["PRG_changefileserver"])
- var/old_value = file_server
- var/list/file_servers = list()
- for(var/obj/machinery/computer/exonet/mainframe/mainframe in exonet.get_mainframes())
- LAZYDISTINCTADD(file_servers, exonet.get_network_tag(mainframe))
- file_server = sanitize(input(usr, "Choose a fileserver to view access records on:", "Select File Server") as null|anything in file_servers)
- if(!file_server)
- file_server = old_value // Safety check.
- if(href_list["PRG_assigngrant"])
- var/list/all_grants = get_all_grants()
- var/list/grant_values = list()
- // Make a pretty list for UI.
- for(var/datum/computer_file/data/grant_record/GR in all_grants)
- LAZYDISTINCTADD(grant_values, GR.stored_data)
- var/selected_grant = sanitize(input(usr, "Choose a grant to assign to this user:", "Assign Grant") as null|anything in grant_values)
- if(!selected_grant)
- return 1 // Chose nothing.
- // Resolve our selection back to a file.
- var/datum/computer_file/data/grant_record/grant
- for(var/datum/computer_file/data/grant_record/GR in all_grants)
- if(selected_grant == GR.stored_data)
- grant = GR
- break
- var/datum/computer_file/data/access_record/AR = get_access_record()
- if(!AR)
- error = "ERROR: Access record not found."
- return 1
- AR.add_grant(grant) // Add the grant to the record.
- // if(href_list["PRG_creategrant"])
- // if(href_list["PRG_deletegrant"])
- if(href_list["PRG_adduser"])
- var/new_user_id = sanitize(input(usr, "Enter user's PLEXUS ID or leave blank to cancel:", "Add New User"))
- if(!new_user_id)
- return 1
- var/new_user_name = sanitize(input(usr, "Enter user's desired name or leave blank to cancel:", "Add New User"))
- if(!new_user_name)
- return 1
- // TODO: Add a check to see if this user actually exists if PLEXUS is online.
- // Add the record.
- var/datum/computer_file/data/access_record/new_record = new()
- new_record.filename = "[replacetext(new_user_name, " ", "_")]"
- new_record.user_id = new_user_id
- new_record.desired_name = new_user_name
- new_record.ennid = ennid
- var/obj/machinery/computer/exonet/mainframe/mainframe = exonet.get_device_by_tag(file_server)
- if(!mainframe)
- error = "NETWORK ERROR: Lost connection to mainframe. Unable to save user access record."
- return 1
- if(!mainframe.try_store_file(new_record))
- error = "MAINFRAME ERROR: Unable to store record on mainframe."
- return 1
- editing_user = new_user_id
- if(href_list["PRG_viewuser"])
- editing_user = href_list["PRG_viewuser"]
- // if(href_list["PRG_deleteuser"])
- // if(href_list["PRG_rename"])
- return 1
- /obj/machinery/computer/exonet/access_directory/build_ui_data()
- . = ..()
- if(error)
- .["error"] = error
- return .
- var/datum/extension/exonet_device/exonet = get_extension(src, /datum/extension/exonet_device)
- if(!file_server)
- var/list/mainframes = exonet.get_mainframes()
- if(length(mainframes) <= 0)
- .["error"] = "NETWORK ERROR: No mainframes are available for storing security records."
- return .
- file_server = exonet.get_network_tag(mainframes[1])
- .["file_server"] = file_server
- .["editing_user"] = editing_user
- .["awaiting_cortical_scan"] = awaiting_cortical_scan
- if(awaiting_cortical_scan)
- return .
- // Let's build some data.
- var/obj/machinery/computer/exonet/mainframe/mainframe = exonet.get_device_by_tag(file_server)
- if(!mainframe || !mainframe.operable())
- .["error"] = "NETWORK ERROR: Mainframe is offline."
- return .
- if(editing_user)
- .["user_id"] = editing_user
- var/list/grants = list()
- // We're editing a user, so we only need to build a subset of data.
- for(var/datum/computer_file/data/access_record/AR in mainframe.stored_files)
- if(AR.user_id != editing_user)
- continue
- .["desired_name"] = AR.desired_name
- .["grant_count"] = length(AR.get_valid_grants())
- .["size"] = AR.size
- // Oh hey here's the record we're looking for.
- for(var/datum/computer_file/data/grant_record/GR in AR.get_valid_grants())
- grants.Add(list(
- "name" = GR.stored_data
- ))
- .["grants"] = grants
- else
- // We're looking at all records. Or lack thereof.
- var/list/users = list()
- for(var/datum/computer_file/data/access_record/AR in mainframe.stored_files)
- users.Add(list(
- "desired_name" = AR.desired_name,
- "user_id" = AR.user_id,
- "grant_count" = length(AR.get_valid_grants()),
- "size" = AR.size
- ))
- .["users"] = users
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement