2006-12-08 Sebastien Pouliot <sebastien@ximian.com>
[mono.git] / mcs / class / Mono.Security / Mono.Security.Protocol.Tls / HttpsClientStream.cs
index 89562c9b416b079e9d2ad8a852bbb68aa7dd493f..06b823e43a1746b953bca872fdd3517607306788 100644 (file)
@@ -5,9 +5,7 @@
 // Author:
 //      Sebastien Pouliot  <sebastien@ximian.com>
 //
-// (C) 2004 Novell (http://www.novell.com)
-//
-
+// Copyright (C) 2004-2006 Novell, Inc. (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -41,15 +39,17 @@ namespace Mono.Security.Protocol.Tls {
         internal class HttpsClientStream : SslClientStream {
 
                 private HttpWebRequest _request;
-
+               private int _status;
 
                 public HttpsClientStream (Stream stream, X509CertificateCollection clientCertificates,
                                        HttpWebRequest request, byte [] buffer)
-                        : base (stream, request.RequestUri.Host, false, SecurityProtocolType.Default, clientCertificates)
+                        : base (stream, request.RequestUri.Host, false, (Mono.Security.Protocol.Tls.SecurityProtocolType)
+                               ServicePointManager.SecurityProtocol, clientCertificates)
                 {
                         // this constructor permit access to the WebRequest to call
                         // ICertificatePolicy.CheckValidationResult
                         _request = request;
+                       _status = 0;
                        if (buffer != null)
                                InputBuffer.Write (buffer, 0, buffer.Length);
 #if !NET_1_0
@@ -58,19 +58,29 @@ namespace Mono.Security.Protocol.Tls {
 #endif
                 }
 
+               public bool TrustFailure {
+                       get { 
+                               switch (_status) {
+                               case -2146762486: // CERT_E_CHAINING            0x800B010A
+                               case -2146762487: // CERT_E_UNTRUSTEDROOT       0x800B0109
+                                       return true;
+                               default:
+                                       return false;
+                               }
+                       }
+               }
+
                 internal override bool RaiseServerCertificateValidation (X509Certificate certificate, int[] certificateErrors)
                 {
-                        bool failed = (certificateErrors.Length > 0);
-                        if (ServicePointManager.CertificatePolicy != null) {
-                                ServicePoint sp = _request.ServicePoint;
+                       bool failed = (certificateErrors.Length > 0);
+                       // only one problem can be reported by this interface
+                       _status = ((failed) ? certificateErrors [0] : 0);
 
-                                // 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;
-                }
+                       if (ServicePointManager.CertificatePolicy != null) {
+                               ServicePoint sp = _request.ServicePoint;
+                               return ServicePointManager.CertificatePolicy.CheckValidationResult (sp, certificate, _request, _status);
+                       }
+                       return failed;
+               }
         }
 }
-