1
0
mirror of https://github.com/chylex/Minecraft-Phantom-Panel.git synced 2026-01-12 08:58:15 +01:00
Files
Minecraft-Phantom-Panel/Controller/Phantom.Controller/CertificateFile.cs

61 lines
2.0 KiB
C#

using Phantom.Utils.IO;
using Phantom.Utils.Logging;
using Phantom.Utils.Monads;
using Phantom.Utils.Rpc.Runtime.Tls;
using Serilog;
namespace Phantom.Controller;
sealed class CertificateFile(string name) {
private static ILogger Logger { get; } = PhantomLogger.Create<CertificateFile>();
private readonly string fileName = name + ".pfx";
public async Task<RpcServerCertificate?> CreateOrLoad(string folderPath) {
string filePath = Path.Combine(folderPath, fileName);
if (File.Exists(filePath)) {
try {
return Read(filePath);
} catch (IOException e) {
Logger.Fatal(e, "Error reading certificate file: {FileName}", fileName);
return null;
} catch (Exception) {
Logger.Fatal("Certificate file contains invalid data: {FileName}", fileName);
return null;
}
}
try {
return await Generate(filePath);
} catch (Exception e) {
Logger.Fatal(e, "Error creating certificate file: {FileName}", fileName);
return null;
}
}
private RpcServerCertificate? Read(string filePath) {
switch (RpcServerCertificate.Load(filePath)) {
case Left<RpcServerCertificate, DisallowedAlgorithmError>(var rpcServerCertificate):
Logger.Information("Loaded certificate file: {FileName}", fileName);
return rpcServerCertificate;
case Right<RpcServerCertificate, DisallowedAlgorithmError>(var error):
Logger.Fatal("Certificate file {FileName} was expected to use {ExpectedAlgorithmName}, instead it uses {ActualAlgorithmName}.", fileName, error.ExpectedAlgorithmName, error.ActualAlgorithmName);
return null;
}
Logger.Fatal("Certificate file could not be loaded: {FileName}", fileName);
return null;
}
private async Task<RpcServerCertificate> Generate(string filePath) {
byte[] certificateBytes = RpcServerCertificate.CreateAndExport("phantom-controller");
await Files.WriteBytesAsync(filePath, certificateBytes, FileMode.Create, Chmod.URW_GR);
Logger.Information("Created certificate file: {FileName}", fileName);
return RpcServerCertificate.Load(filePath).RequireLeft;
}
}