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); } } } } } } }
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); }
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 })); }
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"); } } } } }
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 })); }