using Autofac;
using Microsoft.Win32;
using PKISharp.WACS.Configuration;
using PKISharp.WACS.DomainObjects;
using PKISharp.WACS.Extensions;
using PKISharp.WACS.Host.Services.Legacy;
using PKISharp.WACS.Plugins.Base.Options;
using PKISharp.WACS.Plugins.Interfaces;
using PKISharp.WACS.Plugins.Resolvers;
using PKISharp.WACS.Plugins.StorePlugins;
using PKISharp.WACS.Plugins.ValidationPlugins;
using PKISharp.WACS.Services.Legacy;
using System;
using System.Linq;
namespace PKISharp.WACS.Services
{
internal class AutofacBuilder : IAutofacBuilder
{
///
/// This is used to import renewals from 1.9.x
///
///
///
///
///
public ILifetimeScope Legacy(ILifetimeScope main, Uri fromUri, Uri toUri)
{
return main.BeginLifetimeScope(builder =>
{
var realSettings = main.Resolve();
var realArguments = main.Resolve();
builder.Register(c => new MainArguments {
BaseUri = fromUri.ToString()
}).
As().
SingleInstance();
builder.RegisterType().
As().
SingleInstance();
builder.RegisterType().
WithParameter(new TypedParameter(typeof(ISettingsService), realSettings)).
SingleInstance();
builder.RegisterType();
builder.RegisterType().
WithParameter(new TypedParameter(typeof(IArgumentsService), realArguments)).
WithParameter(new TypedParameter(typeof(ISettingsService), realSettings)).
SingleInstance();
builder.Register((scope) => main.Resolve()).
As().
SingleInstance();
// Check where to load Renewals from
var hive = Registry.CurrentUser;
var key = hive.OpenSubKey($"Software\\letsencrypt-win-simple");
if (key == null)
{
hive = Registry.LocalMachine;
key = hive.OpenSubKey($"Software\\letsencrypt-win-simple");
}
var log = main.Resolve();
if (key != null)
{
log.Debug("Loading legacy renewals from registry hive {name}", hive.Name);
builder.RegisterType().
As().
WithParameter(new NamedParameter("hive", hive.Name)).
SingleInstance();
}
else
{
log.Debug("Loading legacy renewals from file");
builder.RegisterType().
As().
SingleInstance();
}
builder.RegisterType().
SingleInstance();
});
}
///
/// For revocation and configuration
///
///
///
///
public ILifetimeScope Configuration(ILifetimeScope main, Renewal renewal, RunLevel runLevel)
{
var resolver = runLevel.HasFlag(RunLevel.Interactive)
? main.Resolve(new TypedParameter(typeof(RunLevel), runLevel))
: (IResolver)main.Resolve();
return main.BeginLifetimeScope(builder =>
{
builder.Register(c => runLevel).As();
builder.Register(c => resolver).As();
builder.Register(c => resolver.GetTargetPlugin(main).Result).As().SingleInstance();
builder.Register(c => resolver.GetCsrPlugin(main).Result).As().SingleInstance();
});
}
///
/// For configuration and renewal
///
///
///
///
///
public ILifetimeScope Target(ILifetimeScope main, Renewal renewal, RunLevel runLevel)
{
var resolver = runLevel.HasFlag(RunLevel.Interactive)
? main.Resolve(new TypedParameter(typeof(RunLevel), runLevel))
: (IResolver)main.Resolve();
return main.BeginLifetimeScope(builder =>
{
builder.RegisterInstance(renewal.TargetPluginOptions).As(renewal.TargetPluginOptions.GetType());
builder.RegisterInstance(renewal.TargetPluginOptions).As(renewal.TargetPluginOptions.GetType().BaseType);
builder.RegisterType(renewal.TargetPluginOptions.Instance).As().SingleInstance();
builder.Register(c => c.Resolve().Generate().Result).As().SingleInstance();
builder.Register(c => resolver.GetValidationPlugin(main, c.Resolve()).Result).As().SingleInstance();
builder.Register(c => resolver.GetOrderPlugin(main, c.Resolve()).Result).As().SingleInstance();
});
}
///
/// For renewal and creating scheduled task
///
///
///
///
///
public ILifetimeScope Execution(ILifetimeScope target, Renewal renewal, RunLevel runLevel)
{
return target.BeginLifetimeScope(builder =>
{
builder.Register(c => runLevel).As();
builder.RegisterType().SingleInstance();
// Used to configure TaskScheduler without renewal
if (renewal != null)
{
builder.RegisterInstance(renewal);
builder.RegisterInstance(renewal.StorePluginOptions).As(renewal.StorePluginOptions.GetType());
if (renewal.CsrPluginOptions != null)
{
builder.RegisterInstance(renewal.CsrPluginOptions).As(renewal.CsrPluginOptions.GetType());
}
if (renewal.OrderPluginOptions != null)
{
builder.RegisterInstance(renewal.OrderPluginOptions).As(renewal.OrderPluginOptions.GetType());
}
builder.RegisterInstance(renewal.ValidationPluginOptions).As(renewal.ValidationPluginOptions.GetType());
builder.RegisterInstance(renewal.TargetPluginOptions).As(renewal.TargetPluginOptions.GetType());
// Find factory based on options
builder.Register(x =>
{
var plugin = x.Resolve();
var match = plugin.GetFactories(target).FirstOrDefault(vp => vp.OptionsType.PluginId() == renewal.ValidationPluginOptions.Plugin);
return match;
}).As().SingleInstance();
if (renewal.CsrPluginOptions != null)
{
builder.RegisterType(renewal.CsrPluginOptions.Instance).As().SingleInstance();
}
if (renewal.OrderPluginOptions != null)
{
builder.RegisterType(renewal.OrderPluginOptions.Instance).As().SingleInstance();
}
else
{
builder.RegisterType().As().SingleInstance();
}
builder.RegisterType(renewal.ValidationPluginOptions.Instance).As().SingleInstance();
builder.RegisterType(renewal.TargetPluginOptions.Instance).As().SingleInstance();
foreach (var i in renewal.InstallationPluginOptions)
{
builder.RegisterInstance(i).As(i.GetType());
}
foreach (var i in renewal.StorePluginOptions)
{
builder.RegisterInstance(i).As(i.GetType());
}
}
});
}
///
/// Validation
///
///
///
///
///
///
public ILifetimeScope Validation(ILifetimeScope execution, ValidationPluginOptions options)
{
return execution.BeginLifetimeScope(builder =>
{
builder.RegisterType();
builder.RegisterType(options.Instance).
As().
SingleInstance();
});
}
}
}