[PATCH v2] Add XDG Base Directory support

Nicolai Dagestad nicolai at dagestad.fr
Wed May 27 18:43:16 CEST 2020


---
Following Allan Odgaard's suggestion I added an `prefix` command to pass 
that prints out the storage path.
I also updated the man page to reflect the changes
Still no change to the emacs scripts as I haven't switched to emacs since 
my last patch.

I am not really pleased with having a get_prefix function before setting the 
PREFIX variable but without moving around a lot more code I didn't fiind a 
better way to add it...

 contrib/dmenu/passmenu              |  2 +-
 man/pass.1                          | 30 +++++++++++++++++------------
 src/completion/pass.bash-completion |  4 ++--
 src/completion/pass.fish-completion | 11 ++---------
 src/completion/pass.zsh-completion  |  3 ++-
 src/password-store.sh               | 19 +++++++++++++++++-
 6 files changed, 43 insertions(+), 26 deletions(-)

diff --git a/contrib/dmenu/passmenu b/contrib/dmenu/passmenu
index 83268bc..dcdeadc 100755
--- a/contrib/dmenu/passmenu
+++ b/contrib/dmenu/passmenu
@@ -8,7 +8,7 @@ if [[ $1 == "--type" ]]; then
 	shift
 fi
 
-prefix=${PASSWORD_STORE_DIR-~/.password-store}
+prefix="$(pass prefix)"
 password_files=( "$prefix"/**/*.gpg )
 password_files=( "${password_files[@]#"$prefix"/}" )
 password_files=( "${password_files[@]%.gpg}" )
diff --git a/man/pass.1 b/man/pass.1
index a555dcb..06c75c6 100644
--- a/man/pass.1
+++ b/man/pass.1
@@ -19,7 +19,7 @@ pass - stores, retrieves, generates, and synchronizes passwords securely
 is a very simple password store that keeps passwords inside 
 .BR gpg2 (1)
 encrypted files inside a simple directory tree residing at 
-.IR ~/.password-store .
+.IR $XDG_DATA_HOME/password-store .
 The
 .B pass
 utility provides a series of commands for manipulating the password store,
@@ -174,6 +174,9 @@ is set to \fItrue\fP, then all commits will be signed using \fIuser.signingkey\f
 default git signing key. This config key may be turned on using:
 .B `pass git config --bool --add pass.signcommits true`
 .TP
+\fBprefix\fP
+Show the password storage path.
+.TP
 \fBhelp\fP
 Show usage message.
 .TP
@@ -186,7 +189,7 @@ Show version information.
 Initialize password store
 .B zx2c4 at laptop ~ $ pass init Jason at zx2c4.com 
 .br
-mkdir: created directory \[u2018]/home/zx2c4/.password-store\[u2019] 
+mkdir: created directory \[u2018]/home/zx2c4/.local/share/password-store\[u2019] 
 .br
 Password store initialized for Jason at zx2c4.com.
 .TP
@@ -294,9 +297,9 @@ Copied Email/jasondonenfeld.com to clipboard. Will clear in 45 seconds.
 Remove password from store
 .B zx2c4 at laptop ~ $ pass remove Business/cheese-whiz-factory 
 .br
-rm: remove regular file \[u2018]/home/zx2c4/.password-store/Business/cheese-whiz-factory.gpg\[u2019]? y 
+rm: remove regular file \[u2018]/home/zx2c4/.local/share/password-store/Business/cheese-whiz-factory.gpg\[u2019]? y 
 .br
-removed \[u2018]/home/zx2c4/.password-store/Business/cheese-whiz-factory.gpg\[u2019]
+removed \[u2018]/home/zx2c4/.local/share/password-store/Business/cheese-whiz-factory.gpg\[u2019]
 
 .SH EXTENDED GIT EXAMPLE
 Here, we initialize new password store, create a git repository, and then manipulate and sync passwords. Make note of the arguments to the first call of \fBpass git push\fP; consult
@@ -305,13 +308,13 @@ for more information.
 
 .B zx2c4 at laptop ~ $ pass init Jason at zx2c4.com 
 .br
-mkdir: created directory \[u2018]/home/zx2c4/.password-store\[u2019] 
+mkdir: created directory \[u2018]/home/zx2c4/.local/share/password-store\[u2019] 
 .br
 Password store initialized for Jason at zx2c4.com. 
 
 .B zx2c4 at laptop ~ $ pass git init 
 .br
