[System]: Correctly implement close and shutdown in SslStream. (#4969)
[mono.git] / mcs / class / System / Mono.Net.Security / MobileTlsContext.cs
index 752f0c49efb26f9a8855fd7d29a25f1dab583fcc..b4ba1c014cabf7cb5e47d7410d46d19e5aa10106 100644 (file)
@@ -35,6 +35,7 @@ namespace Mono.Net.Security
                MobileAuthenticatedStream parent;
                bool serverMode;
                string targetHost;
+               string serverName;
                SslProtocols enabledProtocols;
                X509Certificate serverCertificate;
                X509CertificateCollection clientCertificates;
@@ -54,6 +55,13 @@ namespace Mono.Net.Security
                        this.clientCertificates = clientCertificates;
                        this.askForClientCert = askForClientCert;
 
+                       serverName = targetHost;
+                       if (!string.IsNullOrEmpty (serverName)) {
+                               var pos = serverName.IndexOf (':');
+                               if (pos > 0)
+                                       serverName = serverName.Substring (0, pos);
+                       }
+
                        certificateValidator = CertificateValidationHelper.GetInternalValidator (
                                parent.Settings, parent.Provider);
                }
@@ -92,6 +100,10 @@ namespace Mono.Net.Security
                        get { return targetHost; }
                }
 
+               protected string ServerName {
+                       get { return serverName; }
+               }
+
                protected bool AskForClientCertificate {
                        get { return askForClientCert; }
                }
@@ -157,32 +169,37 @@ namespace Mono.Net.Security
 
                public abstract int Write (byte[] buffer, int offset, int count, out bool wantMore);
 
-               public abstract void Close ();
+               public abstract void Shutdown ();
+
+               protected bool ValidateCertificate (X509Certificate leaf, X509Chain chain)
+               {
+                       var result = certificateValidator.ValidateCertificate (TargetHost, IsServer, leaf, chain);
+                       return result != null && result.Trusted && !result.UserDenied;
+               }
 
-               protected ValidationResult ValidateCertificate (X509Certificate leaf, X509Chain chain)
+               protected bool ValidateCertificate (X509CertificateCollection certificates)
                {
-                       return certificateValidator.ValidateCertificate (
-                               targetHost, serverMode, leaf, chain);
+                       var result = certificateValidator.ValidateCertificate (TargetHost, IsServer, certificates);
+                       return result != null && result.Trusted && !result.UserDenied;
                }
 
-               protected X509Certificate SelectClientCertificate (string[] acceptableIssuers)
-                {
-                        X509Certificate certificate;
-                        var selected = certificateValidator.SelectClientCertificate (
-                               targetHost, clientCertificates, serverCertificate,
-                               null, out certificate);
-                        if (selected)
-                                return certificate;
+               protected X509Certificate SelectClientCertificate (X509Certificate serverCertificate, string[] acceptableIssuers)
+               {
+                       X509Certificate certificate;
+                       var selected = certificateValidator.SelectClientCertificate (
+                               TargetHost, ClientCertificates, serverCertificate, acceptableIssuers, out certificate);
+                       if (selected)
+                               return certificate;
 
-                        if (clientCertificates == null || clientCertificates.Count == 0)
-                                return null;
+                       if (clientCertificates == null || clientCertificates.Count == 0)
+                               return null;
 
-                        if (clientCertificates.Count == 1)
-                                return clientCertificates [0];
+                       if (clientCertificates.Count == 1)
+                               return clientCertificates [0];
 
-                        // FIXME: select one.
-                        throw new NotImplementedException ();
-                }
+                       // FIXME: select onne.
+                       throw new NotImplementedException ();
+               }
 
                public void Dispose ()
                {