// 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
internal class HttpsClientStream : SslClientStream {
private HttpWebRequest _request;
-
+ private int _status;
public HttpsClientStream (Stream stream, X509CertificateCollection clientCertificates,
- HttpWebRequest request)
- : base (stream, request.RequestUri.Host, false, SecurityProtocolType.Default, clientCertificates)
+ HttpWebRequest request, byte [] buffer)
+ : 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
// also saved from reflection
base.CheckCertRevocationStatus = ServicePointManager.CheckCertificateRevocationList;
#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;
-
- // only one problem can be reported by this interface
- int problem = ((failed) ? certificateErrors [0] : 0);
+ bool failed = (certificateErrors.Length > 0);
+ // only one problem can be reported by this interface
+ _status = ((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;
+ }
}
}