Пример #1
0
        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);
            });
        }
Пример #2
0
        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
            {
            }
        }