2017-10-24 04:45:59 +02:00
|
|
|
|
using System;
|
2017-11-07 04:55:15 +01:00
|
|
|
|
using System.Collections.Generic;
|
2017-10-24 04:45:59 +02:00
|
|
|
|
using System.IO;
|
|
|
|
|
|
|
|
|
|
namespace Bit.Setup
|
|
|
|
|
{
|
|
|
|
|
public class EnvironmentFileBuilder
|
|
|
|
|
{
|
2017-11-07 04:55:15 +01:00
|
|
|
|
private IDictionary<string, string> _globalValues;
|
|
|
|
|
private IDictionary<string, string> _mssqlValues;
|
|
|
|
|
|
2017-11-07 17:32:13 +01:00
|
|
|
|
public string Url { get; set; } = "https://localhost";
|
|
|
|
|
public string Domain { get; set; } = "localhost";
|
|
|
|
|
public string IdentityCertPassword { get; set; } = "REPLACE";
|
2017-10-24 04:45:59 +02:00
|
|
|
|
public Guid? InstallationId { get; set; }
|
|
|
|
|
public string InstallationKey { get; set; }
|
|
|
|
|
public bool Push { get; set; }
|
2017-11-07 17:32:13 +01:00
|
|
|
|
public string DatabasePassword { get; set; } = "REPLACE";
|
|
|
|
|
public string OutputDirectory { get; set; } = ".";
|
2017-10-24 04:45:59 +02:00
|
|
|
|
|
2017-11-07 04:55:15 +01:00
|
|
|
|
public void BuildForInstaller()
|
2017-10-24 04:45:59 +02:00
|
|
|
|
{
|
|
|
|
|
Directory.CreateDirectory("/bitwarden/env/");
|
2017-11-07 17:43:26 +01:00
|
|
|
|
Init(true);
|
2017-11-07 04:55:15 +01:00
|
|
|
|
Build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void BuildForUpdater()
|
|
|
|
|
{
|
2017-11-07 17:43:26 +01:00
|
|
|
|
Init(false);
|
2017-11-07 04:55:15 +01:00
|
|
|
|
LoadExistingValues(_globalValues, "/bitwarden/env/global.override.env");
|
|
|
|
|
LoadExistingValues(_mssqlValues, "/bitwarden/env/mssql.override.env");
|
|
|
|
|
Build();
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-07 17:43:26 +01:00
|
|
|
|
private void Init(bool forInstall)
|
2017-11-07 04:55:15 +01:00
|
|
|
|
{
|
2017-12-21 17:18:36 +01:00
|
|
|
|
var dbConnectionString = Helpers.MakeSqlConnectionString("mssql", "vault", "sa", DatabasePassword);
|
2017-11-07 04:55:15 +01:00
|
|
|
|
_globalValues = new Dictionary<string, string>
|
|
|
|
|
{
|
|
|
|
|
["globalSettings__baseServiceUri__vault"] = Url,
|
|
|
|
|
["globalSettings__baseServiceUri__api"] = $"{Url}/api",
|
|
|
|
|
["globalSettings__baseServiceUri__identity"] = $"{Url}/identity",
|
2018-04-17 02:35:53 +02:00
|
|
|
|
["globalSettings__baseServiceUri__admin"] = $"{Url}/admin",
|
2017-11-07 04:55:15 +01:00
|
|
|
|
["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",
|
2018-03-28 04:16:55 +02:00
|
|
|
|
["globalSettings__logDirectory"] = $"{OutputDirectory}/logs",
|
2017-11-07 04:55:15 +01:00
|
|
|
|
["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",
|
2018-03-28 16:45:30 +02:00
|
|
|
|
["adminSettings__admins"] = string.Empty,
|
2017-11-07 04:55:15 +01:00
|
|
|
|
};
|
2017-10-24 04:45:59 +02:00
|
|
|
|
|
2017-11-08 05:02:40 +01:00
|
|
|
|
if(forInstall && !Push)
|
2017-11-07 04:55:15 +01:00
|
|
|
|
{
|
|
|
|
|
_globalValues.Add("globalSettings__pushRelayBaseUri", "REPLACE");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_mssqlValues = new Dictionary<string, string>
|
2017-10-24 04:45:59 +02:00
|
|
|
|
{
|
2017-11-07 04:55:15 +01:00
|
|
|
|
["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]))
|
2017-10-24 04:45:59 +02:00
|
|
|
|
{
|
2017-11-07 04:55:15 +01:00
|
|
|
|
_values[lineParts[0]] = value;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
_values.Add(lineParts[0], value);
|
2017-10-24 04:45:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2017-11-07 04:55:15 +01:00
|
|
|
|
}
|
2017-10-24 04:45:59 +02:00
|
|
|
|
|
2017-11-07 04:55:15 +01:00
|
|
|
|
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
|
2018-04-17 02:35:53 +02:00
|
|
|
|
globalSettings__baseServiceUri__admin=http://localhost/admin
|
|
|
|
|
globalSettings__baseServiceUri__internalAdmin=http://admin:5000
|
2018-03-26 20:57:10 +02:00
|
|
|
|
globalSettings__baseServiceUri__internalIdentity=http://identity:5000
|
2018-03-29 14:45:04 +02:00
|
|
|
|
globalSettings__baseServiceUri__internalApi=http://api:5000
|
|
|
|
|
globalSettings__baseServiceUri__internalVault=http://web:5000
|
2017-11-07 04:55:15 +01:00
|
|
|
|
globalSettings__pushRelayBaseUri=https://push.bitwarden.com
|
|
|
|
|
globalSettings__installation__identityUri=https://identity.bitwarden.com
|
|
|
|
|
");
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-21 04:31:30 +01:00
|
|
|
|
Helpers.Exec("chmod 600 /bitwarden/docker/global.env");
|
|
|
|
|
|
2017-11-07 04:55:15 +01:00
|
|
|
|
using(var sw = File.CreateText("/bitwarden/docker/mssql.env"))
|
2017-10-24 04:45:59 +02:00
|
|
|
|
{
|
|
|
|
|
sw.Write($@"ACCEPT_EULA=Y
|
|
|
|
|
MSSQL_PID=Express
|
2017-11-07 04:55:15 +01:00
|
|
|
|
SA_PASSWORD=SECRET
|
|
|
|
|
");
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-21 04:31:30 +01:00
|
|
|
|
Helpers.Exec("chmod 600 /bitwarden/docker/mssql.env");
|
|
|
|
|
|
2017-11-07 04:55:15 +01:00
|
|
|
|
Console.WriteLine("Building docker environment override files.");
|
|
|
|
|
Directory.CreateDirectory(" /bitwarden/env/");
|
|
|
|
|
using(var sw = File.CreateText("/bitwarden/env/global.override.env"))
|
|
|
|
|
{
|
|
|
|
|
foreach(var item in _globalValues)
|
|
|
|
|
{
|
|
|
|
|
sw.WriteLine($"{item.Key}={item.Value}");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-21 04:31:30 +01:00
|
|
|
|
Helpers.Exec("chmod 600 /bitwarden/env/global.override.env");
|
|
|
|
|
|
2017-11-07 04:55:15 +01:00
|
|
|
|
using(var sw = File.CreateText("/bitwarden/env/mssql.override.env"))
|
|
|
|
|
{
|
|
|
|
|
foreach(var item in _mssqlValues)
|
|
|
|
|
{
|
|
|
|
|
sw.WriteLine($"{item.Key}={item.Value}");
|
|
|
|
|
}
|
2017-10-24 04:45:59 +02:00
|
|
|
|
}
|
2017-12-21 04:31:30 +01:00
|
|
|
|
|
|
|
|
|
Helpers.Exec("chmod 600 /bitwarden/env/mssql.override.env");
|
2018-03-27 21:23:02 +02:00
|
|
|
|
|
|
|
|
|
// Empty uid env file. Only used on Linux hosts.
|
2018-05-31 18:05:26 +02:00
|
|
|
|
if(!File.Exists("/bitwarden/env/uid.env"))
|
|
|
|
|
{
|
|
|
|
|
using(var sw = File.CreateText("/bitwarden/env/uid.env")) { }
|
|
|
|
|
}
|
2017-10-24 04:45:59 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|