# # 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 ) &! 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)" ret=$? if [[ $ret -ne 0 ]]; then # entry not found echo $entry return $ret fi entry="$(echo $entry | grep "$subcmd:" | sed -e "s/^$subcmd: //")" if [[ -z $entry ]]; then echo "No '$subcmd:' entry found" return 11 else if [[ -n $xclip ]]; then clip "$entry" "entry of $ppath" else echo $entry fi fi # vim: ft=zsh