[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] Always check for client-certificates in open-network-stream
From: |
Robert Pluim |
Subject: |
[PATCH] Always check for client-certificates in open-network-stream |
Date: |
Tue, 22 Oct 2019 17:39:16 +0200 |
I could have sworn this went in, but I found it lingering at the end
of my patch queue. Last time we discussed this, I think everyone was
OK with the idea, but I thought Iʼd ask before pushing.
>From 29aea0dfc80efa2f1a1b29190de9d3d2681fa42a Mon Sep 17 00:00:00 2001
From: Robert Pluim <address@hidden>
Date: Thu, 24 Jan 2019 14:35:30 +0100
Subject: [PATCH] Always check for client-certificates
To: address@hidden
* lisp/net/network-stream.el
(network-stream-use-client-certificates): New user option.
(open-network-stream): If 'network-stream-use-client-certificates'
is t, and the user hasn't specified :client-certificate, do
certificate lookups via 'auth-source'.
(network-stream-certificate): Only return key and certificate
files that exist.
* doc/lispref/processes.texi (Network): Document new
client-certificate behavior.
* etc/NEWS: Document 'network-stream-use-client-certificates'.
---
doc/lispref/processes.texi | 8 ++++++--
etc/NEWS | 6 ++++++
lisp/net/network-stream.el | 26 ++++++++++++++++++++++++--
3 files changed, 36 insertions(+), 4 deletions(-)
diff --git a/doc/lispref/processes.texi b/doc/lispref/processes.texi
index 287221a184..5caf0a2426 100644
--- a/doc/lispref/processes.texi
+++ b/doc/lispref/processes.texi
@@ -2516,12 +2516,16 @@ Network
protocols like @acronym{IMAP} and the like, where most users would
expect the network traffic to be encrypted.
+@vindex network-stream-use-client-certificates
@item :client-certificate @var{list-or-t}
Either a list of the form @code{(@var{key-file} @var{cert-file})},
naming the certificate key file and certificate file itself, or
@code{t}, meaning to query @code{auth-source} for this information
-(@pxref{Top,,Overview, auth, The Auth-Source Manual}).
-Only used for @acronym{TLS} or @acronym{STARTTLS}.
+(@pxref{Help for users,,auth-source, auth, Emacs auth-source Library}).
+Only used for @acronym{TLS} or @acronym{STARTTLS}. If
+@code{:client-certificate} is not specified, behave as if it were t,
+customize @code{network-stream-use-client-certificates} to change
+this.
@item :return-list @var{cons-or-nil}
The return value of this function. If omitted or @code{nil}, return a
diff --git a/etc/NEWS b/etc/NEWS
index c13d879f1a..9b7a59ba8c 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -321,6 +321,12 @@ Previously, this support was only available when using the
external
':client-certificate t' to trigger looking up of per-server
certificates via 'auth-source'.
++++
+** New user option 'network-stream-use-client-certificates'.
+When non-nil, 'open-network-stream' performs lookups of client
+certificates using 'auth-source' as if ':client-certificate t' were
+specified. Defaults to t.
+
+++
** New function 'fill-polish-nobreak-p', to be used in
'fill-nobreak-predicate'.
It blocks line breaking after a one-letter word, also in the case when
diff --git a/lisp/net/network-stream.el b/lisp/net/network-stream.el
index 2b3292b71b..4050c83eb0 100644
--- a/lisp/net/network-stream.el
+++ b/lisp/net/network-stream.el
@@ -58,6 +58,21 @@ starttls-use-gnutls
(defvar starttls-gnutls-program)
(defvar starttls-program)
+(defcustom network-stream-use-client-certificates t
+ "Whether to use client certificates for network connections.
+
+When non-nil, `open-network-stream' will automatically look for
+matching client certificates (via 'auth-source') for a
+destination server, if it is called without a :client-certificate
+keyword.
+
+Set to nil to disable this lookup globally. To disable on a
+per-connection basis, specify ':client-certificate nil' when
+calling `open-network-stream'."
+ :group 'network
+ :type 'boolean
+ :version "27.1")
+
;;;###autoload
(defun open-network-stream (name buffer host service &rest parameters)
"Open a TCP connection to HOST, optionally with encryption.
@@ -132,7 +147,9 @@ open-network-stream
element is the certificate file name itself, or t, which
means that `auth-source' will be queried for the key and the
certificate. This parameter will only be used when doing TLS
- or STARTTLS connections.
+ or STARTTLS connections. If :client-certificate is not
+ specified, behave as if it were t, customize
+ `network-stream-use-client-certificates' to change this.
:use-starttls-if-possible is a boolean that says to do opportunistic
STARTTLS upgrades even if Emacs doesn't have built-in TLS functionality.
@@ -181,6 +198,11 @@ open-network-stream
((memq type '(tls ssl)) 'network-stream-open-tls)
((eq type 'shell) 'network-stream-open-shell)
(t (error "Invalid connection type %s" type))))
+ (parameters
+ (if (and network-stream-use-client-certificates
+ (not (plist-member parameters :client-certificate)))
+ (plist-put parameters :client-certificate t)
+ parameters))
result)
(unwind-protect
(setq result (funcall fun name work-buffer host service parameters))
@@ -209,7 +231,7 @@ network-stream-certificate
:port service)))
(key (plist-get auth-info :key))
(cert (plist-get auth-info :cert)))
- (and key cert
+ (and key cert (file-readable-p key) (file-readable-p cert)
(list key cert)))))))
;;;###autoload
--
2.23.0
- [PATCH] Always check for client-certificates in open-network-stream,
Robert Pluim <=