Ejemplo n.º 1
0
        public IActionResult Maintenance()
        {
            MaintenanceViewModel vm = new MaintenanceViewModel();

            vm.UserName  = "******";
            vm.DNSDomain = this.Request.Host.Host;
            vm.SetConfiguredSSH(_Options.SSHSettings);
            if (IPAddress.TryParse(vm.DNSDomain, out var unused))
            {
                vm.DNSDomain = null;
            }
            return(View(vm));
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> Maintenance(MaintenanceViewModel vm, string command)
        {
            if (!ModelState.IsValid)
            {
                return(View(vm));
            }
            vm.SetConfiguredSSH(_Options.SSHSettings);
            if (command == "changedomain")
            {
                if (string.IsNullOrWhiteSpace(vm.DNSDomain))
                {
                    ModelState.AddModelError(nameof(vm.DNSDomain), $"Required field");
                    return(View(vm));
                }
                vm.DNSDomain = vm.DNSDomain.Trim().ToLowerInvariant();
                if (vm.DNSDomain.Equals(this.Request.Host.Host, StringComparison.OrdinalIgnoreCase))
                {
                    return(View(vm));
                }
                if (IPAddress.TryParse(vm.DNSDomain, out var unused))
                {
                    ModelState.AddModelError(nameof(vm.DNSDomain), $"This should be a domain name");
                    return(View(vm));
                }
                if (vm.DNSDomain.Equals(this.Request.Host.Host, StringComparison.InvariantCultureIgnoreCase))
                {
                    ModelState.AddModelError(nameof(vm.DNSDomain), $"The server is already set to use this domain");
                    return(View(vm));
                }
                var builder = new UriBuilder();
                using (var client = new HttpClient(new HttpClientHandler()
                {
                    ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
                }))
                {
                    try
                    {
                        builder.Scheme = this.Request.Scheme;
                        builder.Host   = vm.DNSDomain;
                        var addresses1 = GetAddressAsync(this.Request.Host.Host);
                        var addresses2 = GetAddressAsync(vm.DNSDomain);
                        await Task.WhenAll(addresses1, addresses2);

                        var addressesSet     = addresses1.GetAwaiter().GetResult().Select(c => c.ToString()).ToHashSet();
                        var hasCommonAddress = addresses2.GetAwaiter().GetResult().Select(c => c.ToString()).Any(s => addressesSet.Contains(s));
                        if (!hasCommonAddress)
                        {
                            ModelState.AddModelError(nameof(vm.DNSDomain), $"Invalid host ({vm.DNSDomain} is not pointing to this BTCPay instance)");
                            return(View(vm));
                        }
                    }
                    catch (Exception ex)
                    {
                        var messages = new List <object>();
                        messages.Add(ex.Message);
                        if (ex.InnerException != null)
                        {
                            messages.Add(ex.InnerException.Message);
                        }
                        ModelState.AddModelError(nameof(vm.DNSDomain), $"Invalid domain ({string.Join(", ", messages.ToArray())})");
                        return(View(vm));
                    }
                }

                var error = RunSSH(vm, $"changedomain.sh {vm.DNSDomain}");
                if (error != null)
                {
                    return(error);
                }

                builder.Path  = null;
                builder.Query = null;
                StatusMessage = $"Domain name changing... the server will restart, please use \"{builder.Uri.AbsoluteUri}\"";
            }
            else if (command == "update")
            {
                var error = RunSSH(vm, $"btcpay-update.sh");
                if (error != null)
                {
                    return(error);
                }
                StatusMessage = $"The server might restart soon if an update is available...";
            }
            else
            {
                return(NotFound());
            }
            return(RedirectToAction(nameof(Maintenance)));
        }
        public async Task <IActionResult> Maintenance(MaintenanceViewModel vm, string command)
        {
            if (!ModelState.IsValid)
            {
                return(View(vm));
            }
            vm.SetConfiguredSSH(_Options.SSHSettings);
            if (command == "changedomain")
            {
                if (string.IsNullOrWhiteSpace(vm.DNSDomain))
                {
                    ModelState.AddModelError(nameof(vm.DNSDomain), $"Campo requerido");
                    return(View(vm));
                }
                vm.DNSDomain = vm.DNSDomain.Trim().ToLowerInvariant();
                if (vm.DNSDomain.Equals(this.Request.Host.Host, StringComparison.OrdinalIgnoreCase))
                {
                    return(View(vm));
                }
                if (IPAddress.TryParse(vm.DNSDomain, out var unused))
                {
                    ModelState.AddModelError(nameof(vm.DNSDomain), $"Este debe ser un nombre de dominio");
                    return(View(vm));
                }
                if (vm.DNSDomain.Equals(this.Request.Host.Host, StringComparison.InvariantCultureIgnoreCase))
                {
                    ModelState.AddModelError(nameof(vm.DNSDomain), $"El servidor ya está configurado para usar este dominio.");
                    return(View(vm));
                }
                var builder = new UriBuilder();
                using (var client = new HttpClient(new HttpClientHandler()
                {
                    ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
                }))
                {
                    try
                    {
                        builder.Scheme = this.Request.Scheme;
                        builder.Host   = vm.DNSDomain;
                        var addresses1 = GetAddressAsync(this.Request.Host.Host);
                        var addresses2 = GetAddressAsync(vm.DNSDomain);
                        await Task.WhenAll(addresses1, addresses2);

                        var addressesSet     = addresses1.GetAwaiter().GetResult().Select(c => c.ToString()).ToHashSet();
                        var hasCommonAddress = addresses2.GetAwaiter().GetResult().Select(c => c.ToString()).Any(s => addressesSet.Contains(s));
                        if (!hasCommonAddress)
                        {
                            ModelState.AddModelError(nameof(vm.DNSDomain), $"Host inválido ({vm.DNSDomain} no apunta a esta instancia de BTCPay)");
                            return(View(vm));
                        }
                    }
                    catch (Exception ex)
                    {
                        var messages = new List <object>();
                        messages.Add(ex.Message);
                        if (ex.InnerException != null)
                        {
                            messages.Add(ex.InnerException.Message);
                        }
                        ModelState.AddModelError(nameof(vm.DNSDomain), $"Dominio inválido ({string.Join(", ", messages.ToArray())})");
                        return(View(vm));
                    }
                }

                var error = RunSSH(vm, $"changedomain.sh {vm.DNSDomain}");
                if (error != null)
                {
                    return(error);
                }

                builder.Path  = null;
                builder.Query = null;
                StatusMessage = $"Cambio de nombre de dominio ... el servidor se reiniciará, por favor use \"{builder.Uri.AbsoluteUri}\"";
            }
            else if (command == "update")
            {
                var error = RunSSH(vm, $"btcpay-update.sh");
                if (error != null)
                {
                    return(error);
                }
                StatusMessage = $"El servidor podría reiniciarse pronto si hay una actualización disponible...";
            }
            else if (command == "clean")
            {
                var error = RunSSH(vm, $"btcpay-clean.sh");
                if (error != null)
                {
                    return(error);
                }
                StatusMessage = $"Las viejas imágenes de la ventana acoplable se limpiarán pronto...";
            }
            else
            {
                return(NotFound());
            }
            return(RedirectToAction(nameof(Maintenance)));
        }