From 78a981ab965afc79b3c4843b314983a9f23435cb Mon Sep 17 00:00:00 2001 From: Cat Stevens Date: Sat, 19 May 2018 15:16:38 -0400 Subject: [PATCH] os-specific refactor appears to work on Linux --- basis/elevate/elevate.factor | 95 +++++----------------------- basis/elevate/linux/linux.factor | 34 ++++++++++ basis/elevate/linux/platforms.txt | 0 basis/elevate/macosx/macosx.factor | 35 ++++++++++ basis/elevate/macosx/platforms.txt | 0 basis/elevate/unix/platforms.txt | 0 basis/elevate/unix/unix.factor | 31 +++++++++ basis/elevate/windows/platforms.txt | 0 basis/elevate/windows/windows.factor | 12 ++++ 9 files changed, 127 insertions(+), 80 deletions(-) create mode 100644 basis/elevate/linux/linux.factor create mode 100644 basis/elevate/linux/platforms.txt create mode 100644 basis/elevate/macosx/macosx.factor create mode 100644 basis/elevate/macosx/platforms.txt create mode 100644 basis/elevate/unix/platforms.txt create mode 100644 basis/elevate/unix/unix.factor create mode 100644 basis/elevate/windows/platforms.txt create mode 100644 basis/elevate/windows/windows.factor diff --git a/basis/elevate/elevate.factor b/basis/elevate/elevate.factor index 44c472e4bc..820e16996e 100644 --- a/basis/elevate/elevate.factor +++ b/basis/elevate/elevate.factor @@ -1,99 +1,34 @@ -USING: accessors arrays assocs command-line environment -formatting fry io.launcher kernel ui locals math namespaces -sequences splitting strings system unix.ffi unix.process ; +USING: accessors arrays assocs combinators command-line +environment formatting fry io.launcher kernel locals math +namespaces sequences splitting strings system ui vocabs ; IN: elevate > zero? not ; -: posix-lowered ( -- ) - getgid setgid failed-process? [ lowered-failed ] [ ] if - getuid setuid failed-process? [ lowered-failed ] [ ] if ; - PRIVATE> +HOOK: already-root? os ( -- ? ) HOOK: elevated os ( command replace? win-console? posix-graphical? -- process ) - -! TODO -M: windows elevated - 3drop run-process ; - -! TODO -M:: macosx elevated ( command replace? win-console? posix-graphical? -- process ) - already-root? [ command >>command 1array ] [ - posix-graphical? [ ! graphical (through applescript) - command apple-script-elevated - ] when - command replace? win-console? posix-graphical? - linux os [ elevated ] with-variable - ] if ; - -M:: linux elevated ( command replace? win-console? posix-graphical? -- process ) - already-root? [ - command >>command 1array ! we are already root: just give a process - ] [ - ! graphical handled - posix-graphical? ui-running? or "DISPLAY" os-env and - { "gksudo" "kdesudo" "sudo" } { "sudo" } ? - - command '[ _ glue-command ] map :> command-list command-list [ - replace? [ - " " split posix-replace-process - ] [ run-process ] if - ] map - ! if they all failed, then it failed, but if one passed, that's normal (success) - [ [ failed-process? ] all? [ command command-list elevated-failed ] [ ] if ] keep - ] if ; +HOOK: lowered os ( -- ) : elevate ( win-console? posix-graphical? -- ) [ (command-line) t ] 2dip elevated drop ; -HOOK: lowered os ( -- ) - -! https://wiki.sei.cmu.edu/confluence/display/c/POS36-C.+Observe+correct+revocation+order+while+relinquishing+privileges -! group ID must be lowered before user ID otherwise program may re-gain root! -M: linux lowered - posix-lowered ; - -M: macosx lowered - posix-lowered ; - -M: windows lowered ; \ No newline at end of file +{ + { [ os windows? ] [ "elevate.windows" require ] } + { [ os linux? ] [ "elevate.linux" require ] } + { [ os macosx? ] [ "elevate.macosx" require ] } +} cond diff --git a/basis/elevate/linux/linux.factor b/basis/elevate/linux/linux.factor new file mode 100644 index 0000000000..3f14efc1b3 --- /dev/null +++ b/basis/elevate/linux/linux.factor @@ -0,0 +1,34 @@ +USING: accessors arrays elevate elevate.private elevate.unix +elevate.unix.private environment io.launcher kernel locals +sequences system ui ; +IN: elevate.linux + + command >>command 1array ! we are already root: just give a process + ] [ + posix-graphical? ui-running? or "DISPLAY" os-env and [ + command { "gksudo" "kdesudo" "pkexec" "sudo" } [ + prepend-command + ] with map :> command-list + + command-list [ + replace? [ posix-replace-process ] [ + ! need to fix race condition + swap >>command t >>detached run-process + ] if + ] map [ + [ failed-process? ] all? [ + command command-list elevated-failed + ] [ ] if + ] keep + ] [ + command replace? posix-elevated ! sudo only + ] if + ] if ; + +M: linux lowered + posix-lowered ; + +PRIVATE> diff --git a/basis/elevate/linux/platforms.txt b/basis/elevate/linux/platforms.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/elevate/macosx/macosx.factor b/basis/elevate/macosx/macosx.factor new file mode 100644 index 0000000000..81e1cf4a70 --- /dev/null +++ b/basis/elevate/macosx/macosx.factor @@ -0,0 +1,35 @@ +USING: cocoa.apple-script elevate elevate.unix ; +IN: elevate.macosx + + command >>command 1array ] [ + posix-graphical? [ ! graphical through applescript + command apple-script-elevated + ] when + posix-elevated + ] if ; + +M: macosx lowered + posix-lowered ; + +PRIVATE> + diff --git a/basis/elevate/macosx/platforms.txt b/basis/elevate/macosx/platforms.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/elevate/unix/platforms.txt b/basis/elevate/unix/platforms.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/elevate/unix/unix.factor b/basis/elevate/unix/unix.factor new file mode 100644 index 0000000000..a5898314c0 --- /dev/null +++ b/basis/elevate/unix/unix.factor @@ -0,0 +1,31 @@ +USING: arrays elevate elevate.private io.launcher kernel locals +math sequences splitting strings system unix.ffi unix.process prettyprint ; +IN: elevate.unix + + diff --git a/basis/elevate/windows/platforms.txt b/basis/elevate/windows/platforms.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/basis/elevate/windows/windows.factor b/basis/elevate/windows/windows.factor new file mode 100644 index 0000000000..6d2934ab53 --- /dev/null +++ b/basis/elevate/windows/windows.factor @@ -0,0 +1,12 @@ +USING: io.launcher elevate ; +IN: elevate.windows + + + \ No newline at end of file -- 2.34.1