[PATCH] add "pass reencrypt" sub command

Rune Juhl Jacobsen rune at juhljacobsen.dk
Wed Jan 8 12:43:33 CET 2020


Nice, I've been looking for that. I've actually implemented it 
too, but as an extension instead of patching password-store: 
https://github.com/runejuhl/pass-reencrypt ...your implementation 
looks a lot cleaner though :)

/Rune
 
Kjetil Torgrim Homme <kjetil.homme at redpill-linpro.com> writes:

> I was surprised to find there was no command to reencrypt a pass 
> installation without specifying the key ids manually to pass 
> init.  The  code is basically there already, so this patch adds 
> a "reencrypt"  command (basically a copy of "init" with less 
> code) which will use the  correct .gpg-id files for each sub 
> directory. 
>  
> diff --git bin/pass bin/pass index b17ec580e..c10680f97 100755 
> --- bin/pass +++ bin/pass @@ -264,6 +279,8 @@ cmd_usage() { 
>   	    $PROGRAM init [--path=subfolder,-p subfolder] gpg-id... 
>   Initialize new password storage and use gpg-id for encryption. 
>   Selectively reencrypt existing passwords using new gpg-id. 
> +	    $PROGRAM reencrypt [--path=subfolder,-p subfolder] + 
> Selectively reencrypt existing passwords based on updated 
> .gpg-id files. 
>   	    $PROGRAM [ls] [subfolder] List passwords.  $PROGRAM find 
>   pass-names... 
> @@ -349,6 +366,27 @@ cmd_init() { 
>   	git_add_file "$PREFIX/$id_path" "Reencrypt password store 
>   using new  
> GPG id ${id_print%, }${id_path:+ ($id_path)}." 
>   } 
> 
> +cmd_reencrypt() { +	local opts id_path="" +	opts="$($GETOPT -o 
> p: -l path: -n "$PROGRAM" -- "$@")" +	local err=$?  +	eval set 
> -- "$opts" +	while true; do case $1 in +		-p|--path) 
> id_path="$2"; shift 2 ;; +		--) shift; break ;; +	esac done + 
> +	[[ $err -ne 0 || $# -gt 0 ]] && die "Usage: $PROGRAM $COMMAND 
> [--path=subfolder,-p subfolder]" +	[[ -n $id_path ]] && 
> check_sneaky_paths "$id_path" +	[[ -n $id_path && ! -d 
> $PREFIX/$id_path && -e $PREFIX/$id_path ]] &&  die "Error: 
> $PREFIX/$id_path exists but is not a directory."  + +        # 
> set_git does a dirname operation, so trailing slash is needed + 
> set_git "$PREFIX/$id_path/" + +	reencrypt_path 
> "$PREFIX/$id_path" +	git_add_file "$PREFIX/$id_path" "Reencrypt 
> password store using  updated .gpg-id files."  +} + 
>   cmd_show() { local opts selected_line clip=0 qrcode=0 
>   opts="$($GETOPT -o q::c:: -l qrcode::,clip:: -n "$PROGRAM" -- 
>   "$@")" 
> @@ -688,6 +726,7 @@ COMMAND="$1" 
> 
>   case "$1" in init) shift;			cmd_init "$@" ;; 
> +	reencrypt) shift;		cmd_reencrypt "$@" ;; 
>   	help|--help) shift;		cmd_usage "$@" ;; version|--version) 
>   shift;	cmd_version "$@" ;; show|ls|list) shift;		cmd_show 
>   "$@" ;; 
> 
> --  Kjetil T. Homme Redpill Linpro - Changing the Game diff 
> --git bin/pass bin/pass index b17ec580e..c10680f97 100755 --- 
> bin/pass +++ bin/pass @@ -264,6 +279,8 @@ cmd_usage() { 
>  	    $PROGRAM init [--path=subfolder,-p subfolder] gpg-id... 
>  Initialize new password storage and use gpg-id for encryption. 
>  Selectively reencrypt existing passwords using new gpg-id. 
> +	    $PROGRAM reencrypt [--path=subfolder,-p subfolder] + 
> Selectively reencrypt existing passwords based on updated 
> .gpg-id files. 
>  	    $PROGRAM [ls] [subfolder] List passwords.  $PROGRAM find 
>  pass-names... 
> @@ -349,6 +366,27 @@ cmd_init() { 
>  	git_add_file "$PREFIX/$id_path" "Reencrypt password store 
>  using new GPG id ${id_print%, }${id_path:+ ($id_path)}."  }  
> +cmd_reencrypt() { +	local opts id_path="" +	opts="$($GETOPT -o 
> p: -l path: -n "$PROGRAM" -- "$@")" +	local err=$?  +	eval set 
> -- "$opts" +	while true; do case $1 in +		-p|--path) 
> id_path="$2"; shift 2 ;; +		--) shift; break ;; +	esac done + 
> +	[[ $err -ne 0 || $# -gt 0 ]] && die "Usage: $PROGRAM $COMMAND 
> [--path=subfolder,-p subfolder]" +	[[ -n $id_path ]] && 
> check_sneaky_paths "$id_path" +	[[ -n $id_path && ! -d 
> $PREFIX/$id_path && -e $PREFIX/$id_path ]] && die "Error: 
> $PREFIX/$id_path exists but is not a directory."  + +        # 
> set_git does a dirname operation, so trailing slash is needed + 
> set_git "$PREFIX/$id_path/" + +	reencrypt_path 
> "$PREFIX/$id_path" +	git_add_file "$PREFIX/$id_path" "Reencrypt 
> password store using updated .gpg-id files."  +} + 
>  cmd_show() { local opts selected_line clip=0 qrcode=0 
>  opts="$($GETOPT -o q::c:: -l qrcode::,clip:: -n "$PROGRAM" -- 
>  "$@")" 
> @@ -688,6 +726,7 @@ COMMAND="$1" 
>   case "$1" in init) shift;			cmd_init "$@" ;; 
> +	reencrypt) shift;		cmd_reencrypt "$@" ;; 
>  	help|--help) shift;		cmd_usage "$@" ;; version|--version) 
>  shift;	cmd_version "$@" ;; show|ls|list) shift;		cmd_show 
>  "$@" ;; 
> _______________________________________________ Password-Store 
> mailing list Password-Store at lists.zx2c4.com 
> https://lists.zx2c4.com/mailman/listinfo/password-store 

-- 
Rune Juhl Jacobsen
rune at juhljacobsen.dk
+45 6016 8337


More information about the Password-Store mailing list