mirror of
https://github.com/jakeswenson/BitBetter.git
synced 2025-09-15 06:13:26 +00:00
Refactor and fixes
This commit is contained in:
parent
52fabd9a95
commit
93cae61d66
|
@ -10,30 +10,33 @@ namespace licenseGen;
|
|||
|
||||
internal class Program
|
||||
{
|
||||
private static readonly CommandLineApplication App = new();
|
||||
private static readonly CommandOption Cert = App.Option("--cert", "cert file", CommandOptionType.SingleValue);
|
||||
private static readonly CommandOption CoreDll = App.Option("--core", "path to core dll", CommandOptionType.SingleValue);
|
||||
|
||||
private static Int32 Main(String[] args)
|
||||
{
|
||||
CommandLineApplication app = new();
|
||||
CommandOption cert = app.Option("--cert", "cert file", CommandOptionType.SingleValue);
|
||||
CommandOption coreDll = app.Option("--core", "path to core dll", CommandOptionType.SingleValue);
|
||||
App.HelpOption("-? | -h | --help");
|
||||
|
||||
Boolean CertExists()
|
||||
if (!File.Exists(Cert.Value()))
|
||||
{
|
||||
return File.Exists(cert.Value());
|
||||
App.Error.WriteLine($"Can't find certificate at: {Cert.Value()}");
|
||||
App.ShowHelp();
|
||||
return 1;
|
||||
}
|
||||
if (!File.Exists(CoreDll.Value()))
|
||||
{
|
||||
App.Error.WriteLine($"Can't find core dll at: {CoreDll.Value()}");
|
||||
App.ShowHelp();
|
||||
return 1;
|
||||
}
|
||||
if (Cert == null || String.IsNullOrWhiteSpace(Cert.Value()) || CoreDll == null || String.IsNullOrWhiteSpace(CoreDll.Value()))
|
||||
{
|
||||
App.ShowHelp();
|
||||
return 1;
|
||||
}
|
||||
|
||||
Boolean CoreExists()
|
||||
{
|
||||
return File.Exists(coreDll.Value());
|
||||
}
|
||||
|
||||
Boolean VerifyTopOptions()
|
||||
{
|
||||
return !String.IsNullOrWhiteSpace(cert.Value()) &&
|
||||
!String.IsNullOrWhiteSpace(coreDll.Value()) &&
|
||||
CertExists() && CoreExists();
|
||||
}
|
||||
|
||||
app.Command("interactive", config =>
|
||||
App.Command("interactive", config =>
|
||||
{
|
||||
String buff, licenseType = "", name = "", email = "", businessName="";
|
||||
Int16 storage = 0;
|
||||
|
@ -43,15 +46,6 @@ internal class Program
|
|||
|
||||
config.OnExecute(() =>
|
||||
{
|
||||
if (!VerifyTopOptions())
|
||||
{
|
||||
if (!CoreExists()) config.Error.WriteLine($"Can't find core dll at: {coreDll.Value()}");
|
||||
if (!CertExists()) config.Error.WriteLine($"Can't find certificate at: {cert.Value()}");
|
||||
|
||||
config.ShowHelp();
|
||||
return 1;
|
||||
}
|
||||
|
||||
Console.WriteLine("Interactive license mode...");
|
||||
|
||||
while (licenseType == "")
|
||||
|
@ -59,51 +53,55 @@ internal class Program
|
|||
Console.WriteLine("What would you like to generate, a [u]ser license or an [o]rg license: ");
|
||||
buff = Console.ReadLine();
|
||||
|
||||
if(buff == "u")
|
||||
switch (buff)
|
||||
{
|
||||
licenseType = "user";
|
||||
Console.WriteLine("Okay, we will generate a user license.");
|
||||
|
||||
while (!validGuid)
|
||||
case "u":
|
||||
{
|
||||
Console.WriteLine("Please provide the user's guid — refer to the Readme for details on how to retrieve this. [GUID]: ");
|
||||
buff = Console.ReadLine();
|
||||
licenseType = "user";
|
||||
Console.WriteLine("Okay, we will generate a user license.");
|
||||
|
||||
if (Guid.TryParse(buff, out guid))validGuid = true;
|
||||
else Console.WriteLine("The user-guid provided does not appear to be valid!");
|
||||
}
|
||||
}
|
||||
else if (buff == "o")
|
||||
{
|
||||
licenseType = "org";
|
||||
Console.WriteLine("Okay, we will generate an organization license.");
|
||||
|
||||
while (!validInstallid)
|
||||
{
|
||||
Console.WriteLine("Please provide your Bitwarden Install-ID — refer to the Readme for details on how to retrieve this. [Install-ID]: ");
|
||||
buff = Console.ReadLine();
|
||||
|
||||
if (Guid.TryParse(buff, out installid)) validInstallid = true;
|
||||
else Console.WriteLine("The install-id provided does not appear to be valid.");
|
||||
}
|
||||
|
||||
while (businessName == "")
|
||||
{
|
||||
Console.WriteLine("Please enter a business name, default is BitBetter. [Business Name]: ");
|
||||
buff = Console.ReadLine();
|
||||
if (buff == "")
|
||||
while (!validGuid)
|
||||
{
|
||||
businessName = "BitBetter";
|
||||
}
|
||||
else if (CheckBusinessName(buff))
|
||||
{
|
||||
businessName = buff;
|
||||
Console.WriteLine("Please provide the user's guid — refer to the Readme for details on how to retrieve this. [GUID]: ");
|
||||
buff = Console.ReadLine();
|
||||
|
||||
if (Guid.TryParse(buff, out guid))validGuid = true;
|
||||
else Console.WriteLine("The user-guid provided does not appear to be valid!");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Unrecognized option \'" + buff + "\'.");
|
||||
case "o":
|
||||
{
|
||||
licenseType = "org";
|
||||
Console.WriteLine("Okay, we will generate an organization license.");
|
||||
|
||||
while (!validInstallid)
|
||||
{
|
||||
Console.WriteLine("Please provide your Bitwarden Install-ID — refer to the Readme for details on how to retrieve this. [Install-ID]: ");
|
||||
buff = Console.ReadLine();
|
||||
|
||||
if (Guid.TryParse(buff, out installid)) validInstallid = true;
|
||||
else Console.WriteLine("The install-id provided does not appear to be valid.");
|
||||
}
|
||||
|
||||
while (businessName == "")
|
||||
{
|
||||
Console.WriteLine("Please enter a business name, default is BitBetter. [Business Name]: ");
|
||||
buff = Console.ReadLine();
|
||||
if (buff == "")
|
||||
{
|
||||
businessName = "BitBetter";
|
||||
}
|
||||
else if (CheckBusinessName(buff))
|
||||
{
|
||||
businessName = buff;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
Console.WriteLine("Unrecognized option \'" + buff + "\'.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,7 +109,7 @@ internal class Program
|
|||
{
|
||||
Console.WriteLine("Please provide the username this license will be registered to. [username]: ");
|
||||
buff = Console.ReadLine();
|
||||
if ( CheckUsername(buff) ) name = buff;
|
||||
if (CheckUsername(buff)) name = buff;
|
||||
}
|
||||
|
||||
while (email == "")
|
||||
|
@ -141,39 +139,46 @@ internal class Program
|
|||
}
|
||||
}
|
||||
|
||||
if (licenseType == "user")
|
||||
switch (licenseType)
|
||||
{
|
||||
Console.WriteLine("Confirm creation of \"user\" license for username: \"" + name + "\", email: \"" + email + "\", Storage: \"" + storage + " GB\", User-GUID: \"" + guid + "\"? Y/n");
|
||||
buff = Console.ReadLine();
|
||||
if ( buff is "" or "y" or "Y" )
|
||||
case "user":
|
||||
{
|
||||
GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name, email, storage, guid, null);
|
||||
Console.WriteLine("Confirm creation of \"user\" license for username: \"" + name + "\", email: \"" + email + "\", Storage: \"" + storage + " GB\", User-GUID: \"" + guid + "\"? Y/n");
|
||||
buff = Console.ReadLine();
|
||||
if (buff is "" or "y" or "Y")
|
||||
{
|
||||
GenerateUserLicense(new X509Certificate2(Cert.Value(), "test"), CoreDll.Value(), name, email, storage, guid, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Exiting...");
|
||||
return 0;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
else
|
||||
case "org":
|
||||
{
|
||||
Console.WriteLine("Exiting...");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if (licenseType == "org")
|
||||
{
|
||||
Console.WriteLine("Confirm creation of \"organization\" license for business name: \"" + businessName + "\", username: \"" + name + "\", email: \"" + email + "\", Storage: \"" + storage + " GB\", Install-ID: \"" + installid + "\"? Y/n");
|
||||
buff = Console.ReadLine();
|
||||
if ( buff is "" or "y" or "Y" )
|
||||
{
|
||||
GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name, email, storage, installid, businessName, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Exiting...");
|
||||
return 0;
|
||||
Console.WriteLine("Confirm creation of \"organization\" license for business name: \"" + businessName + "\", username: \"" + name + "\", email: \"" + email + "\", Storage: \"" + storage + " GB\", Install-ID: \"" + installid + "\"? Y/n");
|
||||
buff = Console.ReadLine();
|
||||
if (buff is "" or "y" or "Y")
|
||||
{
|
||||
GenerateOrgLicense(new X509Certificate2(Cert.Value(), "test"), CoreDll.Value(), name, email, storage, installid, businessName, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Exiting...");
|
||||
return 0;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
});
|
||||
});
|
||||
app.Command("user", config =>
|
||||
App.Command("user", config =>
|
||||
{
|
||||
CommandArgument name = config.Argument("Name", "your name");
|
||||
CommandArgument email = config.Argument("Email", "your email");
|
||||
|
@ -183,15 +188,6 @@ internal class Program
|
|||
|
||||
config.OnExecute(() =>
|
||||
{
|
||||
if (!VerifyTopOptions())
|
||||
{
|
||||
if (!CoreExists()) config.Error.WriteLine($"Can't find core dll at: {coreDll.Value()}");
|
||||
if (!CertExists()) config.Error.WriteLine($"Can't find certificate at: {cert.Value()}");
|
||||
|
||||
config.ShowHelp();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (String.IsNullOrWhiteSpace(name.Value) || String.IsNullOrWhiteSpace(email.Value))
|
||||
{
|
||||
config.Error.WriteLine($"Some arguments are missing: Name='{name.Value}' Email='{email.Value}'");
|
||||
|
@ -219,12 +215,12 @@ internal class Program
|
|||
storageShort = (Int16) parsedStorage;
|
||||
}
|
||||
|
||||
GenerateUserLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, storageShort, userId, key.Value);
|
||||
GenerateUserLicense(new X509Certificate2(Cert.Value()!, "test"), CoreDll.Value(), name.Value, email.Value, storageShort, userId, key.Value);
|
||||
|
||||
return 0;
|
||||
});
|
||||
});
|
||||
app.Command("org", config =>
|
||||
App.Command("org", config =>
|
||||
{
|
||||
CommandArgument name = config.Argument("Name", "your name");
|
||||
CommandArgument email = config.Argument("Email", "your email");
|
||||
|
@ -235,18 +231,7 @@ internal class Program
|
|||
|
||||
config.OnExecute(() =>
|
||||
{
|
||||
if (!VerifyTopOptions())
|
||||
{
|
||||
if (!CoreExists()) config.Error.WriteLine($"Can't find core dll at: {coreDll.Value()}");
|
||||
if (!CertExists()) config.Error.WriteLine($"Can't find certificate at: {cert.Value()}");
|
||||
|
||||
config.ShowHelp();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (String.IsNullOrWhiteSpace(name.Value) ||
|
||||
String.IsNullOrWhiteSpace(email.Value) ||
|
||||
String.IsNullOrWhiteSpace(installId.Value))
|
||||
if (String.IsNullOrWhiteSpace(name.Value) || String.IsNullOrWhiteSpace(email.Value) || String.IsNullOrWhiteSpace(installId.Value))
|
||||
{
|
||||
config.Error.WriteLine($"Some arguments are missing: Name='{name.Value}' Email='{email.Value}' InstallId='{installId.Value}'");
|
||||
config.ShowHelp(true);
|
||||
|
@ -271,26 +256,24 @@ internal class Program
|
|||
config.ShowHelp(true);
|
||||
return 1;
|
||||
}
|
||||
storageShort = (Int16) parsedStorage;
|
||||
storageShort = (Int16)parsedStorage;
|
||||
}
|
||||
|
||||
GenerateOrgLicense(new X509Certificate2(cert.Value(), "test"), coreDll.Value(), name.Value, email.Value, storageShort, installationId, businessName.Value, key.Value);
|
||||
GenerateOrgLicense(new X509Certificate2(Cert.Value()!, "test"), CoreDll.Value(), name.Value, email.Value, storageShort, installationId, businessName.Value, key.Value);
|
||||
|
||||
return 0;
|
||||
});
|
||||
});
|
||||
|
||||
app.OnExecute(() =>
|
||||
App.OnExecute(() =>
|
||||
{
|
||||
app.ShowHelp();
|
||||
App.ShowHelp();
|
||||
return 10;
|
||||
});
|
||||
|
||||
app.HelpOption("-? | -h | --help");
|
||||
|
||||
try
|
||||
{
|
||||
return app.Execute(args);
|
||||
return App.Execute(args);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -351,8 +334,33 @@ internal class Program
|
|||
Type type = core.GetType("Bit.Core.Billing.Models.Business.UserLicense");
|
||||
Type licenseTypeEnum = core.GetType("Bit.Core.Enums.LicenseType");
|
||||
|
||||
if (type == null)
|
||||
{
|
||||
Console.WriteLine("Could not find type!");
|
||||
return;
|
||||
}
|
||||
if (licenseTypeEnum == null)
|
||||
{
|
||||
Console.WriteLine("Could not find license licenseTypeEnum!");
|
||||
return;
|
||||
}
|
||||
|
||||
Object license = Activator.CreateInstance(type);
|
||||
|
||||
MethodInfo computeHash = type.GetMethod("ComputeHash");
|
||||
if (computeHash == null)
|
||||
{
|
||||
Console.WriteLine("Could not find ComputeHash!");
|
||||
return;
|
||||
}
|
||||
|
||||
MethodInfo sign = type.GetMethod("Sign");
|
||||
if (sign == null)
|
||||
{
|
||||
Console.WriteLine("Could not find sign!");
|
||||
return;
|
||||
}
|
||||
|
||||
Set("LicenseKey", String.IsNullOrWhiteSpace(key) ? Guid.NewGuid().ToString("n") : key);
|
||||
Set("Id", userId);
|
||||
Set("Name", userName);
|
||||
|
@ -365,8 +373,8 @@ internal class Program
|
|||
Set("Expires", DateTime.UtcNow.AddYears(100));
|
||||
Set("Trial", false);
|
||||
Set("LicenseType", Enum.Parse(licenseTypeEnum, "User"));
|
||||
Set("Hash", Convert.ToBase64String((Byte[])type.GetMethod("ComputeHash").Invoke(license, [])));
|
||||
Set("Signature", Convert.ToBase64String((Byte[])type.GetMethod("Sign").Invoke(license, [cert])));
|
||||
Set("Hash", Convert.ToBase64String(((Byte[])computeHash.Invoke(license, []))!));
|
||||
Set("Signature", Convert.ToBase64String((Byte[])sign.Invoke(license, [cert])!));
|
||||
|
||||
Console.WriteLine(JsonConvert.SerializeObject(license, Formatting.Indented));
|
||||
return;
|
||||
|
@ -381,12 +389,42 @@ internal class Program
|
|||
{
|
||||
Assembly core = AssemblyLoadContext.Default.LoadFromAssemblyPath(corePath);
|
||||
|
||||
Type type = core.GetType("Bit.Core.Models.Billing.Business.OrganizationLicense");
|
||||
Type type = core.GetType("Bit.Core.Billing.Organizations.Models");
|
||||
Type licenseTypeEnum = core.GetType("Bit.Core.Enums.LicenseType");
|
||||
Type planTypeEnum = core.GetType("Bit.Core.Billing.Enums.PlanType");
|
||||
|
||||
if (type == null)
|
||||
{
|
||||
Console.WriteLine("Could not find type!");
|
||||
return;
|
||||
}
|
||||
if (licenseTypeEnum == null)
|
||||
{
|
||||
Console.WriteLine("Could not find licenseTypeEnum!");
|
||||
return;
|
||||
}
|
||||
if (planTypeEnum == null)
|
||||
{
|
||||
Console.WriteLine("Could not find planTypeEnum!");
|
||||
return;
|
||||
}
|
||||
|
||||
Object license = Activator.CreateInstance(type);
|
||||
|
||||
MethodInfo computeHash = type.GetMethod("ComputeHash");
|
||||
if (computeHash == null)
|
||||
{
|
||||
Console.WriteLine("Could not find ComputeHash!");
|
||||
return;
|
||||
}
|
||||
|
||||
MethodInfo sign = type.GetMethod("Sign");
|
||||
if (sign == null)
|
||||
{
|
||||
Console.WriteLine("Could not find sign!");
|
||||
return;
|
||||
}
|
||||
|
||||
Set("LicenseKey", String.IsNullOrWhiteSpace(key) ? Guid.NewGuid().ToString("n") : key);
|
||||
Set("InstallationId", instalId);
|
||||
Set("Id", Guid.NewGuid());
|
||||
|
@ -431,8 +469,8 @@ internal class Program
|
|||
Set("UseRiskInsights", true);
|
||||
Set("UseOrganizationDomains", true);
|
||||
Set("UseAdminSponsoredFamilies", true);
|
||||
Set("Hash", Convert.ToBase64String((Byte[])type.GetMethod("ComputeHash").Invoke(license, [])));
|
||||
Set("Signature", Convert.ToBase64String((Byte[])type.GetMethod("Sign").Invoke(license, [cert])));
|
||||
Set("Hash", Convert.ToBase64String((Byte[])computeHash.Invoke(license, [])!));
|
||||
Set("Signature", Convert.ToBase64String((Byte[])sign.Invoke(license, [cert])!));
|
||||
|
||||
Console.WriteLine(JsonConvert.SerializeObject(license, Formatting.Indented));
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue
Block a user