mirror of
				https://github.com/jakeswenson/BitBetter.git
				synced 2025-10-31 12:53:25 +00:00 
			
		
		
		
	Functional implementation of licensegen interactive mode.
This commit is contained in:
		
							parent
							
								
									fca0d599b9
								
							
						
					
					
						commit
						9e3701b272
					
				
							
								
								
									
										43
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										43
									
								
								README.md
									
									
									
									
									
								
							|  | @ -42,14 +42,14 @@ dotnet add package Newtonsoft.Json --version 11.0.0 | |||
| ``` | ||||
| ## Building BitBetter | ||||
| 
 | ||||
| Now that you've set up your build environment, you can run the main `BitBetter/build.sh` script to generate a modified version of the `bitwarden/api` and `bitwarden/identity` docker images. | ||||
| Now that you've set up your build environment, you can **run the main build script** to generate a modified version of the `bitwarden/api` and `bitwarden/identity` docker images. | ||||
| 
 | ||||
| From the BitBetter directory, simply run: | ||||
| ```bash | ||||
| ./build.sh | ||||
| ``` | ||||
| 
 | ||||
| This will create a new self-signed certificate in the `.keys` directory one does not already exist and then create a modified version of the official `bitwarden/api` called `bitbetter/api` and a modified version of the `bitwarden/identity` called `bitbetter/identity`. You may now simply edit your bitwarden docker-compose.yml to utilize the modified image. | ||||
| This will create a new self-signed certificate in the `.keys` directory one does not already exist and then create a modified version of the official `bitwarden/api` called `bitbetter/api` and a modified version of the `bitwarden/identity` called `bitbetter/identity`. You may **now simply edit your bitwarden docker-compose.yml to utilize the modified image**. | ||||
| 
 | ||||
| Edit your  `/path/to/bwdata/docker/docker-compose.yml`. | ||||
| 
 | ||||
|  | @ -61,10 +61,10 @@ You'll also want to edit the `/path/to/bwdata/scripts/run.sh` file. In the `func | |||
| 
 | ||||
| > Replace `dockerComposePull`<br>with `#dockerComposePull` | ||||
| 
 | ||||
| You can now start or restart Bitwarden as normal and the modified api will be used. <b>It is now ready to accept self-issued licenses.</b> | ||||
| You can now start or restart Bitwarden as normal and the modified api will be used. **It is now ready to accept self-issued licenses.** | ||||
| 
 | ||||
| --- | ||||
| **Note: Manually generating Certificate & Key** | ||||
| ### Note: Manually generating Certificate & Key | ||||
| 
 | ||||
| If you wish to generate your self-signed cert & key manually, you can run the following commands. | ||||
| 
 | ||||
