Added moonlight side dns check for ssl
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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" />
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user