From 3d0fca5f69e5634824a649a97eabcbb8bbc5aa23 Mon Sep 17 00:00:00 2001 From: Lars Magne Ingebrigtsen Date: Thu, 30 Sep 2010 22:33:35 +0200 Subject: [PATCH] Use tls.el exclusively, and not starttls.el at all. --- lisp/ChangeLog | 7 +++++++ lisp/nnimap.el | 25 ++++++++++++++++++++++--- lisp/tls.el | 21 +++++++++++++++++---- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 9a1c08055..ddac51cc3 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,12 @@ 2010-09-30 Lars Magne Ingebrigtsen + * nnimap.el (nnimap-extend-tls-programs): New function. + (nnimap-open-connection): Use tls.el exclusively, and not starttls.el. + + * tls.el (tls-starttls-switches): New variable. + (tls-find-starttls-argument): Use it. + (open-tls-stream): Ditto. + * netrc.el (netrc-credentials): Return the value of the "default" entry. (netrc-machine): Ditto. diff --git a/lisp/nnimap.el b/lisp/nnimap.el index f3e4e7bb0..533047871 100644 --- a/lisp/nnimap.el +++ b/lisp/nnimap.el @@ -309,9 +309,11 @@ textual parts.") (setq port (or nnimap-server-port "imap"))) '("imap")) ((eq nnimap-stream 'starttls) - (starttls-open-stream - "*nnimap*" (current-buffer) nnimap-address - (setq port (or nnimap-server-port "imap"))) + (let ((tls-program (nnimap-extend-tls-programs))) + (open-tls-stream + "*nnimap*" (current-buffer) nnimap-address + (setq port (or nnimap-server-port "imap")) + 'starttls)) '("imap")) ((eq nnimap-stream 'ssl) (open-tls-stream @@ -383,6 +385,23 @@ textual parts.") (nnimap-command "ENABLE QRESYNC")) t))))))) +(defun nnimap-extend-tls-programs () + (let ((programs tls-program) + result) + (unless (consp programs) + (setq programs (list programs))) + (dolist (program programs) + (push + (with-temp-buffer + (insert program) + (goto-char (point-min)) + (or (search-forward " " nil t) + (goto-char (point-max))) + (insert " %s ") + (buffer-string)) + result)) + (nreverse result))) + (defun nnimap-find-parameter (parameter elems) (let (result) (dolist (elem elems) diff --git a/lisp/tls.el b/lisp/tls.el index d4fa8c2e7..ad0768968 100644 --- a/lisp/tls.el +++ b/lisp/tls.el @@ -75,9 +75,14 @@ and `gnutls-cli' (version 2.0.1) output." :type 'regexp :group 'tls) -(defcustom tls-program '("gnutls-cli -p %p %h" - "gnutls-cli -p %p %h --protocols ssl3" - "openssl s_client -connect %h:%p -no_ssl2 -ign_eof") +(defvar tls-starttls-switches + '(("gnutls-cli" "-s") + ("openssl" "-starttls imap")) + "Alist of programs and the switches necessary to get starttls behaviour.") + +(defcustom tls-program '("gnutls-cli %s -p %p %h" + "gnutls-cli %s -p %p %h --protocols ssl3" + "openssl s_client %s -connect %h:%p -no_ssl2 -ign_eof") "List of strings containing commands to start TLS stream to a host. Each entry in the list is tried until a connection is successful. %h is replaced with server hostname, %p with port to connect to. @@ -199,7 +204,7 @@ Used by `tls-certificate-information'." (push (cons (match-string 1) (match-string 2)) vals)) (nreverse vals)))))) -(defun open-tls-stream (name buffer host port) +(defun open-tls-stream (name buffer host port &optional starttlsp) "Open a TLS connection for a port to a host. Returns a subprocess-object to represent the connection. Input and output work as for subprocesses; `delete-process' closes it. @@ -229,6 +234,9 @@ Fourth arg PORT is an integer specifying a port to connect to." (format-spec cmd (format-spec-make + ?s (if starttlsp + (tls-find-starttls-argument cmd) + "") ?h host ?p (if (integerp port) (int-to-string port) @@ -300,6 +308,11 @@ match `%s'. Connect anyway? " host)))))) (kill-buffer buffer)) done)) +(defun tls-find-starttls-argument (command) + (let ((command (car (split-string command)))) + (or (cadr (assoc command tls-starttls-switches)) + ""))) + (provide 'tls) ;;; tls.el ends here -- 2.25.1