diff options
author | Daniel Colascione <dancol@dancol.org> | 2014-02-21 17:44:59 -0800 |
---|---|---|
committer | Daniel Colascione <dancol@dancol.org> | 2014-02-21 17:44:59 -0800 |
commit | d3cac061271e336722993c90985e5a29a3d01254 (patch) | |
tree | e77f9764104fda24a09b6785a3f8e836785a0b8f /lisp/gnus/auth-source.el | |
parent | 4e6526341d2a8a5884e760ed6815f0de22529b15 (diff) | |
download | emacs-d3cac061271e336722993c90985e5a29a3d01254.tar.gz |
Build correct secrets pattern from auth-source pattern
Diffstat (limited to 'lisp/gnus/auth-source.el')
-rw-r--r-- | lisp/gnus/auth-source.el | 41 |
1 files changed, 35 insertions, 6 deletions
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 |