From 747da72a4e98056d9da1881012390a788ffdc0bd Mon Sep 17 00:00:00 2001 From: Lars Ingebrigtsen Date: Thu, 17 Feb 2011 15:45:12 -0800 Subject: [PATCH] (auth-source-search): Do a two-phase search, one with no :create to get the responses from all backends. --- lisp/ChangeLog | 3 ++ lisp/auth-source.el | 85 +++++++++++++++++++++++++++------------------ 2 files changed, 55 insertions(+), 33 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index d5fa15d01..3b4f571db 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2011-02-17 Lars Ingebrigtsen + * auth-source.el (auth-source-search): Do a two-phase search, one with + no :create to get the responses from all backends. + * nnimap.el (nnimap-open-connection-1): Delete duplicate server names when getting credentials. diff --git a/lisp/auth-source.el b/lisp/auth-source.el index 8c34591c9..239ebeddf 100644 --- a/lisp/auth-source.el +++ b/lisp/auth-source.el @@ -510,7 +510,7 @@ must call it to obtain the actual value." unless (memq (nth i spec) ignored-keys) collect (nth i spec))) (found (auth-source-recall spec)) - filtered-backends accessor-key found-here goal) + filtered-backends accessor-key found-here goal matches) (if (and found auth-source-do-cache) (auth-source-do-debug @@ -539,38 +539,57 @@ must call it to obtain the actual value." ;; (debug spec "filtered" filtered-backends) (setq goal max) - (dolist (backend filtered-backends) - (setq found-here (apply - (slot-value backend 'search-function) - :backend backend - :create create - :delete delete - spec)) - - ;; if max is 0, as soon as we find something, return it - (when (and (zerop max) (> 0 (length found-here))) - (return t)) - - ;; decrement the goal by the number of new results - (decf goal (length found-here)) - ;; and append the new results to the full list - (setq found (append found found-here)) - - (auth-source-do-debug - "auth-source-search: found %d results (max %d/%d) in %S matching %S" - (length found-here) max goal backend spec) - - ;; return full list if the goal is 0 or negative - (when (zerop (max 0 goal)) - (return found)) - - ;; change the :max parameter in the spec to the goal - (setq spec (plist-put spec :max goal))) - - (when (and found auth-source-do-cache) - (auth-source-remember spec found))) - - found)) + ;; First go through all the backends without :create, so we can + ;; query them all. + (let ((uspec (copy-sequence spec))) + (plist-put uspec :create nil) + (dolist (backend filtered-backends) + (let ((match (apply + (slot-value backend 'search-function) + :backend backend + uspec))) + (when match + (push (list backend match) matches))))) + ;; If we didn't find anything, then we allow the backend(s) to + ;; create the entries. + (unless matches + (let ((match (apply + (slot-value backend 'search-function) + :backend backend + :create create + :delete delete + spec))) + (when match + (push (list backend match) matches)))) + + (setq backend (caar matches) + found-here (cadar matches)) + + (block nil + ;; if max is 0, as soon as we find something, return it + (when (and (zerop max) (> 0 (length found-here))) + (return t)) + + ;; decrement the goal by the number of new results + (decf goal (length found-here)) + ;; and append the new results to the full list + (setq found (append found found-here)) + + (auth-source-do-debug + "auth-source-search: found %d results (max %d/%d) in %S matching %S" + (length found-here) max goal backend spec) + + ;; return full list if the goal is 0 or negative + (when (zerop (max 0 goal)) + (return found)) + + ;; change the :max parameter in the spec to the goal + (setq spec (plist-put spec :max goal)) + + (when (and found auth-source-do-cache) + (auth-source-remember spec found)))) + + found)) ;;; (auth-source-search :max 1) ;;; (funcall (plist-get (nth 0 (auth-source-search :max 1)) :secret)) -- 2.25.1