Sorry, thunderbird messed up with the space characters in the patch, attached the real patch.
>From a8ecfd39897a67f247d5f0888026e31fa53071bc Mon Sep 17 00:00:00 2001
From: Mildred Ki'Lya <[email protected]>
Date: Thu, 16 May 2019 16:56:09 +0200
Subject: [PATCH] Add --edit option to generate subcommand

When creating passwords, it's often very useful to add contextual
information about it at creation time, such as the e-mail address used
or the login name. With the --edit flag, it's possible to modify the
password file before it is encrypted.
---
 src/completion/pass.bash-completion |  2 +-
 src/completion/pass.fish-completion |  1 +
 src/completion/pass.zsh-completion  |  4 +++-
 src/password-store.sh               | 26 +++++++++++++++++++++-----
 4 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/src/completion/pass.bash-completion b/src/completion/pass.bash-completion
index 95d3e1e..27fed85 100644
--- a/src/completion/pass.bash-completion
+++ b/src/completion/pass.bash-completion
@@ -109,7 +109,7 @@ _pass()
 				_pass_complete_entries
 				;;
 			generate)
-				COMPREPLY+=($(compgen -W "-n --no-symbols -c --clip -f --force -i --in-place" -- ${cur}))
+				COMPREPLY+=($(compgen -W "-n --no-symbols -c --clip -f --force -i --in-place -e --edit" -- ${cur}))
 				_pass_complete_entries
 				;;
 			cp|copy|mv|rename)
diff --git a/src/completion/pass.fish-completion b/src/completion/pass.fish-completion
index 8637874..1f80ed2 100644
--- a/src/completion/pass.fish-completion
+++ b/src/completion/pass.fish-completion
@@ -77,6 +77,7 @@ complete -c $PROG -f -A -n '__fish_pass_uses_command generate' -s n -l no-symbol
 complete -c $PROG -f -A -n '__fish_pass_uses_command generate' -s c -l clip -d 'Put the password in clipboard'
 complete -c $PROG -f -A -n '__fish_pass_uses_command generate' -s f -l force -d 'Do not prompt before overwritting'
 complete -c $PROG -f -A -n '__fish_pass_uses_command generate' -s i -l in-place -d 'Replace only the first line with the generated password'
+complete -c $PROG -f -A -n '__fish_pass_uses_command generate' -s e -l edit -d 'Edit file after generation'
 complete -c $PROG -f -A -n '__fish_pass_uses_command generate' -a "(__fish_pass_print_entry_dirs)"
 
 complete -c $PROG -f -A -n '__fish_pass_needs_command' -a mv -d 'Command: rename existing password'
diff --git a/src/completion/pass.zsh-completion b/src/completion/pass.zsh-completion
index 27ce15a..9801e81 100644
--- a/src/completion/pass.zsh-completion
+++ b/src/completion/pass.zsh-completion
@@ -55,7 +55,9 @@ _pass () {
 					"-f[force overwrite]" \
 					"--force[force overwrite]" \
 					"-i[replace first line]" \
-					"--in-place[replace first line]"
+					"--in-place[replace first line]" \
+					"-e[edit file after generation]" \
+					"--edit[edit file after generation]"
 				_pass_complete_entries_with_subdirs
 				;;
 			cp|copy|mv|rename)
diff --git a/src/password-store.sh b/src/password-store.sh
index 284eabf..e95b091 100755
--- a/src/password-store.sh
+++ b/src/password-store.sh
@@ -292,7 +292,7 @@ cmd_usage() {
 	        overwriting existing password unless forced.
 	    $PROGRAM edit pass-name
 	        Insert a new password or edit an existing password using ${EDITOR:-vi}.
-	    $PROGRAM generate [--no-symbols,-n] [--clip,-c] [--in-place,-i | --force,-f] pass-name [pass-length]
+	    $PROGRAM generate [--no-symbols,-n] [--clip,-c] [--in-place,-i | --force,-f] [--edit,-e] pass-name [pass-length]
 	        Generate a new password of pass-length (or $GENERATED_LENGTH if unspecified) with optionally no symbols.
 	        Optionally put it on the clipboard and clear board after $CLIP_TIME seconds.
 	        Prompt before overwriting existing password unless forced.
@@ -507,8 +507,8 @@ cmd_edit() {
 }
 
 cmd_generate() {
-	local opts qrcode=0 clip=0 force=0 characters="$CHARACTER_SET" inplace=0 pass
-	opts="$($GETOPT -o nqcif -l no-symbols,qrcode,clip,in-place,force -n "$PROGRAM" -- "$@")"
+	local opts qrcode=0 clip=0 force=0 characters="$CHARACTER_SET" inplace=0 edit=0 pass
+	opts="$($GETOPT -o nqcife -l no-symbols,qrcode,clip,in-place,force,edit -n "$PROGRAM" -- "$@")"
 	local err=$?
 	eval set -- "$opts"
 	while true; do case $1 in
@@ -517,6 +517,7 @@ cmd_generate() {
 		-c|--clip) clip=1; shift ;;
 		-f|--force) force=1; shift ;;
 		-i|--in-place) inplace=1; shift ;;
+		-e|--edit) edit=1; shift ;;
 		--) shift; break ;;
 	esac done
 
@@ -533,13 +534,28 @@ cmd_generate() {
 
 	[[ $inplace -eq 0 && $force -eq 0 && -e $passfile ]] && yesno "An entry already exists for $path. Overwrite it?"
 
+	tmpdir #Defines $SECURE_TMPDIR
+	local tmp_file="$(mktemp -u "$SECURE_TMPDIR/XXXXXX")-${path//\//-}.txt"
+
 	read -r -n $length pass < <(LC_ALL=C tr -dc "$characters" < /dev/urandom)
 	[[ ${#pass} -eq $length ]] || die "Could not generate password from /dev/urandom."
 	if [[ $inplace -eq 0 ]]; then
-		echo "$pass" | $GPG -e "${GPG_RECIPIENT_ARGS[@]}" -o "$passfile" "${GPG_OPTS[@]}" || die "Password encryption aborted."
+		echo "$pass" >"$tmp_file"
+	else
+		{ echo "$pass"; $GPG -d "${GPG_OPTS[@]}" "$passfile" | tail -n +2; } >"$tmp_file"
+	fi
+
+	if [[ $edit -ne 0 ]]; then
+		${EDITOR:-vi} "$tmp_file"
+		[[ -f $tmp_file ]] || die "New password not saved."
+		pass="$(head -n 1 "$tmp_file")"
+	fi
+
+	if [[ $inplace -eq 0 ]]; then
+		$GPG -e "${GPG_RECIPIENT_ARGS[@]}" -o "$passfile" "${GPG_OPTS[@]}" "$tmp_file" || die "Password encryption aborted."
 	else
 		local passfile_temp="${passfile}.tmp.${RANDOM}.${RANDOM}.${RANDOM}.${RANDOM}.--"
-		if { echo "$pass"; $GPG -d "${GPG_OPTS[@]}" "$passfile" | tail -n +2; } | $GPG -e "${GPG_RECIPIENT_ARGS[@]}" -o "$passfile_temp" "${GPG_OPTS[@]}"; then
+		if $GPG -e "${GPG_RECIPIENT_ARGS[@]}" -o "$passfile_temp" "${GPG_OPTS[@]}" "$tmp_file"; then
 			mv "$passfile_temp" "$passfile"
 		else
 			rm -f "$passfile_temp"
-- 
2.21.0

_______________________________________________
Password-Store mailing list
[email protected]
https://lists.zx2c4.com/mailman/listinfo/password-store

Reply via email to