Advertisement
m1cr0man

M1cr0S Server 1.7

Jun 27th, 2012
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 11.68 KB | None | 0 0
  1. --M1cr0S Server 1.7
  2.  
  3. os.loadAPI("/files/m1")
  4. local tmptbl, menu, user, timer, login, keyres, pings = {}, 0, "", nil, false, 0, 0
  5. local userdb = m1.tableload("/files/userdb")
  6. local syncids = m1.tableload("/files/syncids")
  7. m1.set(true, 9, 2)
  8. term.clear()
  9.  
  10. function savesync(user, user2)                          --Synchronise and save user database
  11.     m1.tablesave("/files/userdb", userdb)               --Save to disk
  12.     for id, auth in pairs(syncids) do if auth then      --Get list of servers to sync with and send modified/new user
  13.         m1.tablesend({[1] = "srvsync", [2] = user, [3] = userdb[user]}, id)
  14.     end end
  15.     m1.wait(0.1)                                        --Stops sync loops
  16.     m1.printex(10, "Synchronised "..user, 1, "history")
  17. end
  18.  
  19. function redraw()
  20.     local x, y = term.getSize()
  21.     while x > 0 do
  22.         m1.printex(1, "-", x, "noclr")
  23.         m1.printex(11, "-", x, "noclr")
  24.         x = x-1
  25.     end
  26.     m1.printex(1, "M1cr0S Login Server", "center", "noclr")
  27.     m1.printex(12, "")
  28.     m1.printex(14, "")
  29.     m1.printex(15, "")
  30.     m1.printex(16, "")
  31.     m1.printex(17, "")
  32.     m1.printex(18, "")
  33.     m1.printex(y, "Pings: "..tostring(pings), "right")
  34. end
  35.  
  36. function pwdaction(pwd, name, rank) --Checks passwords and creates/modifies users
  37.     if name == nil then name = "root" end
  38.     if rank == nil then
  39.         if userdb[name] == nil then return("User Doesn't Exist") end
  40.         local tmp, checks = {}, 0
  41.         if pwd[#pwd] ~= userdb[name]["pwd"][#pwd] then for i,data in ipairs(pwd) do table.insert(tmp, data*(name:len()/2)) end else tmp = pwd end --The Passowrd Math...
  42.         for i,data in ipairs(tmp) do if data == userdb[name]["pwd"][i] then checks = checks+1 end end
  43.         if checks == #userdb[name]["pwd"] then return(m1.serialize({"true", userdb[name]["rank"]})) else return("Invalid Password") end
  44.     elseif rank ~= nil and pwd == nil then
  45.         userdb[name]["rank"] = tonumber(rank)
  46.         savesync(user)
  47.         m1.printex(10, user.."'s rank set to "..rank, 1, "history")
  48.     elseif rank ~= nil and pwd ~= nil then
  49.         userdb[name] = {["pwd"] = {}, ["rank"] = rank, ["msgs"] = {}}
  50.         for i,data in ipairs(pwd) do table.insert(userdb[name]["pwd"], data*(name:len()/2)) end --The Passowrd Math...
  51.         savesync(user)
  52.         m1.printex(10, "User "..user.." created.", 1, "history")
  53.     end
  54. end
  55.  
  56. function msgmgr(sender, action, message, user)
  57.     if action == "add" then
  58.         if userdb[user] ~= nil then
  59.             if userdb[user]["msgs"] == nil then userdb[user]["msgs"] = {} end
  60.             table.insert(userdb[user]["msgs"], {[1] = sender, [2] = message})
  61.             savesync(user)
  62.             m1.wait(0.1)
  63.             savesync(sender)
  64.         end
  65.     elseif action == "del" then --Deletes a message, and returns updated messages as tables
  66.         table.remove(userdb[sender]["msgs"], message)
  67.         savesync(sender)
  68.     elseif action == "get" and userdb[sender] ~= nil then --Returns all sender's messages as tables
  69.         if userdb[sender]["msgs"] == {} or #userdb[sender]["msgs"] < 1 then return({[1] = -1}) end
  70.         return(userdb[sender]["msgs"])
  71.     else return {[1] = "Invalid Request"} end --Returns false if request was invalid
  72. end
  73.  
  74. function getinput(key, mode) --Simply manages key input and adds it to tmptbl
  75.     if mode == 1 then return key-1
  76.         elseif key == 14 then table.remove(tmptbl)
  77.         elseif key ~= 1 and key ~= 28 and key ~= " " and key ~= nil then table.insert(tmptbl, key)
  78.         elseif key == 28 and (mode == nil or mode == -1) then return 28
  79.         elseif key == 28 and mode == 2 then
  80.             local comb = ""
  81.             for i,data in ipairs(tmptbl) do comb = comb..data end
  82.             return comb
  83.     end
  84.     m1.printex(13, "")
  85.     for i,data in ipairs(tmptbl) do
  86.         if (menu == 0 or menu == 2.5 or menu == -1) then data = "*" end
  87.         m1.printex(13, data, i, "noclr")
  88.     end
  89. end
  90.  
  91. function finish()
  92.     redraw()
  93.     m1.printex(12, "Enter Password:")
  94.     m1.printex(13, "")
  95.     tmptbl, login, menu, user = {}, false, 0, ""
  96. end
  97.  
  98. function startup()
  99.     rednet.open(m1.getperipheral("modem"))
  100.     redraw()
  101.     m1.printex(12, "Enter Password:")
  102.     repeat
  103.         --Asks for Root Password on first run
  104.         if userdb["root"] == nil then
  105.             m1.printex(12, "Root Password:")
  106.             menu = -1
  107.         end
  108.        
  109.         --Get and Sort Input
  110.         local event, p1, p2 = os.pullEvent()
  111.         if event == "key" and menu == -1 then login = getinput(p1)
  112.             elseif event == "key" and (menu == 1 or menu == 2 or menu == 3 or menu == 5) and (p1 == 14 or p1 == 28) then user = getinput(p1, 2) --For enabling backspace and enter when getting name
  113.             elseif event == "char" and (menu == 1 or menu == 2 or menu == 3 or menu == 5) then user = getinput(p1, 2) --Get name of user to use for commands
  114.             elseif event == "key" and login == true and menu == 0 then menu = getinput(p1, 1) --Get Menu Option
  115.             elseif event == "key" and (menu == 0 or menu == 2.5) then keyres = getinput(p1) --Get password from user to login to server
  116.         end
  117.        
  118.         --For getting root pwd
  119.         if login == 28 then
  120.             pwdaction(tmptbl, "root", 4)
  121.             m1.printex(10, "Root Password Set", 1, "history")
  122.             finish()
  123.         end
  124.        
  125.         --List Menus
  126.         if keyres == 28 and login == false and menu == 0 then
  127.             local result = m1.deserialize(pwdaction(tmptbl, "root"))
  128.             if result ~= nil and result[1] == "true" then
  129.                 login, tmptbl, keyres = true, {}, 0
  130.                 m1.printex(12, "Select Action:")
  131.                 m1.printex(13, "1. Make Login Disk        6. + Sync server")
  132.                 m1.printex(14, "2. Create/Modify User     7. - Sync server")
  133.                 m1.printex(15, "3. Set a User's Rank")
  134.                 m1.printex(16, "4. Backup UserDB to floppy disk")
  135.                 m1.printex(17, "5. Delete User")
  136.                 m1.printex(18, "8. Cancel")
  137.             else
  138.                 tmptbl = {}
  139.                 m1.printex(10, "Password Incorrect", 1, "history")
  140.                 m1.printex(13, "")
  141.             end
  142.            
  143.         --The Sub Menus
  144.         elseif event == "key" and p1 == 28 and (menu == 1 or menu == 3 or menu == 5) and userdb[user] == nil then
  145.             m1.printex(10, "User "..user.." doesn't Exist", 1, "history")
  146.             finish()
  147.         elseif event == "key" and p1 == 28 and menu == 1 then
  148.             if not m1.getperipheral("drive") then
  149.                 m1.printex(10, "No floppy drive connected!", 1, "history")
  150.             else
  151.                 disk.setLabel(m1.getperipheral("drive"), user.."'s Login Disk")
  152.                 disk.eject(m1.getperipheral("drive"))
  153.                 m1.tablesave("/disk/login", {[1] = "pwdchk", [2] = user, [3] = userdb[user]["pwd"]})
  154.                 m1.printex(10, "Floppy Created for user "..user, 1, "history")
  155.                 finish()
  156.                 tmptbl, login, menu, user = {}, false, 0, ""
  157.             end
  158.         elseif event == "key" and p1 == 28 and menu == 2 then
  159.             redraw()
  160.             menu, tmptbl = 2.5, {}
  161.             m1.printex(12, "Enter new password:")
  162.             m1.printex(13, "")
  163.         elseif event == "key" and p1 == 28 and menu == 2.5 then
  164.             pwdaction(tmptbl, user, 1)
  165.             finish()
  166.         elseif event == "key" and p1 == 28 and menu == 3 then
  167.             redraw()
  168.             m1.printex(12, "Enter New Rank (Instantly sets):")
  169.             m1.printex(13, "")
  170.             menu, tmptbl = 3.5, {}
  171.         elseif event == "key" and menu == 3.5 then
  172.             pwdaction(nil, user, p1-1)
  173.             finish()
  174.         elseif event == "key" and p1 == 28 and menu == 5 then
  175.             userdb[user] = nil
  176.             savesync(user)
  177.             m1.printex(10, "User "..user.." Deleted", 1, "history")
  178.             finish()
  179.         elseif (p1 == 14 or event == "char") and tonumber(p1) and (menu == 6.2 or menu == 7.2) and login == false then
  180.             if p1 == 14 then
  181.                 tmptbl = tmptbl:sub(1, tmptbl:len()-1)
  182.             else
  183.                 tmptbl = tmptbl..p1
  184.             end
  185.             m1.printex(13, tmptbl, "left")
  186.         elseif p1 == 28 and menu == 6.2 and login == false then                             --First sync
  187.             p1 = tonumber(tmptbl)
  188.             syncids[p1] = true
  189.             m1.tablesave("/files/syncids", syncids)
  190.             m1.printex(10, "Server "..tostring(p1).." syncing", 1, "history")
  191.             m1.tablesend({[1] = "srvsyncfirst"}, p1)
  192.             local id, newdb = m1.tablereceive(p1, 4)
  193.             if not id then
  194.                 m1.printex(10, "Server "..tostring(p1).." failed to sync", 1, "history")
  195.                 finish()
  196.             else
  197.                 local newusers, currentusers = 0, 0
  198.                 for user, data in pairs(newdb) do newusers = newusers+1 end
  199.                 for user, data in pairs(userdb) do currentusers = currentusers+1 end
  200.                 if newusers >= currentusers then
  201.                     local root = userdb["root"]["pwd"]
  202.                     userdb = newdb
  203.                     userdb["root"]["pwd"] = root
  204.                     m1.printex(10, "Got userdb from "..tostring(p1), 1, "history")
  205.                 else
  206.                     m1.tablesend({[1] = "srvsyncdb", [2] = userdb}, p1)
  207.                     m1.printex(10, "Sent userdb to "..tostring(p1), 1, "history")
  208.                 end
  209.                 finish()
  210.             end
  211.         elseif p1 == 28 and menu == 7.2 and login == false then
  212.             p1 = tonumber(tmptbl)
  213.             syncids[p1] = false
  214.             m1.tablesave("/files/syncids", syncids)
  215.             m1.printex(10, "Server "..tostring(p1).." no longer syncing", 1, "history")
  216.             finish()
  217.         --The Menus
  218.         elseif login == true and event == "key" and (menu == 1 or menu == 2 or menu == 3 or menu == 5) then
  219.             redraw()
  220.             tmptbl, login = {}, false
  221.             m1.printex(12, "Enter user name:")
  222.             m1.printex(13, "")
  223.         elseif login == true and event == "key" and menu == 4 then
  224.             m1.tablesave("/disk/userdb", userdb)
  225.             m1.printex(10, "User Database saved to Floppy", 1, "history")
  226.             finish()
  227.         elseif login == true and event == "key" and (menu == 6 or menu == 7) then
  228.             redraw()
  229.             tmptbl, login, menu = "", false, menu+0.2
  230.             m1.printex(12, "Enter Server ID:")
  231.             m1.printex(13, "")
  232.         elseif (login == true and event == "key" and menu >= 8) or (event == "key" and p1 == 1) then finish() end
  233.        
  234.         --Wireless stuff
  235.         if event == "rednet_message" then
  236.             local request = m1.deserialize(p2)
  237.             if p2 == "srvidreq" then
  238.                 rednet.send(p1, tostring(os.computerID()))
  239.                 m1.printex(10, "Sent server ID to "..p1, 1, "history")
  240.             elseif p2 == "ping" then
  241.                 rednet.send(p1, "pong")
  242.                 pings = pings+1
  243.             elseif request ~= nil and type(request) == "table" and request[1] == "pwdchk" and request[2] ~= nil and request[3] ~= nil then
  244.                 local result = pwdaction(request[3], request[2])
  245.                 if m1.deserialize(result) ~= nil and m1.deserialize(result)[1] == "true" then
  246.                     m1.printex(10, "Password from "..p1.." is correct. User Rank: "..tostring(userdb[request[2]]["rank"]), 1, "history")
  247.                 else
  248.                     m1.printex(10, "Password error from "..p1..": "..result, 1, "history")
  249.                 end
  250.                 rednet.send(p1, result)
  251.                 result = nil
  252.             elseif request ~= nil and type(request) == "table" and request[1] == "remopn" and type(request[2]) == "number" then
  253.                 m1.tablesend({[1] = "remopn", [2] = request[3], [3] = userdb[request[3]]["rank"]}, request[2])
  254.                 m1.printex(10, request[3].." opened remote door "..request[2], 1, "history")
  255.             elseif request ~= nil and type(request) == "table" and request[1] == "usrchk" then
  256.                 if userdb[request[2]] ~= nil then rednet.send(p1, "true") else rednet.send(p1, "false") end
  257.                 m1.printex(10, "PC "..tostring(p1).." checked if "..request[2].." existed.", 1, "history")
  258.             elseif request ~= nil and type(request) == "table" and type(request[2]) == "string" and request[2]:sub(1, 3) == "msg" then
  259.                 --[[[1] = Sender/Username
  260.                     [2] = Action
  261.                     [3] = Message/Message No.
  262.                     [4] = To
  263.                 ]]--
  264.                 m1.tablesend(msgmgr(request[1], string.sub(request[2], 4, 6), request[3], request[4]), p1)
  265.                 m1.printex(10, request[1].." performed "..string.sub(request[2], 4, 6).." on pc "..tostring(p1), 1, "history")
  266.             elseif request ~= nil and type(request) == "table" and request[1] == "srvsync" and type(request[3]) == "table" and syncids[p1] then         --Sync
  267.                 userdb[request[2]] = request[3]
  268.                 m1.printex(10, "Synced user "..request[2], 1, "history")
  269.                 savesync(request[2])
  270.             elseif request ~= nil and type(request) == "table" and request[1] == "srvsyncdb" and type(request[2]) == "table" and syncids[p1] then           --Sync
  271.                 local root = userdb["root"]["pwd"]
  272.                 userdb = request[2]
  273.                 userdb["root"]["pwd"] = root
  274.                 m1.printex(10, "Got database from "..p1, 1, "history")
  275.             elseif request ~= nil and type(request) == "table" and request[1] == "srvsyncfirst" and syncids[p1] then    --First Sync
  276.                 m1.tablesend(userdb, p1)
  277.                 m1.printex(10, "First sync with "..p1, 1, "history")
  278.             end
  279.             request = nil
  280.         end
  281.     until false
  282.     rednet.close(m1.getperipheral("modem"))
  283. end
  284. startup()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement