update tuner
[mono.git] / mcs / tools / tuner / Mono.Tuner / PreserveHttps.cs
1 using System;
2 using System.IO;
3 using System.Xml.XPath;
4
5 using Mono.Linker;
6 using Mono.Linker.Steps;
7
8 using Mono.Cecil;
9
10 namespace Mono.Tuner {
11
12         public class PreserveHttps : BaseStep {
13
14                 static string [] types = new [] {
15                         "System.Net.WebRequest",
16                         "System.Net.WebClient",
17                         "System.Net.Security.RemoteCertificateValidationCallback",
18                         "System.Web.Services.Protocols.WebClientProtocol",
19                         "System.Security.Cryptography.X509Certificates.X509Certificate",
20                         "System.Web.Services.WebServiceBindingAttribute",
21                         "System.Web.Services.Protocols.SoapHttpClientProtocol",
22                 };
23
24                 bool need_https;
25
26                 protected override void ProcessAssembly (AssemblyDefinition assembly)
27                 {
28                         if (need_https)
29                                 return;
30
31                         if (Profile.IsSdkAssembly (assembly))
32                                 return;
33
34                         if (HasNeededReference (assembly.MainModule))
35                                 need_https = true;
36                 }
37
38                 static bool HasNeededReference (ModuleDefinition module)
39                 {
40                         foreach (var type in types)
41                                 if (module.HasTypeReference (type))
42                                         return true;
43
44                         return false;
45                 }
46
47                 protected override void EndProcess ()
48                 {
49                         if (!need_https)
50                                 return;
51
52                         var mono_security = Context.Resolve ("Mono.Security");
53                         if (mono_security == null)
54                                 return;
55
56                         if (Annotations.GetAction (mono_security) != AssemblyAction.Link)
57                                 return;
58
59                         var xml_preserve = CreatePreserveStep ();
60                         Context.Pipeline.AddStepAfter (typeof (PreserveHttps), xml_preserve);
61 //                      Context.Pipeline.AddStepAfter (xml_preserve, new PreserveCrypto ());
62                 }
63
64                 static IStep CreatePreserveStep ()
65                 {
66                         return new ResolveFromXmlStep (
67                                 new XPathDocument (
68                                         new StringReader (descriptor)));
69                 }
70
71                 const string descriptor = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
72 <linker>
73         <assembly fullname=""mscorlib"">
74                 <namespace fullname=""System.Security.Cryptography"" />
75         </assembly>
76         <assembly fullname=""System"">
77                 <namespace fullname=""System.Security.Cryptography"" />
78         </assembly>
79         <assembly fullname=""Mono.Security"">
80                 <type fullname=""Mono.Security.Protocol.Tls.HttpsClientStream"" />
81                 <type fullname=""Mono.Security.Protocol.Tls.SslClientStream"">
82                         <method name=""get_SelectedClientCertificate"" />
83                 </type>
84                 <type fullname=""Mono.Security.Protocol.Tls.SslStreamBase"">
85                         <method name=""get_ServerCertificate"" />
86                 </type>
87         </assembly>
88 </linker>
89 ";
90         }
91 }