changeset 112101:f17e96101723

nnimap.el (nnimap-login): Refactored out into own function, and implement CRAM-MD5. (nnimap-wait-for-line): Refactored out. shr.el (shr-rescale-image): Display all GIF images as animated images. nnimap.el (nnimap-login): Prefer AUTH=CRAM-MD5, if it's available. This avoids sending passwords in plain text over non-encrypted channels.
author Katsumi Yamaoka <yamaoka@jpl.org>
date Sun, 02 Jan 2011 23:17:32 +0000
parents cb7f7a583491
children ff459bc4b620
files lisp/gnus/ChangeLog lisp/gnus/nnimap.el lisp/gnus/shr.el
diffstat 3 files changed, 45 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/gnus/ChangeLog	Sun Jan 02 23:58:13 2011 +0200
+++ b/lisp/gnus/ChangeLog	Sun Jan 02 23:17:32 2011 +0000
@@ -1,5 +1,15 @@
 2011-01-02  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
+	* nnimap.el (nnimap-login): Prefer AUTH=CRAM-MD5, if it's available.
+	This avoids sending passwords in plain text over non-encrypted
+	channels.
+
+	* shr.el (shr-rescale-image): Display all GIF images as animated images.
+
+	* nnimap.el (nnimap-login): Refactored out into own function, and
+	implement CRAM-MD5.
+	(nnimap-wait-for-line): Refactored out.
+
 	* mm-view.el (mml-smime): Require.
 
 2010-12-20  David Engster  <deng@eml.cc>
--- a/lisp/gnus/nnimap.el	Sun Jan 02 23:58:13 2011 +0200
+++ b/lisp/gnus/nnimap.el	Sun Jan 02 23:17:32 2011 +0000
@@ -390,17 +390,7 @@
 				(nnimap-credentials nnimap-address ports)))))
 		  (setq nnimap-object nil)
 		(setq login-result
-		      (if (and (nnimap-capability "AUTH=PLAIN")
-			       (nnimap-capability "LOGINDISABLED"))
-			  (nnimap-command
-			   "AUTHENTICATE PLAIN %s"
-			   (base64-encode-string
-			    (format "\000%s\000%s"
-				    (nnimap-quote-specials (car credentials))
-				    (nnimap-quote-specials (cadr credentials)))))
-			(nnimap-command "LOGIN %S %S"
-					(car credentials)
-					(cadr credentials))))
+		      (nnimap-login (car credentials) (cadr credentials)))
 		(unless (car login-result)
 		  ;; If the login failed, then forget the credentials
 		  ;; that are now possibly cached.
@@ -417,6 +407,33 @@
 		(nnimap-command "ENABLE QRESYNC"))
 	      (nnimap-process nnimap-object))))))))
 
+(autoload 'rfc2104-hash "rfc2104")
+
+(defun nnimap-login (user password)
+  (cond
+   ((nnimap-capability "AUTH=CRAM-MD5")
+    (erase-buffer)
+    (let ((sequence (nnimap-send-command "AUTHENTICATE CRAM-MD5"))
+	  (challenge (nnimap-wait-for-line "^\\+\\(.*\\)\n")))
+      (process-send-string
+       (get-buffer-process (current-buffer))
+       (concat
+	(base64-encode-string
+	 (concat user " "
+		 (rfc2104-hash 'md5 64 16 password
+			       (base64-decode-string challenge))))
+	"\r\n"))
+      (nnimap-wait-for-response sequence)))
+   ((not (nnimap-capability "LOGINDISABLED"))
+    (nnimap-command "LOGIN %S %S" user password))
+   ((nnimap-capability "AUTH=PLAIN")
+    (nnimap-command
+     "AUTHENTICATE PLAIN %s"
+     (base64-encode-string
+      (format "\000%s\000%s"
+	      (nnimap-quote-specials user)
+	      (nnimap-quote-specials password)))))))
+
 (defun nnimap-quote-specials (string)
   (with-temp-buffer
     (insert string)
@@ -1541,8 +1558,9 @@
   (nnimap-parse-response))
 
 (defun nnimap-wait-for-connection (&optional regexp)
-  (unless regexp
-    (setq regexp "^[*.] .*\n"))
+  (nnimap-wait-for-line (or regexp "^[*.] .*\n") "[*.] \\([A-Z0-9]+\\)"))
+
+(defun nnimap-wait-for-line (regexp &optional response-regexp)
   (let ((process (get-buffer-process (current-buffer))))
     (goto-char (point-min))
     (while (and (memq (process-status process)
@@ -1551,7 +1569,7 @@
       (nnheader-accept-process-output process)
       (goto-char (point-min)))
     (forward-line -1)
-    (and (looking-at "[*.] \\([A-Z0-9]+\\)")
+    (and (looking-at (or response-regexp regexp))
 	 (match-string 1))))
 
 (defun nnimap-wait-for-response (sequence &optional messagep)
--- a/lisp/gnus/shr.el	Sun Jan 02 23:58:13 2011 +0200
+++ b/lisp/gnus/shr.el	Sun Jan 02 23:17:32 2011 +0000
@@ -507,6 +507,9 @@
 		     (create-image data 'imagemagick t
 				   :width window-width)
 		     image)))
+      (when (and (fboundp 'create-animated-image)
+		 (eq (image-type data nil t) 'gif))
+	(setq image (create-animated-image data 'gif t)))
       image)))
 
 ;; url-cache-extract autoloads url-cache.