[PATCH] Added wild-card capability to the show command.

Trey Mitchell treym at wolfram.com
Wed Apr 4 19:47:10 CEST 2018


Due to the nature of our environment it's sometimes necessary to iterate through a bunch of old passwords before finding the one I need.
So I wanted to be able to list more than one password in a directory at a time. I was previously using shell one-liners to accomplish this but finally got around to just adding the functionality. It may not make sense for anyone else, but I figured I'd submit it anyway on the off chance that someone else found it useful.

Example:

Given this structure
$ pass wc-demo/
wc-demo/
├── 0-current
├── 1-old
├── dir-demo1
│   ├── 0-current
│   └── 1-old
└── dir-demo2
    ├── 0-current
    └── 1-old

All of these work:
$ pass wc-demo/*
wc-demo/0-current:
pass1

wc-demo/1-old:
pass2

$ pass wc-demo/dir*
wc-demo/dir-demo1
├── 0-current
└── 1-old
wc-demo/dir-demo2
├── 0-current
└── 1-old

$ pass wc-demo/dir*/*
wc-demo/dir-demo1/0-current:
pass2

wc-demo/dir-demo1/1-old:
oldpass

wc-demo/dir-demo2/0-current:
pass#1

wc-demo/dir-demo2/1-old:
A@|FVz}W=w1A at ZkzXD*2WxA2X

$ pass wc-demo/dir-demo1/*
wc-demo/dir-demo1/0-current:
pass2

wc-demo/dir-demo1/1-old:
oldpass

All existing functionality is preserved.

Let me know if you want me to revise or clean up the code in any way.

>From abe2089d0d5e76145fec26953a900da695c52d72 Mon Sep 17 00:00:00 2001
From: Trey Mitchell <treym at wolfram.com>
Date: Fri, 30 Mar 2018 19:06:30 -0500
Subject: [PATCH] Added wild-card capability to the show command.

---
 src/password-store.sh | 71 ++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 48 insertions(+), 23 deletions(-)

diff --git a/src/password-store.sh b/src/password-store.sh
index eac5404..aa69ac0 100755
--- a/src/password-store.sh
+++ b/src/password-store.sh
@@ -358,33 +358,58 @@ cmd_show() {
        [[ $err -ne 0 || ( $qrcode -eq 1 && $clip -eq 1 ) ]] && die "Usage: $PROGRAM $COMMAND [--clip[=line-number],-c[line-number]] [--qrcode[=line-number],-q[line-number]] [pass-name]"

        local path="$1"
-       local passfile="$PREFIX/$path.gpg"
        check_sneaky_paths "$path"
-       if [[ -f $passfile ]]; then
-               if [[ $clip -eq 0 && $qrcode -eq 0 ]]; then
-                       $GPG -d "${GPG_OPTS[@]}" "$passfile" || exit $?
-               else
-                       [[ $selected_line =~ ^[0-9]+$ ]] || die "Clip location '$selected_line' is not a number."
-                       local pass="$($GPG -d "${GPG_OPTS[@]}" "$passfile" | tail -n +${selected_line} | head -n 1)"
-                       [[ -n $pass ]] || die "There is no password to put on the clipboard at line ${selected_line}."
-                       if [[ $clip -eq 1 ]]; then
-                               clip "$pass" "$path"
-                       elif [[ $qrcode -eq 1 ]]; then
-                               qrcode "$pass" "$path"
+       local passfiles="$PREFIX/$path.gpg"
+       local ARRAY=($passfiles)
+
+       if [[ $clip -eq 1 && ${#ARRAY[@]} -gt 1 ]]; then
+               die "Clip makes no sense in multi record context."
+       fi
+
+       for passfile in $passfiles; do
+               local passpath=${passfile#$PREFIX\/}
+               local passpath=${passpath%\.gpg}
+               local passdir=${passfile%\.gpg}
+               local passdirlong=($(ls -d $passdir 2>/dev/null))
+               local passdirshort=${passdirlong#$PREFIX\/}
+               if [[ -f $passfile ]]; then
+                       if [[ $clip -eq 0 && $qrcode -eq 0 ]]; then
+                               if [ ${#ARRAY[@]} -gt 1 ]; then
+                                       printf "$passpath:\n"
+                                       $GPG -d "${GPG_OPTS[@]}" "$passfile" || exit $?
+                                       printf "\n"
+                               else
+                                       $GPG -d "${GPG_OPTS[@]}" "$passfile" || exit $?
+                               fi
+                       else
+                               [[ $selected_line =~ ^[0-9]+$ ]] || die "Clip location '$selected_line' is not a number."
+                               local pass="$($GPG -d "${GPG_OPTS[@]}" "$passfile" | tail -n +${selected_line} | head -n 1)"
+                               [[ -n $pass ]] || die "There is no password to put on the clipboard at line ${selected_line}."
+                               if [[ $clip -eq 1 ]]; then
+                                       clip "$pass" "$path"
+                               elif [[ $qrcode -eq 1 ]]; then
+                                       if [ ${#ARRAY[@]} -gt 1 ]; then
+                                               printf "$passpath:\n"
+                                       fi
+                                       qrcode "$pass" "$passpath"
+                               fi
                        fi
-               fi
-       elif [[ -d $PREFIX/$path ]]; then
-               if [[ -z $path ]]; then
-                       echo "Password Store"
+               elif [[ -d ${passdirlong[0]} ]]; then
+                       if [[ -z $path ]]; then
+                               echo "Password Store"
+                               tree -C -l --noreport "$PREFIX" | tail -n +2 | sed -E 's/\.gpg(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' # remove .gpg at end of line, but keep colors
+                       else
+                               for dir in "${passdirlong[@]}"; do
+                               echo ${dir#$PREFIX\/}
+                               tree -C -l --noreport "$dir" | tail -n +2 | sed -E 's/\.gpg(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' # remove .gpg at end of line, but keep colors
+                               done
+                       fi
+               elif [[ -z $path ]]; then
+                       die "Error: password store is empty. Try \"pass init\"."
                else
-                       echo "${path%\/}"
+                       die "Error: $path is not in the password store."
                fi
-               tree -C -l --noreport "$PREFIX/$path" | tail -n +2 | sed -E 's/\.gpg(\x1B\[[0-9]+m)?( ->|$)/\1\2/g' # remove .gpg at end of line, but keep colors
-       elif [[ -z $path ]]; then
-               die "Error: password store is empty. Try \"pass init\"."
-       else
-               die "Error: $path is not in the password store."
-       fi
+       done
 }

 cmd_find() {
--
2.14.1



--
Trey Mitchell
Wolfram Research, Inc
Systems Administrator, Dev/Ops
217-398-0700


More information about the Password-Store mailing list