Compare commits

...
6 Commits
4 changed files with 77 additions and 29 deletions

No files matched your search

+25 -14
View File
@@ -15,18 +15,16 @@ local function establish_connection()
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)
if establish_connection() then
tg_server_id = rednet.lookup("tg", tg_server_name)
rednet.send(tg_server_id, "validate_clearance,"..computer_id..","..clearance_level)
tg_server_id = rednet.lookup('tg', tg_server_name)
rednet.send(tg_server_id, "validate_clearance,"..computer_id..","..clearance_level,"tg")
local id, msg, proto = rednet.receive("tg")
if msg == "granted" then
return true
@@ -41,11 +39,11 @@ end
function validate_key(minimum_clearance)
if establish_connection() then
if fs.exists("/disk/key") then
key_file = fs.open("/disk/key","r")
key = key_file.readLine()
local key_file = fs.open("/disk/key","r")
local key = key_file.readLine()
tg_server_id = rednet.lookup('tg', tg_server_name)
rednet.send(tg_server_id, "validate_key,"..key..","..minimum_clearance, "tg")
id, msg, _ = rednet.receive("tg")
local id, msg, _ = rednet.receive("tg")
if msg == "authentication successful" then
return true
else
@@ -59,27 +57,40 @@ function validate_key(minimum_clearance)
end
end
if fs.exists('/disk/key') then
key_file = fs.open('/disk/key', 'r')
key = key_file.readLine()
function authenticate()
if fs.exists('/disk/key') then
local key_file = fs.open('/disk/key', 'r')
local key = key_file.readLine()
if establish_connection() then
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 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.")
return true, _, card_holder, card_clearance
else
print("Authentication failed.")
return false, "authentication failed"
end
else
return false, "modem not found"
end
key_file.close()
else
else
print("Key file not found. Aborting.")
return false, "key file not found"
end
end
if args[1] == "auth" or args[1] == "authenticate" then
local success, error, card_holder, card_clearance = authenticate()
if success then
print("Authentication was successful.")
print("Hello "..card_holder..", you were granted clearance level "..card_clearance.." for this computer.")
else
print("Authentication failed: "..error)
end
end
+7
View File
@@ -0,0 +1,7 @@
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
+1 -1
View File
@@ -1,7 +1,7 @@
local config = {
name = "tg_server",
modem_side = "top",
clearance_expiry = 600, -- Minutes until clearance will expire
clearance_expiry = 600, -- Seconds until clearance will expire
key_file = "verified_keys.txt", -- Name of the key file, relative to tg_server.lua
}
return config
+44 -14
View File
@@ -1,9 +1,10 @@
local fullPath = shell.getRunningProgram()
local dir = fullPath:match("^(.*/)") or ""
local args = {...}
local config = dofile(dir..'taskguard.cfg')
local clearances = { { computer_id = 1, clearance_level = 1, time_granted = os.clock() } }
local clearances = { } -- { computer_id = 1, clearance_level = 1, time_granted = os.clock() }
local function split(str, divider)
local t = {}
@@ -13,14 +14,7 @@ local function split(str, divider)
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
dofile(dir..'hash.lua')
local function check_for_outdated_sessions()
local expired = 0
@@ -57,11 +51,11 @@ local function validate_key(card_holder, card_clearance, random_chars)
end
end
rednet.open(config.modem_side)
rednet.host('tg', config.name)
print("Server started, waiting for requests...")
while true do
if args[1] == "serve" then
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, ',')
@@ -115,4 +109,40 @@ while true do
end
print("Transaction finished")
end
end
elseif args[1] == "add_card" then
if args[2] then
local new_card = args[2]
local new_card_parts = split(new_card, ',')
local card_holder = new_card_parts[1]
local key_file = fs.open(card_holder..'.key', 'w')
key_file.write(new_card)
key_file.close()
local trusted_keys = fs.open(dir..config.key_file, 'a')
local card_hash = hash(new_card)
trusted_keys.write(card_hash)
trusted_keys.close()
end
elseif args[1] == "remove_card" then
if args[2] then
local key_hash = args[2]
local trusted_keys = fs.open(dir..config.key_file, 'r')
local new_key_table = {}
while true do
local trusted_hash = trusted_keys.readLine()
if trusted_hash ~= key_hash then
table.insert(new_key_table, trusted_hash)
end
if not trusted_hash then break end -- Stop when EOF reached
end
trusted_keys.close()
local trusted_keys = fs.open(dir..config.key_file, 'w+')
for _, entry in ipairs(new_key_table) do
trusted_keys.write(entry .. '\n')
end
trusted_keys.close()
end
end