Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --M1cr0S Server 1.7
- os.loadAPI("/files/m1")
- local tmptbl, menu, user, timer, login, keyres, pings = {}, 0, "", nil, false, 0, 0
- local userdb = m1.tableload("/files/userdb")
- local syncids = m1.tableload("/files/syncids")
- m1.set(true, 9, 2)
- term.clear()
- function savesync(user, user2) --Synchronise and save user database
- m1.tablesave("/files/userdb", userdb) --Save to disk
- for id, auth in pairs(syncids) do if auth then --Get list of servers to sync with and send modified/new user
- m1.tablesend({[1] = "srvsync", [2] = user, [3] = userdb[user]}, id)
- end end
- m1.wait(0.1) --Stops sync loops
- m1.printex(10, "Synchronised "..user, 1, "history")
- end
- function redraw()
- local x, y = term.getSize()
- while x > 0 do
- m1.printex(1, "-", x, "noclr")
- m1.printex(11, "-", x, "noclr")
- x = x-1
- end
- m1.printex(1, "M1cr0S Login Server", "center", "noclr")
- m1.printex(12, "")
- m1.printex(14, "")
- m1.printex(15, "")
- m1.printex(16, "")
- m1.printex(17, "")
- m1.printex(18, "")
- m1.printex(y, "Pings: "..tostring(pings), "right")
- end
- function pwdaction(pwd, name, rank) --Checks passwords and creates/modifies users
- if name == nil then name = "root" end
- if rank == nil then
- if userdb[name] == nil then return("User Doesn't Exist") end
- local tmp, checks = {}, 0
- 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...
- for i,data in ipairs(tmp) do if data == userdb[name]["pwd"][i] then checks = checks+1 end end
- if checks == #userdb[name]["pwd"] then return(m1.serialize({"true", userdb[name]["rank"]})) else return("Invalid Password") end
- elseif rank ~= nil and pwd == nil then
- userdb[name]["rank"] = tonumber(rank)
- savesync(user)
- m1.printex(10, user.."'s rank set to "..rank, 1, "history")
- elseif rank ~= nil and pwd ~= nil then
- userdb[name] = {["pwd"] = {}, ["rank"] = rank, ["msgs"] = {}}
- for i,data in ipairs(pwd) do table.insert(userdb[name]["pwd"], data*(name:len()/2)) end --The Passowrd Math...
- savesync(user)
- m1.printex(10, "User "..user.." created.", 1, "history")
- end
- end
- function msgmgr(sender, action, message, user)
- if action == "add" then
- if userdb[user] ~= nil then
- if userdb[user]["msgs"] == nil then userdb[user]["msgs"] = {} end
- table.insert(userdb[user]["msgs"], {[1] = sender, [2] = message})
- savesync(user)
- m1.wait(0.1)
- savesync(sender)
- end
- elseif action == "del" then --Deletes a message, and returns updated messages as tables
- table.remove(userdb[sender]["msgs"], message)
- savesync(sender)
- elseif action == "get" and userdb[sender] ~= nil then --Returns all sender's messages as tables
- if userdb[sender]["msgs"] == {} or #userdb[sender]["msgs"] < 1 then return({[1] = -1}) end
- return(userdb[sender]["msgs"])
- else return {[1] = "Invalid Request"} end --Returns false if request was invalid
- end
- function getinput(key, mode) --Simply manages key input and adds it to tmptbl
- if mode == 1 then return key-1
- elseif key == 14 then table.remove(tmptbl)
- elseif key ~= 1 and key ~= 28 and key ~= " " and key ~= nil then table.insert(tmptbl, key)
- elseif key == 28 and (mode == nil or mode == -1) then return 28
- elseif key == 28 and mode == 2 then
- local comb = ""
- for i,data in ipairs(tmptbl) do comb = comb..data end
- return comb
- end
- m1.printex(13, "")
- for i,data in ipairs(tmptbl) do
- if (menu == 0 or menu == 2.5 or menu == -1) then data = "*" end
- m1.printex(13, data, i, "noclr")
- end
- end
- function finish()
- redraw()
- m1.printex(12, "Enter Password:")
- m1.printex(13, "")
- tmptbl, login, menu, user = {}, false, 0, ""
- end
- function startup()
- rednet.open(m1.getperipheral("modem"))
- redraw()
- m1.printex(12, "Enter Password:")
- repeat
- --Asks for Root Password on first run
- if userdb["root"] == nil then
- m1.printex(12, "Root Password:")
- menu = -1
- end
- --Get and Sort Input
- local event, p1, p2 = os.pullEvent()
- if event == "key" and menu == -1 then login = getinput(p1)
- 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
- 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
- elseif event == "key" and login == true and menu == 0 then menu = getinput(p1, 1) --Get Menu Option
- elseif event == "key" and (menu == 0 or menu == 2.5) then keyres = getinput(p1) --Get password from user to login to server
- end
- --For getting root pwd
- if login == 28 then
- pwdaction(tmptbl, "root", 4)
- m1.printex(10, "Root Password Set", 1, "history")
- finish()
- end
- --List Menus
- if keyres == 28 and login == false and menu == 0 then
- local result = m1.deserialize(pwdaction(tmptbl, "root"))
- if result ~= nil and result[1] == "true" then
- login, tmptbl, keyres = true, {}, 0
- m1.printex(12, "Select Action:")
- m1.printex(13, "1. Make Login Disk 6. + Sync server")
- m1.printex(14, "2. Create/Modify User 7. - Sync server")
- m1.printex(15, "3. Set a User's Rank")
- m1.printex(16, "4. Backup UserDB to floppy disk")
- m1.printex(17, "5. Delete User")
- m1.printex(18, "8. Cancel")
- else
- tmptbl = {}
- m1.printex(10, "Password Incorrect", 1, "history")
- m1.printex(13, "")
- end
- --The Sub Menus
- elseif event == "key" and p1 == 28 and (menu == 1 or menu == 3 or menu == 5) and userdb[user] == nil then
- m1.printex(10, "User "..user.." doesn't Exist", 1, "history")
- finish()
- elseif event == "key" and p1 == 28 and menu == 1 then
- if not m1.getperipheral("drive") then
- m1.printex(10, "No floppy drive connected!", 1, "history")
- else
- disk.setLabel(m1.getperipheral("drive"), user.."'s Login Disk")
- disk.eject(m1.getperipheral("drive"))
- m1.tablesave("/disk/login", {[1] = "pwdchk", [2] = user, [3] = userdb[user]["pwd"]})
- m1.printex(10, "Floppy Created for user "..user, 1, "history")
- finish()
- tmptbl, login, menu, user = {}, false, 0, ""
- end
- elseif event == "key" and p1 == 28 and menu == 2 then
- redraw()
- menu, tmptbl = 2.5, {}
- m1.printex(12, "Enter new password:")
- m1.printex(13, "")
- elseif event == "key" and p1 == 28 and menu == 2.5 then
- pwdaction(tmptbl, user, 1)
- finish()
- elseif event == "key" and p1 == 28 and menu == 3 then
- redraw()
- m1.printex(12, "Enter New Rank (Instantly sets):")
- m1.printex(13, "")
- menu, tmptbl = 3.5, {}
- elseif event == "key" and menu == 3.5 then
- pwdaction(nil, user, p1-1)
- finish()
- elseif event == "key" and p1 == 28 and menu == 5 then
- userdb[user] = nil
- savesync(user)
- m1.printex(10, "User "..user.." Deleted", 1, "history")
- finish()
- elseif (p1 == 14 or event == "char") and tonumber(p1) and (menu == 6.2 or menu == 7.2) and login == false then
- if p1 == 14 then
- tmptbl = tmptbl:sub(1, tmptbl:len()-1)
- else
- tmptbl = tmptbl..p1
- end
- m1.printex(13, tmptbl, "left")
- elseif p1 == 28 and menu == 6.2 and login == false then --First sync
- p1 = tonumber(tmptbl)
- syncids[p1] = true
- m1.tablesave("/files/syncids", syncids)
- m1.printex(10, "Server "..tostring(p1).." syncing", 1, "history")
- m1.tablesend({[1] = "srvsyncfirst"}, p1)
- local id, newdb = m1.tablereceive(p1, 4)
- if not id then
- m1.printex(10, "Server "..tostring(p1).." failed to sync", 1, "history")
- finish()
- else
- local newusers, currentusers = 0, 0
- for user, data in pairs(newdb) do newusers = newusers+1 end
- for user, data in pairs(userdb) do currentusers = currentusers+1 end
- if newusers >= currentusers then
- local root = userdb["root"]["pwd"]
- userdb = newdb
- userdb["root"]["pwd"] = root
- m1.printex(10, "Got userdb from "..tostring(p1), 1, "history")
- else
- m1.tablesend({[1] = "srvsyncdb", [2] = userdb}, p1)
- m1.printex(10, "Sent userdb to "..tostring(p1), 1, "history")
- end
- finish()
- end
- elseif p1 == 28 and menu == 7.2 and login == false then
- p1 = tonumber(tmptbl)
- syncids[p1] = false
- m1.tablesave("/files/syncids", syncids)
- m1.printex(10, "Server "..tostring(p1).." no longer syncing", 1, "history")
- finish()
- --The Menus
- elseif login == true and event == "key" and (menu == 1 or menu == 2 or menu == 3 or menu == 5) then
- redraw()
- tmptbl, login = {}, false
- m1.printex(12, "Enter user name:")
- m1.printex(13, "")
- elseif login == true and event == "key" and menu == 4 then
- m1.tablesave("/disk/userdb", userdb)
- m1.printex(10, "User Database saved to Floppy", 1, "history")
- finish()
- elseif login == true and event == "key" and (menu == 6 or menu == 7) then
- redraw()
- tmptbl, login, menu = "", false, menu+0.2
- m1.printex(12, "Enter Server ID:")
- m1.printex(13, "")
- elseif (login == true and event == "key" and menu >= 8) or (event == "key" and p1 == 1) then finish() end
- --Wireless stuff
- if event == "rednet_message" then
- local request = m1.deserialize(p2)
- if p2 == "srvidreq" then
- rednet.send(p1, tostring(os.computerID()))
- m1.printex(10, "Sent server ID to "..p1, 1, "history")
- elseif p2 == "ping" then
- rednet.send(p1, "pong")
- pings = pings+1
- elseif request ~= nil and type(request) == "table" and request[1] == "pwdchk" and request[2] ~= nil and request[3] ~= nil then
- local result = pwdaction(request[3], request[2])
- if m1.deserialize(result) ~= nil and m1.deserialize(result)[1] == "true" then
- m1.printex(10, "Password from "..p1.." is correct. User Rank: "..tostring(userdb[request[2]]["rank"]), 1, "history")
- else
- m1.printex(10, "Password error from "..p1..": "..result, 1, "history")
- end
- rednet.send(p1, result)
- result = nil
- elseif request ~= nil and type(request) == "table" and request[1] == "remopn" and type(request[2]) == "number" then
- m1.tablesend({[1] = "remopn", [2] = request[3], [3] = userdb[request[3]]["rank"]}, request[2])
- m1.printex(10, request[3].." opened remote door "..request[2], 1, "history")
- elseif request ~= nil and type(request) == "table" and request[1] == "usrchk" then
- if userdb[request[2]] ~= nil then rednet.send(p1, "true") else rednet.send(p1, "false") end
- m1.printex(10, "PC "..tostring(p1).." checked if "..request[2].." existed.", 1, "history")
- elseif request ~= nil and type(request) == "table" and type(request[2]) == "string" and request[2]:sub(1, 3) == "msg" then
- --[[[1] = Sender/Username
- [2] = Action
- [3] = Message/Message No.
- [4] = To
- ]]--
- m1.tablesend(msgmgr(request[1], string.sub(request[2], 4, 6), request[3], request[4]), p1)
- m1.printex(10, request[1].." performed "..string.sub(request[2], 4, 6).." on pc "..tostring(p1), 1, "history")
- elseif request ~= nil and type(request) == "table" and request[1] == "srvsync" and type(request[3]) == "table" and syncids[p1] then --Sync
- userdb[request[2]] = request[3]
- m1.printex(10, "Synced user "..request[2], 1, "history")
- savesync(request[2])
- elseif request ~= nil and type(request) == "table" and request[1] == "srvsyncdb" and type(request[2]) == "table" and syncids[p1] then --Sync
- local root = userdb["root"]["pwd"]
- userdb = request[2]
- userdb["root"]["pwd"] = root
- m1.printex(10, "Got database from "..p1, 1, "history")
- elseif request ~= nil and type(request) == "table" and request[1] == "srvsyncfirst" and syncids[p1] then --First Sync
- m1.tablesend(userdb, p1)
- m1.printex(10, "First sync with "..p1, 1, "history")
- end
- request = nil
- end
- until false
- rednet.close(m1.getperipheral("modem"))
- end
- startup()
Add Comment
Please, Sign In to add comment