From 97b3ad684326bc376dda3d7859890071404a3de3 Mon Sep 17 00:00:00 2001
From: "patchback[bot]" <45432694+patchback[bot]@users.noreply.github.com>
Date: Thu, 21 Jul 2022 08:14:30 +0200
Subject: [PATCH] Fix path detection for gopass (#4955) (#4965)

* Fix path detection for gopass

As per https://github.com/gopasspw/gopass/blob/fc8c9a228618fa4a146a87c9027fa0434b0737fa/docs/features.md#initializing-a-password-store, gopass defaults to ~/.local/share/gopass/stores/root for its password store root location.

However, the user can also override this, and this will be stored in the gopass config file (https://github.com/gopasspw/gopass/blob/ed7451678c5e8138d5a8eaafa278d5065a9eb9fe/docs/config.md#configuration-options).

This patch ensures that the config setting in gopass is respected, falling back to the default gopass path. pass' behaviour remains unchanged.

* Formatting improvements

Co-authored-by: Felix Fontein <felix@fontein.de>

* Add changelog fragment

* Formatting improvement

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

Co-authored-by: Felix Fontein <felix@fontein.de>
Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
(cherry picked from commit c31e6413f29f8844a66ba2d86f8f8c266778f706)

Co-authored-by: Sylvia van Os <sylvia@hackerchick.me>
---
 .../4955-fix-path-detection-for-gopass.yaml   |  2 ++
 plugins/lookup/passwordstore.py               | 27 +++++++++++++++----
 2 files changed, 24 insertions(+), 5 deletions(-)
 create mode 100644 changelogs/fragments/4955-fix-path-detection-for-gopass.yaml

diff --git a/changelogs/fragments/4955-fix-path-detection-for-gopass.yaml b/changelogs/fragments/4955-fix-path-detection-for-gopass.yaml
new file mode 100644
index 0000000000..0ea6106664
--- /dev/null
+++ b/changelogs/fragments/4955-fix-path-detection-for-gopass.yaml
@@ -0,0 +1,2 @@
+bugfixes:
+  - passwordstore - fix password store path detection for gopass (https://github.com/ansible-collections/community.general/pull/4955).
diff --git a/plugins/lookup/passwordstore.py b/plugins/lookup/passwordstore.py
index 5823756e35..2f904abdb2 100644
--- a/plugins/lookup/passwordstore.py
+++ b/plugins/lookup/passwordstore.py
@@ -21,8 +21,14 @@ DOCUMENTATION = '''
         description: query key.
         required: True
       passwordstore:
-        description: location of the password store.
-        default: '~/.password-store'
+        description:
+          - Location of the password store.
+          - 'The value is decided by checking the following in order:'
+          - If set, this value is used.
+          - If C(directory) is set, that value will be used.
+          - If I(backend=pass), then C(~/.password-store) is used.
+          - If I(backend=gopass), then the C(path) field in C(~/.config/gopass/config.yml) is used,
+            falling back to C(~/.local/share/gopass/stores/root) if not defined.
       directory:
         description: The directory of the password store.
         env:
@@ -428,11 +434,22 @@ class LookupModule(LookupBase):
             raise AnsibleError("{0} is not a correct value for locktimeout".format(timeout))
         unit_to_seconds = {"s": 1, "m": 60, "h": 3600}
         self.lock_timeout = int(timeout[:-1]) * unit_to_seconds[timeout[-1]]
+
+        directory = variables.get('passwordstore', os.environ.get('PASSWORD_STORE_DIR', None))
+
+        if directory is None:
+            if self.backend == 'gopass':
+                try:
+                    with open(os.path.expanduser('~/.config/gopass/config.yml')) as f:
+                        directory = yaml.safe_load(f)['path']
+                except (FileNotFoundError, KeyError, yaml.YAMLError):
+                    directory = os.path.expanduser('~/.local/share/gopass/stores/root')
+            else:
+                directory = os.path.expanduser('~/.password-store')
+
         self.paramvals = {
             'subkey': 'password',
-            'directory': variables.get('passwordstore', os.environ.get(
-                                       'PASSWORD_STORE_DIR',
-                                       os.path.expanduser('~/.password-store'))),
+            'directory': directory,
             'create': False,
             'returnall': False,
             'overwrite': False,