summaryrefslogtreecommitdiff
path: root/.zsh/functions/pass
blob: ad780183d06ea30b45dee99638940881b88c1b1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#
# 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