diff options
Diffstat (limited to '.zsh/functions/pass')
-rw-r--r-- | .zsh/functions/pass | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/.zsh/functions/pass b/.zsh/functions/pass new file mode 100644 index 0000000..4c8f5e0 --- /dev/null +++ b/.zsh/functions/pass @@ -0,0 +1,87 @@ +# +# Add handling of special fields to 'pass' +# +# Syntax is: pass entry FIELD [-c|--clip] +# It is then tried to find "^FIELD: " inside the file and the value +# (i.e. without "FIELD: ") returned (optionally only to clipboard) +# +# There are aliases: +# - user|User --> entry 'User' +# - pin|PIN --> entry 'PIN' + +local cmd subcmd entry xclip ppath +[[ $# -lt 1 ]] && { command pass; return } + +cmd=$1 +shift + +# copied from pass sourcecode +clip() { + # This base64 business is a disgusting hack to deal with newline inconsistancies + # in shell. There must be a better way to deal with this, but because I'm a dolt, + # we're going with this for now. + + before="$(xclip -o -selection clipboard | base64)" + echo -n "$1" | xclip -selection clipboard + ( + sleep 45 + now="$(xclip -o -selection clipboard | base64)" + if [[ $now != $(echo -n "$1" | base64) ]]; then + before="$now" + fi + + # It might be nice to programatically check to see if klipper exists, + # as well as checking for other common clipboard managers. But for now, + # this works fine -- if qdbus isn't there or if klipper isn't running, + # this essentially becomes a no-op. + # + # Clipboard managers frequently write their history out in plaintext, + # so we axe it here: + qdbus org.kde.klipper /klipper org.kde.klipper.klipper.clearClipboardHistory &>/dev/null + + echo "$before" | base64 -d | xclip -selection clipboard + ) & disown + echo "Copied $2 to clipboard. Will clear in 45 seconds." +} + +TRAPEXIT () { + unfunction clip +} + +case $cmd in + entry) + subcmd=$1 + shift + ;; + [Uu]ser) + subcmd="User" + cmd="entry" + ;; + [pP][iI][nN]) + subcmd="PIN" + cmd="entry" + ;; + *) command pass $cmd "$@" + return +esac + +ppath=$1 + +if [[ $ppath == "-c" || $ppath == "--clip" ]]; then + xclip=1 + ppath=$2 +fi + +entry="$(command pass show $ppath | grep "$subcmd:" | sed -e "s/^$subcmd: //")" + +if [[ -z $entry ]]; then + echo "No '$subcmd:' entry found" +else + if [[ -n $xclip ]]; then + clip "$entry" "entry of $ppath" + else + echo $entry + fi +fi + +# vim: ft=zsh |