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