]> Sergey Matveev's repositories - passman.git/blob - passman
b71f206a61e6d9b751f17029dc6e210c397fe274
[passman.git] / passman
1 #!/bin/sh -e
2 # passman -- simple password manager
3 # Copyright (C) 2013-2023 Sergey Matveev (stargrave@stargrave.org)
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; version 3 of the License.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17 DB=${PASSMANDB:-$HOME/.passmandb}
18
19 dec() {
20     if [ -s $DB ] ; then
21         age -d $DB | zstd -d
22     else
23         cat <<EOF
24 %rec: Credential
25 %key: Name
26 %mandatory: Name Passwd
27 %allowed: Data
28 EOF
29     fi
30 }
31
32 enc() {
33     zstd | age -p
34 }
35
36 generator() {
37     dd if=/dev/random bs=16 count=1 status=none | base64 | tr "+/" "-_" | tr -d =
38 }
39
40 cliper() {
41     xclip -in -selection $1
42 }
43
44 tmp=`mktemp`.rec
45 trap "rm -f $tmp ${DB}.tmp" HUP PIPE INT QUIT TERM EXIT
46
47 finder() {
48     dec | recsel -e "Name ~ '$1'" > $tmp
49     [ $(recsel -c $tmp) -eq 1 ] || {
50         recsel -C -P Name $tmp
51         exit 1
52     }
53 }
54
55 commit() {
56     enc < $tmp > ${DB}.tmp
57     fsync ${DB}.tmp
58     mv ${DB}.tmp $DB
59 }
60
61 case "$1" in
62 has)
63     finder "$2"
64     ;;
65 gen)
66     generator
67     ;;
68 add)
69     dst="$2"
70     passwd="$3"
71     [ -n "$dst" ]
72     [ -n "$passwd" ] || passwd=$(generator)
73     echo ${dst}...
74     dec | recins -t Credential -f Name -v "$dst" -f Passwd -v "$passwd" > $tmp
75     commit
76     ;;
77 mod)
78     dec > $tmp
79     $EDITOR $tmp
80     commit
81     ;;
82 *)
83     finder "$1"
84     name=$(recsel -P Name $tmp)
85     echo $name >&2
86     data=$(recsel -P Data $tmp)
87     [ -z "$data" ] || echo "Associated data: $data"
88     echo -n $(recsel -P Passwd $tmp) | cliper clipboard
89     echo -n ${name##*/} | cliper primary
90     sleep 10
91     echo -n | cliper clipboard
92     ;;
93 esac