emacs/lisp/obsolete/tls.el

299 lines
11 KiB
EmacsLisp
Raw Normal View History

2003-03-26 11:48:32 +00:00
;;; tls.el --- TLS/SSL support via wrapper around GnuTLS
;; Copyright (C) 1996-1999, 2002-2020 Free Software Foundation, Inc.
2003-03-26 11:48:32 +00:00
;; Author: Simon Josefsson <simon@josefsson.org>
;; Keywords: comm, tls, gnutls, ssl
;; Obsolete-since: 27.1
2003-03-26 11:48:32 +00:00
;; This file is part of GNU Emacs.
;; GNU Emacs is free software: you can redistribute it and/or modify
2003-03-26 11:48:32 +00:00
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
2003-03-26 11:48:32 +00:00
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2003-03-26 11:48:32 +00:00
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
2003-03-26 11:48:32 +00:00
;;; Commentary:
;; This package implements a simple wrapper around "gnutls-cli" to
;; make Emacs support TLS/SSL.
;;
;; Usage is the same as `open-network-stream', i.e.:
;;
;; (setq tmp (open-tls-stream "test" (current-buffer) "news.mozilla.org" 563))
;; ...
;; #<process test>
;; (process-send-string tmp "mode reader\n")
;; 200 secnews.netscape.com Netscape-Collabra/3.52 03615 NNRP ready ...
;; nil
;; (process-send-string tmp "quit\n")
;; 205
;; nil
;; To use this package as a replacement for ssl.el by William M. Perry
;; <wmperry@cs.indiana.edu>, you need to evaluate the following:
;;
;; (defalias 'open-ssl-stream 'open-tls-stream)
;;; Code:
(require 'gnutls)
2003-03-26 11:48:32 +00:00
(defgroup tls nil
"Transport Layer Security (TLS) parameters."
:group 'comm)
(defcustom tls-end-of-info
(concat
"\\("
;; `openssl s_client' regexp. See ssl/ssl_txt.c lines 219-220.
;; According to apps/s_client.c line 1515 `---' is always the last
;; line that is printed by s_client before the real data.
"^ Verify return code: .+\n---\n\\|"
;; `gnutls' regexp. See src/cli.c lines 721-.
"^- Simple Client Mode:\n"
"\\(\n\\|" ; ignore blank lines
2007-11-08 13:20:11 +00:00
;; According to GnuTLS v2.1.5 src/cli.c lines 640-650 and 705-715
2007-11-09 13:06:05 +00:00
;; in `main' the handshake will start after this message. If the
2007-11-08 13:20:11 +00:00
;; handshake fails, the programs will abort.
"^\\*\\*\\* Starting TLS handshake\n\\)*"
"\\)")
"Regexp matching end of TLS client informational messages.
Client data stream begins after the last character this matches.
The default matches the output of \"gnutls-cli\" (version 2.0.1)."
:version "22.2"
:type 'regexp
:group 'tls)
(defcustom tls-program
'("gnutls-cli --x509cafile %t -p %p %h"
"gnutls-cli --x509cafile %t -p %p %h --protocols ssl3")
2003-03-26 11:48:32 +00:00
"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 the server hostname, %p with the port to
connect to, and %t with a file name containing trusted certificates.
The program should read input on stdin and write output to stdout.
See `tls-checktrust' on how to check trusted root certs.
Also see `tls-success' for what the program should output after
successful negotiation."
:type
'(choice
(const :tag "Default list of commands"
("gnutls-cli --x509cafile %t -p %p %h"
"gnutls-cli --x509cafile %t -p %p %h --protocols ssl3"))
(list :tag "Choose commands"
:value
("gnutls-cli --x509cafile %t -p %p %h"
"gnutls-cli --x509cafile %t -p %p %h --protocols ssl3")
(set :inline t
;; FIXME: add brief `:tag "..."' descriptions.
;; (repeat :inline t :tag "Other" (string))
;; No trust check:
(const "gnutls-cli --insecure -p %p %h")
(const "gnutls-cli --insecure -p %p %h --protocols ssl3"))
(repeat :inline t :tag "Other" (string)))
(list :tag "List of commands"
(repeat :tag "Command" (string))))
:version "26.1" ; remove s_client
2003-03-26 11:48:32 +00:00
:group 'tls)
(defcustom tls-process-connection-type nil
"Value for `process-connection-type' to use when starting TLS process."
:version "22.1"
2003-03-26 11:48:32 +00:00
:type 'boolean
:group 'tls)
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-676 Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 169-173) - Merge from emacs--cvs-trunk--0 - Update from CVS 2005-12-16 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-art.el (gnus-signature-separator): Fix custom type. * lisp/gnus/mm-decode.el (mm-inlined-types): Fix custom type. (mm-keep-viewer-alive-types): Ditto. (mm-automatic-display): Ditto. (mm-attachment-override-types): Ditto. (mm-inline-override-types): Ditto. (mm-automatic-external-display): Ditto. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-art.el (gnus-buttonized-mime-types): Mention addition of multipart/alternative and add xref to mm-discouraged-alternatives in doc string. * lisp/gnus/mm-decode.el (mm-discouraged-alternatives): Add xref to gnus-buttonized-mime-types in doc string. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/rfc2047.el (rfc2047-charset-to-coding-system): Recognize us-ascii as a MIME charset. * lisp/gnus/mm-bodies.el (mm-decode-content-transfer-encoding): Protect against the case where the 2nd arg TYPE is nil. 2005-12-09 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/gnus-start.el (gnus-no-server-1): Mention `gnus-level-default-subscribed' in doc string. 2005-11-26 Dave Love <fx@gnu.org> * lisp/gnus/tls.el (open-tls-stream): Rename arg SERVICE to PORT. (tls-program, tls-success): Provide openssl alternative. * lisp/gnus/starttls.el: Doc fixes. (starttls-open-stream-gnutls, starttls-open-stream): Rename arg SERVICE to PORT. 2005-12-09 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/gnus-start.el (gnus-start-draft-setup): Enforce `gnus-draft-mode' for nndraft:drafts at startup. * lisp/gnus/gnus.el (gnus-splash): Change custom group. (gnus-group-get-parameter, gnus-group-parameter-value): Describe allow-list argument. * lisp/gnus/gnus-agent.el (gnus-agent-article-alist-save-format): Format doc string. 2005-12-09 ARISAWA Akihiro <ari@mbf.ocn.ne.jp> (tiny change) * lisp/gnus/mm-decode.el (mm-display-external): Add lacked cdr. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * man/gnus.texi (MIME Commands): Mention addition of multipart/alternative to gnus-buttonized-mime-types and add xref to mm-discouraged-alternatives. * man/emacs-mime.texi (Display Customization): Mention addition of "image/.*" and add xref to gnus-buttonized-mime-types in the mm-discouraged-alternatives section.
2005-12-17 21:41:34 +00:00
(defcustom tls-success "- Handshake was completed\\|SSL handshake has read "
"Regular expression indicating completed TLS handshakes.
The default is what GnuTLS's \"gnutls-cli\" outputs."
;; or OpenSSL's \"openssl s_client\"
:version "22.1"
2003-03-26 11:48:32 +00:00
:type 'regexp
:group 'tls)
(defcustom tls-checktrust nil
"Indicate if certificates should be checked against trusted root certs.
If this is `ask', the user can decide whether to accept an
untrusted certificate. You may have to adapt `tls-program' in
order to make this feature work properly, i.e., to ensure that
the external program knows about the root certificates you
consider trustworthy, e.g.:
\(setq tls-program
Shorten over-wide docstrings in defcustoms * lisp/calc/calc.el (calc-embedded-announce-formula-alist) (calc-embedded-open-formula, calc-embedded-close-formula) (calc-matrix-mode): * lisp/cedet/semantic/imenu.el (semantic-imenu-sort-bucket-function): * lisp/emacs-lisp/find-func.el (find-feature-regexp): * lisp/emulation/cua-base.el (cua-paste-pop-rotate-temporarily): * lisp/emulation/viper-init.el (viper-fast-keyseq-timeout) (viper-related-files-and-buffers-ring): * lisp/emulation/viper-keym.el (viper-want-ctl-h-help): * lisp/gnus/gnus-art.el (gnus-article-banner-alist): * lisp/gnus/gnus-group.el (gnus-keep-same-level): * lisp/gnus/gnus-score.el (gnus-adaptive-word-length-limit): * lisp/gnus/gnus-sum.el (gnus-inhibit-user-auto-expire): * lisp/gnus/gnus-uu.el (gnus-uu-ignore-files-by-type) (gnus-uu-do-not-unpack-archives) (gnus-uu-unmark-articles-not-decoded) (gnus-uu-correct-stripped-uucode, gnus-uu-save-in-digest) (gnus-uu-post-include-before-composing): * lisp/gnus/gnus.el (gnus-use-long-file-name) (gnus-install-group-spam-parameters): * lisp/gnus/message.el (message-cite-style): * lisp/gnus/nnmail.el (nnmail-split-fancy-with-parent-ignore-groups) (nnmail-cache-ignore-groups): * lisp/ido.el (ido-rewrite-file-prompt-functions): * lisp/mail/feedmail.el (feedmail-fiddle-plex-user-list) (feedmail-spray-address-fiddle-plex-list): * lisp/mh-e/mh-e.el (mh-annotate-msg-hook): * lisp/net/imap.el (imap-process-connection-type): * lisp/net/rcirc.el (rcirc-omit-threshold): * lisp/net/tramp-sh.el (tramp-copy-size-limit): * lisp/nxml/nxml-mode.el (nxml-default-buffer-file-coding-system): * lisp/obsolete/landmark.el (landmark-max-stall-time): * lisp/obsolete/tls.el (tls-checktrust): * lisp/org/org-indent.el (org-indent-mode-turns-off-org-adapt-indentation) (org-indent-mode-turns-on-hiding-stars): * lisp/org/org-protocol.el (org-protocol-project-alist): * lisp/progmodes/cc-vars.el (c-doc-comment-style): * lisp/progmodes/cperl-mode.el (cperl-indent-subs-specially): * lisp/progmodes/flymake-proc.el (flymake-proc-allowed-file-name-masks): * lisp/progmodes/hideif.el (hide-ifdef-expand-reinclusion-protection): * lisp/simple.el (minibuffer-history-case-insensitive-variables): * lisp/tab-bar.el (tab-bar-close-last-tab-choice): * lisp/textmodes/reftex-vars.el (reftex-special-environment-functions): * lisp/vc/ediff-init.el (ediff-startup-hook, ediff-cleanup-hook) (ediff-metachars): * lisp/vc/ediff-merg.el (ediff-show-clashes-only): * lisp/vc/ediff-mult.el (ediff-default-filtering-regexp): Shorten doc strings to not exceed 80-column limits. (Bug#44858)
2020-12-19 17:26:58 +01:00
\\='(\"gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt \\
-p %p %h\"
\"gnutls-cli --x509cafile /etc/ssl/certs/ca-certificates.crt \\
-p %p %h --protocols ssl3\"))"
:type '(choice (const :tag "Always" t)
(const :tag "Never" nil)
(const :tag "Ask" ask))
:version "23.1" ;; No Gnus
:group 'tls)
(defcustom tls-untrusted
"- Peer's certificate is NOT trusted\\|Verify return code: \\([^0] \\|.[^ ]\\)"
"Regular expression indicating failure of TLS certificate verification.
The default is what GnuTLS's \"gnutls-cli\" returns in the event of
unsuccessful verification."
;; or OpenSSL's \"openssl s_client\"
:type 'regexp
:version "23.1" ;; No Gnus
:group 'tls)
(defcustom tls-hostmismatch
"# The hostname in the certificate does NOT match"
"Regular expression indicating a host name mismatch in certificate.
When the host name specified in the certificate doesn't match the
name of the host you are connecting to, gnutls-cli issues a
warning to this effect. There is no such feature in openssl. Set
this to nil if you want to ignore host name mismatches."
:type 'regexp
:version "23.1" ;; No Gnus
:group 'tls)
(defcustom tls-certtool-program "certtool"
"Name of GnuTLS certtool.
Used by `tls-certificate-information'."
:version "22.1"
:type 'string
:group 'tls)
(defalias 'tls-format-message
(if (fboundp 'format-message) 'format-message
;; for Emacs < 25, and XEmacs, don't worry about quote translation.
'format))
(defun tls-certificate-information (der)
"Parse X.509 certificate in DER format into an assoc list."
(let ((certificate (concat "-----BEGIN CERTIFICATE-----\n"
(base64-encode-string der)
"\n-----END CERTIFICATE-----\n"))
(exit-code 0))
(with-current-buffer (get-buffer-create " *certtool*")
(erase-buffer)
(insert certificate)
(setq exit-code (condition-case ()
(call-process-region (point-min) (point-max)
tls-certtool-program
t (list (current-buffer) nil) t
"--certificate-info")
(error -1)))
(if (/= exit-code 0)
nil
(let ((vals nil))
(goto-char (point-min))
(while (re-search-forward "^\\([^:]+\\): \\(.*\\)" nil t)
(push (cons (match-string 1) (match-string 2)) vals))
(nreverse vals))))))
(defun open-tls-stream (name buffer host port)
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-676 Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 169-173) - Merge from emacs--cvs-trunk--0 - Update from CVS 2005-12-16 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-art.el (gnus-signature-separator): Fix custom type. * lisp/gnus/mm-decode.el (mm-inlined-types): Fix custom type. (mm-keep-viewer-alive-types): Ditto. (mm-automatic-display): Ditto. (mm-attachment-override-types): Ditto. (mm-inline-override-types): Ditto. (mm-automatic-external-display): Ditto. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-art.el (gnus-buttonized-mime-types): Mention addition of multipart/alternative and add xref to mm-discouraged-alternatives in doc string. * lisp/gnus/mm-decode.el (mm-discouraged-alternatives): Add xref to gnus-buttonized-mime-types in doc string. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/rfc2047.el (rfc2047-charset-to-coding-system): Recognize us-ascii as a MIME charset. * lisp/gnus/mm-bodies.el (mm-decode-content-transfer-encoding): Protect against the case where the 2nd arg TYPE is nil. 2005-12-09 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/gnus-start.el (gnus-no-server-1): Mention `gnus-level-default-subscribed' in doc string. 2005-11-26 Dave Love <fx@gnu.org> * lisp/gnus/tls.el (open-tls-stream): Rename arg SERVICE to PORT. (tls-program, tls-success): Provide openssl alternative. * lisp/gnus/starttls.el: Doc fixes. (starttls-open-stream-gnutls, starttls-open-stream): Rename arg SERVICE to PORT. 2005-12-09 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/gnus-start.el (gnus-start-draft-setup): Enforce `gnus-draft-mode' for nndraft:drafts at startup. * lisp/gnus/gnus.el (gnus-splash): Change custom group. (gnus-group-get-parameter, gnus-group-parameter-value): Describe allow-list argument. * lisp/gnus/gnus-agent.el (gnus-agent-article-alist-save-format): Format doc string. 2005-12-09 ARISAWA Akihiro <ari@mbf.ocn.ne.jp> (tiny change) * lisp/gnus/mm-decode.el (mm-display-external): Add lacked cdr. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * man/gnus.texi (MIME Commands): Mention addition of multipart/alternative to gnus-buttonized-mime-types and add xref to mm-discouraged-alternatives. * man/emacs-mime.texi (Display Customization): Mention addition of "image/.*" and add xref to gnus-buttonized-mime-types in the mm-discouraged-alternatives section.
2005-12-17 21:41:34 +00:00
"Open a TLS connection for a port to a host.
2003-03-26 11:48:32 +00:00
Returns a subprocess-object to represent the connection.
Input and output work as for subprocesses; `delete-process' closes it.
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-676 Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 169-173) - Merge from emacs--cvs-trunk--0 - Update from CVS 2005-12-16 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-art.el (gnus-signature-separator): Fix custom type. * lisp/gnus/mm-decode.el (mm-inlined-types): Fix custom type. (mm-keep-viewer-alive-types): Ditto. (mm-automatic-display): Ditto. (mm-attachment-override-types): Ditto. (mm-inline-override-types): Ditto. (mm-automatic-external-display): Ditto. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-art.el (gnus-buttonized-mime-types): Mention addition of multipart/alternative and add xref to mm-discouraged-alternatives in doc string. * lisp/gnus/mm-decode.el (mm-discouraged-alternatives): Add xref to gnus-buttonized-mime-types in doc string. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/rfc2047.el (rfc2047-charset-to-coding-system): Recognize us-ascii as a MIME charset. * lisp/gnus/mm-bodies.el (mm-decode-content-transfer-encoding): Protect against the case where the 2nd arg TYPE is nil. 2005-12-09 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/gnus-start.el (gnus-no-server-1): Mention `gnus-level-default-subscribed' in doc string. 2005-11-26 Dave Love <fx@gnu.org> * lisp/gnus/tls.el (open-tls-stream): Rename arg SERVICE to PORT. (tls-program, tls-success): Provide openssl alternative. * lisp/gnus/starttls.el: Doc fixes. (starttls-open-stream-gnutls, starttls-open-stream): Rename arg SERVICE to PORT. 2005-12-09 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/gnus-start.el (gnus-start-draft-setup): Enforce `gnus-draft-mode' for nndraft:drafts at startup. * lisp/gnus/gnus.el (gnus-splash): Change custom group. (gnus-group-get-parameter, gnus-group-parameter-value): Describe allow-list argument. * lisp/gnus/gnus-agent.el (gnus-agent-article-alist-save-format): Format doc string. 2005-12-09 ARISAWA Akihiro <ari@mbf.ocn.ne.jp> (tiny change) * lisp/gnus/mm-decode.el (mm-display-external): Add lacked cdr. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * man/gnus.texi (MIME Commands): Mention addition of multipart/alternative to gnus-buttonized-mime-types and add xref to mm-discouraged-alternatives. * man/emacs-mime.texi (Display Customization): Mention addition of "image/.*" and add xref to gnus-buttonized-mime-types in the mm-discouraged-alternatives section.
2005-12-17 21:41:34 +00:00
Args are NAME BUFFER HOST PORT.
2003-03-26 11:48:32 +00:00
NAME is name for process. It is modified if necessary to make it unique.
BUFFER is the buffer (or buffer name) to associate with the process.
2003-03-26 11:48:32 +00:00
Process output goes at end of that buffer, unless you specify
a filter function to handle the output.
2003-03-26 11:48:32 +00:00
BUFFER may be also nil, meaning that this process is not associated
with any buffer
Third arg is name of the host to connect to, or its IP address.
Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-676 Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 169-173) - Merge from emacs--cvs-trunk--0 - Update from CVS 2005-12-16 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-art.el (gnus-signature-separator): Fix custom type. * lisp/gnus/mm-decode.el (mm-inlined-types): Fix custom type. (mm-keep-viewer-alive-types): Ditto. (mm-automatic-display): Ditto. (mm-attachment-override-types): Ditto. (mm-inline-override-types): Ditto. (mm-automatic-external-display): Ditto. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/gnus-art.el (gnus-buttonized-mime-types): Mention addition of multipart/alternative and add xref to mm-discouraged-alternatives in doc string. * lisp/gnus/mm-decode.el (mm-discouraged-alternatives): Add xref to gnus-buttonized-mime-types in doc string. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * lisp/gnus/rfc2047.el (rfc2047-charset-to-coding-system): Recognize us-ascii as a MIME charset. * lisp/gnus/mm-bodies.el (mm-decode-content-transfer-encoding): Protect against the case where the 2nd arg TYPE is nil. 2005-12-09 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/gnus-start.el (gnus-no-server-1): Mention `gnus-level-default-subscribed' in doc string. 2005-11-26 Dave Love <fx@gnu.org> * lisp/gnus/tls.el (open-tls-stream): Rename arg SERVICE to PORT. (tls-program, tls-success): Provide openssl alternative. * lisp/gnus/starttls.el: Doc fixes. (starttls-open-stream-gnutls, starttls-open-stream): Rename arg SERVICE to PORT. 2005-12-09 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/gnus-start.el (gnus-start-draft-setup): Enforce `gnus-draft-mode' for nndraft:drafts at startup. * lisp/gnus/gnus.el (gnus-splash): Change custom group. (gnus-group-get-parameter, gnus-group-parameter-value): Describe allow-list argument. * lisp/gnus/gnus-agent.el (gnus-agent-article-alist-save-format): Format doc string. 2005-12-09 ARISAWA Akihiro <ari@mbf.ocn.ne.jp> (tiny change) * lisp/gnus/mm-decode.el (mm-display-external): Add lacked cdr. 2005-12-12 Katsumi Yamaoka <yamaoka@jpl.org> * man/gnus.texi (MIME Commands): Mention addition of multipart/alternative to gnus-buttonized-mime-types and add xref to mm-discouraged-alternatives. * man/emacs-mime.texi (Display Customization): Mention addition of "image/.*" and add xref to gnus-buttonized-mime-types in the mm-discouraged-alternatives section.
2005-12-17 21:41:34 +00:00
Fourth arg PORT is an integer specifying a port to connect to."
2007-04-07 04:33:00 +00:00
(let ((cmds tls-program)
(use-temp-buffer (null buffer))
process cmd done)
(if use-temp-buffer
(setq buffer (generate-new-buffer " TLS"))
;; BUFFER is a string but does not exist as a buffer object.
(unless (and (get-buffer buffer)
(buffer-name (get-buffer buffer)))
(generate-new-buffer buffer)))
(with-current-buffer buffer
(message "Opening TLS connection to `%s'..." host)
(while (and (not done) (setq cmd (pop cmds)))
(let ((process-connection-type tls-process-connection-type)
(formatted-cmd
Fix and extend format-spec (bug#41758) * lisp/format-spec.el: Use lexical-binding. Remove dependence on subr-x.el. (format-spec-make): Clarify docstring. (format-spec--parse-modifiers): Rename to... (format-spec--parse-flags): ...this and simplify. In particular, don't bother parsing :space-pad which is redundant and unused. (format-spec--pad): Remove, replacing with... (format-spec--do-flags): ...this new helper function which performs more of format-spec's supported text manipulation. (format-spec): Autoload. Allow optional argument to take on special values 'ignore' and 'delete' for more control over what happens when a replacement for a format specification isn't provided. Bring back proper support for a precision modifier similar to that of 'format'. * lisp/battery.el (battery-format): Rewrite in terms of format-spec. (battery-echo-area-format, battery-mode-line-format): Mention support of format-spec syntax in docstrings. * doc/lispref/strings.texi (Custom Format Strings): * etc/NEWS: Document and announce these changes. * lisp/dired-aux.el (dired-do-compress-to): * lisp/erc/erc-match.el (erc-log-matches): * lisp/erc/erc.el (erc-update-mode-line-buffer): * lisp/gnus/gnus-sieve.el (gnus-sieve-update): * lisp/gnus/gssapi.el (open-gssapi-stream): * lisp/gnus/mail-source.el (mail-source-fetch-file) (mail-source-fetch-directory, mail-source-fetch-pop) (mail-source-fetch-imap): * lisp/gnus/message.el (message-insert-formatted-citation-line): * lisp/image-dired.el: * lisp/net/eww.el: * lisp/net/imap.el (imap-kerberos4-open, imap-gssapi-open) (imap-shell-open): * lisp/net/network-stream.el (network-stream-open-shell): * lisp/obsolete/tls.el (open-tls-stream): * lisp/textmodes/tex-mode.el: Remove extraneous loads and autoloads of format-spec now that it is autoloaded and simplify its uses where possible. * test/lisp/battery-tests.el (battery-format): Test new format-spec support. * test/lisp/format-spec-tests.el (test-format-spec): Rename to... (format-spec) ...this, extending test cases. (test-format-unknown): Rename to... (format-spec-unknown): ...this, extending test cases. (test-format-modifiers): Rename to... (format-spec-flags): ...this. (format-spec-make, format-spec-parse-flags, format-spec-do-flags) (format-spec-do-flags-truncate, format-spec-do-flags-pad) (format-spec-do-flags-chop, format-spec-do-flags-case): New tests.
2020-05-29 19:56:14 +01:00
(format-spec cmd `((?t . ,(car (gnutls-trustfiles)))
(?h . ,host)
(?p . ,(if (integerp port)
(number-to-string port)
port))))))
(message "Opening TLS connection with `%s'..." formatted-cmd)
(setq process (start-process
name buffer shell-file-name shell-command-switch
formatted-cmd))
(while (and process
(memq (process-status process) '(open run))
(progn
(goto-char (point-min))
(not (setq done (re-search-forward
tls-success nil t)))))
(unless (accept-process-output process 1)
(sit-for 1)))
(message "Opening TLS connection with `%s'...%s" formatted-cmd
(if done "done" "failed"))
(if (not done)
(delete-process process)
;; advance point to after all informational messages that
;; `openssl s_client' and `gnutls' print
(let ((start-of-data nil))
(while
2008-03-19 21:32:23 +00:00
(not (setq start-of-data
;; the string matching `tls-end-of-info'
;; might come in separate chunks from
;; `accept-process-output', so start the
;; search where `tls-success' ended
(save-excursion
(if (re-search-forward tls-end-of-info nil t)
(match-end 0)))))
(accept-process-output process 1))
(if start-of-data
;; move point to start of client data
(goto-char start-of-data)))
2008-03-19 21:32:23 +00:00
(setq done process))))
(when (and done
(or
(and tls-checktrust
(save-excursion
(goto-char (point-min))
(re-search-forward tls-untrusted nil t))
(or
(and (not (eq tls-checktrust 'ask))
(message "The certificate presented by `%s' is \
NOT trusted." host))
(not (yes-or-no-p
(tls-format-message "\
The certificate presented by `%s' is NOT trusted. Accept anyway? " host)))))
(and tls-hostmismatch
(save-excursion
(goto-char (point-min))
(re-search-forward tls-hostmismatch nil t))
(not (yes-or-no-p
(format "Host name in certificate doesn't \
match `%s'. Connect anyway? " host))))))
(setq done nil)
(delete-process process))
;; Delete all the informational messages that could confuse
;; future uses of `buffer'.
(delete-region (point-min) (point)))
(message "Opening TLS connection to `%s'...%s"
host (if done "done" "failed"))
2007-04-07 04:33:00 +00:00
(when use-temp-buffer
2007-04-07 04:40:28 +00:00
(if done (set-process-buffer process nil))
2007-04-07 04:33:00 +00:00
(kill-buffer buffer))
2003-03-26 11:48:32 +00:00
done))
(provide 'tls)
;;; tls.el ends here