diff --git a/build.cfg b/build.cfg index 95234cc..5d6342a 100755 --- a/build.cfg +++ b/build.cfg @@ -16,6 +16,7 @@ modules/util/motd.lua modules/lib/readline.lua modules/lib/shutil.lua modules/lib/sha256.lua +modules/lib/userlib.lua modules/net/net-ext.lua modules/applications/login.lua modules/applications/luash.lua diff --git a/modules/applications/login.lua b/modules/applications/login.lua index d5a5ff3..3915c3e 100644 --- a/modules/applications/login.lua +++ b/modules/applications/login.lua @@ -1,14 +1,15 @@ function login() - if _G.PASS_HASH and _G.PASS_SALT then - io.write("\f") - io.write(_G.MOTD.."\nPassword: ") - local pt = io.read() - if pt then - if sha.sha256(pt.._G.PASS_SALT) == _G.PASS_HASH then - return true - end - end - return false + if not userlib then return true end + local un,pw,cc = "","",false + if #userlib.users() > 0 then + repeat + io.write("\f"..MOTD.."\n"..net.id.." login: ") + un = io.read() + io.write("Password: ") + pw = io.read("*") + cc = userlib.verify(un,pw) + until cc + os.setuser(un) + return true end - return true end diff --git a/modules/applications/luash.lua b/modules/applications/luash.lua index bd192a4..f051c19 100644 --- a/modules/applications/luash.lua +++ b/modules/applications/luash.lua @@ -1,9 +1,7 @@ function luash(si) spawn("lua shell",function() - if login then - repeat - until login() - end + coroutine.yield() + log(login()) print("\f"..MOTD) print(_VERSION) while true do diff --git a/modules/lib/userlib.lua b/modules/lib/userlib.lua new file mode 100644 index 0000000..0197821 --- /dev/null +++ b/modules/lib/userlib.lua @@ -0,0 +1,58 @@ +do + _G.userlib = {} + local ut = {} + function userlib.users() + local t = {} + for k,v in pairs(ut) do + t[#t+1] = k + end + return t + end + function userlib.verify(username,pass) + if ut[username] then + if sha.sha256(pass..ut[username][2]) == ut[username][1] then + return true + end + end + return false + end + function userlib.gensalt(len) + local S = "" + for i = 1, len do + S=S..string.char(math.random(32,126)) + end + return S + end + function userlib.setuser(username,hpass,salt,...) + ut[username] = {hpass, salt,...} + end + function userlib.deluser(username) + ut[username] = nil + end + function userlib.readpwd(path) + local f=io.open(path,"rb") + if not f then return false end + local C=f:read("*a") + for line in C:gmatch("[^\n]+") do + local username,hpass,salt = line:match("(.+)\t(.+)\t(.+)") + log(username,hpass,salt) + if username and hpass and salt then + ut[username] = {hpass,salt} + end + end + end + function userlib.writepwd() + local S="" + for k,v in pairs(ut) do + S=S..k.."\t"..v[1].."\t"..v[2].."\n" + end + return S + end + function userlib.write(path) + local f=io.open(path,"wb") + if not f then return false end + f:write(userlib.writepwd()) + f:close() + end + spawn("load users",function() userlib.readpwd("/boot/sys/users.dat") end) +end