factor/basis/elevate/unix/unix.factor

32 lines
1.1 KiB
Factor

USING: arrays elevate elevate.private io.launcher kernel locals
math sequences splitting strings system unix.ffi unix.process prettyprint ;
IN: elevate.unix
<PRIVATE
! https://wiki.sei.cmu.edu/confluence/x/p9YxBQ
! group ID must be lowered before user ID otherwise program may re-gain root!
: posix-lowered ( -- )
getgid setgid failed-process? [ lowered-failed ] [ ] if
getuid setuid failed-process? [ lowered-failed ] [ ] if ;
GENERIC: posix-replace-process ( command-list -- code )
! naive split breaks with spaces inside quotes in shell commands
M: string posix-replace-process
" " split posix-replace-process ;
M: array posix-replace-process
[ first ] [ rest " " prefix ] bi exec-with-path ;
! if either the real or effective user IDs are 0, we are already elevated
M: unix already-root?
getuid geteuid [ zero? ] bi@ or ;
:: posix-elevated ( command replace? -- process )
command "sudo" prepend-command
replace? [ posix-replace-process ] [ run-process ] if
dup failed-process? [ drop command { "sudo" } elevated-failed ] [ ] if ;
M: unix elevated
2drop posix-elevated ;
PRIVATE>