added a proper user system, modified userspace utils to use it, etc etc.
This commit is contained in:
parent
9cec183470
commit
6a822d6779
@ -16,7 +16,6 @@ modules/util/motd.lua
|
|||||||
modules/lib/readline.lua
|
modules/lib/readline.lua
|
||||||
modules/lib/shutil.lua
|
modules/lib/shutil.lua
|
||||||
libwrap sha modules/lib/sha256.lua
|
libwrap sha modules/lib/sha256.lua
|
||||||
modules/lib/userlib.lua
|
|
||||||
modules/net/net-ext.lua
|
modules/net/net-ext.lua
|
||||||
modules/applications/login.lua
|
modules/applications/login.lua
|
||||||
modules/applications/genkernel.lua
|
modules/applications/genkernel.lua
|
||||||
|
@ -3,7 +3,7 @@ local si = tA[1]
|
|||||||
spawn("lua shell",function()
|
spawn("lua shell",function()
|
||||||
_ENV = shutil.genenv()
|
_ENV = shutil.genenv()
|
||||||
coroutine.yield()
|
coroutine.yield()
|
||||||
log(login())
|
log(pcall(login))
|
||||||
print("\f"..MOTD)
|
print("\f"..MOTD)
|
||||||
print(_VERSION)
|
print(_VERSION)
|
||||||
while true do
|
while true do
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
function login()
|
function login()
|
||||||
if not userlib then return true end
|
|
||||||
local un,pw,cc = "","",false
|
local un,pw,cc = "","",false
|
||||||
if #userlib.users() > 0 then
|
if #os.users() > 0 then
|
||||||
repeat
|
repeat
|
||||||
io.write("\f"..MOTD.."\n"..net.id.." login: ")
|
io.write("\f"..MOTD.."\n"..net.id.." login: ")
|
||||||
un = io.read()
|
un = io.read()
|
||||||
io.write("Password: ")
|
io.write("Password: ")
|
||||||
pw = io.read("*")
|
pw = io.read("*")
|
||||||
cc = userlib.verify(un,pw)
|
cc = os.su(un,pw)
|
||||||
until cc
|
until cc
|
||||||
os.setuser(un)
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -101,12 +101,91 @@ do -- so local works
|
|||||||
return tT[pid].n,tT[pid].p,tT[pid].u
|
return tT[pid].n,tT[pid].p,tT[pid].u
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function os.setuser(user)
|
|
||||||
tT[cT].u = user
|
|
||||||
end
|
|
||||||
function os.genenv()
|
function os.genenv()
|
||||||
local et = {}
|
local et = {}
|
||||||
setmetatable(et,{__index=_G})
|
setmetatable(et,{__index=_G})
|
||||||
return et
|
return et
|
||||||
end
|
end
|
||||||
|
-- user stuff from here
|
||||||
|
local ut = {}
|
||||||
|
local function flushut()
|
||||||
|
local f = fs.open("/boot/sys/users.dat","wb")
|
||||||
|
if f then
|
||||||
|
for k,v in pairs(ut) do
|
||||||
|
fs.write(f,k.."\t"..v[1].."\t"..v[2].."\n")
|
||||||
|
end
|
||||||
|
fs.close(f)
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
function os.readut()
|
||||||
|
local f=fs.open("/boot/sys/users.dat","rb")
|
||||||
|
if not f then return false end
|
||||||
|
local C=fs.readall(f)
|
||||||
|
fs.close(f)
|
||||||
|
log(C)
|
||||||
|
for line in C:gmatch("[^\n]+") do
|
||||||
|
local username,hpass,salt = line:match("(.+)\t(.+)\t(.+)")
|
||||||
|
if username and hpass and salt then
|
||||||
|
ut[username] = {hpass,salt}
|
||||||
|
log(username,hpass,salt)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function os.setuid(user)
|
||||||
|
if tT[cT].u == "superuser" and ut[user] then
|
||||||
|
tT[cT].u = user
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
function os.getuid(pid)
|
||||||
|
pid = pid or cT
|
||||||
|
return tT[pid].u
|
||||||
|
end
|
||||||
|
function os.users()
|
||||||
|
local t = {}
|
||||||
|
for k,v in pairs(ut) do
|
||||||
|
t[#t+1] = k
|
||||||
|
end
|
||||||
|
return t
|
||||||
|
end
|
||||||
|
function os.verifyuser(username,pass)
|
||||||
|
if sha then
|
||||||
|
if ut[username] then
|
||||||
|
if sha.sha256(pass..ut[username][2]) == ut[username][1] then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
function os.gensalt(len)
|
||||||
|
local S = ""
|
||||||
|
for i = 1, len do
|
||||||
|
S=S..string.char(math.random(32,126))
|
||||||
|
end
|
||||||
|
return S
|
||||||
|
end
|
||||||
|
function os.setuser(username,hpass,salt,...)
|
||||||
|
if tT[cT].u == "superuser" then
|
||||||
|
if hpass == nil then
|
||||||
|
ut[username] = nil
|
||||||
|
else
|
||||||
|
ut[username] = {hpass, salt,...}
|
||||||
|
flushut()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function os.su(user,pass)
|
||||||
|
if os.verifyuser(user,pass) then
|
||||||
|
log(tT[cT].u .. " su'd to "..user,6,1,true)
|
||||||
|
tT[cT].u = user
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
spawn("read users",os.readut)
|
||||||
end
|
end
|
||||||
|
@ -14,10 +14,11 @@ function shutil.cat(p)
|
|||||||
end
|
end
|
||||||
function shutil.ps(f)
|
function shutil.ps(f)
|
||||||
local f=f or ""
|
local f=f or ""
|
||||||
print("PID\tName")
|
print("PID\tUser\tName")
|
||||||
for k,v in pairs(os.tasks()) do
|
for k,v in pairs(os.tasks()) do
|
||||||
|
local _,_,uid = os.taskinfo(k)
|
||||||
if v:find(f) then
|
if v:find(f) then
|
||||||
print(tostring(k).."\t"..tostring(v))
|
print(tostring(k).."\t"..tostring(uid:sub(1,6)).."\t"..tostring(v))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user