1
0
mirror of https://github.com/bitwarden/server.git synced 2024-12-04 14:13:28 +01:00
bitwarden-server/util/Setup/EnvironmentFileBuilder.cs

237 lines
10 KiB
C#
Raw Normal View History

2017-10-24 04:45:59 +02:00
using System;
2017-11-07 04:55:15 +01:00
using System.Collections.Generic;
using System.Data.SqlClient;
2017-10-24 04:45:59 +02:00
using System.IO;
2018-08-30 17:35:44 +02:00
using System.Linq;
2017-10-24 04:45:59 +02:00
namespace Bit.Setup
{
public class EnvironmentFileBuilder
{
2018-08-30 17:35:44 +02:00
private readonly Context _context;
2017-11-07 04:55:15 +01:00
private IDictionary<string, string> _globalValues;
private IDictionary<string, string> _mssqlValues;
2018-08-30 17:35:44 +02:00
private IDictionary<string, string> _globalOverrideValues;
private IDictionary<string, string> _mssqlOverrideValues;
2017-11-07 04:55:15 +01:00
2018-08-30 17:35:44 +02:00
public EnvironmentFileBuilder(Context context)
{
_context = context;
_globalValues = new Dictionary<string, string>
{
["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__admin"] = "http://localhost/admin",
["globalSettings__baseServiceUri__sso"] = "http://localhost/sso",
["globalSettings__baseServiceUri__portal"] = "http://localhost/portal",
2018-08-30 17:35:44 +02:00
["globalSettings__baseServiceUri__notifications"] = "http://localhost/notifications",
["globalSettings__baseServiceUri__internalNotifications"] = "http://notifications:5000",
["globalSettings__baseServiceUri__internalAdmin"] = "http://admin:5000",
["globalSettings__baseServiceUri__internalIdentity"] = "http://identity:5000",
["globalSettings__baseServiceUri__internalApi"] = "http://api:5000",
["globalSettings__baseServiceUri__internalVault"] = "http://web:5000",
["globalSettings__baseServiceUri__internalSso"] = "http://sso:5000",
["globalSettings__baseServiceUri__internalPortal"] = "http://portal:5000",
2018-08-30 17:35:44 +02:00
["globalSettings__pushRelayBaseUri"] = "https://push.bitwarden.com",
["globalSettings__installation__identityUri"] = "https://identity.bitwarden.com",
};
_mssqlValues = new Dictionary<string, string>
{
["ACCEPT_EULA"] = "Y",
["MSSQL_PID"] = "Express",
["SA_PASSWORD"] = "SECRET",
};
}
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/");
2018-08-30 17:35:44 +02:00
Init();
2017-11-07 04:55:15 +01:00
Build();
}
public void BuildForUpdater()
{
2018-08-30 17:35:44 +02:00
Init();
LoadExistingValues(_globalOverrideValues, "/bitwarden/env/global.override.env");
LoadExistingValues(_mssqlOverrideValues, "/bitwarden/env/mssql.override.env");
if (_context.Config.PushNotifications &&
2018-08-30 17:35:44 +02:00
_globalOverrideValues.ContainsKey("globalSettings__pushRelayBaseUri") &&
_globalOverrideValues["globalSettings__pushRelayBaseUri"] == "REPLACE")
{
_globalOverrideValues.Remove("globalSettings__pushRelayBaseUri");
}
2017-11-07 04:55:15 +01:00
Build();
}
2018-08-30 17:35:44 +02:00
private void Init()
2017-11-07 04:55:15 +01:00
{
2019-03-15 16:19:52 +01:00
var dbPassword = _context.Stub ? "RANDOM_DATABASE_PASSWORD" : Helpers.SecureRandomString(32);
var dbConnectionString = new SqlConnectionStringBuilder
{
DataSource = "tcp:mssql,1433",
InitialCatalog = "vault",
UserID = "sa",
Password = dbPassword,
MultipleActiveResultSets = false,
Encrypt = true,
ConnectTimeout = 30,
TrustServerCertificate = true,
PersistSecurityInfo = false
}.ConnectionString;
2018-08-30 17:35:44 +02:00
_globalOverrideValues = new Dictionary<string, string>
2017-11-07 04:55:15 +01:00
{
2018-08-30 17:35:44 +02:00
["globalSettings__baseServiceUri__vault"] = _context.Config.Url,
["globalSettings__baseServiceUri__api"] = $"{_context.Config.Url}/api",
["globalSettings__baseServiceUri__identity"] = $"{_context.Config.Url}/identity",
["globalSettings__baseServiceUri__admin"] = $"{_context.Config.Url}/admin",
["globalSettings__baseServiceUri__notifications"] = $"{_context.Config.Url}/notifications",
["globalSettings__baseServiceUri__sso"] = $"{_context.Config.Url}/sso",
["globalSettings__baseServiceUri__portal"] = $"{_context.Config.Url}/portal",
2018-08-30 17:35:44 +02:00
["globalSettings__sqlServer__connectionString"] = $"\"{dbConnectionString}\"",
["globalSettings__identityServer__certificatePassword"] = _context.Install?.IdentityCertPassword,
["globalSettings__attachment__baseDirectory"] = $"{_context.OutputDir}/core/attachments",
["globalSettings__attachment__baseUrl"] = $"{_context.Config.Url}/attachments",
2020-11-03 20:29:07 +01:00
["globalSettings__send__baseDirectory"] = $"{_context.OutputDir}/core/attachments/send",
["globalSettings__send__baseUrl"] = $"{_context.Config.Url}/attachments/send",
2018-08-30 17:35:44 +02:00
["globalSettings__dataProtection__directory"] = $"{_context.OutputDir}/core/aspnet-dataprotection",
["globalSettings__logDirectory"] = $"{_context.OutputDir}/logs",
["globalSettings__logRollBySizeLimit"] = string.Empty,
["globalSettings__syslog__destination"] = string.Empty,
2018-08-30 17:35:44 +02:00
["globalSettings__licenseDirectory"] = $"{_context.OutputDir}/core/licenses",
2019-03-15 16:19:52 +01:00
["globalSettings__internalIdentityKey"] = _context.Stub ? "RANDOM_IDENTITY_KEY" :
Helpers.SecureRandomString(64, alpha: true, numeric: true),
["globalSettings__oidcIdentityClientKey"] = _context.Stub ? "RANDOM_IDENTITY_KEY" :
Helpers.SecureRandomString(64, alpha: true, numeric: true),
2019-03-15 16:19:52 +01:00
["globalSettings__duo__aKey"] = _context.Stub ? "RANDOM_DUO_AKEY" :
Helpers.SecureRandomString(64, alpha: true, numeric: true),
2018-08-30 17:35:44 +02:00
["globalSettings__installation__id"] = _context.Install?.InstallationId.ToString(),
["globalSettings__installation__key"] = _context.Install?.InstallationKey,
2017-11-07 04:55:15 +01:00
["globalSettings__yubico__clientId"] = "REPLACE",
["globalSettings__yubico__key"] = "REPLACE",
2018-08-30 17:35:44 +02:00
["globalSettings__mail__replyToEmail"] = $"no-reply@{_context.Config.Domain}",
2017-11-07 04:55:15 +01:00
["globalSettings__mail__smtp__host"] = "REPLACE",
["globalSettings__mail__smtp__port"] = "587",
["globalSettings__mail__smtp__ssl"] = "false",
2017-11-07 04:55:15 +01:00
["globalSettings__mail__smtp__username"] = "REPLACE",
["globalSettings__mail__smtp__password"] = "REPLACE",
["globalSettings__disableUserRegistration"] = "false",
2019-07-23 03:24:04 +02:00
["globalSettings__hibpApiKey"] = "REPLACE",
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
if (!_context.Config.PushNotifications)
2017-11-07 04:55:15 +01:00
{
2018-08-30 17:35:44 +02:00
_globalOverrideValues.Add("globalSettings__pushRelayBaseUri", "REPLACE");
2017-11-07 04:55:15 +01:00
}
2018-08-30 17:35:44 +02:00
_mssqlOverrideValues = 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",
2018-08-30 17:35:44 +02:00
["SA_PASSWORD"] = dbPassword,
2017-11-07 04:55:15 +01:00
};
}
private void LoadExistingValues(IDictionary<string, string> _values, string file)
{
if (!File.Exists(file))
2017-11-07 04:55:15 +01:00
{
return;
}
var fileLines = File.ReadAllLines(file);
foreach (var line in fileLines)
2017-11-07 04:55:15 +01:00
{
if (!line.Contains("="))
2017-11-07 04:55:15 +01:00
{
continue;
}
var value = string.Empty;
var lineParts = line.Split("=", 2);
if (lineParts.Length < 1)
2017-11-07 04:55:15 +01:00
{
continue;
}
if (lineParts.Length > 1)
2017-11-07 04:55:15 +01:00
{
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()
{
2018-08-30 17:35:44 +02:00
var template = Helpers.ReadTemplate("EnvironmentFile");
2019-03-12 15:26:14 +01:00
Helpers.WriteLine(_context, "Building docker environment files.");
2017-11-07 04:55:15 +01:00
Directory.CreateDirectory("/bitwarden/docker/");
using (var sw = File.CreateText("/bitwarden/docker/global.env"))
2017-11-07 04:55:15 +01:00
{
2018-08-30 17:35:44 +02:00
sw.Write(template(new TemplateModel(_globalValues)));
2017-11-07 04:55:15 +01:00
}
2017-12-21 04:31:30 +01:00
Helpers.Exec("chmod 600 /bitwarden/docker/global.env");
using (var sw = File.CreateText("/bitwarden/docker/mssql.env"))
2017-10-24 04:45:59 +02:00
{
2018-08-30 17:35:44 +02:00
sw.Write(template(new TemplateModel(_mssqlValues)));
2017-11-07 04:55:15 +01:00
}
2017-12-21 04:31:30 +01:00
Helpers.Exec("chmod 600 /bitwarden/docker/mssql.env");
2019-03-12 15:26:14 +01:00
Helpers.WriteLine(_context, "Building docker environment override files.");
2018-08-30 17:35:44 +02:00
Directory.CreateDirectory("/bitwarden/env/");
using (var sw = File.CreateText("/bitwarden/env/global.override.env"))
2017-11-07 04:55:15 +01:00
{
2018-08-30 17:35:44 +02:00
sw.Write(template(new TemplateModel(_globalOverrideValues)));
2017-11-07 04:55:15 +01:00
}
2017-12-21 04:31:30 +01:00
Helpers.Exec("chmod 600 /bitwarden/env/global.override.env");
using (var sw = File.CreateText("/bitwarden/env/mssql.override.env"))
2017-11-07 04:55:15 +01:00
{
2018-08-30 17:35:44 +02:00
sw.Write(template(new TemplateModel(_mssqlOverrideValues)));
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.
if (!File.Exists("/bitwarden/env/uid.env"))
{
using (var sw = File.CreateText("/bitwarden/env/uid.env")) { }
}
2017-10-24 04:45:59 +02:00
}
2018-08-30 17:35:44 +02:00
public class TemplateModel
{
public TemplateModel(IEnumerable<KeyValuePair<string, string>> variables)
{
Variables = variables.Select(v => new Kvp { Key = v.Key, Value = v.Value });
}
public IEnumerable<Kvp> Variables { get; set; }
public class Kvp
{
public string Key { get; set; }
public string Value { get; set; }
}
}
2017-10-24 04:45:59 +02:00
}
}