Exemple #1
0
        private static bool ValidateInstallation()
        {
            var installationId = Helpers.ReadInput("Enter your installation id (get at https://bitwarden.com/host)");

            if (!Guid.TryParse(installationId.Trim(), out var installationidGuid))
            {
                Console.WriteLine("Invalid installation id.");
                return(false);
            }

            _context.Install.InstallationId  = installationidGuid;
            _context.Install.InstallationKey = Helpers.ReadInput("Enter your installation key");

            try
            {
                var response = new HttpClient().GetAsync("https://api.bitwarden.com/installations/" +
                                                         _context.Install.InstallationId).GetAwaiter().GetResult();

                if (!response.IsSuccessStatusCode)
                {
                    if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
                    {
                        Console.WriteLine("Invalid installation id.");
                    }
                    else
                    {
                        Console.WriteLine("Unable to validate installation id.");
                    }

                    return(false);
                }

                var resultString = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
                var result       = JsonConvert.DeserializeObject <dynamic>(resultString);
                if (!(bool)result.Enabled)
                {
                    Console.WriteLine("Installation id has been disabled.");
                    return(false);
                }

                return(true);
            }
            catch
            {
                Console.WriteLine("Unable to validate installation id. Problem contacting Bitwarden server.");
                return(false);
            }
        }
Exemple #2
0
        private static bool ValidateInstallation()
        {
            var installationId  = string.Empty;
            var installationKey = string.Empty;

            if (_context.Parameters.ContainsKey("install-id"))
            {
                installationId = _context.Parameters["install-id"].ToLowerInvariant();
            }
            else
            {
                installationId = Helpers.ReadInput("Enter your installation id (get at https://bitwarden.com/host)");
            }

            if (!Guid.TryParse(installationId.Trim(), out var installationidGuid))
            {
                Console.WriteLine("Invalid installation id.");
                return(false);
            }

            if (_context.Parameters.ContainsKey("install-key"))
            {
                installationKey = _context.Parameters["install-key"];
            }
            else
            {
                installationKey = Helpers.ReadInput("Enter your installation key");
            }

            _context.Install.InstallationId  = installationidGuid;
            _context.Install.InstallationKey = installationKey;

            try
            {
                var response = new HttpClient().GetAsync("https://api.bitwarden.com/installations/" +
                                                         _context.Install.InstallationId).GetAwaiter().GetResult();

                if (!response.IsSuccessStatusCode)
                {
                    if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
                    {
                        Console.WriteLine("Invalid installation id.");
                    }
                    else
                    {
                        Console.WriteLine("Unable to validate installation id.");
                    }

                    return(false);
                }

                var result = response.Content.ReadFromJsonAsync <InstallationValidationResponseModel>().GetAwaiter().GetResult();
                if (!result.Enabled)
                {
                    Console.WriteLine("Installation id has been disabled.");
                    return(false);
                }

                return(true);
            }
            catch
            {
                Console.WriteLine("Unable to validate installation id. Problem contacting Bitwarden server.");
                return(false);
            }
        }
