diff options
| author | Xiyue Deng <manphiz@debian.org> | 2026-05-24 19:23:48 -0700 |
|---|---|---|
| committer | Eli Zaretskii <eliz@gnu.org> | 2026-06-04 08:37:25 +0300 |
| commit | d852d36c77fa5f9e7b762ce6b6ff0972a8fcc8ac (patch) | |
| tree | 2e23c67ceca5e795668abb4c358a7562cea2f8dc | |
| parent | c9dfe2abe6339c7b48a9f62c7843d8c75ce7e644 (diff) | |
Decrypt plstore when needed in 'plstore-delete'
When a plstore has entries with secret keys, processing the plstore
file would require decryption first. However, unlike other functions
like 'plstore-get', 'plstore-put', etc., 'plstore-delete' does not
check for secret keys and decrypt the file, which would corrupt the
file when deleting any entries with secret keys.
This patch adds checking for secret keys and decrypt the file when
needed before removing the entry with name.
* lisp/plstore.el (plstore--has-secret-keys): New.
* lisp/plstore.el (plstore-delete): Check for secret keys of the entry
and decrypt plstore before performing the deletion. (Bug#81061)
| -rw-r--r-- | lisp/plstore.el | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/lisp/plstore.el b/lisp/plstore.el index 0964e6ccaf6..2fada5a308d 100644 --- a/lisp/plstore.el +++ b/lisp/plstore.el @@ -550,23 +550,36 @@ SECRET-KEYS is a plist containing secret data." (cons (cons name secret-plist) (plstore--get-secret-alist plstore))))) (plstore--merge-secret plstore))) +(defun plstore--has-secret-keys (plist) + "Return t if PLIST of a plstore entry has secret keys." + (string-match-p "\\`:secret-" (symbol-name (car plist)))) + (defun plstore-delete (plstore name) "Delete the first entry named NAME from PLSTORE." - (let ((entry (assoc name (plstore--get-alist plstore)))) - (if entry - (plstore--set-alist - plstore - (delq entry (plstore--get-alist plstore)))) - (setq entry (assoc name (plstore--get-secret-alist plstore))) - (if entry - (plstore--set-secret-alist - plstore - (delq entry (plstore--get-secret-alist plstore)))) - (setq entry (assoc name (plstore--get-merged-alist plstore))) - (if entry - (plstore--set-merged-alist - plstore - (delq entry (plstore--get-merged-alist plstore)))))) + (when-let* ((entry (assoc name (plstore--get-alist plstore))) + (plist (cdr entry))) + (when (plstore--has-secret-keys plist) + (plstore--decrypt plstore) + (setq entry (assoc name (plstore--get-alist plstore)))) + (plstore--set-alist + plstore + (delq entry (plstore--get-alist plstore)))) + (when-let* ((entry (assoc name (plstore--get-secret-alist plstore))) + (plist (cdr entry))) + (when (plstore--has-secret-keys plist) + (plstore--decrypt plstore) + (setq entry (assoc name (plstore--get-secret-alist plstore)))) + (plstore--set-secret-alist + plstore + (delq entry (plstore--get-secret-alist plstore)))) + (when-let* ((entry (assoc name (plstore--get-merged-alist plstore))) + (plist (cdr entry))) + (when (plstore--has-secret-keys plist) + (plstore--decrypt plstore) + (setq entry (assoc name (plstore--get-merged-alist plstore)))) + (plstore--set-merged-alist + plstore + (delq entry (plstore--get-merged-alist plstore))))) (defvar pp-escape-newlines) (defun plstore--insert-buffer (plstore) |
