From: Daniel Colascione Date: Sat, 22 Feb 2014 01:44:59 +0000 (-0800) Subject: Build correct secrets pattern from auth-source pattern X-Git-Tag: emacs-24.3.90~173^2^2~19 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d3cac061271e336722993c90985e5a29a3d01254;p=emacs.git Build correct secrets pattern from auth-source pattern --- diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog index a3601390496..4263508f34d 100644 --- a/lisp/gnus/ChangeLog +++ b/lisp/gnus/ChangeLog @@ -1,3 +1,9 @@ +2014-02-22 Daniel Colascione + + * auth-source.el (auth-source-secrets-listify-pattern): New function. + (auth-source-secrets-search): Don't pass invalid patterns to secrets.el; + instead, build list of patterns. + 2014-02-13 Teodor Zlatanov * auth-source.el (auth-sources): Add pointer to what the .gpg extension diff --git a/lisp/gnus/auth-source.el b/lisp/gnus/auth-source.el index 6efd52d6abc..a820dcae5eb 100644 --- a/lisp/gnus/auth-source.el +++ b/lisp/gnus/auth-source.el @@ -1506,6 +1506,31 @@ Respects `auth-source-save-behavior'. Uses ;; (let ((auth-sources '("secrets:Login"))) (auth-source-search :max 1)) ;; (let ((auth-sources '("secrets:Login"))) (auth-source-search :max 1 :signon_realm "https://git.gnus.org/Git")) +(defun auth-source-secrets-listify-pattern (pattern) + "Convert a pattern with lists to a list of string patterns. + +auth-source patterns can have values of the form :foo (\"bar\" +\"qux\"), which means to match any secret with :foo equal to +\"bar\" otr :foo equal to \"qux\". The secrets backend supports +only string values for patterns, so this routine returns a list +of patterns that is equivalent to the single original pattern +when interpreted such that if a secret matches any pattern in the +list, it mathces the original pattern." + (if (null pattern) + '(nil) + (let* ((key (pop pattern)) + (value (pop pattern)) + (tails (auth-source-secrets-listify-pattern pattern)) + (heads (if (stringp value) + (list (list key value)) + (mapcar (lambda (v) (list key v)) value)))) + (cl-loop + for h in heads + nconc + (cl-loop + for tl in tails + collect (append h tl)))))) + (defun* auth-source-secrets-search (&rest spec &key backend create delete label @@ -1558,21 +1583,25 @@ authentication tokens: collect (nth i spec))) ;; build a search spec without the ignored keys ;; if a search key is nil or t (match anything), we skip it - (search-spec (apply 'append (mapcar + (search-specs (auth-source-secrets-listify-pattern + (apply 'append (mapcar (lambda (k) (if (or (null (plist-get spec k)) (eq t (plist-get spec k))) nil (list k (plist-get spec k)))) - search-keys))) + search-keys)))) ;; needed keys (always including host, login, port, and secret) (returned-keys (mm-delete-duplicates (append '(:host :login :port :secret) search-keys))) - (items (loop for item in (apply 'secrets-search-items coll search-spec) - unless (and (stringp label) - (not (string-match label item))) - collect item)) + (items + (loop for search-spec in search-specs + nconc + (loop for item in (apply 'secrets-search-items coll search-spec) + unless (and (stringp label) + (not (string-match label item))) + collect item))) ;; TODO: respect max in `secrets-search-items', not after the fact (items (butlast items (- (length items) max))) ;; convert the item name to a full plist