Xamarin Public Jenkins (auto-signing) 6bdd276d05 Imported Upstream version 5.0.0.42
Former-commit-id: fd56571888259555122d8a0f58c68838229cea2b
2017-04-10 11:41:01 +00:00

84 lines
2.0 KiB
C#

using System;
using System.IO;
using System.Xml.XPath;
using Mono.Linker;
using Mono.Linker.Steps;
using Mono.Cecil;
namespace Mono.Tuner {
public class PreserveHttps : BaseStep {
static string [] types = new [] {
"System.Net.WebRequest",
"System.Net.WebClient",
"System.Net.Security.RemoteCertificateValidationCallback",
"System.Web.Services.Protocols.WebClientProtocol",
"System.Security.Cryptography.X509Certificates.X509Certificate",
"System.ServiceModel.ClientBase`1",
"System.Web.Services.WebServiceBindingAttribute",
"System.Web.Services.Protocols.SoapHttpClientProtocol",
"System.Xml.XmlDocument"
};
bool need_https;
protected override void ProcessAssembly (AssemblyDefinition assembly)
{
if (need_https)
return;
if (Profile.IsSdkAssembly (assembly) || Profile.IsProductAssembly (assembly))
return;
if (HasNeededReference (assembly.MainModule))
need_https = true;
}
static bool HasNeededReference (ModuleDefinition module)
{
foreach (var type in types)
if (module.HasTypeReference (type))
return true;
return false;
}
protected override void EndProcess ()
{
if (!need_https)
return;
var mono_security = Context.Resolve ("Mono.Security");
if (mono_security == null)
return;
if (Annotations.GetAction (mono_security) != AssemblyAction.Link)
return;
var xml_preserve = CreatePreserveStep ();
Context.Pipeline.AddStepAfter (typeof (PreserveHttps), xml_preserve);
// Context.Pipeline.AddStepAfter (xml_preserve, new PreserveCrypto ());
}
static IStep CreatePreserveStep ()
{
return new ResolveFromXmlStep (
new XPathDocument (
new StringReader (descriptor)));
}
const string descriptor = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<linker>
<assembly fullname=""Mono.Security"">
<type fullname=""Mono.Security.Protocol.Tls.HttpsClientStream"" />
<type fullname=""Mono.Security.Protocol.Tls.SslClientStream"" />
<type fullname=""Mono.Security.Protocol.Tls.SslStreamBase"" />
</assembly>
</linker>
";
}
}