<div dir="ltr"><div>Hello,</div><div><br></div><div>Just wanted to ask what the status of this is. Are there any plans to merge it?</div><div><br></div><div>Thank you.</div><div><br></div><div>Best,</div><div>Calin<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jan 18, 2019 at 11:57 AM Tobias Girstmair <<a href="mailto:junkgir-passwd@yahoo.de">junkgir-passwd@yahoo.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">This is great! Ack from me (whatever little that counts).<br>
<br>
lg<br>
<br>
On Fri, Jan 18, 2019 at 11:43:49AM +0100, Calin Iorgulescu wrote:<br>
>Hello,<br>
><br>
>@Tobias:<br>
><br>
>> That's something that has been bugging me for years! Is there any reason<br>
>> why `generate -m` doesn't expect lines on stdin, like `insert -m` does?<br>
>><br>
><br>
>No particular reason. I don't really use the '--multiline' mode as part of my workflow, so implementing it as a list of arguments seemed to make more sense at the time.<br>
><br>
>@Tristan:<br>
><br>
>> Thanks for this -- this is a wishlist item that I raised here on<br>
>> December 28.  Your patch is one solution to the problem, but I have to<br>
>> question why you haven't made your "-m" option for "pass generate" work<br>
>> the same way it does for "pass insert" (i.e., by reading the extra lines<br>
>> from stdin rather than from command-line arguments). I think having two<br>
>> different behaviours for the same command will lead to a lot of<br>
>> confusion.  (Also, why not provide an additional long option version<br>
>> named "--multiline", as "pass insert" does?)<br>
><br>
>As I mentioned above to Tobias, this just felt more natural at the time. But I agree that having different behaviors for the same flag is confusing. Hence this new patch.<br>
><br>
>@Pass Word:<br>
>> One nice thing about the multiple -m options on the command line is you could do something like this:<br>
>><br>
>> -m "user: "$(pass generate -n deleteme 10 2>/dev/null| tail -1)<br>
><br>
>That's a nice use case I hadn't considered! Presumably, one could even use a tool like 'pwgen' instead of poluting pass's git history with a "deleteme" password.<br>
>This could still be done using the way that multiline behaves for inserts. For example, the same line could be written as:<br>
><br>
>$ echo "user:"$(pwgen 15 1) | pass generate -m <a href="http://widgets.com" rel="noreferrer" target="_blank">widgets.com</a> 30<br>
><br>
><br>
>@all:<br>
><br>
>I am glad to see this feature raises some interest! As mentioned above, I do think it's worth being consistent with the behavior of '-m' for insert. This patch does just that: it aims to implement '-m' in the same way that it is done for insert. Additionally, it prints out an error message if '-m' is used together with '-i' (as there might be several ways to merge existing multiline entries when changing the password in-place).<br>
><br>
>Best,<br>
>Calin<br>
><br>
>---<br>
> src/password-store.sh | 19 ++++++++++++++-----<br>
> 1 file changed, 14 insertions(+), 5 deletions(-)<br>
><br>
>diff --git a/src/password-store.sh b/src/password-store.sh<br>
>index d89d455..406820a 100755<br>
>--- a/src/password-store.sh<br>
>+++ b/src/password-store.sh<br>
>@@ -276,7 +276,7 @@ cmd_usage() {<br>
>               overwriting existing password unless forced.<br>
>           $PROGRAM edit pass-name<br>
>               Insert a new password or edit an existing password using ${EDITOR:-vi}.<br>
>-          $PROGRAM generate [--no-symbols,-n] [--clip,-c] [--in-place,-i | --force,-f] pass-name [pass-length]<br>
>+          $PROGRAM generate [--no-symbols,-n] [--clip,-c] [--in-place,-i | --force,-f] [--multiline,-m] pass-name [pass-length]<br>
>               Generate a new password of pass-length (or $GENERATED_LENGTH if unspecified) with optionally no symbols.<br>
>               Optionally put it on the clipboard and clear board after $CLIP_TIME seconds.<br>
>               Prompt before overwriting existing password unless forced.<br>
>@@ -491,8 +491,8 @@ cmd_edit() {<br>
> }<br>
><br>
> cmd_generate() {<br>
>-      local opts qrcode=0 clip=0 force=0 characters="$CHARACTER_SET" inplace=0 pass<br>
>-      opts="$($GETOPT -o nqcif -l no-symbols,qrcode,clip,in-place,force -n "$PROGRAM" -- "$@")"<br>
>+      local opts qrcode=0 clip=0 force=0 characters="$CHARACTER_SET" inplace=0 multiline=0 pass<br>
>+      opts="$($GETOPT -o nqcifm -l no-symbols,qrcode,clip,in-place,force,multiline -n "$PROGRAM" -- "$@")"<br>
>       local err=$?<br>
>       eval set -- "$opts"<br>
>       while true; do case $1 in<br>
>@@ -501,10 +501,12 @@ cmd_generate() {<br>
>               -c|--clip) clip=1; shift ;;<br>
>               -f|--force) force=1; shift ;;<br>
>               -i|--in-place) inplace=1; shift ;;<br>
>+              -m|--multiline) multiline=1; shift ;;<br>
>               --) shift; break ;;<br>
>       esac done<br>
><br>
>-      [[ $err -ne 0 || ( $# -ne 2 && $# -ne 1 ) || ( $force -eq 1 && $inplace -eq 1 ) || ( $qrcode -eq 1 && $clip -eq 1 ) ]] && die "Usage: $PROGRAM $COMMAND [--no-symbols,-n] [--clip,-c] [--qrcode,-q] [--in-place,-i | --force,-f] pass-name [pass-length]"<br>
>+      [[ $err -ne 0 || ( $# -ne 2 && $# -ne 1 ) || ( $force -eq 1 && $inplace -eq 1 ) || ( $qrcode -eq 1 && $clip -eq 1 ) ]] && die "Usage: $PROGRAM $COMMAND [--no-symbols,-n] [--clip,-c] [--qrcode,-q] [--in-place,-i | --force,-f] [--multiline,m] pass-name [pass-length]"<br>
>+      [[ $inplace -eq 1 && $multiline -eq 1 ]] && die "Error: multiline entries are not allowed when replacing a password in-place."<br>
>       local path="$1"<br>
>       local length="${2:-$GENERATED_LENGTH}"<br>
>       check_sneaky_paths "$path"<br>
>@@ -520,7 +522,14 @@ cmd_generate() {<br>
>       read -r -n $length pass < <(LC_ALL=C tr -dc "$characters" < /dev/urandom)<br>
>       [[ ${#pass} -eq $length ]] || die "Could not generate password from /dev/urandom."<br>
>       if [[ $inplace -eq 0 ]]; then<br>
>-              echo "$pass" | $GPG -e "${GPG_RECIPIENT_ARGS[@]}" -o "$passfile" "${GPG_OPTS[@]}" || die "Password encryption aborted."<br>
>+              if [[ $multiline -eq 1 ]]; then<br>
>+                      echo "Enter contents of $path and press Ctrl+D when finished:"<br>
>+                      echo<br>
>+              fi<br>
>+              {<br>
>+                      echo "$pass"<br>
>+                      [[ $multiline -eq 1 ]] && cat || true<br>
>+              } | $GPG -e "${GPG_RECIPIENT_ARGS[@]}" -o "$passfile" "${GPG_OPTS[@]}" || die "Password encryption aborted."<br>
>       else<br>
>               local passfile_temp="${passfile}.tmp.${RANDOM}.${RANDOM}.${RANDOM}.${RANDOM}.--"<br>
>               if { echo "$pass"; $GPG -d "${GPG_OPTS[@]}" "$passfile" | tail -n +2; } | $GPG -e "${GPG_RECIPIENT_ARGS[@]}" -o "$passfile_temp" "${GPG_OPTS[@]}"; then<br>
>-- <br>
>2.20.1<br>
><br>
>_______________________________________________<br>
>Password-Store mailing list<br>
><a href="mailto:Password-Store@lists.zx2c4.com" target="_blank">Password-Store@lists.zx2c4.com</a><br>
><a href="https://lists.zx2c4.com/mailman/listinfo/password-store" rel="noreferrer" target="_blank">https://lists.zx2c4.com/mailman/listinfo/password-store</a><br>
</blockquote></div>