[PATCH rde v4 1/1] contrib: age: Add password-store integration
Export this patch
---
src/contrib/features/age.scm | 67 ++++++++++++++++++++++++++ ---
src/rde/features/password-utils.scm | 5 ++ -
2 files changed, 65 insertions(+), 7 deletions(-)
diff --git a/src/contrib/features/age.scm b/src/contrib/features/age.scm
index 5a234a52..e5c793b8 100644
--- a/src/contrib/features/age.scm
+++ b/src/contrib/features/age.scm
@@ -1,6 +1,6 @@
;;; rde --- Reproducible development environment.
;;;
- ;;; Copyright © 2023 Nicolas Graves <ngraves@ngraves.fr>
+ ;;; Copyright © 2023, 2024 Nicolas Graves <ngraves@ngraves.fr>
;;;
;;; This file is part of rde.
;;;
@@ -19,6 +19,7 @@
(define-module (contrib features age)
#:use-module (rde features)
+ #:use-module (rde features emacs)
#:use-module (gnu packages golang-crypto)
#:use-module (gnu services)
#:use-module (gnu services base)
@@ -39,12 +40,66 @@ RDE."
(ensure-pred file-like? age)
(ensure-pred string? age-ssh-key)
+ (define emacs-f-name 'passage)
+ (define f-name (symbol-append 'emacs- emacs-f-name))
+
(define (get-home-services config)
- (list
- (simple-service
- 'age-add-age-package
- home-profile-service-type
- (list age))))
+ (append
+ (list (simple-service
+ 'age-add-age-package
+ home-profile-service-type
+ (list age)))
+ (if (get-value 'pass config)
+ (list
+ (rde-elisp-configuration-service
+ emacs-f-name
+ config
+ `(;; redefining necessary variables and functions
+ (with-eval-after-load
+ 'auth-source-pass
+ (setq auth-source-pass-filename (getenv "PASSAGE_DIR"))
+ (with-eval-after-load
+ 'password-store
+ (setq password-store-executable
+ ,(file-append (get-value 'password-store config)
+ "/bin/passage"))
+ (defun age-password-store--entry-to-file (entry)
+ "Return file name corresponding to ENTRY."
+ (concat
+ (expand-file-name entry (password-store-dir)) ".age"))
+ (advice-add 'password-store--entry-to-file
+ :override 'age-password-store--entry-to-file)
+
+ (defun age-password-store-list (&optional subdir)
+ "List password entries under SUBDIR."
+ (unless subdir (setq subdir ""))
+ (let ((dir (expand-file-name subdir (password-store-dir))))
+ (if (file-directory-p dir)
+ (delete-dups
+ (mapcar 'password-store--file-to-entry
+ (directory-files-recursively
+ dir ".+\\.age\\'"))))))
+ (advice-add 'password-store-list
+ :override 'age-password-store-list)
+
+ (defun age-auth-source-pass--read-entry (entry)
+ "Return a string with the file content of ENTRY."
+ (password-store--run-show entry))
+ (advice-add 'auth-source-pass--read-entry
+ :override 'age-auth-source-pass--read-entry))))
+ #:summary "pass-age emacs interface"
+ #:authors '("Nicolas Graves <ngraves@ngraves.fr>")
+ #:keywords '(convenience))
+ (simple-service
+ 'passage-environment-variables
+ home-environment-variables-service-type
+ `(("PASSAGE_AGE" . ,(file-append age "/bin/age"))
+ ("PASSAGE_DIR"
+ . ,(get-value 'password-store-directory config))
+ ("PASSAGE_IDENTITIES_FILE" . ,age-ssh-key)
+ ("PASSAGE_RECIPIENTS_FILE"
+ . ,(string-append age-ssh-key ".pub")))))
+ '())))
(feature
(name 'age)
diff --git a/src/rde/features/password-utils.scm b/src/rde/features/password-utils.scm
index 717e4de1..c9027a40 100644
--- a/src/rde/features/password-utils.scm
+++ b/src/rde/features/password-utils.scm
@@ -32,6 +32,7 @@
#:use-module (gnu services)
#:use-module (guix gexp)
+ #:use-module (guix packages)
#:export (feature-password-store))
@@ -62,7 +63,8 @@
(define (password-store-home-services config)
"Returns home services related to password-store."
- (require-value 'gpg-primary-key config)
+ (when (string= (package-name password-store) "password-store")
+ (require-value 'gpg-primary-key config))
(require-value 'home-directory config)
(list (service home-password-store-service-type
(home-password-store-configuration
@@ -197,6 +199,7 @@ Keybinding for `rde-consult-pass' and embark actions for it."
(name 'password-store)
(values `((pass . #t)
(password-store . ,password-store)
+ (password-store-directory . ,password-store-directory)
,@(if default-pass-prompt?
`((default-pass-prompt-fn . ,emacs-pass-prompt))
'())))
--
2.47.1