-Initialized empty Git repository in /home/zx2c4/.password-store/.git/
+Initialized empty Git repository in /home/zx2c4/.local/share/password-store/.git/
 .br
 [master (root-commit) 998c8fd] Added current contents of password store.
 .br
@@ -323,7 +326,7 @@ Initialized empty Git repository in /home/zx2c4/.password-store/.git/
 
 .B zx2c4 at laptop ~ $ pass generate Amazon/amazonemail at email.com 21 
 .br
-mkdir: created directory \[u2018]/home/zx2c4/.password-store/Amazon\[u2019] 
+mkdir: created directory \[u2018]/home/zx2c4/.local/share/password-store/Amazon\[u2019] 
 .br
 [master 30fdc1e] Added generated password for Amazon/amazonemail at email.com to store.
 .br
@@ -365,9 +368,9 @@ create mode 100644 Amazon/otheraccount at email.com.gpg
 
 .B zx2c4 at laptop ~ $ pass rm Amazon/amazonemail at email.com 
 .br
-rm: remove regular file \[u2018]/home/zx2c4/.password-store/Amazon/amazonemail at email.com.gpg\[u2019]? y 
+rm: remove regular file \[u2018]/home/zx2c4/.local/share/password-store/Amazon/amazonemail at email.com.gpg\[u2019]? y 
 .br
-removed \[u2018]/home/zx2c4/.password-store/Amazon/amazonemail at email.com.gpg\[u2019] 
+removed \[u2018]/home/zx2c4/.local/share/password-store/Amazon/amazonemail at email.com.gpg\[u2019] 
 .br
 rm 'Amazon/amazonemail at email.com.gpg' 
 .br
@@ -394,16 +397,19 @@ To kexec.com:pass-store
 .SH FILES
 
 .TP
-.B ~/.password-store
+.B $XDG_DATA_HOME/password-store
 The default password storage directory.
 .TP
-.B ~/.password-store/.gpg-id
+.B ~/.password-store
+The legacy password storage directory.
+.TP
+.B $XDG_DATA_HOME/password-store/.gpg-id
 Contains the default gpg key identification used for encryption and decryption.
 Multiple gpg keys may be specified in this file, one per line. If this file
 exists in any sub directories, passwords inside those sub directories are
 encrypted using those keys. This should be set using the \fBinit\fP command.
 .TP
-.B ~/.password-store/.extensions
+.B $XDG_DATA_HOME/password-store/.extensions
 The directory containing extension files.
 
 .SH ENVIRONMENT VARIABLES
diff --git a/src/completion/pass.bash-completion b/src/completion/pass.bash-completion
index 95d3e1e..11530d2 100644
--- a/src/completion/pass.bash-completion
+++ b/src/completion/pass.bash-completion
@@ -5,7 +5,7 @@
 # This file is licensed under the GPLv2+. Please see COPYING for more information.
 
 _pass_complete_entries () {
-	local prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store/}"
+	local prefix="$(pass prefix)"
 	prefix="${prefix%/}/"
 	local suffix=".gpg"
 	local autoexpand=${1:-0}
