Exemplo n.º 1
0
        public static async Task SeedDb(IConfiguration config, IHostEnvironment env, IServiceProvider serviceProvider)
        {
            if (env.IsDevelopment())
            {
                using (var scope = serviceProvider.CreateScope())
                {
                    var userManager = (UserManager <PuckUser>)scope.ServiceProvider.GetService(typeof(UserManager <PuckUser>));
                    var roleManager = (RoleManager <PuckRole>)scope.ServiceProvider.GetService(typeof(RoleManager <PuckRole>));
                    var repo        = scope.ServiceProvider.GetService <I_Puck_Repository>();
                    if (repo.GetPuckUser().Count() == 0)
                    {
                        var roles = new List <string> {
                            PuckRoles.Cache, PuckRoles.Create, PuckRoles.Delete, PuckRoles.Domain, PuckRoles.Edit, PuckRoles.Localisation
                            , PuckRoles.Move, PuckRoles.Notify, PuckRoles.Publish, PuckRoles.Puck, PuckRoles.Revert, PuckRoles.Settings, PuckRoles.Sort, PuckRoles.Tasks
                            , PuckRoles.Unpublish, PuckRoles.Users, PuckRoles.Republish, PuckRoles.Copy, PuckRoles.ChangeType, PuckRoles.TimedPublish, PuckRoles.Audit
                        };

                        foreach (var roleName in roles)
                        {
                            if (!await roleManager.RoleExistsAsync(roleName))
                            {
                                var role = new PuckRole();
                                role.Name = roleName;
                                await roleManager.CreateAsync(role);
                            }
                        }
                        var adminEmail    = config.GetValue <string>("InitialUserEmail");
                        var adminPassword = config.GetValue <string>("InitialUserPassword");
                        if (!string.IsNullOrEmpty(adminEmail))
                        {
                            var admin = await userManager.FindByEmailAsync(adminEmail);

                            if (admin == null)
                            {
                                admin = new PuckUser {
                                    Email = adminEmail, UserName = adminEmail
                                };
                                var result = await userManager.CreateAsync(admin, adminPassword);
                            }
                            //userManager.AddPassword(admin.Id, adminPassword);
                            foreach (var roleName in roles)
                            {
                                if (!await userManager.IsInRoleAsync(admin, roleName))
                                {
                                    await userManager.AddToRoleAsync(admin, roleName);
                                }
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 2
0
        public static Mock <UserManager <PuckUser> > MockUserManager()
        {
            var store = new Mock <IUserStore <PuckUser> >();
            var user  = new PuckUser()
            {
                UserName = "******"
            };
            var mgr = new Mock <UserManager <PuckUser> >(store.Object, null, null, null, null, null, null, null, null);

            mgr.Object.UserValidators.Add(new UserValidator <PuckUser>());
            mgr.Object.PasswordValidators.Add(new PasswordValidator <PuckUser>());
            mgr.Setup(x => x.FindByNameAsync(It.IsAny <string>())).Returns(Task.FromResult(user));
            return(mgr);
        }
Exemplo n.º 3
0
        public async Task <JsonResult> Edit(PuckUserViewModel user, bool edit)
        {
            bool   success     = false;
            string message     = "";
            string startPath   = "/";
            Guid   startNodeId = Guid.Empty;
            var    model       = new PuckUserViewModel();

            try
            {
                if (!ModelState.IsValid)
                {
                    throw new Exception("model invalid.");
                }
                if (!edit)
                {
                    if (string.IsNullOrEmpty(user.Password))
                    {
                        throw new Exception("please enter a password");
                    }

                    var puser = new PuckUser
                    {
                        PuckFirstName   = user.FirstName,
                        PuckSurname     = user.Surname,
                        Email           = user.Email,
                        UserName        = user.UserName,
                        PuckUserVariant = user.UserVariant,
                        PuckStartNodeId = user.StartNode?.FirstOrDefault()?.Id ?? Guid.Empty
                    };
                    var result = await userManager.CreateAsync(puser, user.Password);

                    if (!result.Succeeded)
                    {
                        message = string.Join(" ", result.Errors.Select(x => x.Description));
                        throw new Exception(message);
                    }
                    if (user.Roles != null && user.Roles.Count > 0)
                    {
                        await userManager.AddToRolesAsync(puser, user.Roles.ToArray());
                    }
                    if (!await userManager.IsInRoleAsync(puser, PuckRoles.Puck))
                    {
                        await userManager.AddToRoleAsync(puser, PuckRoles.Puck);
                    }
                    success = true;
                }
                else
                {
                    var puser = await userManager.FindByEmailAsync(user.CurrentEmail);

                    if (puser == null)
                    {
                        throw new Exception("could not find user for edit");
                    }

                    if (!puser.Email.Equals(user.Email))
                    {
                        puser.Email = user.Email;
                    }
                    if (!puser.UserName.Equals(user.UserName))
                    {
                        puser.UserName = user.UserName;
                    }
                    user.Roles = user.Roles ?? new List <string>();
                    var           roles         = (await userManager.GetRolesAsync(puser)).ToList();
                    List <string> rolesToAdd    = new List <string>();
                    List <string> rolesToRemove = new List <string>();
                    //get roles to remove
                    foreach (var r in roles)
                    {
                        if (!user.Roles.Contains(r))
                        {
                            rolesToRemove.Add(r);
                        }
                    }
                    //get roles to add
                    foreach (var r in user.Roles)
                    {
                        if (!roles.Contains(r))
                        {
                            rolesToAdd.Add(r);
                        }
                    }
                    rolesToRemove.RemoveAll(x => x.Equals(PuckRoles.Puck));
                    if (rolesToRemove.Count > 0)
                    {
                        await userManager.RemoveFromRolesAsync(puser, rolesToRemove.ToArray());
                    }
                    if (rolesToAdd.Count > 0)
                    {
                        await userManager.AddToRolesAsync(puser, rolesToAdd);
                    }

                    if (!await userManager.IsInRoleAsync(puser, PuckRoles.Puck))
                    {
                        await userManager.AddToRoleAsync(puser, PuckRoles.Puck);
                    }

                    if (user.StartNode == null || user.StartNode.Count == 0)
                    {
                        puser.PuckStartNodeId = Guid.Empty;
                    }
                    else
                    {
                        Guid picked_id = user.StartNode.First().Id;
                        var  revision  = repo.GetPuckRevision().Where(x => x.Id == picked_id && x.Current).FirstOrDefault();
                        if (revision != null)
                        {
                            startPath = revision.Path + "/";
                        }
                        puser.PuckStartNodeId = picked_id;
                    }
                    if (!string.IsNullOrEmpty(user.UserVariant))
                    {
                        puser.PuckUserVariant = user.UserVariant;
                    }
                    puser.PuckFirstName = user.FirstName;
                    puser.PuckSurname   = user.Surname;
                    await userManager.UpdateAsync(puser);

                    startNodeId = puser.PuckStartNodeId.Value;

                    if (!string.IsNullOrEmpty(user.Password))
                    {
                        var token = await userManager.GeneratePasswordResetTokenAsync(puser);

                        var result = await userManager.ResetPasswordAsync(puser, token, user.Password);

                        if (result.Succeeded)
                        {
                            success = true;
                        }
                        else
                        {
                            success = false;
                            message = string.Join(" ", result.Errors.Select(x => x.Description));
                        }
                    }
                    else
                    {
                        success = true;
                    }
                }
            }
            catch (Exception ex) {
                log.Log(ex);
                success = false;
                message = ex.Message;
            }
            return(Json(new { success = success, message = message, startPath = startPath, startNodeId = startNodeId }));
        }
Exemplo n.º 4
0
        public static async Task SeedDb(IConfiguration config, IHostEnvironment env, IServiceProvider serviceProvider)
        {
            if (env.IsDevelopment() || env.IsStaging())
            {
                using (var scope = serviceProvider.CreateScope())
                {
                    var userManager = (UserManager <PuckUser>)scope.ServiceProvider.GetService(typeof(UserManager <PuckUser>));
                    var roleManager = (RoleManager <PuckRole>)scope.ServiceProvider.GetService(typeof(RoleManager <PuckRole>));
                    var repo        = scope.ServiceProvider.GetService <I_Puck_Repository>();

                    var roles = new List <string> {
                        PuckRoles.Cache, PuckRoles.Create, PuckRoles.Delete, PuckRoles.Domain, PuckRoles.Edit, PuckRoles.Localisation
                        , PuckRoles.Move, PuckRoles.Notify, PuckRoles.Publish, PuckRoles.Puck, PuckRoles.Revert, PuckRoles.Settings, PuckRoles.Sort, PuckRoles.Tasks
                        , PuckRoles.Unpublish, PuckRoles.Users, PuckRoles.Republish, PuckRoles.Copy, PuckRoles.ChangeType, PuckRoles.TimedPublish, PuckRoles.Audit, PuckRoles.Sync, PuckRoles.WorkflowDelete
                    };
                    foreach (var roleName in roles)
                    {
                        if (!await roleManager.RoleExistsAsync(roleName))
                        {
                            var role = new PuckRole();
                            role.Name = roleName;
                            await roleManager.CreateAsync(role);
                        }
                    }
                    if (repo.GetPuckUser().Count() == 0)
                    {
                        var adminEmail    = config.GetValue <string>("InitialUserEmail");
                        var adminPassword = config.GetValue <string>("InitialUserPassword");
                        if (!string.IsNullOrEmpty(adminEmail) && !string.IsNullOrEmpty(adminPassword))
                        {
                            var admin = await userManager.FindByEmailAsync(adminEmail);

                            if (admin == null)
                            {
                                admin = new PuckUser {
                                    Email = adminEmail, UserName = adminEmail, PuckUserGroups = "Administrator,"
                                };
                                var result = await userManager.CreateAsync(admin, adminPassword);

                                if (!result.Succeeded)
                                {
                                    string message = "Initial user could not be created, make sure you've set the InitialUserEmail and InitialUserPassword appSettings correctly - " + string.Join(" ", result.Errors.Select(x => x.Description));
                                    throw new Exception(message);
                                }
                            }
                            //userManager.AddPassword(admin.Id, adminPassword);
                            foreach (var roleName in roles)
                            {
                                if (!await userManager.IsInRoleAsync(admin, roleName))
                                {
                                    await userManager.AddToRoleAsync(admin, roleName);
                                }
                            }
                            PuckCache.JustSeeded = true;
                        }
                        else
                        {
                            throw new Exception("Initial user could not be created, make sure you've set the InitialUserEmail and InitialUserPassword appSettings");
                        }
                    }
                }
            }
        }
Exemplo n.º 5
0
        public async Task <JsonResult> Edit(PuckUserViewModel user, bool edit)
        {
            bool   success      = false;
            string message      = "";
            string startPaths   = "";
            string startNodeIds = "";
            var    model        = new PuckUserViewModel();

            try
            {
                if (!ModelState.IsValid)
                {
                    throw new Exception("model invalid.");
                }
                if (string.IsNullOrEmpty(user.UserGroups))
                {
                    throw new Exception("please select at least one user group");
                }

                if (!edit)
                {
                    if (string.IsNullOrEmpty(user.Password))
                    {
                        throw new Exception("please enter a password");
                    }

                    var puser = new PuckUser
                    {
                        PuckFirstName    = user.FirstName,
                        PuckSurname      = user.Surname,
                        Email            = user.Email,
                        UserName         = user.UserName,
                        PuckUserVariant  = user.UserVariant,
                        PuckStartNodeIds = user.StartNodes == null ? null : string.Join(",", user.StartNodes.Select(x => x.Id.ToString())),
                        PuckUserGroups   = user.UserGroups
                    };
                    var result = await userManager.CreateAsync(puser, user.Password);

                    if (!result.Succeeded)
                    {
                        message = string.Join(" ", result.Errors.Select(x => x.Description));
                        throw new Exception(message);
                    }
                    if (user.Roles != null && user.Roles.Count > 0)
                    {
                        await userManager.AddToRolesAsync(puser, user.Roles.ToArray());
                    }
                    if (!await userManager.IsInRoleAsync(puser, PuckRoles.Puck))
                    {
                        await userManager.AddToRoleAsync(puser, PuckRoles.Puck);
                    }
                    success = true;
                }
                else
                {
                    var puser = await userManager.FindByEmailAsync(user.CurrentEmail);

                    if (puser == null)
                    {
                        throw new Exception("could not find user for edit");
                    }

                    puser.PuckUserGroups = user.UserGroups;

                    if (!puser.Email.Equals(user.Email))
                    {
                        puser.Email = user.Email;
                    }
                    if (!puser.UserName.Equals(user.UserName))
                    {
                        puser.UserName = user.UserName;
                    }
                    user.Roles = user.Roles ?? new List <string>();
                    var           roles         = (await userManager.GetRolesAsync(puser)).Where(x => x.StartsWith("_")).ToList();
                    List <string> rolesToAdd    = new List <string>();
                    List <string> rolesToRemove = new List <string>();
                    //get roles to remove
                    foreach (var r in roles)
                    {
                        if (!user.Roles.Contains(r))
                        {
                            rolesToRemove.Add(r);
                        }
                    }
                    //get roles to add
                    foreach (var r in user.Roles)
                    {
                        if (!roles.Contains(r))
                        {
                            rolesToAdd.Add(r);
                        }
                    }
                    rolesToRemove.RemoveAll(x => x.Equals(PuckRoles.Puck));
                    if (rolesToRemove.Count > 0)
                    {
                        await userManager.RemoveFromRolesAsync(puser, rolesToRemove.ToArray());
                    }
                    if (rolesToAdd.Count > 0)
                    {
                        await userManager.AddToRolesAsync(puser, rolesToAdd);
                    }

                    if (!await userManager.IsInRoleAsync(puser, PuckRoles.Puck))
                    {
                        await userManager.AddToRoleAsync(puser, PuckRoles.Puck);
                    }

                    if (user.StartNodes == null || user.StartNodes.Count == 0)
                    {
                        puser.PuckStartNodeIds = null;
                    }
                    else
                    {
                        Guid[] startIds = user.StartNodes.Select(x => x.Id).ToArray();
                        var    nodes    = repo.GetPuckRevision().Where(x => startIds.Contains(x.Id) && x.Current).ToList().GroupBy(x => x.Id);
                        if (nodes.Any())
                        {
                            startPaths   = string.Join(",", nodes.Select(x => x.First().Path));
                            startNodeIds = string.Join(",", nodes.Select(x => x.First().Id.ToString()));
                        }
                        puser.PuckStartNodeIds = string.Join(",", startIds.Select(x => x.ToString()));
                    }
                    if (!string.IsNullOrEmpty(user.UserVariant))
                    {
                        puser.PuckUserVariant = user.UserVariant;
                    }
                    puser.PuckFirstName = user.FirstName;
                    puser.PuckSurname   = user.Surname;
                    await userManager.UpdateAsync(puser);

                    if (!string.IsNullOrEmpty(user.Password))
                    {
                        var token = await userManager.GeneratePasswordResetTokenAsync(puser);

                        var result = await userManager.ResetPasswordAsync(puser, token, user.Password);

                        if (result.Succeeded)
                        {
                            success = true;
                        }
                        else
                        {
                            success = false;
                            message = string.Join(" ", result.Errors.Select(x => x.Description));
                        }
                    }
                    else
                    {
                        success = true;
                    }
                    cache.Set <bool?>($"renewPuckClaims{user.UserName}", true);
                }
            }
            catch (Exception ex) {
                log.Log(ex);
                success = false;
                message = ex.Message;
            }
            return(Json(new { success = success, message = message, startPaths = startPaths, startNodeIds = startNodeIds }));
        }