From a0388698bf58c67abe88bd0932e6a60f3251a313 Mon Sep 17 00:00:00 2001 From: Jacob Travers Date: Wed, 13 Oct 2021 21:19:30 -0700 Subject: [PATCH 1/2] ADD: sudo-write-quit --- sudo-write.kak | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/sudo-write.kak b/sudo-write.kak index 79a1f41..2558002 100644 --- a/sudo-write.kak +++ b/sudo-write.kak @@ -69,3 +69,65 @@ define-command sudo-write -docstring "Write the content of the buffer using sudo } } +# SAME AS ABOVE WITH 'QUIT' APPENEDED + +define-command -hidden sudo-write-quit-cached-password %{ + eval -save-regs f %{ + reg f %sh{ mktemp -t XXXXXX } + write! %reg{f} + eval %sh{ + sudo -n -- dd if="$kak_main_reg_f" of="$kak_buffile" >/dev/null 2>&1 + if [ $? -eq 0 ]; then + echo "edit!" + else + echo 'fail "Unknown failure"' + fi + rm -f "$kak_main_reg_f" + } + } + quit +} + +define-command -hidden sudo-write-quit-prompt-password %{ + prompt -password 'Password:' %{ + eval -save-regs r %{ + eval -draft -save-regs 'tf|"' %{ + reg t %val{buffile} + reg f %sh{ mktemp -t XXXXXX } + write! %reg{f} + edit -scratch '*sudo-password-tmp*' + reg '"' "%val{text}" + exec + reg | %{ + sudo -S -- dd if="$kak_main_reg_f" of="$kak_main_reg_t" > /dev/null 2>&1 + if [ $? -eq 0 ]; then + printf 'edit!' + else + printf 'fail "Incorrect password?"' + fi + rm -f "$kak_main_reg_f" + } + exec '|' + exec -save-regs '' '%"ry' + delete-buffer! '*sudo-password-tmp*' + } + eval %reg{r} + } + quit + } +} + +define-command sudo-write-quit -docstring "Write the content of the buffer using sudo, then quit" %{ + eval %sh{ + if [ "${kak_buffile%"${kak_buffile#?}"}" != "/" ]; then + printf 'fail "Not a file"' + exit + fi + if sudo -n true > /dev/null 2>&1; then + printf sudo-write-quit-cached-password + else + printf sudo-write-quit-prompt-password + fi + } +} + From 91932596413fe4f791c65c36d17cd4786b92fd87 Mon Sep 17 00:00:00 2001 From: jtrv <46337843+jtrv@users.noreply.github.com> Date: Thu, 26 Dec 2024 21:39:11 -0800 Subject: [PATCH 2/2] fprint mode + cleanup --- sudo-write.kak | 127 +++++++++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 74 deletions(-) diff --git a/sudo-write.kak b/sudo-write.kak index 2558002..787d618 100644 --- a/sudo-write.kak +++ b/sudo-write.kak @@ -1,12 +1,15 @@ # save the current buffer to its file as root using `sudo` -# (optionally pass the user password to sudo if not cached) +# prompt and pass the user password to sudo if not cached -define-command -hidden sudo-write-cached-password %{ +# toggle fprint mode +declare-option bool fprint_mode false + +define-command -hidden sudo-write-cached %{ # easy case: the password was already cached, so we don't need any tricky handling - eval -save-regs f %{ - reg f %sh{ mktemp -t XXXXXX } + evaluate-commands -save-regs f %{ + set-register f %sh{ mktemp -t XXXXXX } write! %reg{f} - eval %sh{ + evaluate-commands %sh{ sudo -n -- dd if="$kak_main_reg_f" of="$kak_buffile" >/dev/null 2>&1 if [ $? -eq 0 ]; then echo "edit!" @@ -18,12 +21,12 @@ define-command -hidden sudo-write-cached-password %{ } } -define-command -hidden sudo-write-prompt-password %{ +define-command -hidden sudo-write-prompt %{ prompt -password 'Password:' %{ - eval -save-regs r %{ - eval -draft -save-regs 'tf|"' %{ - reg t %val{buffile} - reg f %sh{ mktemp -t XXXXXX } + evaluate-commands -save-regs r %{ + evaluate-commands -draft -save-regs 'tf|"' %{ + set-register t %val{buffile} + set-register f %sh{ mktemp -t XXXXXX } write! %reg{f} # write the password in a buffer in order to pass it through STDIN to sudo @@ -31,9 +34,9 @@ define-command -hidden sudo-write-prompt-password %{ # through the shell scope's environment or interpolating it inside the shell string # 'exec |' is pretty much the only way to pass data over STDIN edit -scratch '*sudo-password-tmp*' - reg '"' "%val{text}" - exec - reg | %{ + set-register '"' "%val{text}" + execute-keys + set-register | %{ sudo -S -- dd if="$kak_main_reg_f" of="$kak_main_reg_t" > /dev/null 2>&1 if [ $? -eq 0 ]; then printf 'edit!' @@ -42,41 +45,22 @@ define-command -hidden sudo-write-prompt-password %{ fi rm -f "$kak_main_reg_f" } - exec '|' - exec -save-regs '' '%"ry' + execute-keys '|' + execute-keys -save-regs '' '%"ry' delete-buffer! '*sudo-password-tmp*' } - eval %reg{r} + evaluate-commands %reg{r} } } } -define-command sudo-write -docstring "Write the content of the buffer using sudo" %{ - eval %sh{ - # tricky posix-way of getting the first character of a variable - # no subprocess! - if [ "${kak_buffile%"${kak_buffile#?}"}" != "/" ]; then - # not entirely foolproof as a scratch buffer may start with '/', but good enough - printf 'fail "Not a file"' - exit - fi - # check if the password is cached - if sudo -n true > /dev/null 2>&1; then - printf sudo-write-cached-password - else - printf sudo-write-prompt-password - fi - } -} - -# SAME AS ABOVE WITH 'QUIT' APPENEDED - -define-command -hidden sudo-write-quit-cached-password %{ - eval -save-regs f %{ - reg f %sh{ mktemp -t XXXXXX } +define-command -hidden sudo-write-fprint %{ + evaluate-commands -save-regs f %{ + set-register f %sh{ mktemp -t XXXXXX } write! %reg{f} - eval %sh{ - sudo -n -- dd if="$kak_main_reg_f" of="$kak_buffile" >/dev/null 2>&1 + evaluate-commands %sh{ + # if fprint is enabled we use -S to bypass the password prompt + sudo -S -- dd if="$kak_main_reg_f" of="$kak_buffile" >/dev/null 2>&1 if [ $? -eq 0 ]; then echo "edit!" else @@ -85,49 +69,44 @@ define-command -hidden sudo-write-quit-cached-password %{ rm -f "$kak_main_reg_f" } } - quit } -define-command -hidden sudo-write-quit-prompt-password %{ - prompt -password 'Password:' %{ - eval -save-regs r %{ - eval -draft -save-regs 'tf|"' %{ - reg t %val{buffile} - reg f %sh{ mktemp -t XXXXXX } - write! %reg{f} - edit -scratch '*sudo-password-tmp*' - reg '"' "%val{text}" - exec - reg | %{ - sudo -S -- dd if="$kak_main_reg_f" of="$kak_main_reg_t" > /dev/null 2>&1 - if [ $? -eq 0 ]; then - printf 'edit!' - else - printf 'fail "Incorrect password?"' - fi - rm -f "$kak_main_reg_f" - } - exec '|' - exec -save-regs '' '%"ry' - delete-buffer! '*sudo-password-tmp*' - } - eval %reg{r} - } - quit + +define-command sudo-write -docstring "Write the content of the buffer using sudo" %{ + evaluate-commands %sh{ + # tricky posix-way of getting the first character of a variable + # no subprocess! + if [ "${kak_buffile%"${kak_buffile#?}"}" != "/" ]; then + # not entirely foolproof as a scratch buffer may start with '/', but good enough + echo 'fail "Not a file"' + exit + # check if fprint is enabled + elif "$kak_opt_fprint_mode"; then + echo sudo-write-fprint + # check if the password is cached + elif sudo -n true > /dev/null 2>&1; then + echo sudo-write-cached + else + echo sudo-write-prompt + fi } } +# SAME AS ABOVE WITH 'QUIT' APPENEDED + define-command sudo-write-quit -docstring "Write the content of the buffer using sudo, then quit" %{ - eval %sh{ + evaluate-commands %sh{ if [ "${kak_buffile%"${kak_buffile#?}"}" != "/" ]; then - printf 'fail "Not a file"' + echo 'fail "Not a file"' exit - fi - if sudo -n true > /dev/null 2>&1; then - printf sudo-write-quit-cached-password + elif "$kak_opt_fprint_mode"; then + echo "sudo-write-fprint" + elif sudo -n true > /dev/null 2>&1; then + echo "sudo-write-cached" else - printf sudo-write-quit-prompt-password + echo "sudo-write-prompt" fi + echo "quit" } }