From e59dfb0ecdd4dde493de284d092be55136c58501 Mon Sep 17 00:00:00 2001 From: Michael Albinus Date: Wed, 19 Jun 2013 08:24:12 +0200 Subject: [PATCH] * 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. --- lisp/ChangeLog | 6 ++++++ lisp/net/secrets.el | 41 +++++++++++++++++++++++++++++++++++------ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 8508ef44b34..2e5ca2019ce 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2013-06-19 Michael Albinus + + * 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 * electric.el (electric-pair-mode): Improve interaction with diff --git a/lisp/net/secrets.el b/lisp/net/secrets.el index 1951b195886..b4e51348dde 100644 --- a/lisp/net/secrets.el +++ b/lisp/net/secrets.el @@ -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.") -- 2.39.2