public void Seed(IConfiguration configuration) { this.Database.EnsureDeleted(); this.Database.EnsureCreated(); var adminRole = new Microsoft.AspNetCore.Identity.IdentityRole("Administrator") { NormalizedName = "Administrator".ToUpper(), ConcurrencyStamp = Guid.NewGuid().ToString() }; Roles.Add(adminRole); var admins = new List <ApplicationUser>(); var hasher = new ExploitablePasswordHasher <ApplicationUser>(); var appAdmin = new ApplicationUser() { UserName = "******", Email = "*****@*****.**", NormalizedUserName = "******".ToUpper(), NormalizedEmail = "*****@*****.**".ToUpper(), SecurityStamp = Guid.NewGuid().ToString(), ConcurrencyStamp = Guid.NewGuid().ToString(), LockoutEnabled = false, ProfileImagePath = "wwwroot/images/businessman_512.png", PasswordHash = hasher.HashPassword(null, "Password1!") //Yeah, I know...Weak on purpose... }; Users.Add(appAdmin); var userData = File.ReadAllLines("Users.bak").Where(x => x.Split(',').Count() == 2); var r = new Random(100); foreach (var u in userData) { var x = u.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries); var user = new ApplicationUser() { UserName = x[0], Email = x[0], PhoneNumber = $"1.{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}.{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}.{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}", NormalizedUserName = x[0].ToUpper(), NormalizedEmail = x[0].ToUpper(), SecurityStamp = Guid.NewGuid().ToString(), ConcurrencyStamp = Guid.NewGuid().ToString(), LockoutEnabled = true, SSN = $"{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}-{r.Next().ToString()[0]}{r.Next().ToString()[0]}-{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}", PasswordHash = hasher.HashPassword(null, x[1]) }; Users.Add(user); if (r.NextDouble() >= .95) { admins.Add(user); //only 5% get to be admin } } SaveChanges(); UserRoles.Add(new IdentityUserRole <string>() { RoleId = adminRole.Id, UserId = appAdmin.Id }); foreach (var u in admins) { UserRoles.Add(new IdentityUserRole <string>() { RoleId = adminRole.Id, UserId = u.Id }); } SaveChanges(); var mgr = new Managers.BankingAccountManager(configuration); float runningBalance = 100000000; var masterAccount = mgr.CreateAccount(appAdmin, runningBalance); var rnd = new Random(); var max = runningBalance / Users.Count(); Users.Where(x => x.Id != appAdmin.Id).AsNoTracking().ToList().ForEach(x => { var act = mgr.CreateAccount(x, 0); var seedVal = (float)rnd.NextDouble() * max; runningBalance -= seedVal; var t = mgr.CreateTransaction(masterAccount, act, seedVal, $"Banking Account Seeding with {seedVal.ToString("0.00")}", DateTime.Now); mgr.CompleteTransaction(t); }); }
public bool Seed(IConfiguration configuration, int seedUserCount = 1000) { try { Console.WriteLine("Ensure DB Deleted"); this.Database.EnsureDeleted(); Console.WriteLine("Ensure DB Created"); this.Database.EnsureCreated(); Console.WriteLine("Creating Admin"); var adminRole = new Microsoft.AspNetCore.Identity.IdentityRole("Administrator") { NormalizedName = "Administrator".ToUpper(), ConcurrencyStamp = Guid.NewGuid().ToString() }; Roles.Add(adminRole); var admins = new List <ApplicationUser>(); var hasher = new ExploitablePasswordHasher <ApplicationUser>(); var appAdmin = new ApplicationUser() { UserName = "******", Email = "*****@*****.**", NormalizedUserName = "******".ToUpper(), NormalizedEmail = "*****@*****.**".ToUpper(), SecurityStamp = Guid.NewGuid().ToString(), ConcurrencyStamp = Guid.NewGuid().ToString(), LockoutEnabled = false, ProfileImagePath = "wwwroot/images/businessman_512.png", PasswordHash = hasher.HashPassword(null, $"Password{DateTime.Now.Day}{DateTime.Now.Year}!") //Yeah, I know...Weak on purpose... }; Users.Add(appAdmin); Console.WriteLine("Creating Users"); var userData = File.ReadAllLines("Users.bak").Where(x => x.Split(',').Count() == 2).OrderBy(x => Guid.NewGuid()).Take(seedUserCount); var r = new Random(100); foreach (var u in userData) { var x = u.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries); var user = new ApplicationUser() { UserName = x[0], Email = x[0], PhoneNumber = $"1.{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}.{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}.{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}", NormalizedUserName = x[0].ToUpper(), NormalizedEmail = x[0].ToUpper(), SecurityStamp = Guid.NewGuid().ToString(), ConcurrencyStamp = Guid.NewGuid().ToString(), LockoutEnabled = true, SSN = $"{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}-{r.Next().ToString()[0]}{r.Next().ToString()[0]}-{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}{r.Next().ToString()[0]}", PasswordHash = hasher.HashPassword(null, x[1]) }; Console.WriteLine($"Creating {user.UserName}"); Users.Add(user); if (r.NextDouble() >= .99) { admins.Add(user); //only 1% get to be admin } } SaveChanges(); Console.WriteLine($"Selecting Admin"); UserRoles.Add(new IdentityUserRole <string>() { RoleId = adminRole.Id, UserId = appAdmin.Id }); foreach (var u in admins) { UserRoles.Add(new IdentityUserRole <string>() { RoleId = adminRole.Id, UserId = u.Id }); } SaveChanges(); //Guac Access if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("POSTGRES_HOSTNAME")) && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("POSTGRES_DATABASE")) && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("POSTGRES_PASSWORD")) && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("POSTGRES_USER")) && GuacamoleDB.TestConnection().Result) { Console.WriteLine($"Adding Guacamole Admin Users"); var tasks = new List <Task>(); foreach (var user in admins) { tasks.Add(GuacamoleDB.CreateUserEntry(user.UserName)); } tasks.Add(GuacamoleDB.CreateSshConnections()); Task.WaitAll(tasks.ToArray()); } else { Console.WriteLine($"Skipping Guacamole Admin Step"); } //Console Dump Admins foreach (var user in admins) { Console.WriteLine($"Admin: {user}"); } Console.WriteLine($"Randomly Distributing Funds"); var mgr = new Managers.BankingAccountManager(configuration); float runningBalance = 100000000; var masterAccount = mgr.CreateAccount(appAdmin, runningBalance); var rnd = new Random(); var max = runningBalance / Users.Count(); var users = Users.Where(x => x.Id != appAdmin.Id).AsNoTracking().ToList(); //Account Seeding var accounts = users.Select(x => { var act = mgr.CreateAccount(x, 0); var seedVal = (float)rnd.NextDouble() * max; runningBalance -= seedVal; var t = mgr.CreateTransaction(masterAccount, act, seedVal, $"Banking Account Seeding with {seedVal.ToString("0.00")}", DateTime.Now, true); mgr.CompleteTransaction(t); return(new { act, seedVal }); }).ToList(); //Account Transfers accounts.ForEach(x => { accounts.OrderBy(y => Guid.NewGuid()).Take((int)Math.Ceiling(rnd.NextDouble() * 5)).ToList().ForEach(y => { var xfr = x.seedVal * .1f; var t = mgr.CreateTransaction(x.act, y.act, xfr, $"Random Transfer with {xfr.ToString("0.00")}", DateTime.Now, true); mgr.CompleteTransaction(t); }); }); Console.WriteLine($"Completed Fund Transfers"); return(true); } catch (Exception ex) { Console.WriteLine(ex.ToString()); return(false); } finally { } }