diff options
| author | Simon Josefsson | 2003-03-26 11:48:32 +0000 |
|---|---|---|
| committer | Simon Josefsson | 2003-03-26 11:48:32 +0000 |
| commit | 01b2d1dd68eed4da7362cb4557b98211e3c0e2a9 (patch) | |
| tree | 83290d52d71e890c3aa2588cc7b800b51277a13c | |
| parent | 8798ecdb37f59d22193e59178356a9167aa95cc1 (diff) | |
| download | emacs-01b2d1dd68eed4da7362cb4557b98211e3c0e2a9.tar.gz emacs-01b2d1dd68eed4da7362cb4557b98211e3c0e2a9.zip | |
Initial revision
| -rw-r--r-- | lisp/net/tls.el | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/lisp/net/tls.el b/lisp/net/tls.el new file mode 100644 index 00000000000..70270773a3c --- /dev/null +++ b/lisp/net/tls.el | |||
| @@ -0,0 +1,127 @@ | |||
| 1 | ;;; tls.el --- TLS/SSL support via wrapper around GnuTLS | ||
| 2 | |||
| 3 | ;; Copyright (C) 2003 Free Software Foundation, Inc. | ||
| 4 | |||
| 5 | ;; Author: Simon Josefsson <simon@josefsson.org> | ||
| 6 | ;; Keywords: comm, tls, gnutls, ssl | ||
| 7 | |||
| 8 | ;; This file is part of GNU Emacs. | ||
| 9 | |||
| 10 | ;; GNU Emacs is free software; you can redistribute it and/or modify | ||
| 11 | ;; it under the terms of the GNU General Public License as published by | ||
| 12 | ;; the Free Software Foundation; either version 2, or (at your option) | ||
| 13 | ;; any later version. | ||
| 14 | |||
| 15 | ;; GNU Emacs is distributed in the hope that it will be useful, | ||
| 16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 18 | ;; GNU General Public License for more details. | ||
| 19 | |||
| 20 | ;; You should have received a copy of the GNU General Public License | ||
| 21 | ;; along with GNU Emacs; see the file COPYING. If not, write to the | ||
| 22 | ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
| 23 | ;; Boston, MA 02111-1307, USA. | ||
| 24 | |||
| 25 | ;;; Commentary: | ||
| 26 | |||
| 27 | ;; This package implements a simple wrapper around "gnutls-cli" to | ||
| 28 | ;; make Emacs support TLS/SSL. | ||
| 29 | ;; | ||
| 30 | ;; Usage is the same as `open-network-stream', i.e.: | ||
| 31 | ;; | ||
| 32 | ;; (setq tmp (open-tls-stream "test" (current-buffer) "news.mozilla.org" 563)) | ||
| 33 | ;; ... | ||
| 34 | ;; #<process test> | ||
| 35 | ;; (process-send-string tmp "mode reader\n") | ||
| 36 | ;; 200 secnews.netscape.com Netscape-Collabra/3.52 03615 NNRP ready ... | ||
| 37 | ;; nil | ||
| 38 | ;; (process-send-string tmp "quit\n") | ||
| 39 | ;; 205 | ||
| 40 | ;; nil | ||
| 41 | |||
| 42 | ;; To use this package as a replacement for ssl.el by William M. Perry | ||
| 43 | ;; <wmperry@cs.indiana.edu>, you need to evaluate the following: | ||
| 44 | ;; | ||
| 45 | ;; (defalias 'open-ssl-stream 'open-tls-stream) | ||
| 46 | |||
| 47 | ;;; Code: | ||
| 48 | |||
| 49 | (eval-and-compile | ||
| 50 | (autoload 'format-spec "format-spec") | ||
| 51 | (autoload 'format-spec-make "format-spec")) | ||
| 52 | |||
| 53 | (defgroup tls nil | ||
| 54 | "Transport Layer Security (TLS) parameters." | ||
| 55 | :group 'comm) | ||
| 56 | |||
| 57 | (defcustom tls-program '("gnutls-cli -p %p %h" | ||
| 58 | "gnutls-cli -p %p %h --protocols ssl3") | ||
| 59 | "List of strings containing commands to start TLS stream to a host. | ||
| 60 | Each entry in the list is tried until a connection is successful. | ||
| 61 | %s is replaced with server hostname, %p with port to connect to. | ||
| 62 | The program should read input on stdin and write output to | ||
| 63 | stdout. Also see `tls-success' for what the program should output | ||
| 64 | after successful negotiation." | ||
| 65 | :type '(repeat string) | ||
| 66 | :group 'tls) | ||
| 67 | |||
| 68 | (defcustom tls-process-connection-type nil | ||
| 69 | "*Value for `process-connection-type' to use when starting process." | ||
| 70 | :type 'boolean | ||
| 71 | :group 'tls) | ||
| 72 | |||
| 73 | (defcustom tls-success "- Handshake was completed" | ||
| 74 | "*Regular expression indicating completed TLS handshakes. | ||
| 75 | The default is what GNUTLS's \"gnutls-cli\" outputs." | ||
| 76 | :type 'regexp | ||
| 77 | :group 'tls) | ||
| 78 | |||
| 79 | (defun open-tls-stream (name buffer host service) | ||
| 80 | "Open a TLS connection for a service to a host. | ||
| 81 | Returns a subprocess-object to represent the connection. | ||
| 82 | Input and output work as for subprocesses; `delete-process' closes it. | ||
| 83 | Args are NAME BUFFER HOST SERVICE. | ||
| 84 | NAME is name for process. It is modified if necessary to make it unique. | ||
| 85 | BUFFER is the buffer (or buffer-name) to associate with the process. | ||
| 86 | Process output goes at end of that buffer, unless you specify | ||
| 87 | an output stream or filter function to handle the output. | ||
| 88 | BUFFER may be also nil, meaning that this process is not associated | ||
| 89 | with any buffer | ||
| 90 | Third arg is name of the host to connect to, or its IP address. | ||
| 91 | Fourth arg SERVICE is name of the service desired, or an integer | ||
| 92 | specifying a port number to connect to." | ||
| 93 | (let ((cmds tls-program) cmd done) | ||
| 94 | (message "Opening TLS connection to `%s'..." host) | ||
| 95 | (while (and (not done) (setq cmd (pop cmds))) | ||
| 96 | (message "Opening TLS connection with `%s'..." cmd) | ||
| 97 | (let* ((process-connection-type tls-process-connection-type) | ||
| 98 | (process (start-process | ||
| 99 | name buffer shell-file-name shell-command-switch | ||
| 100 | (format-spec | ||
| 101 | cmd | ||
| 102 | (format-spec-make | ||
| 103 | ?h host | ||
| 104 | ?p (if (integerp service) | ||
| 105 | (int-to-string service) | ||
| 106 | service))))) | ||
| 107 | response) | ||
| 108 | (while (and process | ||
| 109 | (memq (process-status process) '(open run)) | ||
| 110 | (save-excursion | ||
| 111 | (set-buffer buffer) ;; XXX "blue moon" nntp.el bug | ||
| 112 | (goto-char (point-min)) | ||
| 113 | (not (setq done (re-search-forward tls-success nil t))))) | ||
| 114 | (accept-process-output process 1) | ||
| 115 | (sit-for 1)) | ||
| 116 | (message "Opening TLS connection with `%s'...%s" cmd | ||
| 117 | (if done "done" "failed")) | ||
| 118 | (if done | ||
| 119 | (setq done process) | ||
| 120 | (delete-process process)))) | ||
| 121 | (message "Opening TLS connection to `%s'...%s" | ||
| 122 | host (if done "done" "failed")) | ||
| 123 | done)) | ||
| 124 | |||
| 125 | (provide 'tls) | ||
| 126 | |||
| 127 | ;;; tls.el ends here | ||