[System]: Copy 'ServicePoint.Certificate' and 'ClientCertificate' from the references...
authorMartin Baulig <martin.baulig@xamarin.com>
Sun, 28 Feb 2016 03:15:29 +0000 (22:15 -0500)
committerMartin Baulig <martin.baulig@xamarin.com>
Tue, 15 Mar 2016 22:45:38 +0000 (18:45 -0400)
(cherry picked from commit 76e0f64862732c3fb4f5647d5a2687ad9557be45)

mcs/class/System/Mono.Net.Security/ChainValidationHelper.cs
mcs/class/System/Mono.Net.Security/MonoTlsStream.cs
mcs/class/System/System.Net/ServicePoint.cs

index f50bddac7777f46b141185bcc3b03a4988238f7e..70c6996000b8074d62d75487e58f91b516aa4428 100644 (file)
@@ -264,7 +264,7 @@ namespace Mono.Net.Security
                                leaf = certs [0];
 
                        if (tlsStream != null)
-                               request.ServicePoint.SetServerCertificate (leaf);
+                               request.ServicePoint.UpdateServerCertificate (leaf);
 
                        if (leaf == null) {
                                errors |= SslPolicyErrors.RemoteCertificateNotAvailable;
index db6e66ca283313a5d06000cd4e2c0a6039f5c1b7..4be09032163004444764dac968ab26382d783908 100644 (file)
@@ -113,7 +113,7 @@ namespace Mono.Net.Security
                                if (CertificateValidationFailed)
                                        status = WebExceptionStatus.TrustFailure;
 
-                               request.ServicePoint.SetClientCertificate (sslStream.InternalLocalCertificate);
+                               request.ServicePoint.UpdateClientCertificate (sslStream.InternalLocalCertificate);
                                if (status != WebExceptionStatus.Success)
                                        sslStream = null;
                        }
index 6ee185ac19abc5bf7ca0cb434853587558f2ba0a..13c06ec493f499c3f5636c35248940ba13b3a6cc 100644 (file)
@@ -49,8 +49,6 @@ namespace System.Net
                DateTime idleSince;
                DateTime lastDnsResolve;
                Version protocolVersion;
-               X509Certificate certificate;
-               X509Certificate clientCertificate;
                IPHostEntry host;
                bool usesProxy;
                Dictionary<string,WebConnectionGroup> groups;
@@ -92,14 +90,6 @@ namespace System.Net
                        set { endPointCallback = value; }
                }
                
-               public X509Certificate Certificate {
-                       get { return certificate; }
-               }
-               
-               public X509Certificate ClientCertificate {
-                       get { return clientCertificate; }
-               }
-
                [MonoTODO]
                public int ConnectionLeaseTimeout
                {
@@ -413,20 +403,55 @@ namespace System.Net
                        return false;
                }
 
-               internal void SetServerCertificate (X509Certificate server)
+               //
+               // Copied from the referencesource
+               //
+
+               object m_ServerCertificateOrBytes;
+               object m_ClientCertificateOrBytes;
+
+               /// <devdoc>
+               ///    <para>
+               ///       Gets the certificate received for this <see cref='System.Net.ServicePoint'/>.
+               ///    </para>
+               /// </devdoc>
+               public  X509Certificate Certificate {
+                       get {
+                               object chkCert = m_ServerCertificateOrBytes;
+                               if (chkCert != null && chkCert.GetType() == typeof(byte[]))
+                                       return (X509Certificate)(m_ServerCertificateOrBytes = new X509Certificate((byte[]) chkCert));
+                               else
+                                       return chkCert as X509Certificate;
+                       }
+               }
+               internal void UpdateServerCertificate(X509Certificate certificate)
                {
-                       var cloned = server != null ? new X509Certificate (server) : null;
-                       var old = Interlocked.Exchange (ref certificate, cloned);
-                       if (old != null)
-                               old.Dispose ();
+                       if (certificate != null)
+                               m_ServerCertificateOrBytes = certificate.GetRawCertData();
+                       else
+                               m_ServerCertificateOrBytes = null;
+               }
+
+               /// <devdoc>
+               /// <para>
+               /// Gets the Client Certificate sent by us to the Server.
+               /// </para>
+               /// </devdoc>
+               public  X509Certificate ClientCertificate {
+                       get {
+                               object chkCert = m_ClientCertificateOrBytes;
+                               if (chkCert != null && chkCert.GetType() == typeof(byte[]))
+                                       return (X509Certificate)(m_ClientCertificateOrBytes = new X509Certificate((byte[]) chkCert));
+                               else
+                                       return chkCert as X509Certificate;
+                       }
                }
-
-               internal void SetClientCertificate (X509Certificate clientCertificate)
+               internal void UpdateClientCertificate(X509Certificate certificate)
                {
-                       var cloned = clientCertificate != null ? new X509Certificate (clientCertificate) : null;
-                       var old = Interlocked.Exchange (ref clientCertificate, cloned);
-                       if (old != null)
-                               old.Dispose ();
+                       if (certificate != null)
+                               m_ClientCertificateOrBytes = certificate.GetRawCertData();
+                       else
+                               m_ClientCertificateOrBytes = null;
                }
 
                internal bool CallEndPointDelegate (Socket sock, IPEndPoint remote)