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)
This commit is contained in:
Xiyue Deng 2026-05-24 19:23:48 -07:00 committed by Eli Zaretskii
parent c9dfe2abe6
commit d852d36c77

View file

@ -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)