From 79f427e10ae0851cf1c4b3b2234899d2596d8a5f Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Thu, 24 Mar 2022 12:32:41 -0400 Subject: [PATCH] consolidate user creation --- .../Modules/Admin/Register/Index.razor | 5 +- Oqtane.Server/Controllers/UserController.cs | 83 +++++++----------- .../Controllers/UserRoleController.cs | 7 -- ...taneSiteAuthenticationBuilderExtensions.cs | 86 ++++++++----------- .../Infrastructure/DatabaseManager.cs | 27 +----- Oqtane.Server/Repository/UserRepository.cs | 59 ++++++++++++- .../Repository/UserRoleRepository.cs | 13 ++- 7 files changed, 137 insertions(+), 143 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Register/Index.razor b/Oqtane.Client/Modules/Admin/Register/Index.razor index d33131c2..66ec29e5 100644 --- a/Oqtane.Client/Modules/Admin/Register/Index.razor +++ b/Oqtane.Client/Modules/Admin/Register/Index.razor @@ -90,9 +90,10 @@ else { SiteId = PageState.Site.SiteId, Username = _username, - DisplayName = (_displayname == string.Empty ? _username : _displayname), + Password = _password, Email = _email, - Password = _password + DisplayName = (_displayname == string.Empty ? _username : _displayname), + PhotoFileId = null }; user = await UserService.AddUserAsync(user); diff --git a/Oqtane.Server/Controllers/UserController.cs b/Oqtane.Server/Controllers/UserController.cs index 12f3eb99..d4c46586 100644 --- a/Oqtane.Server/Controllers/UserController.cs +++ b/Oqtane.Server/Controllers/UserController.cs @@ -162,6 +162,7 @@ namespace Oqtane.Controllers if (allowregistration) { + bool succeeded; IdentityUser identityuser = await _identityUserManager.FindByNameAsync(user.Username); if (identityuser == null) { @@ -170,74 +171,48 @@ namespace Oqtane.Controllers identityuser.Email = user.Email; identityuser.EmailConfirmed = verified; var result = await _identityUserManager.CreateAsync(identityuser, user.Password); - if (result.Succeeded) - { - user.LastLoginOn = null; - user.LastIPAddress = ""; - newUser = _users.AddUser(user); - if (!verified) - { - string token = await _identityUserManager.GenerateEmailConfirmationTokenAsync(identityuser); - string url = HttpContext.Request.Scheme + "://" + _tenantManager.GetAlias().Name + "/login?name=" + user.Username + "&token=" + WebUtility.UrlEncode(token); - string body = "Dear " + user.DisplayName + ",\n\nIn Order To Complete The Registration Of Your User Account Please Click The Link Displayed Below:\n\n" + url + "\n\nThank You!"; - var notification = new Notification(user.SiteId, newUser, "User Account Verification", body); - _notifications.AddNotification(notification); - } - - // add folder for user - Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users",Path.DirectorySeparatorChar.ToString())); - if (folder != null) - { - _folders.AddFolder(new Folder - { - SiteId = folder.SiteId, - ParentId = folder.FolderId, - Name = "My Folder", - Type = FolderTypes.Private, - Path = Utilities.PathCombine(folder.Path, newUser.UserId.ToString(), Path.DirectorySeparatorChar.ToString()), - Order = 1, - ImageSizes = "", - Capacity = Constants.UserFolderCapacity, - IsSystem = true, - Permissions = new List - { - new Permission(PermissionNames.Browse, newUser.UserId, true), - new Permission(PermissionNames.View, RoleNames.Everyone, true), - new Permission(PermissionNames.Edit, newUser.UserId, true) - }.EncodePermissions() - }) ; - } - } + succeeded = result.Succeeded; } else { var result = await _identitySignInManager.CheckPasswordSignInAsync(identityuser, user.Password, false); - if (result.Succeeded) - { - newUser = _users.GetUser(user.Username); - } + succeeded = result.Succeeded; + verified = true; + } + + if (succeeded) + { + user.LastLoginOn = null; + user.LastIPAddress = ""; + newUser = _users.AddUser(user); } if (newUser != null) { - // add auto assigned roles to user for site - List roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList(); - foreach (Role role in roles) + if (!verified) { - UserRole userrole = new UserRole(); - userrole.UserId = newUser.UserId; - userrole.RoleId = role.RoleId; - userrole.EffectiveDate = null; - userrole.ExpiryDate = null; - _userRoles.AddUserRole(userrole); + string token = await _identityUserManager.GenerateEmailConfirmationTokenAsync(identityuser); + string url = HttpContext.Request.Scheme + "://" + _tenantManager.GetAlias().Name + "/login?name=" + user.Username + "&token=" + WebUtility.UrlEncode(token); + string body = "Dear " + user.DisplayName + ",\n\nIn Order To Complete The Registration Of Your User Account Please Click The Link Displayed Below:\n\n" + url + "\n\nThank You!"; + var notification = new Notification(user.SiteId, newUser, "User Account Verification", body); + _notifications.AddNotification(notification); + } + else + { + string url = HttpContext.Request.Scheme + "://" + _tenantManager.GetAlias().Name; + string body = "Dear " + user.DisplayName + ",\n\nA User Account Has Been Succesfully Created For You. Please Use The Following Link To Access The Site:\n\n" + url + "\n\nThank You!"; + var notification = new Notification(user.SiteId, newUser, "User Account Notification", body); + _notifications.AddNotification(notification); } - } - if (newUser != null) - { newUser.Password = ""; // remove sensitive information _logger.Log(user.SiteId, LogLevel.Information, this, LogFunction.Create, "User Added {User}", newUser); } + else + { + user.Password = ""; // remove sensitive information + _logger.Log(user.SiteId, LogLevel.Error, this, LogFunction.Create, "Unable To Add User {User}", user); + } } else { diff --git a/Oqtane.Server/Controllers/UserRoleController.cs b/Oqtane.Server/Controllers/UserRoleController.cs index 03c7ca6a..0250fd7c 100644 --- a/Oqtane.Server/Controllers/UserRoleController.cs +++ b/Oqtane.Server/Controllers/UserRoleController.cs @@ -73,13 +73,6 @@ namespace Oqtane.Controllers var role = _roles.GetRole(userRole.RoleId); if (ModelState.IsValid && role != null && SiteValid(role.SiteId) && RoleValid(role.Name)) { - if (role.Name == RoleNames.Host) - { - // host roles can only exist at global level - remove all site specific user roles - _userRoles.DeleteUserRoles(userRole.UserId); - _logger.Log(LogLevel.Information, this, LogFunction.Delete, "User Roles Deleted For UserId {UserId}", userRole.UserId); - } - userRole = _userRoles.AddUserRole(userRole); _logger.Log(LogLevel.Information, this, LogFunction.Create, "User Role Added {UserRole}", userRole); diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs index 344f1c47..b2517e95 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs @@ -210,60 +210,43 @@ namespace Oqtane.Extensions var result = await _identityUserManager.CreateAsync(identityuser, DateTime.UtcNow.ToString("yyyy-MMM-dd-HH-mm-ss")); if (result.Succeeded) { - // add user login - await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, "")); - - user = new User(); - user.SiteId = alias.SiteId; - user.Username = email; - user.DisplayName = email; - user.Email = email; - user.LastLoginOn = null; - user.LastIPAddress = ""; + user = new User + { + SiteId = alias.SiteId, + Username = email, + DisplayName = email, + Email = email, + LastLoginOn = null, + LastIPAddress = "" + }; user = _users.AddUser(user); - // add folder for user - var _folders = httpContext.RequestServices.GetRequiredService(); - Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users", Path.DirectorySeparatorChar.ToString())); - if (folder != null) + if (user != null) { - _folders.AddFolder(new Folder - { - SiteId = folder.SiteId, - ParentId = folder.FolderId, - Name = "My Folder", - Type = FolderTypes.Private, - Path = Utilities.PathCombine(folder.Path, user.UserId.ToString(), Path.DirectorySeparatorChar.ToString()), - Order = 1, - ImageSizes = "", - Capacity = Constants.UserFolderCapacity, - IsSystem = true, - Permissions = new List - { - new Permission(PermissionNames.Browse, user.UserId, true), - new Permission(PermissionNames.View, RoleNames.Everyone, true), - new Permission(PermissionNames.Edit, user.UserId, true) - }.EncodePermissions() - }); - } + var _notifications = httpContext.RequestServices.GetRequiredService(); + string url = httpContext.Request.Scheme + "://" + alias.Name; + string body = "You Recently Used An External Account To Sign In To Our Site.\n\n" + url + "\n\nThank You!"; + var notification = new Notification(user.SiteId, user, "User Account Notification", body); + _notifications.AddNotification(notification); - // add auto assigned roles to user for site - var _roles = httpContext.RequestServices.GetRequiredService(); - List roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList(); - foreach (Role role in roles) - { - UserRole userrole = new UserRole(); - userrole.UserId = user.UserId; - userrole.RoleId = role.RoleId; - userrole.EffectiveDate = null; - userrole.ExpiryDate = null; - _userRoles.AddUserRole(userrole); + // add user login + await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, "")); + + _logger.Log(user.SiteId, LogLevel.Information, "ExternalLogin", Enums.LogFunction.Create, "User Added {User}", user); } + else + { + _logger.Log(user.SiteId, LogLevel.Error, "ExternalLogin", Enums.LogFunction.Create, "Unable To Add User {Email}", email); + } + } + else + { + _logger.Log(user.SiteId, LogLevel.Error, "ExternalLogin", Enums.LogFunction.Create, "Unable To Add Identity User {Email} {Error}", email, result.Errors.ToString()); } } else { - _logger.Log(LogLevel.Error, "ExternalLogin", Enums.LogFunction.Security, "Creation Of New Users Is Disabled. User With Email Address {Email} Will First Need To Be Registered On The Site.", email); + _logger.Log(LogLevel.Error, "ExternalLogin", Enums.LogFunction.Security, "Creation Of New Users Is Disabled For This Site. User With Email Address {Email} Will First Need To Be Registered On The Site.", email); } } else @@ -287,24 +270,25 @@ namespace Oqtane.Extensions // add user login await _identityUserManager.AddLoginAsync(identityuser, new UserLoginInfo(providerType, providerKey, "")); user = _users.GetUser(identityuser.UserName); + _logger.Log(user.SiteId, LogLevel.Information, "ExternalLogin", Enums.LogFunction.Create, "External User Login Added For {Email} Using Provider {Provider}", email, providerType); } } // add claims to principal if (user != null) { - // update user - user.LastLoginOn = DateTime.UtcNow; - user.LastIPAddress = httpContext.Connection.RemoteIpAddress.ToString(); - _users.UpdateUser(user); - _logger.Log(LogLevel.Information, "ExternalLogin", Enums.LogFunction.Security, "User Login Successful For {Username} Using Provider {Provider}", user.Username, providerType); - // add Oqtane claims var principal = (ClaimsIdentity)claimsPrincipal.Identity; UserSecurity.ResetClaimsIdentity(principal); List userroles = _userRoles.GetUserRoles(user.UserId, user.SiteId).ToList(); var identity = UserSecurity.CreateClaimsIdentity(alias, user, userroles); principal.AddClaims(identity.Claims); + + // update user + user.LastLoginOn = DateTime.UtcNow; + user.LastIPAddress = httpContext.Connection.RemoteIpAddress.ToString(); + _users.UpdateUser(user); + _logger.Log(LogLevel.Information, "ExternalLogin", Enums.LogFunction.Security, "External User Login Successful For {Username} Using Provider {Provider}", user.Username, providerType); } else // user not logged in { diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs index df58e73a..8bca59ac 100644 --- a/Oqtane.Server/Infrastructure/DatabaseManager.cs +++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs @@ -620,35 +620,12 @@ namespace Oqtane.Infrastructure LastIPAddress = "", LastLoginOn = null }; - user = users.AddUser(user); + + // add host role var hostRoleId = roles.GetRoles(user.SiteId, true).FirstOrDefault(item => item.Name == RoleNames.Host)?.RoleId ?? 0; var userRole = new UserRole { UserId = user.UserId, RoleId = hostRoleId, EffectiveDate = null, ExpiryDate = null }; userRoles.AddUserRole(userRole); - - // add user folder - var folder = folders.GetFolder(user.SiteId, Utilities.PathCombine("Users", Path.DirectorySeparatorChar.ToString())); - if (folder != null) - { - folders.AddFolder(new Folder - { - SiteId = folder.SiteId, - ParentId = folder.FolderId, - Name = "My Folder", - Type = FolderTypes.Private, - Path = Utilities.PathCombine(folder.Path, user.UserId.ToString(), Path.DirectorySeparatorChar.ToString()), - Order = 1, - ImageSizes = "", - Capacity = Constants.UserFolderCapacity, - IsSystem = true, - Permissions = new List - { - new Permission(PermissionNames.Browse, user.UserId, true), - new Permission(PermissionNames.View, RoleNames.Everyone, true), - new Permission(PermissionNames.Edit, user.UserId, true), - }.EncodePermissions(), - }); - } } } } diff --git a/Oqtane.Server/Repository/UserRepository.cs b/Oqtane.Server/Repository/UserRepository.cs index 2a71e980..7f72585c 100644 --- a/Oqtane.Server/Repository/UserRepository.cs +++ b/Oqtane.Server/Repository/UserRepository.cs @@ -1,17 +1,26 @@ using System.Collections.Generic; +using System.IO; using System.Linq; using Microsoft.EntityFrameworkCore; +using Oqtane.Extensions; using Oqtane.Models; +using Oqtane.Shared; namespace Oqtane.Repository { public class UserRepository : IUserRepository { private TenantDBContext _db; + private readonly IFolderRepository _folders; + private readonly IRoleRepository _roles; + private readonly IUserRoleRepository _userroles; - public UserRepository(TenantDBContext context) + public UserRepository(TenantDBContext context, IFolderRepository folders, IRoleRepository roles, IUserRoleRepository userroles) { _db = context; + _folders = folders; + _roles = roles; + _userroles = userroles; } public IEnumerable GetUsers() @@ -21,8 +30,52 @@ namespace Oqtane.Repository public User AddUser(User user) { - _db.User.Add(user); - _db.SaveChanges(); + if (_db.User.AsNoTracking().FirstOrDefault(item => item.Username == user.Username) == null) + { + _db.User.Add(user); + _db.SaveChanges(); + } + else + { + user = _db.User.AsNoTracking().First(item => item.Username == user.Username); + } + + // add folder for user + Folder folder = _folders.GetFolder(user.SiteId, Utilities.PathCombine("Users", Path.DirectorySeparatorChar.ToString())); + if (folder != null) + { + _folders.AddFolder(new Folder + { + SiteId = folder.SiteId, + ParentId = folder.FolderId, + Name = "My Folder", + Type = FolderTypes.Private, + Path = Utilities.PathCombine(folder.Path, user.UserId.ToString(), Path.DirectorySeparatorChar.ToString()), + Order = 1, + ImageSizes = "", + Capacity = Constants.UserFolderCapacity, + IsSystem = true, + Permissions = new List + { + new Permission(PermissionNames.Browse, user.UserId, true), + new Permission(PermissionNames.View, RoleNames.Everyone, true), + new Permission(PermissionNames.Edit, user.UserId, true) + }.EncodePermissions() + }); + } + + // add auto assigned roles to user for site + List roles = _roles.GetRoles(user.SiteId).Where(item => item.IsAutoAssigned).ToList(); + foreach (Role role in roles) + { + UserRole userrole = new UserRole(); + userrole.UserId = user.UserId; + userrole.RoleId = role.RoleId; + userrole.EffectiveDate = null; + userrole.ExpiryDate = null; + _userroles.AddUserRole(userrole); + } + return user; } diff --git a/Oqtane.Server/Repository/UserRoleRepository.cs b/Oqtane.Server/Repository/UserRoleRepository.cs index 8eef5221..ad4cb1d1 100644 --- a/Oqtane.Server/Repository/UserRoleRepository.cs +++ b/Oqtane.Server/Repository/UserRoleRepository.cs @@ -2,16 +2,19 @@ using System.Collections.Generic; using System.Linq; using Microsoft.EntityFrameworkCore; using Oqtane.Models; +using Oqtane.Shared; namespace Oqtane.Repository { public class UserRoleRepository : IUserRoleRepository { private TenantDBContext _db; + private readonly IRoleRepository _roles; - public UserRoleRepository(TenantDBContext context) + public UserRoleRepository(TenantDBContext context, IRoleRepository roles) { _db = context; + _roles = roles; } public IEnumerable GetUserRoles(int siteId) @@ -34,6 +37,14 @@ namespace Oqtane.Repository { _db.UserRole.Add(userRole); _db.SaveChanges(); + + // host roles can only exist at global level - remove any site specific user roles + var role = _roles.GetRole(userRole.RoleId); + if (role.Name == RoleNames.Host) + { + DeleteUserRoles(userRole.UserId); + } + return userRole; }