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@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 <tr...@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 _______________________________________________ Password-Store mailing list Password-Store@lists.zx2c4.com https://lists.zx2c4.com/mailman/listinfo/password-store