using InABox.Clients; using InABox.Core; using InABox.Rpc; using PRSServices; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PRSServer; internal class WebSocketDatabaseProxyEngine : DatabaseProxyEngine { private RpcSocketProxyServer ProxyServer; private CertificateManager CertificateManager; protected override void RunProxy() { Logger.Send(LogType.Information, "", "Starting Listener on port " + Properties.ListenPort); CertificateManager = new CertificateManager(CertificateFileName()); CertificateManager.UpdateCertificate += CertificateManager_UpdateCertificate; CertificateManager.CertificateExpiring += CertificateManager_CertificateExpiring; CertificateManager.CertificateExpired += CertificateManager_CertificateExpired; try { var certificate = CertificateManager.GetCertificate(); ProxyServer = new RpcSocketProxyServer(Properties.ListenPort, ServerTransport, certificate); ProxyServer.Start(); } catch (Exception eListen) { Logger.Send(LogType.Error, ClientFactory.UserID, eListen.Message); } } private void CertificateManager_CertificateExpired() { Logger.Send(LogType.Information, "", "Expiry of certificate reached; restarting HTTPS listener..."); ProxyServer.Stop(); ProxyServer = new RpcSocketProxyServer(Properties.ListenPort, ServerTransport, CertificateManager.GetCertificate()); ProxyServer.Start(); } private void CertificateManager_CertificateExpiring(DateTime expiry) { var message = expiry.Date == DateTime.Now.Date ? $"HTTPS Certificate for Database Engine will expire today at {expiry.TimeOfDay:hh\\:mm}" : $"HTTPS Certificate for Database Engine will expire in {(expiry - DateTime.Now).Days} at {expiry:dd/MM/yyyy hh:mm}"; Logger.Send(LogType.Information, "DATABASE", message); } private void CertificateManager_UpdateCertificate(System.Security.Cryptography.X509Certificates.X509Certificate2 certificate) { Logger.Send(LogType.Information, "DATABASE", "HTTPS Certificate with greater expiry date found; restarting HTTPS listener..."); ProxyServer.Stop(); ProxyServer = new RpcSocketProxyServer(Properties.ListenPort, ServerTransport, certificate); ProxyServer.Start(); } private string CertificateFileName() => !string.IsNullOrWhiteSpace(Properties.CertificateFile) ? Properties.CertificateFile : CertificateEngine.CertificateFile; public override void Stop() { ProxyServer.Stop(); } }