using System.Diagnostics; using System.Security.Cryptography.X509Certificates; using System.Text; namespace IOL.GreatOffice.Api.Models.Misc; public class AppConfiguration { public AppConfiguration() { } public AppConfiguration(IConfiguration c) { DB_HOST = c.GetValue(nameof(DB_HOST)); DB_PORT = c.GetValue(nameof(DB_PORT)); DB_NAME = c.GetValue(nameof(DB_NAME)); DB_USER = c.GetValue(nameof(DB_USER)); DB_PASSWORD = c.GetValue(nameof(DB_PASSWORD)); QUARTZ_DB_HOST = c.GetValue(nameof(QUARTZ_DB_HOST)); QUARTZ_DB_NAME = c.GetValue(nameof(QUARTZ_DB_NAME)); QUARTZ_DB_PASSWORD = c.GetValue(nameof(QUARTZ_DB_PASSWORD)); QUARTZ_DB_USER = c.GetValue(nameof(QUARTZ_DB_USER)); QUARTZ_DB_PORT = c.GetValue(nameof(QUARTZ_DB_PORT)); APP_CERT = c.GetValue(nameof(APP_CERT)); APP_AES_KEY = c.GetValue(nameof(APP_AES_KEY)); SEQ_API_KEY = c.GetValue(nameof(SEQ_API_KEY)); SEQ_API_URL = c.GetValue(nameof(SEQ_API_URL)); POSTMARK_TOKEN = c.GetValue(nameof(POSTMARK_TOKEN)); EMAIL_FROM_ADDRESS = c.GetValue(nameof(EMAIL_FROM_ADDRESS)); CANONICAL_FRONTEND_URL = c.GetValue(nameof(CANONICAL_FRONTEND_URL)); CANONICAL_BACKEND_URL = c.GetValue(nameof(CANONICAL_BACKEND_URL)); ASPNETCORE_ENVIRONMENT = c.GetValue(nameof(ASPNETCORE_ENVIRONMENT)); _configuration = c; } private static IConfiguration _configuration { get; set; } /// /// An reachable ip address or url that points to a postgres database. /// public string DB_HOST { get; set; } /// /// The port number to use with DB_HOST to point to the postgres database. /// public string DB_PORT { get; set; } /// /// The database user to authenticate against postgres with. /// public string DB_USER { get; set; } /// /// The password for the database user to authenticate against postgres with. /// public string DB_PASSWORD { get; set; } /// /// The name of the main app database. /// public string DB_NAME { get; set; } /// /// An reachable ip address or url that points to a postgres(quartz) database. /// public string QUARTZ_DB_HOST { get; set; } /// /// The port number to use with QUARTZ_DB_HOST to point to the postgres(quartz) database. /// public string QUARTZ_DB_PORT { get; set; } /// /// The database user to authenticate against postgres(quartz) with. /// public string QUARTZ_DB_USER { get; set; } /// /// The password for the database user to authenticate against postgres(quartz) with. /// public string QUARTZ_DB_PASSWORD { get; set; } /// /// The name of the quartz database. /// public string QUARTZ_DB_NAME { get; set; } /// /// API key to use when pushing logs to SEQ /// public string SEQ_API_KEY { get; set; } /// /// Url pointing to the seq instance that processes server logs /// public string SEQ_API_URL { get; set; } /// /// A token used when sending email via Postmakr /// public string POSTMARK_TOKEN { get; set; } /// /// The address to send emails from, needs to be setup as a sender in postmark /// public string EMAIL_FROM_ADDRESS { get; set; } /// /// The absolute url to the frontend app /// public string CANONICAL_FRONTEND_URL { get; set; } /// /// The absolute url to the backend api /// public string CANONICAL_BACKEND_URL { get; set; } /// /// A random string used to encrypt/decrypt for general purposes /// public string APP_AES_KEY { get; set; } /// /// A base64 string containing a passwordless pfx cert /// public string APP_CERT { get; set; } /// /// A string signaling to the framework what environment it is running in, usually Development, Testing or Production. /// public string ASPNETCORE_ENVIRONMENT { get; set; } public X509Certificate2 CERT1() => new(Convert.FromBase64String(APP_CERT)); public object GetPublicObject() { return new { DB_HOST, DB_PORT, DB_USER, DB_PASSWORD = DB_PASSWORD.Obfuscate(), QUARTZ_DB_HOST, QUARTZ_DB_PORT, QUARTZ_DB_USER, QUARTZ_DB_PASSWORD = QUARTZ_DB_PASSWORD.Obfuscate(), SEQ_API_KEY = SEQ_API_KEY.Obfuscate(), SEQ_API_URL, POSTMARK_TOKEN = POSTMARK_TOKEN.Obfuscate(), EMAIL_FROM_ADDRESS, APP_AES_KEY = APP_AES_KEY.Obfuscate(), CERT1 = CERT1().Thumbprint, CANONICAL_FRONTEND_URL, ASPNETCORE_ENVIRONMENT }; } public string GetEnvironmentVariable(string variableName, string fallback = "") { if (_configuration == default) { Debug.WriteLine("AppConfiguration was instantiated without a full IConfiguration"); return ""; } if (fallback.HasValue()) return _configuration.GetValue(variableName, fallback); return _configuration.GetValue(variableName); } public string GetAppDatabaseConnectionString() { var builder = new StringBuilder(); builder.Append($"Server={DB_HOST};Port={DB_PORT};Database={DB_NAME};User Id={DB_USER};Password={DB_PASSWORD}"); if (ASPNETCORE_ENVIRONMENT == "Development") { builder.Append(";Include Error Detail=true"); } Log.Debug("Using app database connection string: " + builder.ToString()); return builder.ToString(); } public string GetQuartzDatabaseConnectionString() { var builder = new StringBuilder(); builder.Append($"Server={QUARTZ_DB_HOST};Port={QUARTZ_DB_PORT};Database={QUARTZ_DB_NAME};User Id={QUARTZ_DB_USER};Password={QUARTZ_DB_PASSWORD}"); if (ASPNETCORE_ENVIRONMENT == "Development") { builder.Append(";Include Error Detail=true"); } Log.Debug("Using quartz database connection string: " + builder.ToString()); return builder.ToString(); } public string GetAppVersion() { var versionFilePath = Path.Combine(AppPaths.AppData.HostPath, "version.txt"); if (!File.Exists(versionFilePath)) return "unknown-" + ASPNETCORE_ENVIRONMENT; var versionText = File.ReadAllText(versionFilePath); return versionText + "-" + ASPNETCORE_ENVIRONMENT; } }