summaryrefslogtreecommitdiffstats
path: root/src/main.lib/Plugins/ValidationPlugins/Http/FileSystem/FileSystemOptionsFactory.cs
blob: b32127cfb6e7795003dae0b4d4b5ef8dbd358e00 (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
62
63
64
65
66
67
68
69
70
using PKISharp.WACS.Clients.IIS;
using PKISharp.WACS.DomainObjects;
using PKISharp.WACS.Extensions;
using PKISharp.WACS.Services;
using System.Threading.Tasks;

namespace PKISharp.WACS.Plugins.ValidationPlugins.Http
{
    /// <summary>
    /// Classic FileSystem validation
    /// </summary>
    internal class FileSystemOptionsFactory : HttpValidationOptionsFactory<FileSystem, FileSystemOptions>
    {
        private readonly IIISClient _iisClient;
        private readonly ILogService _log;

        public FileSystemOptionsFactory(
            IIISClient iisClient, ILogService log,
            IArgumentsService arguments) : base(arguments)
        {
            _log = log;
            _iisClient = iisClient;
        }

        public override bool PathIsValid(string path) => path.ValidPath(_log);
        public override bool AllowEmtpy(Target target) => target.IIS;

        public override async Task<FileSystemOptions?> Default(Target target)
        {
            var args = _arguments.GetArguments<FileSystemArguments>();
            var ret = new FileSystemOptions(BaseDefault(target));
            if (string.IsNullOrEmpty(ret.Path))
            {
                if (target.IIS && _iisClient.HasWebSites)
                {
                    if (args?.ValidationSiteId != null)
                    {
                        // Throws exception when not found
                        _iisClient.GetWebSite(args.ValidationSiteId.Value);
                        ret.SiteId = args.ValidationSiteId.Value;
                    }
                }
            }
            return ret;
        }

        public override async Task<FileSystemOptions?> Aquire(Target target, IInputService inputService, RunLevel runLevel)
        {
            // Choose alternative site for validation
            var ret = new FileSystemOptions(await BaseAquire(target, inputService));
            if (target.IIS && _iisClient.HasWebSites && string.IsNullOrEmpty(ret.Path))
            {
                if (await inputService.PromptYesNo("Use different site for validation?", false))
                {
                    var site = await inputService.ChooseOptional("Validation site, must receive requests for all hosts on port 80",
                        _iisClient.WebSites,
                        x => Choice.Create<IIISSite?>(x, x.Name, x.Id.ToString()),
                        "Automatic (target site)");
                    if (site != null)
                    {
                        ret.Path = site.Path;
                        ret.SiteId = site.Id;
                    }
                }
            }
            return ret;
        }
    }

}