Make smtpmail forget the password if the server says it's invalid
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 24 Dec 2012 12:14:04 +0000 (13:14 +0100)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 24 Dec 2012 12:14:04 +0000 (13:14 +0100)
* mail/smtpmail.el (smtpmail-try-auth-method): Refactored out into
its own function.
(smtpmail-try-auth-methods): Forget the user name/password if the
login is unsuccessful.

Fixes: debbugs:12424

lisp/ChangeLog
lisp/mail/smtpmail.el

index fa5985d..1438a23 100644 (file)
@@ -1,3 +1,10 @@
+2012-12-24  Lars Ingebrigtsen  <larsi@gnus.org>
+
+       * mail/smtpmail.el (smtpmail-try-auth-method): Refactored out into
+       its own function.
+       (smtpmail-try-auth-methods): Forget the user name/password if the
+       login is unsuccessful (bug#12424).
+
 2012-12-22  Michael Albinus  <michael.albinus@gmx.de>
 
        * notifications.el (notifications-notify): Protect body with
index 69a4054..db7b003 100644 (file)
@@ -529,6 +529,18 @@ The list is in preference order.")
            password (plist-get auth-info :secret)))
     (when (functionp password)
       (setq password (funcall password)))
+    (let ((result (catch 'done
+                   (smtpmail-try-auth-method process mech user password))))
+      (if (stringp result)
+         (progn
+           (auth-source-forget+ :host host :port port)
+           (throw 'done result))
+       (when save-function
+         (funcall save-function))
+       result))))
+
+(defun smtpmail-try-auth-method (process mech user password)
+  (let (ret)
     (cond
      ((or (not mech)
          (not user)
@@ -554,16 +566,11 @@ The list is in preference order.")
               ;; are taken as a response to the server, and the
               ;; authentication fails.
               (encoded (base64-encode-string response t)))
-         (smtpmail-command-or-throw process encoded)
-         (when save-function
-           (funcall save-function)))))
+         (smtpmail-command-or-throw process encoded))))
      ((eq mech 'login)
       (smtpmail-command-or-throw process "AUTH LOGIN")
-      (smtpmail-command-or-throw
-       process (base64-encode-string user t))
-      (smtpmail-command-or-throw process (base64-encode-string password t))
-      (when save-function
-       (funcall save-function)))
+      (smtpmail-command-or-throw process (base64-encode-string user t))
+      (smtpmail-command-or-throw process (base64-encode-string password t)))
      ((eq mech 'plain)
       ;; We used to send an empty initial request, and wait for an
       ;; empty response, and then send the password, but this
@@ -574,9 +581,7 @@ The list is in preference order.")
        process
        (concat "AUTH PLAIN "
               (base64-encode-string (concat "\0" user "\0" password) t))
-       235)
-      (when save-function
-       (funcall save-function)))
+       235))
      (t
       (error "Mechanism %s not implemented" mech)))))