forked from Hyperion/HyperionOS
Hyperion v1.2.0
This commit is contained in:
@@ -1,21 +1,15 @@
|
||||
--:Minify:--
|
||||
local fs = require("sys.fs")
|
||||
local targetUser = ({ ... })[1] or "root"
|
||||
|
||||
local currentUid = syscall.getuid()
|
||||
local currentUser = syscall.getUsername(currentUid) or tostring(currentUid)
|
||||
local targetUid = syscall.getuidbyname(targetUser)
|
||||
|
||||
local targetUid = syscall.getuid(targetUser)
|
||||
if not targetUid then
|
||||
print("su: user '" .. targetUser .. "' does not exist")
|
||||
syscall.exit(1)
|
||||
return
|
||||
end
|
||||
|
||||
local ok, err
|
||||
if currentUid == 0 then
|
||||
ok = true
|
||||
else
|
||||
if currentUid ~= 0 then
|
||||
printInline("Password: ")
|
||||
local pw = ""
|
||||
while true do
|
||||
@@ -25,16 +19,13 @@ else
|
||||
syscall.write(1, "\n")
|
||||
break
|
||||
elseif ch == "\b" then
|
||||
if #pw > 0 then
|
||||
pw = pw:sub(1, -2); syscall.write(1, "\b \b")
|
||||
end
|
||||
if #pw > 0 then pw = pw:sub(1, -2); syscall.write(1, "\b \b") end
|
||||
else
|
||||
pw = pw .. ch
|
||||
syscall.write(1, "*")
|
||||
pw = pw .. ch; syscall.write(1, "*")
|
||||
end
|
||||
end
|
||||
|
||||
ok, err = syscall.elevate(targetUser, pw)
|
||||
local ok, err = syscall.elevate(targetUser, pw)
|
||||
if not ok then
|
||||
sleep(1)
|
||||
print("su: Authentication failure")
|
||||
@@ -43,38 +34,23 @@ else
|
||||
end
|
||||
end
|
||||
|
||||
if currentUid == 0 then
|
||||
syscall.setuid(targetUid)
|
||||
end
|
||||
syscall.setuid(targetUid)
|
||||
|
||||
local pwent = syscall.getpasswd(targetUid)
|
||||
local shell = (pwent and pwent.shell) or "/bin/hysh"
|
||||
local shell = (pwent and pwent.shell) or "/bin/hysh"
|
||||
local homedir = (pwent and pwent.homedir) or "/"
|
||||
|
||||
syscall.chdir(homedir)
|
||||
syscall.setEnviron("HOME", homedir)
|
||||
syscall.setEnviron("USER", targetUser)
|
||||
local ok_cd, err_cd = pcall(syscall.chdir, homedir)
|
||||
if not ok_cd then
|
||||
homedir = "/"
|
||||
syscall.chdir(homedir)
|
||||
end
|
||||
syscall.setEnviron("HOME", homedir)
|
||||
syscall.setEnviron("USER", targetUser)
|
||||
syscall.setEnviron("SHELL", shell)
|
||||
|
||||
local shellText = fs.readAllText(shell)
|
||||
if not shellText then
|
||||
print("su: shell not found: " .. shell)
|
||||
local ok, err = pcall(syscall.exec, shell)
|
||||
if not ok then
|
||||
print("su: cannot exec shell '" .. shell .. "': " .. tostring(err))
|
||||
syscall.exit(1)
|
||||
return
|
||||
end
|
||||
|
||||
local shellFn, loadErr = load(shellText, "@" .. shell)
|
||||
|
||||
if not shellFn then
|
||||
print("su: cannot load shell: " .. tostring(loadErr))
|
||||
syscall.exit(1)
|
||||
return
|
||||
end
|
||||
|
||||
local success, err = syscall.kill(syscall.getppid())
|
||||
if success then
|
||||
syscall.spawn(shellFn, targetUser .. ":" .. shell, syscall.getEnviron())
|
||||
syscall.exit(0)
|
||||
else
|
||||
print("su: "..err)
|
||||
end
|
||||
Reference in New Issue
Block a user