Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- TODO: Decrypt incoming MSG part from modem (to prevent people executing commands sticking in someone elses name)
- TODO: Add commands for checking permissions (Doors will need to check user permissions)
- TODO: Add commands for adding/removing users/roles/permissions
- TODO: Add commands to enable/disable security on all doors (when disabled, door will open for anyone)
- ]]--
- local computer = require('computer')
- local shell = require('shell')
- local filesys = require('filesystem')
- local term = require('term')
- local event = require('event')
- local component = require('component')
- local modem = component.modem
- local gpu = component.gpu
- local utils = require('SecurityUtils')
- local cRed = 0xFF0000
- local cGreen = 0x00FF00
- local cWhite = 0xFFFFFF
- local permsFile = 'data/permissions.dat'
- local rolesFile = 'data/roles.dat'
- local usersFile = 'data/users.dat'
- local port = 199
- if not filesys.exists('data') then
- shell.execute('mkdir data')
- end
- term.clear()
- print("Security server")
- print("---------------------------------------------------------------------------")
- local permissions = utils.loadTable(permsFile) or {}
- local roles = utils.loadTable(rolesFile) or {}
- local users = utils.loadTable(usersFile) or {}
- function getUser(userName)
- for _, user in pairs(users) do
- if user.name == userName then
- return user
- end
- end
- return nil, "User does not exist!"
- end
- function getRole(roleName)
- for _, role in pairs(roles) do
- if role.name == roleName then
- return role
- end
- end
- return nil, "Role does not exist!"
- end
- function hasRole(user, roleName)
- if user and type(user) == "string" then
- user, err = getUser(user)
- end
- if user and user.roles then
- for _, name in ipairs(user.roles) do
- if name == roleName then
- return true
- end
- end
- end
- return false
- end
- function roleHasPermission(role, permissionName)
- if role and type(role) == "string" then
- role, err = getRole(role)
- end
- if role and role.permissions then
- for _, name in ipairs(role.permissions) do
- if name == permissionName then
- return true
- end
- end
- end
- return false
- end
- function hasPermission(user, permissionName)
- if user and type(user) == "string" then
- user, err = getUser(user)
- end
- if hasRole(user, 'admin') then
- return true -- Admins access everything regardless
- end
- if user and user.permissions then
- for _, name in ipairs(user.permissions) do
- if name == permissionName then
- return true
- end
- end
- end
- if user and user.roles then
- for _, name in ipairs(user.roles) do
- if roleHasPermission(name, permissionName) then
- return true
- end
- end
- end
- return false
- end
- function split(str, delimiter)
- local parts = {}
- for bit in (str..delimiter):gmatch("([^"..delimiter.."]*)"..delimiter) do
- table.insert(parts, bit)
- end
- return parts
- end
- if modem.isOpen(port) then
- term.write('Attempting networking connection...CONNECTED\n')
- end
- while true do
- if not modem.isOpen(port) then
- term.write('Attempting networking connection...')
- while not modem.isOpen(port) do
- modem.open(port)
- os.sleep(0.01)
- end
- term.write('CONNECTED\n')
- end
- local _, _, from, port, _, command, msg = event.pull('modem_message')
- if msg then
- local data = split(msg, ';')
- if #data > 0 then
- local userName = data[1]
- data[1] = nil
- term.write(from..":"..port..": "..command..' ['..msg..']\n')
- if command == "reboot" then
- if hasRole(userName, 'admin') then
- computer.shutdown(true)
- else
- gpu.setForeground(cRed)
- term.write('Reboot denied for '..userName)
- gpu.setForeground(cWhite)
- end
- end
- end
- end
- os.sleep(0.01)
- end
- if modem.isOpen(port) then
- modem.close(port)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement