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(); }); } } }