Merge pull request #175 from Moonlight-Panel/AddMoonlightSideDnsCheckSsl

Added moonlight side dns check for ssl
This commit is contained in:
Marcel Baumgartner
2023-06-17 13:39:25 +02:00
committed by GitHub
4 changed files with 81 additions and 13 deletions

View File

@@ -5,6 +5,8 @@ namespace Moonlight.App.Exceptions;
[Serializable] [Serializable]
public class DisplayException : Exception public class DisplayException : Exception
{ {
public bool DoNotTranslate { get; set; } = false;
// //
// For guidelines regarding the creation of new exception types, see // For guidelines regarding the creation of new exception types, see
// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconerrorraisinghandlingguidelines.asp
@@ -19,6 +21,11 @@ public class DisplayException : Exception
public DisplayException(string message) : base(message) public DisplayException(string message) : base(message)
{ {
} }
public DisplayException(string message, bool doNotTranslate) : base(message)
{
DoNotTranslate = doNotTranslate;
}
public DisplayException(string message, Exception inner) : base(message, inner) public DisplayException(string message, Exception inner) : base(message, inner)
{ {

View File

@@ -1,4 +1,7 @@
using Microsoft.EntityFrameworkCore; using System.Net;
using DnsClient;
using Logging.Net;
using Microsoft.EntityFrameworkCore;
using Moonlight.App.ApiClients.CloudPanel; using Moonlight.App.ApiClients.CloudPanel;
using Moonlight.App.ApiClients.CloudPanel.Requests; using Moonlight.App.ApiClients.CloudPanel.Requests;
using Moonlight.App.Database.Entities; using Moonlight.App.Database.Entities;
@@ -18,7 +21,8 @@ public class WebSpaceService
private readonly CloudPanelApiHelper CloudPanelApiHelper; private readonly CloudPanelApiHelper CloudPanelApiHelper;
public WebSpaceService(Repository<CloudPanel> cloudPanelRepository, Repository<WebSpace> webSpaceRepository, CloudPanelApiHelper cloudPanelApiHelper, Repository<MySqlDatabase> databaseRepository) public WebSpaceService(Repository<CloudPanel> cloudPanelRepository, Repository<WebSpace> webSpaceRepository,
CloudPanelApiHelper cloudPanelApiHelper, Repository<MySqlDatabase> databaseRepository)
{ {
CloudPanelRepository = cloudPanelRepository; CloudPanelRepository = cloudPanelRepository;
WebSpaceRepository = webSpaceRepository; WebSpaceRepository = webSpaceRepository;
@@ -37,7 +41,7 @@ public class WebSpaceService
var ftpPassword = StringHelper.GenerateString(16); var ftpPassword = StringHelper.GenerateString(16);
var phpVersion = "8.1"; // TODO: Add config option or smth var phpVersion = "8.1"; // TODO: Add config option or smth
var w = new WebSpace() var w = new WebSpace()
{ {
CloudPanel = cloudPanel, CloudPanel = cloudPanel,
@@ -83,9 +87,9 @@ public class WebSpaceService
{ {
await DeleteDatabase(webSpace, database); await DeleteDatabase(webSpace, database);
} }
await CloudPanelApiHelper.Delete(webSpace.CloudPanel, $"site/{webSpace.Domain}", null); await CloudPanelApiHelper.Delete(webSpace.CloudPanel, $"site/{webSpace.Domain}", null);
WebSpaceRepository.Delete(webSpace); WebSpaceRepository.Delete(webSpace);
} }
@@ -109,7 +113,7 @@ public class WebSpaceService
return false; return false;
} }
public async Task<bool> IsHostUp(WebSpace w) public async Task<bool> IsHostUp(WebSpace w)
{ {
var webSpace = EnsureData(w); var webSpace = EnsureData(w);
@@ -121,6 +125,52 @@ public class WebSpaceService
{ {
var webspace = EnsureData(w); var webspace = EnsureData(w);
var dns = new LookupClient(new LookupClientOptions()
{
CacheFailedResults = false,
UseCache = false
});
var ipOfWebspaceQuery = await dns.QueryAsync(
webspace.Domain,
QueryType.A
);
var ipOfWebspaceWwwQuery = await dns.QueryAsync(
"www." + webspace.Domain,
QueryType.CNAME
);
var ipOfWebspace = ipOfWebspaceQuery.Answers.ARecords().FirstOrDefault();
var ipOfWebspaceWww = ipOfWebspaceWwwQuery.Answers.CnameRecords().FirstOrDefault();
if (ipOfWebspace == null)
throw new DisplayException($"Unable to find any a records for {webspace.Domain}", true);
if (ipOfWebspaceWww == null)
throw new DisplayException($"Unable to find any cname records for www.{webspace.Domain}", true);
var ipOfHostQuery = await dns.QueryAsync(
webspace.CloudPanel.Host,
QueryType.A
);
var ipOfHost = ipOfHostQuery.Answers.ARecords().FirstOrDefault();
if (ipOfHost == null)
throw new DisplayException("Unable to find a record of host system");
if (ipOfHost.Address.ToString() != ipOfWebspace.Address.ToString())
throw new DisplayException("The dns records of your webspace do not point to the host system");
Logger.Debug($"{ipOfWebspaceWww.CanonicalName.Value}");
if (ipOfWebspaceWww.CanonicalName.Value != webspace.CloudPanel.Host + ".")
throw new DisplayException(
$"The dns record www.{webspace.Domain} does not point to {webspace.CloudPanel.Host}", true);
await CloudPanelApiHelper.Post(webspace.CloudPanel, "letsencrypt/install/certificate", new InstallLetsEncrypt() await CloudPanelApiHelper.Post(webspace.CloudPanel, "letsencrypt/install/certificate", new InstallLetsEncrypt()
{ {
DomainName = webspace.Domain DomainName = webspace.Domain
@@ -158,7 +208,7 @@ public class WebSpaceService
DatabaseUserName = database.UserName, DatabaseUserName = database.UserName,
DatabaseUserPassword = database.Password DatabaseUserPassword = database.Password
}); });
webspace.Databases.Add(database); webspace.Databases.Add(database);
WebSpaceRepository.Update(webspace); WebSpaceRepository.Update(webspace);
} }
@@ -166,7 +216,7 @@ public class WebSpaceService
public async Task DeleteDatabase(WebSpace w, MySqlDatabase database) public async Task DeleteDatabase(WebSpace w, MySqlDatabase database)
{ {
var webspace = EnsureData(w); var webspace = EnsureData(w);
await CloudPanelApiHelper.Delete(webspace.CloudPanel, $"db/{database.UserName}", null); await CloudPanelApiHelper.Delete(webspace.CloudPanel, $"db/{database.UserName}", null);
webspace.Databases.Remove(database); webspace.Databases.Remove(database);
@@ -180,7 +230,8 @@ public class WebSpaceService
var webspace = EnsureData(w); var webspace = EnsureData(w);
return Task.FromResult<FileAccess>( return Task.FromResult<FileAccess>(
new SftpFileAccess(webspace.CloudPanel.Host, webspace.UserName, webspace.Password, 22, true, $"/htdocs/{webspace.Domain}") new SftpFileAccess(webspace.CloudPanel.Host, webspace.UserName, webspace.Password, 22, true,
$"/htdocs/{webspace.Domain}")
); );
} }
@@ -192,7 +243,7 @@ public class WebSpaceService
.Include(x => x.CloudPanel) .Include(x => x.CloudPanel)
.Include(x => x.Owner) .Include(x => x.Owner)
.First(x => x.Id == webSpace.Id); .First(x => x.Id == webSpace.Id);
return webSpace; return webSpace;
} }
} }

View File

@@ -21,6 +21,7 @@
<PackageReference Include="CurrieTechnologies.Razor.SweetAlert2" Version="5.4.0" /> <PackageReference Include="CurrieTechnologies.Razor.SweetAlert2" Version="5.4.0" />
<PackageReference Include="Discord.Net" Version="3.10.0" /> <PackageReference Include="Discord.Net" Version="3.10.0" />
<PackageReference Include="Discord.Net.Webhook" Version="3.10.0" /> <PackageReference Include="Discord.Net.Webhook" Version="3.10.0" />
<PackageReference Include="DnsClient" Version="1.7.0" />
<PackageReference Include="FluentFTP" Version="46.0.2" /> <PackageReference Include="FluentFTP" Version="46.0.2" />
<PackageReference Include="GravatarSharp.Core" Version="1.0.1.2" /> <PackageReference Include="GravatarSharp.Core" Version="1.0.1.2" />
<PackageReference Include="JWT" Version="10.0.2" /> <PackageReference Include="JWT" Version="10.0.2" />

View File

@@ -47,9 +47,18 @@ else
if (exception is DisplayException displayException) if (exception is DisplayException displayException)
{ {
await AlertService.Error( if (displayException.DoNotTranslate)
SmartTranslateService.Translate(displayException.Message) {
); await AlertService.Error(
displayException.Message
);
}
else
{
await AlertService.Error(
SmartTranslateService.Translate(displayException.Message)
);
}
} }
else if (exception is CloudflareException cloudflareException) else if (exception is CloudflareException cloudflareException)
{ {