Look up IMAP credentials based on both the virtual and physical server names.
authorLars Magne Ingebrigtsen <larsi@quimbies.gnus.org>
Sun, 26 Sep 2010 14:11:10 +0000 (16:11 +0200)
committerLars Magne Ingebrigtsen <larsi@quimbies.gnus.org>
Sun, 26 Sep 2010 14:11:10 +0000 (16:11 +0200)
lisp/ChangeLog
lisp/nnimap.el

index 14e71ce..c49ae94 100644 (file)
@@ -1,5 +1,10 @@
 2010-09-26  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
+       * nnimap.el (nnimap-credentials): Allow inhibiting the password query
+       on failure.
+       (nnimap-open-connection): Look up both virtual and physical server name
+       credentials.
+
        * gnus-win.el: Revert previous patch, since it made Gnus backtrace.
 
 2009-02-07  Dave Love  <fx@gnu.org>
index f3cb77f..8c3e6ea 100644 (file)
@@ -238,7 +238,7 @@ some servers.")
                     ?s host
                     ?p port)))))
 
-(defun nnimap-credentials (address ports)
+(defun nnimap-credentials (address ports &optional inhibit-create)
   (let (port credentials)
     ;; Request the credentials from all ports, but only query on the
     ;; last port if all the previous ones have failed.
@@ -246,7 +246,10 @@ some servers.")
                (setq port (pop ports)))
       (setq credentials
            (auth-source-user-or-password
-            '("login" "password") address port nil (null ports))))
+            '("login" "password") address port nil
+            (if inhibit-create
+                nil
+              (null ports)))))
     credentials))
 
 (defun nnimap-keepalive ()
@@ -318,16 +321,21 @@ some servers.")
          (when (eq nnimap-stream 'starttls)
            (nnimap-command "STARTTLS")
            (starttls-negotiate (nnimap-process nnimap-object)))
+         (when nnimap-server-port
+           (push (format "%s" nnimap-server-port) ports))
          (unless (equal connection-result "PREAUTH")
            (if (not (setq credentials
                           (if (eq nnimap-authenticator 'anonymous)
                               (list "anonymous"
                                     (message-make-address))
-                            (nnimap-credentials
-                             nnimap-address
-                             (if nnimap-server-port
-                                 (cons (format "%s" nnimap-server-port) ports)
-                               ports)))))
+                            (or
+                             ;; First look for the credentials based
+                             ;; on the virtual server name.
+                             (nnimap-credentials
+                              (nnoo-current-server 'nnimap) ports t)
+                             ;; Then look them up based on the
+                             ;; physical address.
+                             (nnimap-credentials nnimap-address ports)))))
                (setq nnimap-object nil)
              (setq login-result (nnimap-command "LOGIN %S %S"
                                                 (car credentials)