summaryrefslogtreecommitdiff
path: root/.zsh/functions/pass
diff options
context:
space:
mode:
Diffstat (limited to '.zsh/functions/pass')
-rw-r--r--.zsh/functions/pass87
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