@@ -84,7 +84,7 @@ _pass()
 {
 	COMPREPLY=()
 	local cur="${COMP_WORDS[COMP_CWORD]}"
-	local commands="init ls find grep show insert generate edit rm mv cp git help version ${PASSWORD_STORE_EXTENSION_COMMANDS[*]}"
+	local commands="init ls find grep show insert generate edit rm mv cp git prefix help version ${PASSWORD_STORE_EXTENSION_COMMANDS[*]}"
 	if [[ $COMP_CWORD -gt 1 ]]; then
 		local lastarg="${COMP_WORDS[$COMP_CWORD-1]}"
 		case "${COMP_WORDS[1]}" in
diff --git a/src/completion/pass.fish-completion b/src/completion/pass.fish-completion
index 8637874..a387f53 100644
--- a/src/completion/pass.fish-completion
+++ b/src/completion/pass.fish-completion
@@ -5,14 +5,6 @@
 
 set PROG 'pass'
 
-function __fish_pass_get_prefix
-    set -l prefix "$PASSWORD_STORE_DIR"
-    if [ -z "$prefix" ]
-        set prefix "$HOME/.password-store"
-    end
-    echo "$prefix"
-end
-
 function __fish_pass_needs_command
     set -l cmd (commandline -opc)
     if [ (count $cmd) -eq 1 -a $cmd[1] = $PROG ]
@@ -38,7 +30,7 @@ end
 function __fish_pass_print
     set -l ext $argv[1]
     set -l strip $argv[2]
-    set -l prefix (__fish_pass_get_prefix)
+    set -l prefix (pass prefix)
     printf '%s\n' "$prefix"/**"$ext" | sed "s#$prefix/\(.*\)$strip#\1#"
 end
 
@@ -115,3 +107,4 @@ complete -c $PROG -f -A -n '__fish_pass_uses_command git' -a 'log' -d 'View chan
 
 complete -c $PROG -f -A -n '__fish_pass_needs_command' -a find -d 'Command: find a password file or directory matching pattern'
 complete -c $PROG -f -A -n '__fish_pass_needs_command' -a grep -d 'Command: search inside of decrypted password files for matching pattern'
+complete -c $PROG -f -A -n '__fish_pass_needs_command' -a prefix -d 'Command: show the password storage path'
diff --git a/src/completion/pass.zsh-completion b/src/completion/pass.zsh-completion
index 27ce15a..8c51b61 100644
--- a/src/completion/pass.zsh-completion
+++ b/src/completion/pass.zsh-completion
@@ -103,6 +103,7 @@ _pass () {
 			"cp:Copy the password"
 			"rm:Remove the password"
 			"git:Call git on the password store"
+			"prefix:Output the password storage path"
 			"version:Output version information"
 			"help:Output help message"
 		)
@@ -123,7 +124,7 @@ _pass_cmd_show () {
 _pass_complete_entries_helper () {
 	local IFS=$'\n'
 	local prefix
-	zstyle -s ":completion:${curcontext}:" prefix prefix || prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
+	zstyle -s ":completion:${curcontext}:" prefix prefix || prefix="$(pass prefix)"
 	_values -C 'passwords' ${$(find -L "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print 2>/dev/null | sed -e "s#${prefix}/\{0,1\}##" -e 's#\.gpg##' -e 's#\\#\\\\#' | sort):-""}
 }
 
diff --git a/src/password-store.sh b/src/password-store.sh
index 77f3eda..547df92 100755
--- a/src/password-store.sh
+++ b/src/password-store.sh
@@ -12,7 +12,17 @@ export GPG_TTY="${GPG_TTY:-$(tty 2>/dev/null)}"
 which gpg2 &>/dev/null && GPG="gpg2"
 [[ -n $GPG_AGENT_INFO || $GPG == "gpg2" ]] && GPG_OPTS+=( "--batch" "--use-agent" )
 
-PREFIX="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
+get_prefix(){
+	if [[ ! -z "$PASSWORD_STORE_DIR" ]] && [[ -d "$PASSWORD_STORE_DIR" ]]; then 
+		echo $PASSWORD_STORE_DIR
+	elif [[ -d "$HOME/.password-store" ]]; then
+		echo "$HOME/.password-store"
+	else
+		echo ${XDG_DATA_HOME:-$HOME/.local/share}/password-store
+	fi
+}
+
+PREFIX="$(get_prefix)"
 EXTENSIONS="${PASSWORD_STORE_EXTENSIONS_DIR:-$PREFIX/.extensions}"
 X_SELECTION="${PASSWORD_STORE_X_SELECTION:-clipboard}"
 CLIP_TIME="${PASSWORD_STORE_CLIP_TIME:-45}"
@@ -307,6 +317,8 @@ cmd_usage() {
 	    $PROGRAM git git-command-args...
 	        If the password store is a git repository, execute a git command
 	        specified by git-command-args.
+	    $PROGRAM prefix
+	        Outputs the password-store path.
 	    $PROGRAM help
 	        Show this text.
 	    $PROGRAM version
@@ -693,6 +705,10 @@ cmd_extension() {
 	return 0
 }
 
+cmd_prefix() {
+	get_prefix
+}
+
 #
 # END subcommand functions
 #
@@ -714,6 +730,7 @@ case "$1" in
 	rename|mv) shift;		cmd_copy_move "move" "$@" ;;
 	copy|cp) shift;			cmd_copy_move "copy" "$@" ;;
 	git) shift;			cmd_git "$@" ;;
+	prefix) shift;			cmd_prefix "$@" ;;
 	*)				cmd_extension_or_show "$@" ;;
 esac
 exit 0
-- 
2.26.2



More information about the Password-Store mailing list