]> git.eshelyaron.com Git - emacs.git/commitdiff
The temprary "session" collection might not exist in Secret Service
authorMichael Albinus <michael.albinus@gmx.de>
Mon, 27 Dec 2021 18:53:00 +0000 (19:53 +0100)
committerMichael Albinus <michael.albinus@gmx.de>
Mon, 27 Dec 2021 18:53:00 +0000 (19:53 +0100)
* doc/misc/auth.texi (Secret Service API):
* test/lisp/net/secrets-tests.el (secrets--test-delete-all-session-items)
(secrets-test02-collections, secrets-test03-items)
(secrets-test04-search): The temporary "session" collection might
not exist.

* lisp/net/secrets.el (secrets-struct-secret-content-type):
Remove compatibility hack.
(secrets-create-item): Adapt accordingly.

doc/misc/auth.texi
lisp/net/secrets.el
test/lisp/net/secrets-tests.el

index 034004d1df4ca342fba0301fbb444f39f0d3e7f6..6602f9dc2e44b3626e1db2513f693d3d0c5f136c 100644 (file)
@@ -370,6 +370,10 @@ items should not live longer than Emacs.  The session collection can
 be specified either by the string @code{"session"}, or by @code{nil},
 whenever a collection parameter is needed in the following functions.
 
+However, not all Secret Service provider create this temporary
+@code{"session"} collection, like KeePassXC.  You shall check first
+that this collection exists, before you use it.
+
 @defun secrets-list-items collection
 Returns all the item labels of @var{collection} as a list.
 @end defun
@@ -382,7 +386,7 @@ pairs set for the created item.  The keys are keyword symbols,
 starting with a colon.  Example:
 
 @example
-;;; The session is "session", the label is "my item"
+;;; The collection is "session", the label is "my item"
 ;;; and the secret (password) is "geheim".
 (secrets-create-item "session" "my item" "geheim"
  :method "sudo" :user "joe" :host "remote-host")
index 4217c219ad91b8293fb6abb1d48db44617da8f1d..25802f2c463a9b06a31db15d1e82e6ad3ae64a4d 100644 (file)
@@ -263,6 +263,7 @@ It returns t if not."
 ;;   </signal>
 ;; </interface>
 
+;; This is not guaranteed to exist.  For example, KeePassXC does not offer this.
 (defconst secrets-session-collection-path
   "/org/freedesktop/secrets/collection/session"
   "The D-Bus temporary session collection object path.")
@@ -311,43 +312,8 @@ It returns t if not."
 (defconst secrets-interface-item-type-generic "org.freedesktop.Secret.Generic"
   "The default item type we are using.")
 
-;; We cannot use introspection, because some servers, like
-;; mate-keyring-daemon, don't provide relevant data.  Once the dust
-;; has settled, we shall assume the new interface, and get rid of the test.
-(defconst secrets-struct-secret-content-type
-  (ignore-errors
-    (let ((content-type "text/plain")
-         (path (cadr
-                (dbus-call-method
-                 :session secrets-service secrets-path
-                 secrets-interface-service
-                 "OpenSession" "plain" '(:variant ""))))
-         result)
-      ;; Create a dummy item.
-      (setq result
-           (dbus-call-method
-            :session secrets-service secrets-session-collection-path
-            secrets-interface-collection "CreateItem"
-            ;; Properties.
-            `(:array
-              (:dict-entry ,(concat secrets-interface-item ".Label")
-                           (:variant " ")))
-            ;; Secret.
-            `(:struct :object-path ,path
-                      (:array :signature "y")
-                      ,(dbus-string-to-byte-array " ")
-                      :string ,content-type)
-            ;; Don't replace.
-            nil))
-      ;; Remove it.
-      (dbus-call-method
-       :session secrets-service (car result)
-       secrets-interface-item "Delete")
-      ;; Result.
-      `(,content-type)))
-  "The content_type of a secret struct.
-It must be wrapped as list, because we add it via `append'.  This
-is an interface introduced in 2011.")
+(defconst secrets-struct-secret-content-type "text/plain"
+  "The content_type of a secret struct.")
 
 (defconst secrets-interface-session "org.freedesktop.Secret.Session"
   "A session tracks state between the service and a client application.")
@@ -696,13 +662,10 @@ The object path of the created item is returned."
                `((:dict-entry ,(concat secrets-interface-item ".Attributes")
                               (:variant ,(append '(:array) props))))))
             ;; Secret.
-            (append
-             `(:struct :object-path ,secrets-session-path
-                       (:array :signature "y") ;; No parameters.
-                       ,(dbus-string-to-byte-array password))
-             ;; We add the content_type.  In backward compatibility
-             ;; mode, nil is appended, which means nothing.
-             secrets-struct-secret-content-type)
+            `(:struct :object-path ,secrets-session-path
+                      (:array :signature "y") ;; No parameters.
+                      ,(dbus-string-to-byte-array password)
+                       ,secrets-struct-secret-content-type)
             ;; Do not replace. Replace does not seem to work.
             nil))
       (secrets-prompt (cadr result))
index b392c4d1847c26d1a00bea0fa2065b21cb9bc544..03d3e26faa6bc9cfefe4de1cd73eae016f50d1de 100644 (file)
 
 (defun secrets--test-delete-all-session-items ()
   "Delete all items of collection \"session\" bound to this Emacs."
-  (dolist (item (secrets-list-items "session"))
-    (secrets-delete-item "session" item)))
+  ;; If the "session" collection does not exist, a `dbus-error' is
+  ;; fired, which we ignore.
+  (dbus-ignore-errors
+    (dolist (item (secrets-list-items "session"))
+      (secrets-delete-item "session" item))))
 
 (ert-deftest secrets-test01-sessions ()
   "Test opening / closing a secrets session."
@@ -93,7 +96,7 @@
   (unwind-protect
       (progn
        (should (secrets-open-session))
-       (should (member "session" (secrets-list-collections)))
+       (skip-unless (member "session" (secrets-list-collections)))
 
        ;; Create a random collection.  This asks for a password
        ;; outside our control, so we make it in the interactive case
   (unwind-protect
       (let (item-path)
        (should (secrets-open-session))
+       (skip-unless (member "session" (secrets-list-collections)))
 
         ;; Cleanup.  There could be items in the "session" collection.
         (secrets--test-delete-all-session-items)
   (unwind-protect
       (progn
        (should (secrets-open-session))
+       (skip-unless (member "session" (secrets-list-collections)))
 
         ;; Cleanup.  There could be items in the "session" collection.
         (secrets--test-delete-all-session-items)