Updates referencesource to .NET 4.7
[mono.git] / mcs / class / System / ReferenceSources / ServerCertValidationCallback.cs
1 using System.Net.Security;
2 using System.Security.Cryptography.X509Certificates;
3 using System.Threading;
4
5 namespace System.Net
6 {
7     internal class ServerCertValidationCallback
8     {
9         readonly RemoteCertificateValidationCallback m_ValidationCallback;
10         readonly ExecutionContext                    m_Context;
11
12         internal ServerCertValidationCallback(RemoteCertificateValidationCallback validationCallback)
13         {
14             m_ValidationCallback = validationCallback;
15             m_Context = ExecutionContext.Capture();
16         }
17
18         internal RemoteCertificateValidationCallback ValidationCallback {
19             get { return m_ValidationCallback;}
20         }
21
22         internal void Callback(object state)
23         {
24             CallbackContext context = (CallbackContext) state;
25             context.result = m_ValidationCallback(context.request,
26                                                   context.certificate,
27                                                   context.chain,
28                                                   context.sslPolicyErrors);
29         }
30
31         internal bool Invoke(object request,
32                              X509Certificate certificate,
33                              X509Chain chain,
34                              SslPolicyErrors sslPolicyErrors)
35         {
36             if (m_Context == null)
37             {
38                 return m_ValidationCallback(request, certificate, chain, sslPolicyErrors);
39             }
40             else
41             {
42                 ExecutionContext execContext = m_Context.CreateCopy();
43                 CallbackContext callbackContext = new CallbackContext(request,
44                                                                       certificate,
45                                                                       chain,
46                                                                       sslPolicyErrors);
47                 ExecutionContext.Run(execContext, Callback, callbackContext);
48                 return callbackContext.result;
49             }
50         }
51
52         private class CallbackContext
53         {
54             internal readonly Object request;
55             internal readonly X509Certificate certificate;
56             internal readonly X509Chain chain;
57             internal readonly SslPolicyErrors sslPolicyErrors;
58
59             internal bool result;
60
61             internal CallbackContext(Object request,
62                                      X509Certificate certificate,
63                                      X509Chain chain,
64                                      SslPolicyErrors sslPolicyErrors)
65             {
66                 this.request = request;
67                 this.certificate = certificate;
68                 this.chain = chain;
69                 this.sslPolicyErrors = sslPolicyErrors;
70             }
71         }
72     }
73 }