diff options
author | Gnus developers <ding@gnus.org> | 2011-05-01 23:30:18 +0000 |
---|---|---|
committer | Katsumi Yamaoka <yamaoka@jpl.org> | 2011-05-01 23:30:18 +0000 |
commit | b87f32fc00c8b085e575fdd4f04af716eee599c4 (patch) | |
tree | 037e653c0dcb425e3b340dee9a255211df98a79b /lisp/gnus/pop3.el | |
parent | 8de66e05c4b7de58d7bd091bda5674b2677fb6ad (diff) | |
download | emacs-b87f32fc00c8b085e575fdd4f04af716eee599c4.tar.gz emacs-b87f32fc00c8b085e575fdd4f04af716eee599c4.tar.bz2 emacs-b87f32fc00c8b085e575fdd4f04af716eee599c4.zip |
Merge changes made in Gnus trunk.
pop3.el (pop3-open-server): Upgrade opportunistically to STARTTLS.
(open-tls-stream): Remove superfluous tls/starttls autoloads.
gnus-sum.el (gnus-summary-next-article): Don't bug out if the summary buffer has moved to a different frame.
nnimap.el (nnimap-request-article): Use nntp-insert-buffer-substring to get the conversion from unibyte to multibyte buffers to work on Emacs 22.
nntp.el (nntp-request-article): Slight clean-up.
Diffstat (limited to 'lisp/gnus/pop3.el')
-rw-r--r-- | lisp/gnus/pop3.el | 90 |
1 files changed, 33 insertions, 57 deletions
diff --git a/lisp/gnus/pop3.el b/lisp/gnus/pop3.el index 08cd7cd4ef1..3ca5cab76e1 100644 --- a/lisp/gnus/pop3.el +++ b/lisp/gnus/pop3.el @@ -33,6 +33,13 @@ ;;; Code: (eval-when-compile (require 'cl)) + +(eval-and-compile + ;; In Emacs 24, `open-protocol-stream' is an autoloaded alias for + ;; `make-network-stream'. + (unless (fboundp 'open-protocol-stream) + (require 'proto-stream))) + (require 'mail-utils) (defvar parse-time-months) @@ -257,10 +264,6 @@ Use streaming commands." (pop3-quit process) message-count)) -(autoload 'open-tls-stream "tls") -(autoload 'starttls-open-stream "starttls") -(autoload 'starttls-negotiate "starttls") ; avoid warning - (defcustom pop3-stream-type nil "*Transport security type for POP3 connexions. This may be either nil (plain connexion), `ssl' (use an @@ -286,64 +289,37 @@ this is nil, `ssl' is assumed for connexions to port Returns the process associated with the connection." (let ((coding-system-for-read 'binary) (coding-system-for-write 'binary) - process) + result) (with-current-buffer (get-buffer-create (concat " trace of POP session to " mailhost)) (erase-buffer) (setq pop3-read-point (point-min)) - (setq process - (cond - ((or (eq pop3-stream-type 'ssl) - (and (not pop3-stream-type) (member port '(995 "pop3s")))) - ;; gnutls-cli, openssl don't accept service names - (if (or (equal port "pop3s") - (null port)) - (setq port 995)) - (let ((process (open-tls-stream "POP" (current-buffer) - mailhost port))) - (when process - ;; There's a load of info printed that needs deleting. - (let ((again 't)) - ;; repeat until - ;; - either we received the +OK line - ;; - or accept-process-output timed out without getting - ;; anything - (while (and again - (setq again (memq (process-status process) - '(open run)))) - (setq again (pop3-accept-process-output process)) - (goto-char (point-max)) - (forward-line -1) - (cond ((looking-at "\\+OK") - (setq again nil) - (delete-region (point-min) (point))) - ((not again) - (pop3-quit process) - (error "POP SSL connexion failed"))))) - process))) - ((eq pop3-stream-type 'starttls) - ;; gnutls-cli, openssl don't accept service names - (if (equal port "pop3") - (setq port 110)) - ;; Delay STLS until server greeting is read (Bug#7438). - (starttls-open-stream "POP" (current-buffer) - mailhost (or port 110))) - (t - (open-network-stream "POP" (current-buffer) mailhost port)))) - (let ((response (pop3-read-response process t))) - (setq pop3-timestamp - (substring response (or (string-match "<" response) 0) - (+ 1 (or (string-match ">" response) -1))))) - (when (eq pop3-stream-type 'starttls) - (pop3-send-command process "STLS") - (let ((response (pop3-read-response process t))) - (if (and response (string-match "+OK" response)) - (starttls-negotiate process) - (pop3-quit process) - (error "POP server doesn't support starttls")))) - (pop3-set-process-query-on-exit-flag process nil) - process))) + (setq result + (open-protocol-stream + "POP" (current-buffer) mailhost port + :type (cond + ((or (eq pop3-stream-type 'ssl) + (and (not pop3-stream-type) + (member port '(995 "pop3s")))) + :tls) + (t + (or pop3-stream-type 'network))) + :capability-command "CAPA\r\n" + :end-of-command "^\\.\r?\n\\|^\\+[A-Z]+ .*\n" + :success "^\\+OK.*\n" + :return-list t + :starttls-function + (lambda (capabilities) + (and (string-match "\\bSTLS\\b" capabilities) + "STLS\r\n")))) + (when result + (let ((response (plist-get (cdr result) :greeting))) + (setq pop3-timestamp + (substring response (or (string-match "<" response) 0) + (+ 1 (or (string-match ">" response) -1))))) + (pop3-set-process-query-on-exit-flag (car result) nil) + (car result))))) ;; Support functions |