summaryrefslogtreecommitdiffstats
path: root/src/main/Plugins/ValidationPlugins/Http/FileSystem/FileSystemOptionsFactory.cs
blob: b16f70533ba156197ba9f0b63fedafe5379345fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
{
    /// <summary>
    /// Classic FileSystem validation
    /// </summary>
    internal class FileSystemOptionsFactory : HttpValidationOptionsFactory<FileSystem, FileSystemOptions>
    {
        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<IIISSite>(x) { Command = x.Id.ToString(), Description = x.Name }, true);
                    if (site != null)
                    {
                        ret.Path = site.Path;
                        ret.SiteId = site.Id;
                    }
                }
            }
            return ret;
        }
    }

}