Exemple #3
0
        private static void Install()
        {
            var outputDir = _parameters.ContainsKey("out") ?
                            _parameters["out"].ToLowerInvariant() : "/etc/bitwarden";
            var domain = _parameters.ContainsKey("domain") ?
                         _parameters["domain"].ToLowerInvariant() : "localhost";
            var letsEncrypt = _parameters.ContainsKey("letsencrypt") ?
                              _parameters["letsencrypt"].ToLowerInvariant() == "y" : false;

            if (!ValidateInstallation())
            {
                return;
            }

            var ssl = letsEncrypt;

            if (!letsEncrypt)
            {
                ssl = Helpers.ReadQuestion("Do you have a SSL certificate to use?");
                if (ssl)
                {
                    Directory.CreateDirectory($"/bitwarden/ssl/{domain}/");
                    var message = "Make sure 'certificate.crt' and 'private.key' are provided in the \n" +
                                  "appropriate directory before running 'start' (see docs for info).";
                    Helpers.ShowBanner("NOTE", message);
                }
            }

            var identityCertPassword = Helpers.SecureRandomString(32, alpha: true, numeric: true);
            var certBuilder          = new CertBuilder(domain, identityCertPassword, letsEncrypt, ssl);
            var selfSignedSsl        = certBuilder.BuildForInstall();

            ssl = certBuilder.Ssl; // Ssl prop can get flipped during the build

            var sslTrusted       = letsEncrypt;
            var sslDiffieHellman = letsEncrypt;

            if (ssl && !selfSignedSsl && !letsEncrypt)
            {
                sslDiffieHellman = Helpers.ReadQuestion("Use Diffie Hellman ephemeral parameters for SSL " +
                                                        "(requires dhparam.pem, see docs)?");
                sslTrusted = Helpers.ReadQuestion("Is this a trusted SSL certificate (requires ca.crt, see docs)?");
            }

            if (!ssl)
            {
                var message = "You are not using a SSL certificate. Bitwarden requires HTTPS to operate. \n" +
                              "You must front your installation with a HTTPS proxy. The web vault (and \n" +
                              "other Bitwarden apps) will not work properly without HTTPS.";
                Helpers.ShowBanner("WARNING", message, ConsoleColor.Yellow);
            }
            else if (ssl && !sslTrusted)
            {
                var message = "You are using an untrusted SSL certificate. This certificate will not be \n" +
                              "trusted by Bitwarden client applications. You must add this certificate to \n" +
                              "the trusted store on each device or else you will receive errors when trying \n" +
                              "to connect to your installation.";
                Helpers.ShowBanner("WARNING", message, ConsoleColor.Yellow);
            }

            var url = $"https://{domain}";
            int httpPort = default(int), httpsPort = default(int);

            if (Helpers.ReadQuestion("Do you want to use the default ports for HTTP (80) and HTTPS (443)?"))
            {
                httpPort = 80;
                if (ssl)
                {
                    httpsPort = 443;
                }
            }
            else if (ssl)
            {
                httpsPort = 443;
                if (int.TryParse(Helpers.ReadInput("HTTPS port").Trim(), out httpsPort) && httpsPort != 443)
                {
                    url += (":" + httpsPort);
                }
                else
                {
                    Console.WriteLine("Using default port.");
                }
            }
            else
            {
                httpPort = 80;
                if (!int.TryParse(Helpers.ReadInput("HTTP port").Trim(), out httpPort) && httpPort != 80)
                {
                    Console.WriteLine("Using default port.");
                }
            }

            if (Helpers.ReadQuestion("Is your installation behind a reverse proxy?"))
            {
                if (Helpers.ReadQuestion("Do you use the default HTTPS port (443) on your reverse proxy?"))
                {
                    url = $"https://{domain}";
                }
                else
                {
                    if (int.TryParse(Helpers.ReadInput("Proxy HTTPS port").Trim(), out var httpsReversePort) &&
                        httpsReversePort != 443)
                    {
                        url += (":" + httpsReversePort);
                    }
                    else
                    {
                        Console.WriteLine("Using default port.");
                        url = $"https://{domain}";
                    }
                }
            }
            else if (!ssl)
            {
                Console.WriteLine("ERROR: You must use a reverse proxy if not using SSL.");
                return;
            }

            var push = Helpers.ReadQuestion("Do you want to use push notifications?");

            var nginxBuilder = new NginxConfigBuilder(domain, url, ssl, selfSignedSsl, letsEncrypt,
                                                      sslTrusted, sslDiffieHellman);

            nginxBuilder.BuildForInstaller();

            var environmentFileBuilder = new EnvironmentFileBuilder
            {
                DatabasePassword     = Helpers.SecureRandomString(32),
                Domain               = domain,
                IdentityCertPassword = identityCertPassword,
                InstallationId       = _installationId,
                InstallationKey      = _installationKey,
                OutputDirectory      = outputDir,
                Push = push,
                Url  = url
            };

            environmentFileBuilder.BuildForInstaller();

            var appIdBuilder = new AppIdBuilder(url);

            appIdBuilder.Build();

            var dockerComposeBuilder = new DockerComposeBuilder(_hostOs, _webVersion, _coreVersion);

            dockerComposeBuilder.BuildForInstaller(httpPort, httpsPort);
        }