2004-02-25 Sebastien Pouliot <sebastien@ximian.com>
authorSebastien Pouliot <sebastien@ximian.com>
Wed, 25 Feb 2004 20:40:19 +0000 (20:40 -0000)
committerSebastien Pouliot <sebastien@ximian.com>
Wed, 25 Feb 2004 20:40:19 +0000 (20:40 -0000)
* HttpsClientStream.cs: New. Internal glue class between System.dll
WebConnection and SslClientStream to reduce reflection.
* SslClientStream.cs: RaiseServerCertificateValidation is now virtual
to allow HttpsClientStream to override it.

svn path=/trunk/mcs/; revision=23467

mcs/class/Mono.Security/Mono.Security.Protocol.Tls/ChangeLog
mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs [new file with mode: 0644]
mcs/class/Mono.Security/Mono.Security.Protocol.Tls/SslClientStream.cs

index 19a7bbad013d295ed883e6704e9299f906514263..77a892a110478d56dc4185bd57f8d63b27bfc6d0 100644 (file)
@@ -1,3 +1,10 @@
+2004-02-25  Sebastien Pouliot  <sebastien@ximian.com>
+
+       * HttpsClientStream.cs: New. Internal glue class between System.dll 
+       WebConnection and SslClientStream to reduce reflection.
+       * SslClientStream.cs: RaiseServerCertificateValidation is now virtual
+       to allow HttpsClientStream to override it.\r
+
 2004-02-24 Carlos Guzman Alvarez  <carlosga@telefonica.net>
 
        * Mono.Security.Protocol.Tls/RecordProtocol.cs:\r
diff --git a/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs b/mcs/class/Mono.Security/Mono.Security.Protocol.Tls/HttpsClientStream.cs
new file mode 100644 (file)
index 0000000..40ceaf4
--- /dev/null
@@ -0,0 +1,54 @@
+//
+// HttpsClientStream.cs: Glue between HttpWebRequest and SslClientStream to
+//     reduce reflection usage.
+//
+// Author:
+//     Sebastien Pouliot  <sebastien@ximian.com>
+//
+// (C) 2004 Novell (http://www.novell.com)
+//
+
+using System;
+using System.IO;
+using System.Net;
+using System.Security.Cryptography.X509Certificates;
+
+namespace Mono.Security.Protocol.Tls {
+
+       // Note: DO NOT REUSE this class - instead use SslClientStream
+
+       internal class HttpsClientStream : SslClientStream {
+
+               private string _host;
+               private WebRequest _request;
+
+
+               public HttpsClientStream (Stream stream, string targetHost, X509CertificateCollection clientCertificates, WebRequest request)
+                       : base (stream, targetHost, false, SecurityProtocolType.Default, clientCertificates)
+               {
+                       _host = targetHost;
+                       // this constructor permit access to the WebRequest to call
+                       // ICertificatePolicy.CheckValidationResult
+                       _request = request;
+#if !NET_1_0
+                       // also saved from reflection
+                       base.CheckCertRevocationStatus = ServicePointManager.CheckCertificateRevocationList;
+#endif
+               }
+
+               internal override bool RaiseServerCertificateValidation (X509Certificate certificate, int[] certificateErrors)
+               {
+                       bool failed = (certificateErrors.Length > 0);
+                       if (ServicePointManager.CertificatePolicy != null) {
+                               Uri target = new Uri ("https://" + _host);
+                               ServicePoint sp = ServicePointManager.FindServicePoint (target);
+
+                               // only one problem can be reported by this interface
+                               int problem = ((failed) ? certificateErrors [0] : 0);
+
+                               return ServicePointManager.CertificatePolicy.CheckValidationResult (sp, certificate, _request, problem);
+                       }
+                       return failed;
+               }
+       }
+}
index 1abe421257b8e82cd1a5286137294beefced0324..361f101a64bb0fa5bc4f928bf1d589ce853bf6a1 100644 (file)
@@ -797,7 +797,7 @@ namespace Mono.Security.Protocol.Tls
 
                #region Event Methods
 
-               internal bool RaiseServerCertificateValidation(
+               internal virtual bool RaiseServerCertificateValidation(
                        X509Certificate certificate, 
                        int[]                   certificateErrors)
                {
@@ -806,7 +806,7 @@ namespace Mono.Security.Protocol.Tls
                                return this.ServerCertValidation(certificate, certificateErrors);
                        }
 
-                       return certificateErrors != null && certificateErrors.Length == 0 ? true : false;
+                       return (certificateErrors != null && certificateErrors.Length == 0);
                }
 
                internal X509Certificate RaiseClientCertificateSelection(
@@ -843,4 +843,4 @@ namespace Mono.Security.Protocol.Tls
 
                #endregion
        }
-}
\ No newline at end of file
+}