|  | @ -74,7 +74,7 @@ openssl x509 -inform DER -in cert.cert -out cert.pem | |||
| openssl pkcs12 -export -out cert.pfx -inkey key.pem -in cert.pem -passin pass:test -passout pass:test | ||||
| ``` | ||||
| 
 | ||||
| Note that the password here must be `test`.<sup>[1](#f1)</sup> | ||||
| > Note that the password here must be `test`.<sup>[1](#f1)</sup> | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
|  | @ -82,22 +82,41 @@ Note that the password here must be `test`.<sup>[1](#f1)</sup> | |||
| 
 | ||||
| There is a tool included in the directory `src/licenseGen/` that will generate new individual and organization licenses. These licenses will be accepted by the modified Bitwarden because they will be signed by the certificate you generated in earlier steps. | ||||
| 
 | ||||
| First, from the `BitBetter/src/licenseGen` directory, build the license generator.<sup>[2](#f2)</sup> | ||||
| First, from the `BitBetter` directory, **build the license generator**.<sup>[2](#f2)</sup> | ||||
| 
 | ||||
| ```bash | ||||
| ./build.sh | ||||
| ./src/licenseGen/build.sh | ||||
| ``` | ||||
| 
 | ||||
| Now, from the `BitBetter/src/licenseGen` directory, you can run the tool to generate licenses. | ||||
| In order to run the tool and generate a license you'll need to get a **user's GUID** in order to generate an **invididual license** or the server's **install ID** to generate an **Organization license**. These can be retrieved most easily through the Bitwarden [Admin Portal](https://help.bitwarden.com/article/admin-portal/). | ||||
| 
 | ||||
| You'll need to get a user's <b>GUID</b> in order to generate an <b>invididual license</b> and the server's <b>install ID</b> to generate an <b>Organization license</b>. These can be retrieved most easily through the Bitwarden [Admin Portal](https://help.bitwarden.com/article/admin-portal/). | ||||
| If you generated your keys in the default `BitBetter/.keys` directory, you can **simply run the license gen in interactive mode** from the `Bitbetter` directory and **follow the prompts to generate your license**. | ||||
| 
 | ||||
| ```bash | ||||
| ./run.sh ~/BitBetter/.keys/cert.pfx user "Name" "EMail" "User-GUID" | ||||
| ./run.sh ~/BitBetter/.keys/cert.pfx org "Name" "EMail" "Install-ID used to install the server" | ||||
| ./src/licenseGen/run.sh interactive | ||||
| ``` | ||||
| 
 | ||||
| <b>The license generator will spit out a JSON-formatted license which can then be used within the Bitwarden web front-end to license your user or org!</b> | ||||
| **The license generator will spit out a JSON-formatted license which can then be used within the Bitwarden web front-end to license your user or org!** | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| ### Note: Alternative Ways to Generate License | ||||
| 
 | ||||
| If you wish to run the license gen from a directory aside from the root `BitBetter` one, you'll have to provide the absolute path to your cert.pfx. | ||||
| 
 | ||||
| ```bash | ||||
| ./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx interactive | ||||
| ``` | ||||
| 
 | ||||
| Additional, instead of interactive mode, you can also pass the parameters directly to the command as follows. | ||||
| 
 | ||||
| ```bash | ||||
| ./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx user "Name" "EMail" "User-GUID" | ||||
| ./src/licenseGen/run.sh /Absolute/Path/To/BitBetter/.keys/cert.pfx org "Name" "EMail" "Install-ID used to install the server" | ||||
| ``` | ||||
| 
 | ||||
| --- | ||||
| 
 | ||||
| 
 | ||||
| # FAQ: Questions (you might have?) | ||||
| 
 | ||||
|  |  | |||
|  | @ -35,30 +35,21 @@ namespace bitwardenSelfLicensor | |||
| 
 | ||||
|             app.Command("interactive", config => | ||||
|             { | ||||
|                 string buff="", licensetype="", name="", email="", guid="", installid="", key="", businessname=""; | ||||
|                 string buff="", licensetype="", name="", email="", businessname=""; | ||||
| 
 | ||||
|                 bool valid_guid = false, valid_installid = false; | ||||
|                 Guid guid, installid; | ||||
| 
 | ||||
|                 config.OnExecute(() => | ||||
|                 { | ||||
|                     if (!verifyTopOptions()) | ||||
|                     { | ||||
|                         if (!coreExists()) | ||||
|                         { | ||||
|                             config.Error.WriteLine($"Cant find core dll at: {coreDll.Value()}"); | ||||
|                         } | ||||
|                         if (!certExists()) | ||||
|                         { | ||||
|                             config.Error.WriteLine($"Cant find certificate at: {cert.Value()}"); | ||||
|                         } | ||||
|                         if (!coreExists()) config.Error.WriteLine($"Cant find core dll at: {coreDll.Value()}"); | ||||
|                         if (!certExists()) config.Error.WriteLine($"Cant find certificate at: {cert.Value()}"); | ||||
| 
 | ||||
|                         config.ShowHelp(); | ||||
|                         return 1; | ||||
|                     } | ||||
|                     else if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(email)) | ||||
|                     { | ||||
|                         config.Error.WriteLine($"Some arguments are missing: Name='{name}' Email='{email}'"); | ||||
|                         config.ShowHelp("user"); | ||||
|                         return 1; | ||||
|                     } | ||||
| 
 | ||||
|                     WriteLine("Interactive license mode..."); | ||||
| 
 | ||||
|  | @ -71,31 +62,33 @@ namespace bitwardenSelfLicensor | |||
|                         { | ||||
|                             licensetype = "user"; | ||||
|                             WriteLineOver("Okay, we will generate a user license."); | ||||
|                             WriteLine("Please provide the user's guid — refer to the Readme for details on how to retrieve this. [GUID]:"); | ||||
| 
 | ||||
|                             while (guid == "") | ||||
|                             while (valid_guid == false) | ||||
|                             { | ||||
|                                 WriteLineOver("Please provide the user's guid — refer to the Readme for details on how to retrieve this. [GUID]:"); | ||||
|                                 WriteLine("Please provide the user's guid — refer to the Readme for details on how to retrieve this. [GUID]:"); | ||||
|                                 buff = Console.ReadLine(); | ||||
|                                 if ( checkGUID(buff) ) guid = buff; | ||||
| 
 | ||||
|                                 if (Guid.TryParse(buff, out guid))valid_guid = true; | ||||
|                                 else WriteLineOver("The user-guid provided does not appear to be valid."); | ||||
|                             } | ||||
|                         } | ||||
|                         else if (buff == "o") | ||||
|                         { | ||||
|                             licensetype = "org"; | ||||
|                             WriteLineOver("Okay, we will generate an organization license."); | ||||
|                             WriteLine("Please provide your Bitwarden Install-ID — refer to the Readme for details on how to retrieve this. [Install-ID]:"); | ||||
| 
 | ||||
|                             while (installid == "") | ||||
|                             while (valid_installid == false) | ||||
|                             { | ||||
|                                 WriteLineOver("Please provide your Bitwarden Install-ID — refer to the Readme for details on how to retrieve this. [Install-ID]:"); | ||||
|                                 WriteLine("Please provide your Bitwarden Install-ID — refer to the Readme for details on how to retrieve this. [Install-ID]:"); | ||||
|                                 buff = Console.ReadLine(); | ||||
|                                 if ( checkGUID(buff) ) installid = buff; | ||||
| 
 | ||||
|                                 if (Guid.TryParse(buff, out installid)) valid_installid = true; | ||||
|                                 else WriteLineOver("The install-id provided does not appear to be valid."); | ||||
|                             } | ||||
| 
 | ||||
|                             while (businessname == "") | ||||
|                             { | ||||
|                                 WriteLineOver("Please enter an option business name, default is BitBetter. [Business Name]:"); | ||||
|                                 WriteLineOver("Please enter a business name, default is BitBetter. [Business Name]:"); | ||||
|                                 buff = Console.ReadLine(); | ||||
|                                 if (buff == "")                     businessname = "BitBetter"; | ||||
|                                 else if (checkBusinessName(buff))   businessname = buff; | ||||
|  | @ -128,7 +121,7 @@ namespace bitwardenSelfLicensor | |||
|                         buff = Console.ReadLine(); | ||||
|                         if ( buff == "" || buff == "y" || buff == "Y" ) | ||||
|                         { | ||||
|                             WriteLine("Okay."); | ||||
|                             GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name, email, guid, null); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|  | @ -142,7 +135,7 @@ namespace bitwardenSelfLicensor | |||
|                         buff = Console.ReadLine(); | ||||
|                         if ( buff == "" || buff == "y" || buff == "Y" ) | ||||
|                         { | ||||
|                             WriteLine("Okay."); | ||||
|                             GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name, email, installid, businessname, null); | ||||
|                         } | ||||
|                         else | ||||
|                         { | ||||
|  | @ -204,6 +197,7 @@ namespace bitwardenSelfLicensor | |||
|                 var name = config.Argument("Name", "your name"); | ||||
|                 var email = config.Argument("Email", "your email"); | ||||
|                 var installId = config.Argument("InstallId", "your installation id (GUID)"); | ||||
|                 var businessName = config.Argument("BusinessName", "name For the organization (optional)"); | ||||
|                 var key = config.Argument("Key", "your key id (optional)"); | ||||
|                 var help = config.HelpOption("--help | -h | -?"); | ||||
| 
 | ||||
|  | @ -240,7 +234,7 @@ namespace bitwardenSelfLicensor | |||
|                         return 1; | ||||
|                     } | ||||
| 
 | ||||
|                     GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, installationId, key.Value); | ||||
|                     GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, installationId, businessName.Value, key.Value); | ||||
| 
 | ||||
|                     return 0; | ||||
|                 }); | ||||
|  | @ -265,31 +259,11 @@ namespace bitwardenSelfLicensor | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         // checkGUID Checks that the user-guid matches the correct format | ||||
|         static bool checkGUID(string s) | ||||
|         { | ||||
|             if (s == "") { | ||||
|                 WriteLineOver("The User-GUID provided appears to be malformed."); | ||||
|                 return false; | ||||
|             } | ||||
|             return true;    // TODO: Actually validate | ||||
|         } | ||||
| 
 | ||||
|         // checkInstallID Checks that the Install-ID matches the correct format | ||||
|         static bool checkInstallID(string s) | ||||
|         { | ||||
|             if (s == "") { | ||||
|                 WriteLineOver("The Install-ID provided appears to be malformed."); | ||||
|                 return false; | ||||
|             } | ||||
|             return true;    // TODO: Actually validate | ||||
|         } | ||||
| 
 | ||||
|         // checkUsername Checks that the username is a valid username | ||||
|         static bool checkUsername(string s) | ||||
|         { | ||||
|             if (s == "") { | ||||
|                 WriteLineOver("The username provided doesn't appear to be valid."); | ||||
|             if ( string.IsNullOrWhiteSpace(s) ) { | ||||
|                 WriteLineOver("The username provided doesn't appear to be valid.\n"); | ||||
|                 return false; | ||||
|             } | ||||
|             return true;    // TODO: Actually validate | ||||
|  | @ -298,8 +272,8 @@ namespace bitwardenSelfLicensor | |||
|         // checkBusinessName Checks that the Business Name is a valid username | ||||
|         static bool checkBusinessName(string s) | ||||
|         { | ||||
|             if (s == "Microsoft") { | ||||
|                 WriteLineOver("The Business Name provided doesn't appear to be valid."); | ||||
|             if ( string.IsNullOrWhiteSpace(s) ) { | ||||
|                 WriteLineOver("The Business Name provided doesn't appear to be valid.\n"); | ||||
|                 return false; | ||||
|             } | ||||
|             return true;    // TODO: Actually validate | ||||
|  | @ -308,8 +282,8 @@ namespace bitwardenSelfLicensor | |||
|         // checkEmail Checks that the email address is a valid email address | ||||
|         static bool checkEmail(string s) | ||||
|         { | ||||
|             if (s == "") { | ||||
|                 WriteLineOver("The email provided doesn't appear to be valid."); | ||||
|             if ( string.IsNullOrWhiteSpace(s) ) { | ||||
|                 WriteLineOver("The email provided doesn't appear to be valid.\n"); | ||||
|                 return false; | ||||
|             } | ||||
|             return true;    // TODO: Actually validate | ||||
|  | @ -361,7 +335,7 @@ namespace bitwardenSelfLicensor | |||
|         } | ||||
| 
 | ||||
|         static void GenerateOrgLicense(X509Certificate2 cert, string corePath, | ||||
|             string userName, string email, Guid instalId, string key) | ||||
|             string userName, string email, Guid instalId, string businessName, string key) | ||||
|         { | ||||
|             var core = AssemblyLoadContext.Default.LoadFromAssemblyPath(corePath); | ||||
| 
 | ||||
|  | @ -379,7 +353,7 @@ namespace bitwardenSelfLicensor | |||
|             set("Id", Guid.NewGuid()); | ||||
|             set("Name", userName); | ||||
|             set("BillingEmail", email); | ||||
|             set("BusinessName", "BitBetter"); | ||||
|             set("BusinessName", string.IsNullOrWhiteSpace(businessName) ? "BitBetter" : businessName); | ||||
|             set("Enabled", true); | ||||
|             set("Plan", "Custom"); | ||||
|             set("PlanType", (byte)6); | ||||
|  |  | |||
|  | @ -2,11 +2,17 @@ | |||
| 
 | ||||
| script_dir=`cd $(dirname $0); pwd` | ||||
| 
 | ||||
| # Grab the absolute path to the default pfx location | ||||
| cert_path=`cd ./.keys; ls -d -1 $PWD/cert.pfx` | ||||
| 
 | ||||
| if [ "$#" -lt "1" ]; then | ||||
|     echo "USAGE: $0 <ABSOLUTE PATH TO CERT.PFX> [License Gen args...]" | ||||
|     exit 1 | ||||
| fi | ||||
| elif [ "$#" -ge "2" ]; then | ||||
|     # If a cert path is provided manually, override the default | ||||
|     cert_path=$1 | ||||
|     shift | ||||
| fi | ||||
| 
 | ||||
| docker run -it -v "$cert_path:/cert.pfx" bitbetter/licensegen "$@" | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user