CCCPaste

operatore porta con lista

local USERS_FILE = "allowed_users"
local PASS_FILE = "operator_pass"

local function load_allowed()
    if fs.exists(USERS_FILE) then
        local fh = fs.open(USERS_FILE, "r")
        local content = fh.readAll()
        fh.close()
        local ok, t = pcall(textutils.unserialize, content)
        if ok and type(t) == "table" then
            return t
        end
    end
    return {}
end

local function save_allowed(tbl)
    local fh = fs.open(USERS_FILE, "w")
    fh.write(textutils.serialize(tbl))
    fh.close()
end

local function read_password(prompt)
    term.write(prompt)
    -- read masked input
    local pass = read("*")
    print()
    return pass
end

local function load_pass()
    if fs.exists(PASS_FILE) then
        local fh = fs.open(PASS_FILE, "r")
        local p = fh.readAll()
        fh.close()
        return p
    end
    return nil
end

local function save_pass(p)
    local fh = fs.open(PASS_FILE, "w")
    fh.write(p)
    fh.close()
end

-- Login / impostazione password
local stored = load_pass()
if not stored then
    print("Nessuna password impostata. Impostane una ora.")
    local p1 = read_password("Nuova password: ")
    local p2 = read_password("Conferma password: ")
    if p1 == "" then
        print("Password vuota non permessa. Esco.")
        return
    end
    if p1 ~= p2 then
        print("Le password non coincidono. Esco.")
        return
    end
    save_pass(p1)
    stored = p1
    print("Password impostata correttamente.")
end

local attempt = read_password("Password operatore: ")
if attempt ~= stored then
    print("Password errata. Accesso negato.")
    return
end

-- Se qui, autenticato
local users = load_allowed()

local function list_users()
    if #users == 0 then
        print("[Nessun utente consentito]")
        return
    end
    print("Utenti consentiti:")
    for i, u in ipairs(users) do
        print(string.format("%d) %s", i, u))
    end
end

local function add_user()
    term.write("Nome utente da aggiungere: ")
    local name = read()
    if name == "" then
        print("Nome vuoto, annullo.")
        return
    end
    for _, v in ipairs(users) do
        if v == name then
            print("Utente già presente.")
            return
        end
    end
    table.insert(users, name)
    save_allowed(users)
    print("Utente '"..name.."' aggiunto.")
end

local function remove_user()
    term.write("Nome utente da rimuovere: ")
    local name = read()
    if name == "" then
        print("Nome vuoto, annullo.")
        return
    end
    for i, v in ipairs(users) do
        if v == name then
            table.remove(users, i)
            save_allowed(users)
            print("Utente '"..name.."' rimosso.")
            return
        end
    end
    print("Utente non trovato.")
end

local function change_password()
    local p = read_password("Nuova password: ")
    local p2 = read_password("Conferma nuova password: ")
    if p == "" then
        print("Password vuota non permessa.")
        return
    end
    if p ~= p2 then
        print("Le password non coincidono.")
        return
    end
    save_pass(p)
    print("Password aggiornata.")
end

-- Menu principale
while true do
    print("\n--- Menu Operatore ---")
    print("1) Elenca utenti")
    print("2) Aggiungi utente")
    print("3) Rimuovi utente")
    print("4) Cambia password")
    print("5) Esci")
    term.write("> ")
    local choice = read()
    if choice == "1" then
        list_users()
    elseif choice == "2" then
        add_user()
    elseif choice == "3" then
        remove_user()
    elseif choice == "4" then
        change_password()
    elseif choice == "5" then
        print("Uscita.")
        break
    else
        print("Scelta non valida.")
    end
end