Advertisement
Guest User

test.lua

a guest
Dec 9th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.78 KB | None | 0 0
  1. --[[
  2.   TODO: Decrypt incoming MSG part from modem (to prevent people executing commands sticking in someone elses name)
  3.   TODO: Add commands for checking permissions (Doors will need to check user permissions)
  4.   TODO: Add commands for adding/removing users/roles/permissions
  5.   TODO: Add commands to enable/disable security on all doors (when disabled, door will open for anyone)
  6. ]]--
  7.  
  8. local computer = require('computer')
  9. local shell = require('shell')
  10. local filesys = require('filesystem')
  11. local term = require('term')
  12. local event = require('event')
  13. local component = require('component')
  14. local modem = component.modem
  15. local gpu = component.gpu
  16.  
  17. local utils = require('SecurityUtils')
  18.  
  19. local cRed = 0xFF0000
  20. local cGreen = 0x00FF00
  21. local cWhite = 0xFFFFFF
  22.  
  23. local permsFile = 'data/permissions.dat'
  24. local rolesFile = 'data/roles.dat'
  25. local usersFile = 'data/users.dat'
  26.  
  27. local port = 199
  28.  
  29. if not filesys.exists('data') then
  30.   shell.execute('mkdir data')
  31. end
  32.  
  33. term.clear()
  34. print("Security server")
  35. print("---------------------------------------------------------------------------")
  36.  
  37. local permissions = utils.loadTable(permsFile) or {}
  38. local roles = utils.loadTable(rolesFile) or {}
  39. local users = utils.loadTable(usersFile) or {}
  40.  
  41. function getUser(userName)
  42.   for _, user in pairs(users) do
  43.     if user.name == userName then
  44.       return user
  45.     end
  46.   end
  47.  
  48.   return nil, "User does not exist!"
  49. end
  50.  
  51. function getRole(roleName)
  52.   for _, role in pairs(roles) do
  53.     if role.name == roleName then
  54.       return role
  55.     end
  56.   end
  57.  
  58.   return nil, "Role does not exist!"
  59. end
  60.  
  61. function hasRole(user, roleName)
  62.   if user and type(user) == "string" then
  63.     user, err = getUser(user)
  64.   end
  65.  
  66.   if user and user.roles then
  67.     for _, name in ipairs(user.roles) do
  68.       if name == roleName then
  69.         return true
  70.       end
  71.     end
  72.   end
  73.  
  74.   return false
  75. end
  76.  
  77. function roleHasPermission(role, permissionName)
  78.   if role and type(role) == "string" then
  79.     role, err = getRole(role)
  80.   end
  81.  
  82.   if role and role.permissions then
  83.     for _, name in ipairs(role.permissions) do
  84.       if name == permissionName then
  85.         return true
  86.       end
  87.     end
  88.   end
  89.  
  90.   return false
  91. end
  92.  
  93. function hasPermission(user, permissionName)
  94.   if user and type(user) == "string" then
  95.     user, err = getUser(user)
  96.   end
  97.  
  98.   if hasRole(user, 'admin') then
  99.     return true -- Admins access everything regardless
  100.   end
  101.  
  102.   if user and user.permissions then
  103.     for _, name in ipairs(user.permissions) do
  104.       if name == permissionName then
  105.         return true
  106.       end
  107.     end
  108.   end
  109.  
  110.   if user and user.roles then
  111.     for _, name in ipairs(user.roles) do
  112.       if roleHasPermission(name, permissionName) then
  113.         return true
  114.       end
  115.     end
  116.   end
  117.  
  118.   return false
  119. end
  120.  
  121. function split(str, delimiter)
  122.   local parts = {}
  123.  
  124.   for bit in (str..delimiter):gmatch("([^"..delimiter.."]*)"..delimiter) do
  125.     table.insert(parts, bit)
  126.   end
  127.  
  128.   return parts
  129. end
  130.  
  131. if modem.isOpen(port) then
  132.   term.write('Attempting networking connection...CONNECTED\n')
  133. end
  134.  
  135. while true do
  136.   if not modem.isOpen(port) then
  137.     term.write('Attempting networking connection...')
  138.     while not modem.isOpen(port) do
  139.       modem.open(port)
  140.       os.sleep(0.01)
  141.     end
  142.     term.write('CONNECTED\n')
  143.   end
  144.  
  145.   local _, _, from, port, _, command, msg = event.pull('modem_message')
  146.  
  147.   if msg then
  148.     local data = split(msg, ';')
  149.    
  150.     if #data > 0 then
  151.       local userName = data[1]
  152.       data[1] = nil
  153.  
  154.       term.write(from..":"..port..": "..command..' ['..msg..']\n')
  155.  
  156.       if command == "reboot" then
  157.         if hasRole(userName, 'admin') then
  158.           computer.shutdown(true)
  159.         else
  160.           gpu.setForeground(cRed)
  161.           term.write('Reboot denied for '..userName)
  162.           gpu.setForeground(cWhite)
  163.         end
  164.       end
  165.  
  166.     end
  167.   end
  168.  
  169.   os.sleep(0.01)
  170. end
  171.  
  172. if modem.isOpen(port) then
  173.   modem.close(port)
  174. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement