Skip to content

Commit f4342e2

Browse files
committed
Add SingleUserRecipe for seeding a single known user
1 parent 92f2555 commit f4342e2

3 files changed

Lines changed: 101 additions & 4 deletions

File tree

util/Seeder/Factories/UserSeeder.cs

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,50 @@
11
using Bit.Core.Enums;
2+
using Bit.Core.Utilities;
23
using Bit.Infrastructure.EntityFramework.Models;
34

45
namespace Bit.Seeder.Factories;
56

6-
public class UserSeeder
7+
public struct UserData
78
{
8-
public static User CreateUser(string email)
9+
public string Email;
10+
public Guid Id;
11+
public string? Key;
12+
public string? PublicKey;
13+
public string? PrivateKey;
14+
public string? ApiKey;
15+
public KdfType Kdf;
16+
public int KdfIterations;
17+
}
18+
19+
#pragma warning disable CS9113 // Parameter is unread.
20+
public class UserSeeder(Guid mangleId)
21+
#pragma warning restore CS9113 // Parameter is unread.
22+
{
23+
private string MangleEmail(string email)
24+
{
25+
return "admin@large.test"; // only this email works, for now
26+
// return $"{mangleId}+{email}";
27+
}
28+
29+
public User CreateUser(string email)
30+
{
31+
return new User
32+
{
33+
Id = CoreHelpers.GenerateComb(),
34+
Email = MangleEmail(email),
35+
MasterPassword = "AQAAAAIAAYagAAAAEBATmF66OHMpHuHKc1CsGZQ1ltHUHyhYK+7e4re3bVFi16SOpLpDfzdFswnvFQs2Rg==",
36+
SecurityStamp = "4830e359-e150-4eae-be2a-996c81c5e609",
37+
Key = "2.z/eLKFhd62qy9RzXu3UHgA==|fF6yNupiCIguFKSDTB3DoqcGR0Xu4j+9VlnMyT5F3PaWIcGhzQKIzxdB95nhslaCQv3c63M7LBnvzVo1J9SUN85RMbP/57bP1HvhhU1nvL8=|IQPtf8v7k83MFZEhazSYXSdu98BBU5rqtvC4keVWyHM=",
38+
PublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0Ww2chogqCpaAR7Uw448am4b7vDFXiM5kXjFlGfXBlrAdAqTTggEvTDlMNYqPlCo+mBM6iFmTTUY9rpZBvFskMnKvsvpJ47/fehAH2o2e3Ulv/5NFevaVCMCmpkBDtbMbO1A4a3btdRtCP8DsKWMefHauEpaoLxNTLWnOIZVfCMjsSgx2EvULHAZPTtbFwm4+UVKniM4ds4jvOsD85h4jn2aLs/jWJXFfxN8iVSqEqpC2TBvsPdyHb49xQoWWfF0Z6BiNqeNGKEU9Uos1pjL+kzhEzzSpH31PZT/ufJ/oo4+93wrUt57hb6f0jxiXhwd5yQ+9F6wVwpbfkq0IwhjOwIDAQAB",
39+
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=",
40+
ApiKey = "7gp59kKHt9kMlks0BuNC4IjNXYkljR",
41+
42+
Kdf = KdfType.PBKDF2_SHA256,
43+
KdfIterations = 600_000,
44+
};
45+
}
46+
47+
public static User CreateUserNoMangle(string email)
948
{
1049
return new User
1150
{
@@ -22,4 +61,32 @@ public static User CreateUser(string email)
2261
KdfIterations = 600_000,
2362
};
2463
}
64+
65+
public Dictionary<string, string?> GetMangleMap(User user, UserData expectedUserData)
66+
{
67+
var mangleMap = new Dictionary<string, string?>
68+
{
69+
{expectedUserData.Email, MangleEmail(expectedUserData.Email) },
70+
{expectedUserData.Id.ToString(), user.Id.ToString() },
71+
{expectedUserData.Kdf.ToString(), user.Kdf.ToString() },
72+
{expectedUserData.KdfIterations.ToString(), user.KdfIterations.ToString() }
73+
};
74+
if (expectedUserData.Key != null)
75+
{
76+
mangleMap[expectedUserData.Key] = user.Key;
77+
}
78+
if (expectedUserData.PublicKey != null)
79+
{
80+
mangleMap[expectedUserData.PublicKey] = user.PublicKey;
81+
}
82+
if (expectedUserData.PrivateKey != null)
83+
{
84+
mangleMap[expectedUserData.PrivateKey] = user.PrivateKey;
85+
}
86+
if (expectedUserData.ApiKey != null)
87+
{
88+
mangleMap[expectedUserData.ApiKey] = user.ApiKey;
89+
}
90+
return mangleMap;
91+
}
2592
}

util/Seeder/Recipes/OrganizationWithUsersRecipe.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ public class OrganizationWithUsersRecipe(DatabaseContext db)
99
{
1010
public RecipeResult Seed(string name, int users, string domain)
1111
{
12+
var mangleId = Guid.NewGuid();
1213
var organization = OrganizationSeeder.CreateEnterprise(name, domain, users);
13-
var user = UserSeeder.CreateUser($"admin@{domain}");
14+
var user = UserSeeder.CreateUserNoMangle($"admin@{domain}");
1415
var orgUser = organization.CreateOrganizationUser(user);
1516

1617
var additionalUsers = new List<User>();
1718
var additionalOrgUsers = new List<OrganizationUser>();
1819
for (var i = 0; i < users; i++)
1920
{
20-
var additionalUser = UserSeeder.CreateUser($"user{i}@{domain}");
21+
var additionalUser = UserSeeder.CreateUserNoMangle($"user{i}@{domain}");
2122
additionalUsers.Add(additionalUser);
2223
additionalOrgUsers.Add(organization.CreateOrganizationUser(additionalUser));
2324
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using Bit.Core.Enums;
2+
using Bit.Infrastructure.EntityFramework.Repositories;
3+
using Bit.Seeder.Factories;
4+
5+
namespace Bit.Seeder.Recipes;
6+
7+
public class SingleUserRecipe(DatabaseContext db)
8+
{
9+
public Dictionary<string, string?> Seed(string email)
10+
{
11+
var userSeeder = new UserSeeder(Guid.NewGuid());
12+
var user = userSeeder.CreateUser(email);
13+
14+
db.Add(user);
15+
db.SaveChanges();
16+
17+
return userSeeder.GetMangleMap(user, new UserData
18+
{
19+
Email = email,
20+
Id = Guid.Parse("00000000-0000-0000-0000-000000000001"),
21+
Key = "seeded_key",
22+
PublicKey = "seeded_public_key",
23+
PrivateKey = "seeded_private_key",
24+
ApiKey = "seeded_api_key",
25+
Kdf = KdfType.PBKDF2_SHA256,
26+
KdfIterations = 600_000,
27+
});
28+
}
29+
}

0 commit comments

Comments
 (0)