From f4142a1a1db724d7cb035780bc940121520b511d Mon Sep 17 00:00:00 2001
From: Kyle Spearrin <kyle.spearrin@gmail.com>
Date: Mon, 6 Nov 2017 22:55:15 -0500
Subject: [PATCH] build environment files from setup

---
 util/Setup/EnvironmentFileBuilder.cs | 163 +++++++++++++++++++++------
 util/Setup/Program.cs                |   5 +-
 2 files changed, 134 insertions(+), 34 deletions(-)

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<string, string> _globalValues;
+        private IDictionary<string, string> _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<string, string>
+            {
+                ["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<string, string>
+            {
+                ["ACCEPT_EULA"] = "Y",
+                ["MSSQL_PID"] = "Express",
+                ["SA_PASSWORD"] = DatabasePassword,
+            };
+        }
+
+        private void LoadExistingValues(IDictionary<string, string> _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))
             {