From d852d36c77fa5f9e7b762ce6b6ff0972a8fcc8ac Mon Sep 17 00:00:00 2001 From: Xiyue Deng Date: Sun, 24 May 2026 19:23:48 -0700 Subject: [PATCH] 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) --- lisp/plstore.el | 43 ++++++++++++++++++++++++++++--------------- 1 file 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)