using Microsoft.Web.Administration; using PKISharp.WACS.Clients.IIS; using PKISharp.WACS.DomainObjects; using PKISharp.WACS.Extensions; using PKISharp.WACS.Services; namespace PKISharp.WACS.Plugins.ValidationPlugins.Http { /// /// Classic FileSystem validation /// internal class FileSystemOptionsFactory : HttpValidationOptionsFactory { private IIISClient _iisClient; public FileSystemOptionsFactory(IIISClient iisClient, ILogService log) : base(log) { _iisClient = iisClient; } public override bool PathIsValid(string path) => path.ValidPath(_log); public override bool AllowEmtpy(Target target) => target.IIS; public override FileSystemOptions Default(Target target, IOptionsService optionsService) { var ret = new FileSystemOptions(BaseDefault(target, optionsService)); if (target.IIS == true && _iisClient.HasWebSites) { var validationSiteId = optionsService.TryGetLong(nameof(optionsService.MainArguments.ValidationSiteId), optionsService.MainArguments.ValidationSiteId); if (validationSiteId != null) { var site = _iisClient.GetWebSite(validationSiteId.Value); // Throws exception when not found ret.Path = site.Path; ret.SiteId = validationSiteId; } } return ret; } public override FileSystemOptions Aquire(Target target, IOptionsService optionsService, IInputService inputService, RunLevel runLevel) { // Choose alternative site for validation var ret = new FileSystemOptions(BaseAquire(target, optionsService, inputService, runLevel)); if (target.IIS && _iisClient.HasWebSites && string.IsNullOrEmpty(ret.Path)) { if (inputService.PromptYesNo("Use different site for validation?")) { var site = inputService.ChooseFromList("Validation site, must receive requests for all hosts on port 80", _iisClient.WebSites, x => new Choice(x) { Command = x.Id.ToString(), Description = x.Name }, true); if (site != null) { ret.Path = site.Path; ret.SiteId = site.Id; } } } return ret; } } }