mirror of
https://github.com/bitwarden/server
synced 2025-12-22 11:13:27 +00:00
Add SingleUserRecipe for seeding a single known user
This commit is contained in:
@@ -1,11 +1,50 @@
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Core.Utilities;
|
||||
using Bit.Infrastructure.EntityFramework.Models;
|
||||
|
||||
namespace Bit.Seeder.Factories;
|
||||
|
||||
public class UserSeeder
|
||||
public struct UserData
|
||||
{
|
||||
public static User CreateUser(string email)
|
||||
public string Email;
|
||||
public Guid Id;
|
||||
public string? Key;
|
||||
public string? PublicKey;
|
||||
public string? PrivateKey;
|
||||
public string? ApiKey;
|
||||
public KdfType Kdf;
|
||||
public int KdfIterations;
|
||||
}
|
||||
|
||||
#pragma warning disable CS9113 // Parameter is unread.
|
||||
public class UserSeeder(Guid mangleId)
|
||||
#pragma warning restore CS9113 // Parameter is unread.
|
||||
{
|
||||
private string MangleEmail(string email)
|
||||
{
|
||||
return "admin@large.test"; // only this email works, for now
|
||||
// return $"{mangleId}+{email}";
|
||||
}
|
||||
|
||||
public User CreateUser(string email)
|
||||
{
|
||||
return new User
|
||||
{
|
||||
Id = CoreHelpers.GenerateComb(),
|
||||
Email = MangleEmail(email),
|
||||
MasterPassword = "AQAAAAIAAYagAAAAEBATmF66OHMpHuHKc1CsGZQ1ltHUHyhYK+7e4re3bVFi16SOpLpDfzdFswnvFQs2Rg==",
|
||||
SecurityStamp = "4830e359-e150-4eae-be2a-996c81c5e609",
|
||||
Key = "2.z/eLKFhd62qy9RzXu3UHgA==|fF6yNupiCIguFKSDTB3DoqcGR0Xu4j+9VlnMyT5F3PaWIcGhzQKIzxdB95nhslaCQv3c63M7LBnvzVo1J9SUN85RMbP/57bP1HvhhU1nvL8=|IQPtf8v7k83MFZEhazSYXSdu98BBU5rqtvC4keVWyHM=",
|
||||
PublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Ww2chogqCpaAR7Uw448am4b7vDFXiM5kXjFlGfXBlrAdAqTTggEvTDlMNYqPlCo+mBM6iFmTTUY9rpZBvFskMnKvsvpJ47/fehAH2o2e3Ulv/5NFevaVCMCmpkBDtbMbO1A4a3btdRtCP8DsKWMefHauEpaoLxNTLWnOIZVfCMjsSgx2EvULHAZPTtbFwm4+UVKniM4ds4jvOsD85h4jn2aLs/jWJXFfxN8iVSqEqpC2TBvsPdyHb49xQoWWfF0Z6BiNqeNGKEU9Uos1pjL+kzhEzzSpH31PZT/ufJ/oo4+93wrUt57hb6f0jxiXhwd5yQ+9F6wVwpbfkq0IwhjOwIDAQAB",
|
||||
PrivateKey = "2.yN7l00BOlUE0Sb0M//Q53w==|EwKG/BduQRQ33Izqc/ogoBROIoI5dmgrxSo82sgzgAMIBt3A2FZ9vPRMY+GWT85JiqytDitGR3TqwnFUBhKUpRRAq4x7rA6A1arHrFp5Tp1p21O3SfjtvB3quiOKbqWk6ZaU1Np9HwqwAecddFcB0YyBEiRX3VwF2pgpAdiPbSMuvo2qIgyob0CUoC/h4Bz1be7Qa7B0Xw9/fMKkB1LpOm925lzqosyMQM62YpMGkjMsbZz0uPopu32fxzDWSPr+kekNNyLt9InGhTpxLmq1go/pXR2uw5dfpXc5yuta7DB0EGBwnQ8Vl5HPdDooqOTD9I1jE0mRyuBpWTTI3FRnu3JUh3rIyGBJhUmHqGZvw2CKdqHCIrQeQkkEYqOeJRJVdBjhv5KGJifqT3BFRwX/YFJIChAQpebNQKXe/0kPivWokHWwXlDB7S7mBZzhaAPidZvnuIhalE2qmTypDwHy22FyqV58T8MGGMchcASDi/QXI6kcdpJzPXSeU9o+NC68QDlOIrMVxKFeE7w7PvVmAaxEo0YwmuAzzKy9QpdlK0aab/xEi8V4iXj4hGepqAvHkXIQd+r3FNeiLfllkb61p6WTjr5urcmDQMR94/wYoilpG5OlybHdbhsYHvIzYoLrC7fzl630gcO6t4nM24vdB6Ymg9BVpEgKRAxSbE62Tqacxqnz9AcmgItb48NiR/He3n3ydGjPYuKk/ihZMgEwAEZvSlNxYONSbYrIGDtOY+8Nbt6KiH3l06wjZW8tcmFeVlWv+tWotnTY9IqlAfvNVTjtsobqtQnvsiDjdEVtNy/s2ci5TH+NdZluca2OVEr91Wayxh70kpM6ib4UGbfdmGgCo74gtKvKSJU0rTHakQ5L9JlaSDD5FamBRyI0qfL43Ad9qOUZ8DaffDCyuaVyuqk7cz9HwmEmvWU3VQ+5t06n/5kRDXttcw8w+3qClEEdGo1KeENcnXCB32dQe3tDTFpuAIMLqwXs6FhpawfZ5kPYvLPczGWaqftIs/RXJ/EltGc0ugw2dmTLpoQhCqrcKEBDoYVk0LDZKsnzitOGdi9mOWse7Se8798ib1UsHFUjGzISEt6upestxOeupSTOh0v4+AjXbDzRUyogHww3V+Bqg71bkcMxtB+WM+pn1XNbVTyl9NR040nhP7KEf6e9ruXAtmrBC2ah5cFEpLIot77VFZ9ilLuitSz+7T8n1yAh1IEG6xxXxninAZIzi2qGbH69O5RSpOJuJTv17zTLJQIIc781JwQ2TTwTGnx5wZLbffhCasowJKd2EVcyMJyhz6ru0PvXWJ4hUdkARJs3Xu8dus9a86N8Xk6aAPzBDqzYb1vyFIfBxP0oO8xFHgd30Cgmz8UrSE3qeWRrF8ftrI6xQnFjHBGWD/JWSvd6YMcQED0aVuQkuNW9ST/DzQThPzRfPUoiL10yAmV7Ytu4fR3x2sF0Yfi87YhHFuCMpV/DsqxmUizyiJuD938eRcH8hzR/VO53Qo3UIsqOLcyXtTv6THjSlTopQ+JOLOnHm1w8dzYbLN44OG44rRsbihMUQp+wUZ6bsI8rrOnm9WErzkbQFbrfAINdoCiNa6cimYIjvvnMTaFWNymqY1vZxGztQiMiHiHYwTfwHTXrb9j0uPM=|09J28iXv9oWzYtzK2LBT6Yht4IT4MijEkk0fwFdrVQ4=",
|
||||
ApiKey = "7gp59kKHt9kMlks0BuNC4IjNXYkljR",
|
||||
|
||||
Kdf = KdfType.PBKDF2_SHA256,
|
||||
KdfIterations = 600_000,
|
||||
};
|
||||
}
|
||||
|
||||
public static User CreateUserNoMangle(string email)
|
||||
{
|
||||
return new User
|
||||
{
|
||||
@@ -22,4 +61,32 @@ public class UserSeeder
|
||||
KdfIterations = 600_000,
|
||||
};
|
||||
}
|
||||
|
||||
public Dictionary<string, string?> GetMangleMap(User user, UserData expectedUserData)
|
||||
{
|
||||
var mangleMap = new Dictionary<string, string?>
|
||||
{
|
||||
{expectedUserData.Email, MangleEmail(expectedUserData.Email) },
|
||||
{expectedUserData.Id.ToString(), user.Id.ToString() },
|
||||
{expectedUserData.Kdf.ToString(), user.Kdf.ToString() },
|
||||
{expectedUserData.KdfIterations.ToString(), user.KdfIterations.ToString() }
|
||||
};
|
||||
if (expectedUserData.Key != null)
|
||||
{
|
||||
mangleMap[expectedUserData.Key] = user.Key;
|
||||
}
|
||||
if (expectedUserData.PublicKey != null)
|
||||
{
|
||||
mangleMap[expectedUserData.PublicKey] = user.PublicKey;
|
||||
}
|
||||
if (expectedUserData.PrivateKey != null)
|
||||
{
|
||||
mangleMap[expectedUserData.PrivateKey] = user.PrivateKey;
|
||||
}
|
||||
if (expectedUserData.ApiKey != null)
|
||||
{
|
||||
mangleMap[expectedUserData.ApiKey] = user.ApiKey;
|
||||
}
|
||||
return mangleMap;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,15 +9,16 @@ public class OrganizationWithUsersRecipe(DatabaseContext db)
|
||||
{
|
||||
public RecipeResult Seed(string name, int users, string domain)
|
||||
{
|
||||
var mangleId = Guid.NewGuid();
|
||||
var organization = OrganizationSeeder.CreateEnterprise(name, domain, users);
|
||||
var user = UserSeeder.CreateUser($"admin@{domain}");
|
||||
var user = UserSeeder.CreateUserNoMangle($"admin@{domain}");
|
||||
var orgUser = organization.CreateOrganizationUser(user);
|
||||
|
||||
var additionalUsers = new List<User>();
|
||||
var additionalOrgUsers = new List<OrganizationUser>();
|
||||
for (var i = 0; i < users; i++)
|
||||
{
|
||||
var additionalUser = UserSeeder.CreateUser($"user{i}@{domain}");
|
||||
var additionalUser = UserSeeder.CreateUserNoMangle($"user{i}@{domain}");
|
||||
additionalUsers.Add(additionalUser);
|
||||
additionalOrgUsers.Add(organization.CreateOrganizationUser(additionalUser));
|
||||
}
|
||||
|
||||
29
util/Seeder/Recipes/SingleUserRecipe.cs
Normal file
29
util/Seeder/Recipes/SingleUserRecipe.cs
Normal file
@@ -0,0 +1,29 @@
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Infrastructure.EntityFramework.Repositories;
|
||||
using Bit.Seeder.Factories;
|
||||
|
||||
namespace Bit.Seeder.Recipes;
|
||||
|
||||
public class SingleUserRecipe(DatabaseContext db)
|
||||
{
|
||||
public Dictionary<string, string?> Seed(string email)
|
||||
{
|
||||
var userSeeder = new UserSeeder(Guid.NewGuid());
|
||||
var user = userSeeder.CreateUser(email);
|
||||
|
||||
db.Add(user);
|
||||
db.SaveChanges();
|
||||
|
||||
return userSeeder.GetMangleMap(user, new UserData
|
||||
{
|
||||
Email = email,
|
||||
Id = Guid.Parse("00000000-0000-0000-0000-000000000001"),
|
||||
Key = "seeded_key",
|
||||
PublicKey = "seeded_public_key",
|
||||
PrivateKey = "seeded_private_key",
|
||||
ApiKey = "seeded_api_key",
|
||||
Kdf = KdfType.PBKDF2_SHA256,
|
||||
KdfIterations = 600_000,
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user