diff --git a/util/Setup/EnvironmentFileBuilder.cs b/util/Setup/EnvironmentFileBuilder.cs index 8443f9a3d2..8799c34cae 100644 --- a/util/Setup/EnvironmentFileBuilder.cs +++ b/util/Setup/EnvironmentFileBuilder.cs @@ -1,10 +1,14 @@ using System; +using System.Collections.Generic; using System.IO; namespace Bit.Setup { public class EnvironmentFileBuilder { + private IDictionary _globalValues; + private IDictionary _mssqlValues; + public string Url { get; set; } public string Domain { get; set; } public string IdentityCertPassword { get; set; } @@ -14,50 +18,143 @@ namespace Bit.Setup public string DatabasePassword { get; set; } public string OutputDirectory { get; set; } - public void Build() + public void BuildForInstaller() { - Console.WriteLine("Building docker environment override files."); Directory.CreateDirectory("/bitwarden/env/"); - var dbConnectionString = Helpers.MakeSqlConnectionString("mssql", "vault", "sa", DatabasePassword); + Init(); + Build(); + } + public void BuildForUpdater() + { + Init(); + LoadExistingValues(_globalValues, "/bitwarden/env/global.override.env"); + LoadExistingValues(_mssqlValues, "/bitwarden/env/mssql.override.env"); + Build(); + } + + private void Init() + { + var dbConnectionString = Helpers.MakeSqlConnectionString("mssql", "vault", "sa", DatabasePassword); + _globalValues = new Dictionary + { + ["globalSettings__baseServiceUri__vault"] = Url, + ["globalSettings__baseServiceUri__api"] = $"{Url}/api", + ["globalSettings__baseServiceUri__identity"] = $"{Url}/identity", + ["globalSettings__sqlServer__connectionString"] = $"\"{ dbConnectionString }\"", + ["globalSettings__identityServer__certificatePassword"] = IdentityCertPassword, + ["globalSettings__attachment__baseDirectory"] = $"{OutputDirectory}/core/attachments", + ["globalSettings__attachment__baseUrl"] = $"{Url}/attachments", + ["globalSettings__dataProtection__directory"] = $"{OutputDirectory}/core/aspnet-dataprotection", + ["globalSettings__logDirectory"] = $"{OutputDirectory}/core/logs", + ["globalSettings__licenseDirectory"] = $"{OutputDirectory}/core/licenses", + ["globalSettings__duo__aKey"] = $"{Helpers.SecureRandomString(64, alpha: true, numeric: true)}", + ["globalSettings__installation__id"] = InstallationId?.ToString(), + ["globalSettings__installation__key"] = InstallationKey, + ["globalSettings__yubico__clientId"] = "REPLACE", + ["globalSettings__yubico__key"] = "REPLACE", + ["globalSettings__mail__replyToEmail"] = $"no-reply@{Domain}", + ["globalSettings__mail__smtp__host"] = "REPLACE", + ["globalSettings__mail__smtp__username"] = "REPLACE", + ["globalSettings__mail__smtp__password"] = "REPLACE", + ["globalSettings__mail__smtp__ssl"] = "true", + ["globalSettings__mail__smtp__port"] = "587", + ["globalSettings__mail__smtp__useDefaultCredentials"] = "false", + ["globalSettings__disableUserRegistration"] = "false", + }; + + if(!Push) + { + _globalValues.Add("globalSettings__pushRelayBaseUri", "REPLACE"); + } + + _mssqlValues = new Dictionary + { + ["ACCEPT_EULA"] = "Y", + ["MSSQL_PID"] = "Express", + ["SA_PASSWORD"] = DatabasePassword, + }; + } + + private void LoadExistingValues(IDictionary _values, string file) + { + if(!File.Exists(file)) + { + return; + } + + var fileLines = File.ReadAllLines(file); + foreach(var line in fileLines) + { + if(!line.Contains("=")) + { + continue; + } + + var value = string.Empty; + var lineParts = line.Split("=", 2); + if(lineParts.Length < 1) + { + continue; + } + + if(lineParts.Length > 1) + { + value = lineParts[1]; + } + + if(_values.ContainsKey(lineParts[0])) + { + _values[lineParts[0]] = value; + } + else + { + _values.Add(lineParts[0], value); + } + } + } + + private void Build() + { + Console.WriteLine("Building docker environment files."); + Directory.CreateDirectory("/bitwarden/docker/"); + using(var sw = File.CreateText("/bitwarden/docker/global.env")) + { + sw.Write($@"ASPNETCORE_ENVIRONMENT=Production +globalSettings__selfHosted=true +globalSettings__baseServiceUri__vault=http://localhost +globalSettings__baseServiceUri__api=http://localhost/api +globalSettings__baseServiceUri__identity=http://localhost/identity +globalSettings__baseServiceUri__internalIdentity=http://identity +globalSettings__pushRelayBaseUri=https://push.bitwarden.com +globalSettings__installation__identityUri=https://identity.bitwarden.com +"); + } + + using(var sw = File.CreateText("/bitwarden/docker/mssql.env")) + { + sw.Write($@"ACCEPT_EULA=Y +MSSQL_PID=Express +SA_PASSWORD=SECRET +"); + } + + Console.WriteLine("Building docker environment override files."); + Directory.CreateDirectory(" /bitwarden/env/"); using(var sw = File.CreateText("/bitwarden/env/global.override.env")) { - sw.Write($@"globalSettings__baseServiceUri__vault={Url} -globalSettings__baseServiceUri__api={Url}/api -globalSettings__baseServiceUri__identity={Url}/identity -globalSettings__sqlServer__connectionString=""{dbConnectionString}"" -globalSettings__identityServer__certificatePassword={IdentityCertPassword} -globalSettings__attachment__baseDirectory={OutputDirectory}/core/attachments -globalSettings__attachment__baseUrl={Url}/attachments -globalSettings__dataProtection__directory={OutputDirectory}/core/aspnet-dataprotection -globalSettings__logDirectory={OutputDirectory}/core/logs -globalSettings__licenseDirectory={OutputDirectory}/core/licenses -globalSettings__duo__aKey={Helpers.SecureRandomString(64, alpha: true, numeric: true)} -globalSettings__installation__id={InstallationId} -globalSettings__installation__key={InstallationKey} -globalSettings__yubico__clientId=REPLACE -globalSettings__yubico__key=REPLACE -globalSettings__mail__replyToEmail=no-reply@{Domain} -globalSettings__mail__smtp__host=REPLACE -globalSettings__mail__smtp__username=REPLACE -globalSettings__mail__smtp__password=REPLACE -globalSettings__mail__smtp__ssl=true -globalSettings__mail__smtp__port=587 -globalSettings__mail__smtp__useDefaultCredentials=false -globalSettings__disableUserRegistration=false"); - - if(!Push) + foreach(var item in _globalValues) { - sw.Write(@" -globalSettings__pushRelayBaseUri=REPLACE"); + sw.WriteLine($"{item.Key}={item.Value}"); } } using(var sw = File.CreateText("/bitwarden/env/mssql.override.env")) { - sw.Write($@"ACCEPT_EULA=Y -MSSQL_PID=Express -SA_PASSWORD={DatabasePassword}"); + foreach(var item in _mssqlValues) + { + sw.WriteLine($"{item.Key}={item.Value}"); + } } } } diff --git a/util/Setup/Program.cs b/util/Setup/Program.cs index f0d7d2474e..e4e57ce940 100644 --- a/util/Setup/Program.cs +++ b/util/Setup/Program.cs @@ -117,7 +117,7 @@ namespace Bit.Setup Push = push, Url = url }; - environmentFileBuilder.Build(); + environmentFileBuilder.BuildForInstaller(); var appSettingsBuilder = new AppSettingsBuilder(url, domain); appSettingsBuilder.Build(); @@ -250,6 +250,9 @@ namespace Bit.Setup private static void RebuildConfigs() { + var environmentFileBuilder = new EnvironmentFileBuilder(); + environmentFileBuilder.BuildForUpdater(); + var url = Helpers.GetValueFronEnvFile("global", "globalSettings__baseServiceUri__vault"); if(!Uri.TryCreate(url, UriKind.Absolute, out Uri uri)) {