···4343 # Heredocs are sometimes implemented via temporary files,
4444 # however this is typically done using 'mkstemp()' which
4545 # is more secure than a leak in '/proc'.
4646- pubkey=$(sed -n 's/.*\(age\)/\1/p' ~/.age/key.txt)
4746 age -r "$pubkey" -o "$name.age" <<-EOF &&
4848- $pass
4747+ $pass
4948 EOF
5049 printf '%s\n' "Saved '$name' to the store."
5150}
52515252+pw_edit() {
5353+ name=$1
5454+5555+ # we use /dev/shm because it's an in-memory
5656+ # space that we can use to store private data,
5757+ # and securely wipe it without worrying about
5858+ # residual badness
5959+ if [ ! -d /dev/shm ]; then
6060+ die "Failed to access /dev/shm"
6161+ fi
6262+6363+ mkdir -p /dev/shm/pa
6464+ trap 'rm -rf /dev/shm/pa' EXIT
6565+ tmpfile="/dev/shm/pa/$name.txt"
6666+6767+ "${EDITOR:-vi}" "$tmpfile"
6868+6969+ if [ ! -f $tmpfile ]; then
7070+ die "New password not saved"
7171+ fi
7272+7373+ age -r "$pubkey" -o "$name.age" "$tmpfile"
7474+}
7575+5376pw_del() {
5477 yn "Delete pass file '$1'?" && {
5578 rm -f "$1.age"
···132155pa 0.1.0 - age-based password manager
133156=> [a]dd [name] - Create a new password, randomly generated
134157=> [d]el [name] - Delete a password entry.
158158+=> [e]dit [name] - Edit a password entry with $EDITOR.
135159=> [l]ist - List all entries.
136160=> [s]how [name] - Show password for an entry.
137161Password length: export PA_LENGTH=50
···176200 glob "$2" '*/*' && { mkdir -p "${2%/*}" ||
177201 die "Couldn't create category '${2%/*}'"; }
178202203203+ pubkey=$(sed -n 's/.*\(age\)/\1/p' ~/.age/key.txt)
204204+179205 # Restrict permissions of any new files to
180206 # only the current user.
181207 umask 077
···187213 case $1 in
188214 a*) pw_add "$2" ;;
189215 d*) pw_del "$2" ;;
216216+ e*) pw_edit "$2" ;;
190217 s*) pw_show "$2" ;;
191218 l*) pw_list ;;
192219 *) usage