]> git.eshelyaron.com Git - emacs.git/commitdiff
* net/secrets.el (secrets-struct-secret-content-type): Replace
authorMichael Albinus <michael.albinus@gmx.de>
Wed, 19 Jun 2013 06:24:12 +0000 (08:24 +0200)
committerMichael Albinus <michael.albinus@gmx.de>
Wed, 19 Jun 2013 06:24:12 +0000 (08:24 +0200)
check of introspection data by a test call of "CreateItem".  Some
servers do not offer introspection.

lisp/ChangeLog
lisp/net/secrets.el

index 8508ef44b346fc0e37086abd03735e8d71110560..2e5ca2019ce9b955145416fed630525a44d329bf 100644 (file)
@@ -1,3 +1,9 @@
+2013-06-19  Michael Albinus  <michael.albinus@gmx.de>
+
+       * net/secrets.el (secrets-struct-secret-content-type): Replace
+       check of introspection data by a test call of "CreateItem".  Some
+       servers do not offer introspection.
+
 2013-06-19  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        * electric.el (electric-pair-mode): Improve interaction with
index 1951b19588641f74563764e9881dfdc354ec7ef6..b4e51348ddef62e8519dc5186b965297494aa997 100644 (file)
@@ -310,13 +310,42 @@ 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
-  (when (string-equal
-        (dbus-introspect-get-signature
-         :session secrets-service secrets-path secrets-interface-service
-         "GetSecrets" "out")
-        "a{o(oayays)}")
-    '("text/plain"))
+  (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 "dummy"))
+              (:dict-entry ,(concat secrets-interface-item ".Type")
+                           (:variant ,secrets-interface-item-type-generic)))
+            ;; 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.")