From 4c0a074b6d167b152a88df5ee42c15880303863e Mon Sep 17 00:00:00 2001 From: juhnsa Date: Tue, 26 Aug 2025 00:54:30 +0200 Subject: [PATCH] Initial commit --- tg_client/key | 1 + tg_client/tg_client.lua | 64 +++++++++++++++++++++++++ tg_server/taskguard.cfg | 7 +++ tg_server/tg_server.lua | 96 +++++++++++++++++++++++++++++++++++++ tg_server/verified_keys.txt | 1 + 5 files changed, 169 insertions(+) create mode 100644 tg_client/key create mode 100644 tg_client/tg_client.lua create mode 100644 tg_server/taskguard.cfg create mode 100644 tg_server/tg_server.lua create mode 100644 tg_server/verified_keys.txt diff --git a/tg_client/key b/tg_client/key new file mode 100644 index 0000000..5622b1a --- /dev/null +++ b/tg_client/key @@ -0,0 +1 @@ +admin,10,82930ftm4un \ No newline at end of file diff --git a/tg_client/tg_client.lua b/tg_client/tg_client.lua new file mode 100644 index 0000000..b0af518 --- /dev/null +++ b/tg_client/tg_client.lua @@ -0,0 +1,64 @@ +local args = {...} + +local function split(str, divider) + local t = {} + for part in string.gmatch(str, "([^" .. divider .. "]+)") do + table.insert(t, part) + end + return t +end + +local function establish_connection() + local peripherals = peripheral.getNames() + for _, side in ipairs(peripherals) do + if peripheral.getType(side) == "modem" then + rednet.open(side) + print("Opened modem: "..side) + return true + end + end + print("No modem found!") + return false +end + +function validate_clearance(computer_id, clearance_level, tg_server_name) + if establish_connection() then + tg_server_id = rednet.lookup("tg", tg_server_name) + rednet.send(tg_server_id, "validate_clearance,"..computer_id..","..clearance_level) + local id, msg, proto = rednet.receive("tg") + if msg == "granted" then + return true + else + return false, "authentication failed" + end + else + return false, "modem not found" + end +end + +if fs.exists('/disk/key') then + key_file = fs.open('/disk/key', 'r') + key = key_file.readLine() + if establish_connection() then + local tg_server_name = "tg_server" + + tg_server_id = rednet.lookup("tg", tg_server_name) + rednet.send(tg_server_id, "authenticate,"..key,"tg") + local id, msg, proto = rednet.receive("tg") + + if msg == "authentication successful" then + key_parts = split(key,',') + local card_holder = key_parts[1] + local card_clearance = key_parts[2] + print("Authentication was successful.") + print("Hello "..card_holder..", you were granted clearance level "..card_clearance.." for this computer.") + else + print("Authentication failed.") + end + else + return false, "modem not found" + end + key_file.close() +else + print("Key file not found. Aborting.") +end \ No newline at end of file diff --git a/tg_server/taskguard.cfg b/tg_server/taskguard.cfg new file mode 100644 index 0000000..3990def --- /dev/null +++ b/tg_server/taskguard.cfg @@ -0,0 +1,7 @@ +local config = { + name = "tg_server", + modem_side = "top", + clearance_expiry = 600, -- Minutes until clearance will expire + key_file = "verified_keys.txt", -- Name of the key file, relative to tg_server.lua +} +return config \ No newline at end of file diff --git a/tg_server/tg_server.lua b/tg_server/tg_server.lua new file mode 100644 index 0000000..dbc5115 --- /dev/null +++ b/tg_server/tg_server.lua @@ -0,0 +1,96 @@ +local fullPath = shell.getRunningProgram() +local dir = fullPath:match("^(.*/)") or "" + +local config = dofile(dir..'taskguard.cfg') + +local clearances = { { computer_id = 1, clearance_level = 1, time_granted = os.clock() } } + +local function split(str, divider) + local t = {} + for part in string.gmatch(str, "([^" .. divider .. "]+)") do + table.insert(t, part) + end + return t +end + +local function hash(str) + local hash = 0 + for i = 1, #str do + hash = (hash * 31 + string.byte(str, i)) % 65536 + end + return string.format("%04X", hash) +end + + +local function check_for_outdated_sessions() + local expired = 0 + for i = #clearances, 1, -1 do + if (os.clock() - clearances[i].time_granted) > config.clearance_expiry then + table.remove(clearances, i) + expired = expired + 1 + end + end + print("Removed " .. expired .. " expired clearance(s). " .. + #clearances .. " active session(s) remain.") +end + + + +rednet.open(config.modem_side) +rednet.host('tg', config.name) +print("Server started, waiting for requests...") + +while true do + local id, msg, proto = rednet.receive('tg') + check_for_outdated_sessions() + msg_parts = split(msg, ',') + if msg_parts[1] == 'validate_clearance' then + print("Beginning transaction for clearance query with "..id) + local target_id = tonumber(msg_parts[2]) + local requested_clearance = tonumber(msg_parts[3]) + local has_clearance = false + + for i, entry in ipairs(clearances) do + if entry.computer_id == target_id and entry.clearance_level >= requested_clearance then + -- Auth granted + rednet.send(id, 'granted', 'tg') + print('Finished transaction, granted') + has_clearance = true + end + end + + if has_clearance == false then + -- Auth not granted + rednet.send(id, 'failed', 'tg') + print('Finished transaction, failed') + end + print("EOP") + elseif msg_parts[1] == 'authenticate' then + print("Beginning transaction for authentication with "..id) + local card_holder = msg_parts[2] + local card_clearance = msg_parts[3] + local card_hash = hash(card_holder..','..card_clearance..','..msg_parts[4]) + local key_file = fs.open(dir..config.key_file, 'r') + local card_authentic = false + + while true do + local trusted_hash = key_file.readLine() + if trusted_hash == card_hash then + table.insert(clearances, { computer_id = tonumber(id), clearance_level = tonumber(card_clearance), time_granted = os.clock() }) + rednet.send(id, "authentication successful", "tg") + print("Granted card "..card_hash.." clearance level "..card_clearance) + + card_authentic = true + end + if not line then break end -- Stop when EOF reached + end + + key_file.close() + + if card_authentic == false then + print("Unknown card "..card_hash) + rednet.send(id, "authentication failed", "tg") + end + print("Transaction finished") + end +end \ No newline at end of file diff --git a/tg_server/verified_keys.txt b/tg_server/verified_keys.txt new file mode 100644 index 0000000..501dacb --- /dev/null +++ b/tg_server/verified_keys.txt @@ -0,0 +1 @@ +DE1A