(nnimap-request-article): Downcase the NILs so that they are nil.
[gnus] / lisp / nnimap.el
index bc3a047..1dd561a 100644 (file)
@@ -40,6 +40,9 @@
 (require 'utf7)
 (require 'parse-time)
 
+(autoload 'auth-source-forget-user-or-password "auth-source")
+(autoload 'auth-source-user-or-password "auth-source")
+
 (nnoo-declare nnimap)
 
 (defvoo nnimap-address nil
@@ -67,6 +70,9 @@ Values are `ssl', `network', `starttls' or `shell'.")
   "How mail is split.
 Uses the same syntax as nnmail-split-methods")
 
+(make-obsolete-variable 'nnimap-split-rule "see `nnimap-split-methods'"
+                       "Gnus 5.13")
+
 (defvoo nnimap-authenticator nil
   "How nnimap authenticate itself to the server.
 Possible choices are nil (use default methods) or `anonymous'.")
@@ -85,6 +91,13 @@ some servers.")
 
 (defvoo nnimap-current-infos nil)
 
+(defvoo nnimap-fetch-partial-articles nil
+  "If non-nil, Gnus will fetch partial articles.
+If t, nnimap will fetch only the first part.  If a string, it
+will fetch all parts that have types that match that string.  A
+likely value would be \"text/\" to automatically fetch all
+textual parts.")
+
 (defvar nnimap-process nil)
 
 (defvar nnimap-status-string "")
@@ -332,15 +345,6 @@ some servers.")
            (when (eq nnimap-stream 'starttls)
              (nnimap-command "STARTTLS")
              (starttls-negotiate (nnimap-process nnimap-object)))
-           ;; If this is a STARTTLS-capable server, then sever the
-           ;; connection and start a STARTTLS connection instead.
-           (when (and (eq nnimap-stream 'network)
-                      (member "STARTTLS" (nnimap-capabilities nnimap-object)))
-             (let ((nnimap-stream 'starttls))
-               (delete-process (nnimap-process nnimap-object))
-               (kill-buffer (current-buffer))
-               (return
-                (nnimap-open-connection buffer))))
            (when nnimap-server-port
              (push (format "%s" nnimap-server-port) ports))
            (unless (equal connection-result "PREAUTH")
@@ -361,6 +365,14 @@ some servers.")
                                                   (car credentials)
                                                   (cadr credentials)))
                (unless (car login-result)
+                 ;; If the login failed, then forget the credentials
+                 ;; that are now possibly cached.
+                 (dolist (host (list (nnoo-current-server 'nnimap)
+                                     nnimap-address))
+                   (dolist (port ports)
+                     (dolist (element '("login" "password"))
+                       (auth-source-forget-user-or-password
+                        element host port))))
                  (delete-process (nnimap-process nnimap-object))
                  (setq nnimap-object nil))))
            (when nnimap-object
@@ -406,14 +418,17 @@ some servers.")
        (erase-buffer)
        (with-current-buffer (nnimap-buffer)
          (erase-buffer)
-         (when gnus-fetch-partial-articles
-           (if (eq gnus-fetch-partial-articles t)
-               (setq parts '(1))
-             (nnimap-command "UID FETCH %d (BODYSTRUCTURE)" article)
-             (goto-char (point-min))
-             (when (re-search-forward "FETCH.*BODYSTRUCTURE" nil t)
-               (setq structure (ignore-errors (read (current-buffer)))
-                     parts (nnimap-find-wanted-parts structure)))))
+         (when nnimap-fetch-partial-articles
+           (nnimap-command "UID FETCH %d (BODYSTRUCTURE)" article)
+           (goto-char (point-min))
+           (when (re-search-forward "FETCH.*BODYSTRUCTURE" nil t)
+             (setq structure (ignore-errors
+                               (let ((start (point)))
+                                 (forward-sexp 1)
+                                 (downcase-region start (point))
+                                 (goto-char (point))
+                                 (read (current-buffer))))
+                   parts (nnimap-find-wanted-parts structure))))
          (when (if parts
                    (nnimap-get-partial-article article parts structure)
                  (nnimap-get-whole-article article))
@@ -493,8 +508,15 @@ some servers.")
     t))
 
 (defun nnimap-insert-partial-structure (structure parts &optional subp)
-  (let ((type (car (last structure 4)))
-       (boundary (cadr (member "BOUNDARY" (car (last structure 3))))))
+  (let (type boundary)
+    (let ((bstruc structure))
+      (while (consp (car bstruc))
+       (pop bstruc))
+      (setq type (car bstruc))
+      (setq bstruc (car (cdr bstruc)))
+      (when (and (stringp (car bstruc))
+                (string= (downcase (car bstruc)) "boundary"))
+       (setq boundary (cadr bstruc))))
     (when subp
       (insert (format "Content-type: multipart/%s; boundary=%S\n\n"
                      (downcase type) boundary)))
@@ -536,7 +558,9 @@ some servers.")
                        (number-to-string num)
                      (format "%s.%s" prefix num))))
            (setcar (nthcdr 9 sub) id)
-           (when (string-match gnus-fetch-partial-articles type)
+           (when (if (eq nnimap-fetch-partial-articles t)
+                     (equal id "1")
+                   (string-match nnimap-fetch-partial-articles type))
              (push id parts))))
        (incf num)))
     (nreverse parts)))
@@ -750,6 +774,7 @@ some servers.")
   (when (nnimap-possibly-change-group group server)
     (let (sequence)
       (with-current-buffer (nnimap-buffer)
+       (erase-buffer)
        ;; Just send all the STORE commands without waiting for
        ;; response.  If they're successful, they're successful.
        (dolist (action actions)
@@ -771,6 +796,7 @@ some servers.")
 (deffoo nnimap-request-accept-article (group &optional server last)
   (when (nnimap-possibly-change-group nil server)
     (nnmail-check-syntax)
+    (nnimap-add-cr)
     (let ((message (buffer-string))
          (message-id (message-field-value "message-id"))
          sequence)
@@ -952,7 +978,10 @@ some servers.")
                              (t
                               ;; No articles and no uidnext.
                               nil)))
-         (setcdr (gnus-active group) (or high (1- uidnext))))
+         (gnus-set-active
+          group
+          (cons (car (gnus-active group))
+                (or high (1- uidnext)))))
        (when (and (not high)
                   uidnext)
          (setq high (1- uidnext)))
@@ -1204,13 +1233,18 @@ some servers.")
           (cond
            ((eql char ?\[)
             (split-string (buffer-substring
-                           (1+ (point)) (1- (search-forward "]")))))
+                           (1+ (point))
+                           (1- (search-forward "]" (line-end-position) 'move)))))
            ((eql char ?\()
             (split-string (buffer-substring
-                           (1+ (point)) (1- (search-forward ")")))))
+                           (1+ (point))
+                           (1- (search-forward ")" (line-end-position) 'move)))))
            ((eql char ?\")
             (forward-char 1)
-            (buffer-substring (point) (1- (search-forward "\""))))
+            (buffer-substring
+             (point)
+             (1- (or (search-forward "\"" (line-end-position) 'move)
+                     (point)))))
            (t
             (buffer-substring (point) (if (search-forward " " nil t)
                                           (1- (point))
@@ -1262,7 +1296,9 @@ some servers.")
 (defun nnimap-split-incoming-mail ()
   (with-current-buffer (nnimap-buffer)
     (let ((nnimap-incoming-split-list nil)
-         (nnmail-split-methods nnimap-split-methods)
+         (nnmail-split-methods (if (eq nnimap-split-methods 'default)
+                                   nnmail-split-methods
+                                 nnimap-split-methods))
          (nnmail-inhibit-default-split-group t)
          (groups (nnimap-get-groups))
          new-articles)
@@ -1313,6 +1349,7 @@ some servers.")
 (defun nnimap-mark-and-expunge-incoming (range)
   (when range
     (setq range (nnimap-article-ranges range))
+    (erase-buffer)
     (let ((sequence
           (nnimap-send-command
            "UID STORE %s +FLAGS.SILENT (\\Deleted)" range)))