Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local MAX_ATTEMPTS = 3 -- Maximum number of incorrect password attempts allowed
- local LOCKOUT_TIME = 30 -- Lockout time in seconds after reaching maximum attempts
- local USERS_FOLDER = "/disk/users/"
- local ERROR_FOLDER = "/disk/error/"
- local BSOD_PROGRAM = "BSOD.lua"
- local DEV_CFG = "/dev.cfg" -- Path to the developer configuration file
- local DEV_MODE = false -- Flag to indicate if developer mode is enabled
- -- Check if developer mode is enabled
- local function checkDeveloperMode()
- if fs.exists(DEV_CFG) then
- DEV_MODE = true
- term.clear()
- term.setCursorPos(1, 1)
- term.setBackgroundColor(colors.black)
- term.setTextColor(colors.white)
- -- Draw the UI for developer mode enabled message
- term.setCursorPos(1, 1)
- term.write("+---------------------------------------+")
- term.setCursorPos(1, 2)
- term.write("| DEVELOPER MODE ENABLED |")
- term.setCursorPos(1, 3)
- term.write("+---------------------------------------+")
- term.setCursorPos(1, 5)
- term.setTextColor(colors.red)
- term.write("Device Security has been disabled.")
- term.setCursorPos(1, 7)
- term.setTextColor(colors.white)
- term.write("This device is currently in dev mode")
- os.sleep(5) -- Display the messages for 5 seconds
- term.clear()
- end
- end
- local function getUserCredentials(username)
- local passwordFile = fs.combine(USERS_FOLDER .. username, "password.txt")
- if fs.exists(passwordFile) then
- local file = fs.open(passwordFile, "r")
- local storedPassword = file.readLine()
- file.close()
- return storedPassword
- else
- return nil -- User does not exist
- end
- end
- local function drawLoginScreen(username, attemptsLeft)
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.cyan)
- term.write("+-------------------------+")
- term.setCursorPos(1, 2)
- term.write("| Login to Doggy OS |")
- term.setCursorPos(1, 3)
- term.write("+-------------------------+")
- term.setCursorPos(1, 5)
- term.setTextColor(colors.yellow)
- term.write("Username: " .. username)
- term.setCursorPos(1, 6)
- term.write("Attempts left: " .. attemptsLeft)
- term.setCursorPos(1, 8)
- term.setTextColor(colors.white)
- term.write("Enter password:")
- term.setCursorPos(1, 9)
- end
- local function lockoutUser(username)
- local disabledFile = fs.combine(USERS_FOLDER .. username, "disabled.txt")
- local file = fs.open(disabledFile, "w")
- file.close()
- end
- local function checkDisabled(username)
- local disabledFile = fs.combine(USERS_FOLDER .. username, "disabled.txt")
- return fs.exists(disabledFile)
- end
- local function checkCredentials(username)
- if DEV_MODE or checkDisabled(username) then
- if not DEV_MODE then
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.red)
- print("This user has been disabled due to security reasons.")
- os.sleep(3) -- Display the disabled message for 3 seconds
- print("Contact your administrator for help.")
- os.sleep(2) -- Display the contact administrator message for 2 seconds
- shell.run("/disk/os/lock.lua") -- Run the lock.lua program
- end
- return DEV_MODE -- In developer mode, return true regardless of user state
- end
- local storedPassword = getUserCredentials(username)
- if not storedPassword then
- return false -- User does not exist
- end
- local attempts = 0
- repeat
- drawLoginScreen(username, MAX_ATTEMPTS - attempts)
- local enteredPassword = read("*")
- attempts = attempts + 1
- if enteredPassword == storedPassword then
- return true
- else
- term.setCursorPos(1, 10)
- term.setTextColor(colors.red)
- print("Incorrect password. Please try again.")
- os.sleep(2) -- Display the error message for 2 seconds
- end
- until attempts > MAX_ATTEMPTS
- print("Too many incorrect attempts. User has been disabled.")
- lockoutUser(username)
- os.sleep(2) -- Display the lockout message for 2 seconds
- return false
- end
- local function checkDiskIDs()
- -- Get a list of all connected peripherals
- local peripherals = peripheral.getNames()
- -- Array to store disk IDs
- local diskIDs = {}
- -- Loop through all peripherals
- for _, name in ipairs(peripherals) do
- -- Check if the peripheral is a disk drive
- if peripheral.getType(name) == "drive" then
- -- Get the disk ID from the disk drive
- local diskID = disk.getID(name)
- -- If a disk is inserted, add its ID to the array
- if diskID then
- table.insert(diskIDs, {id = diskID, name = name})
- end
- end
- end
- -- Check if any disks were found
- if #diskIDs > 0 then
- return diskIDs
- else
- return nil
- end
- end
- local function drawSecurityCardPrompt()
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.blue)
- term.write("+--------------------------+")
- term.setCursorPos(1, 2)
- term.write("| Insert Security Card |")
- term.setCursorPos(1, 3)
- term.write("+--------------------------+")
- term.setCursorPos(1, 5)
- term.setTextColor(colors.yellow)
- term.write("Please insert your security card.")
- term.setCursorPos(1, 6)
- term.write("Press ENTER to use password instead.")
- end
- local function drawErrorMessage(message)
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.red)
- print(message)
- os.sleep(2)
- end
- local function ejectDisk(diskName)
- peripheral.call(diskName, "ejectDisk")
- end
- local function checkSecurityCard(username)
- if DEV_MODE then
- return true -- In developer mode, bypass security card check
- end
- local idFolder = fs.combine(USERS_FOLDER .. username, "ID")
- if not fs.exists(idFolder) then
- return false
- end
- while true do
- drawSecurityCardPrompt()
- local event, key = os.pullEvent()
- if event == "key" and key == keys.enter then
- return false
- elseif event == "disk" or event == "disk_insert" then
- local diskIDs = checkDiskIDs()
- if diskIDs then
- for _, disk in ipairs(diskIDs) do
- ejectDisk(disk.name) -- Eject the disk
- local idFile = fs.combine(idFolder, tostring(disk.id) .. ".file")
- if fs.exists(idFile) then
- return true -- Allow access if a valid ID is found
- end
- end
- drawErrorMessage("Error: Unregistered security key.")
- end
- end
- end
- end
- local function main()
- checkDeveloperMode() -- Check if developer mode should be enabled
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.green)
- term.write("+-------------------------------------+")
- term.setCursorPos(1, 2)
- term.write("| Protected by Doggy OS Security |")
- term.setCursorPos(1, 3)
- term.write("+-------------------------------------+")
- term.setCursorPos(1, 5)
- term.setTextColor(colors.white)
- print("Enter username:")
- local enteredUsername = read()
- if DEV_MODE or checkDisabled(enteredUsername) then
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.red)
- print("This user has been disabled due to security reasons.")
- os.sleep(3) -- Display the disabled message for 3 seconds
- print("Contact your administrator for help.")
- os.sleep(2) -- Display the contact administrator message for 2 seconds
- shell.run("/disk/os/lock.lua") -- Run the lock.lua program
- return
- end
- local users = fs.list(USERS_FOLDER)
- if not users or #users == 0 then
- -- No users detected, run the BSOD program
- shell.run(ERROR_FOLDER .. BSOD_PROGRAM)
- elseif checkSecurityCard(enteredUsername) then
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.lime)
- print("Access granted. Welcome, " .. enteredUsername .. "!")
- os.sleep(2) -- Display the success message for 2 seconds
- term.setTextColor(colors.white)
- shell.run("/disk/os/gui")
- -- Your main OS code goes here
- elseif checkCredentials(enteredUsername) then
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.lime)
- print("Access granted. Welcome, " .. enteredUsername .. "!")
- os.sleep(2) -- Display the success message for 2 seconds
- term.setTextColor(colors.white)
- shell.run("/disk/os/gui")
- -- Your main OS code goes here
- else
- term.clear()
- term.setCursorPos(1, 1)
- term.setTextColor(colors.red)
- print("Access denied.")
- os.sleep(2) -- Display the access denied message for 2 seconds
- shell.run("/disk/os/lock.lua")
- end
- end
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement