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
|