THRIFT-3070 Add ability to set the LocalCertificateSelectionCallback
Client: C#
Patch: Hans-Peter Klett <hansk@spectralogic.com>
This closes #415
Added an optional LocalCertificateSelectionCallback. Also cleans up the connection when a secure authentication fails on the server.
diff --git a/lib/csharp/src/Transport/TTLSServerSocket.cs b/lib/csharp/src/Transport/TTLSServerSocket.cs
index 2e2d299..631a593 100644
--- a/lib/csharp/src/Transport/TTLSServerSocket.cs
+++ b/lib/csharp/src/Transport/TTLSServerSocket.cs
@@ -60,6 +60,11 @@
private RemoteCertificateValidationCallback clientCertValidator;
/// <summary>
+ /// The function to determine which certificate to use.
+ /// </summary>
+ private LocalCertificateSelectionCallback localCertificateSelectionCallback;
+
+ /// <summary>
/// Initializes a new instance of the <see cref="TTLSServerSocket" /> class.
/// </summary>
/// <param name="port">The port where the server runs.</param>
@@ -88,7 +93,14 @@
/// <param name="useBufferedSockets">If set to <c>true</c> [use buffered sockets].</param>
/// <param name="certificate">The certificate object.</param>
/// <param name="clientCertValidator">The certificate validator.</param>
- public TTLSServerSocket(int port, int clientTimeout, bool useBufferedSockets, X509Certificate2 certificate, RemoteCertificateValidationCallback clientCertValidator = null)
+ /// <param name="localCertificateSelectionCallback">The callback to select which certificate to use.</param>
+ public TTLSServerSocket(
+ int port,
+ int clientTimeout,
+ bool useBufferedSockets,
+ X509Certificate2 certificate,
+ RemoteCertificateValidationCallback clientCertValidator = null,
+ LocalCertificateSelectionCallback localCertificateSelectionCallback = null)
{
if (!certificate.HasPrivateKey)
{
@@ -99,6 +111,7 @@
this.serverCertificate = certificate;
this.useBufferedSockets = useBufferedSockets;
this.clientCertValidator = clientCertValidator;
+ this.localCertificateSelectionCallback = localCertificateSelectionCallback;
try
{
// Create server socket
@@ -150,7 +163,13 @@
client.SendTimeout = client.ReceiveTimeout = this.clientTimeout;
//wrap the client in an SSL Socket passing in the SSL cert
- TTLSSocket socket = new TTLSSocket(client, this.serverCertificate, true, this.clientCertValidator);
+ TTLSSocket socket = new TTLSSocket(
+ client,
+ this.serverCertificate,
+ true,
+ this.clientCertValidator,
+ this.localCertificateSelectionCallback
+ );
socket.setupTLS();