From d8cbe994298090f5db87620764dde9c06853ee96 Mon Sep 17 00:00:00 2001 From: Hamid Reza Mohammadi Date: Fri, 23 Jul 2021 10:39:39 +0430 Subject: [PATCH] #184 removing try/catch blocks --- GanjooRazor/appsettings.json | 4 +- .../Services/Implementation/AppUserService.cs | 1915 ++++++++--------- 2 files changed, 862 insertions(+), 1057 deletions(-) diff --git a/GanjooRazor/appsettings.json b/GanjooRazor/appsettings.json index 0a8d1de9..63cb4262 100644 --- a/GanjooRazor/appsettings.json +++ b/GanjooRazor/appsettings.json @@ -8,7 +8,7 @@ }, "AllowedHosts": "*", "GoogleAnalyticsCode": "", - "APIRoot": "https://ganjgah.ir", - "GlobalAPIRoot": "https://ganjgah.ir", + "APIRoot": "http://localhost:3439", + "GlobalAPIRoot": "http://localhost:3439", "SiteUrl": "https://localhost:33081" } diff --git a/RSecurityBackend/Services/Implementation/AppUserService.cs b/RSecurityBackend/Services/Implementation/AppUserService.cs index 254bfcfd..6c595213 100644 --- a/RSecurityBackend/Services/Implementation/AppUserService.cs +++ b/RSecurityBackend/Services/Implementation/AppUserService.cs @@ -27,7 +27,7 @@ namespace RSecurityBackend.Services.Implementation /// Authentication Service /// public class AppUserService : IAppUserService - { + { /// /// Login user, if failed return LoggedOnUserModel is null @@ -37,120 +37,110 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> Login(LoginViewModel loginViewModel, string clientIPAddress) { - try + //we ignore loginViewModel in automatic auditing to prevent logging password data, so we would add a manual auditing to have enough data on login intrusion and ... + REvent log = new REvent() { + EventType = "AppUser/Login (POST)(Manual)", + StartDate = DateTime.UtcNow, + UserName = loginViewModel.Username, + IpAddress = clientIPAddress + }; + _context.AuditLogs.Add(log); + await _context.SaveChangesAsync(); - //we ignore loginViewModel in automatic auditing to prevent logging password data, so we would add a manual auditing to have enough data on login intrusion and ... - REvent log = new REvent() - { - EventType = "AppUser/Login (POST)(Manual)", - StartDate = DateTime.UtcNow, - UserName = loginViewModel.Username, - IpAddress = clientIPAddress - }; - _context.AuditLogs.Add(log); - await _context.SaveChangesAsync(); + RServiceResult checkUserExists = await EnsureDefaultUserExists(); + if (!checkUserExists.Result) + { + return new RServiceResult(null, checkUserExists.ExceptionString); + } - RServiceResult checkUserExists = await EnsureDefaultUserExists(); - if(!checkUserExists.Result) - { - return new RServiceResult(null, checkUserExists.ExceptionString); - } - - - - RAppUser appUser = await _userManager.FindByNameAsync(loginViewModel.Username); + RAppUser appUser = await _userManager.FindByNameAsync(loginViewModel.Username); + if (appUser == null) + { + appUser = await _userManager.FindByEmailAsync(loginViewModel.Username); if (appUser == null) { - appUser = await _userManager.FindByEmailAsync(loginViewModel.Username); - if(appUser == null) - { - return new RServiceResult(null, "نام کاربری و/یا رمز نادرست است."); - } - } - - var result = await _signInManager.CheckPasswordSignInAsync(appUser, loginViewModel.Password, true); - if(result.IsLockedOut) - { - return new RServiceResult(null, "نام کاربری شما به دلیل ورود متوالی ۵ بارهٔ رمزهای اشتباه قفل شده است. لطفاً ۵ دقیقهٔ‌دیگر مجدداً تلاش کنید."); - } - - if(result.IsNotAllowed || result.RequiresTwoFactor) - { - return new RServiceResult(null, result.ToString()); - } - - if (!result.Succeeded) - { return new RServiceResult(null, "نام کاربری و/یا رمز نادرست است."); } - - if (appUser.Status == RAppUserStatus.Inactive) - { - return new RServiceResult(null, "نام کاربری شما غیرفعال شده است."); - } - - RServiceResult securableItems = await GetUserSecurableItemsStatus(appUser.Id); - if (!string.IsNullOrEmpty(securableItems.ExceptionString)) - return new RServiceResult(null, securableItems.ExceptionString); - - RTemporaryUserSession userSession = - new RTemporaryUserSession() - { - RAppUserId = appUser.Id, - ClientIPAddress = clientIPAddress, - ClientAppName = loginViewModel.ClientAppName, - Language = loginViewModel.Language, - LoginTime = DateTime.Now, - LastRenewal = DateTime.Now, - ValidUntil = DateTime.Now + TimeSpan.FromSeconds(DefaultTokenExpirationInSeconds), - Token = "" - }; - - - await _context.Sessions.AddAsync(userSession); - - await _context.SaveChangesAsync(); - - RServiceResult userToken = await GenerateToken(loginViewModel.Username, appUser.Id, userSession.Id); - if(userToken.Result == null) - { - return new RServiceResult(null, userToken.ExceptionString); - } - userSession.Token = userToken.Result; - _context.Sessions.Update(userSession); - _context.SaveChanges(); - - return - new RServiceResult( - new LoggedOnUserModel() - { - SessionId = userSession.Id, - User = new PublicRAppUser() - { - Id = appUser.Id, - Username = appUser.UserName, - Email = appUser.Email, - FirstName = appUser.FirstName, - SureName = appUser.SureName, - PhoneNumber = appUser.PhoneNumber, - RImageId = appUser.RImageId, - Status = appUser.Status, - NickName = appUser.NickName, - Website = appUser.Website, - Bio = appUser.Bio, - EmailConfirmed = appUser.EmailConfirmed - }, - Token = userToken.Result, - SecurableItem = securableItems.Result - } - ); } - catch (Exception exp) + + var result = await _signInManager.CheckPasswordSignInAsync(appUser, loginViewModel.Password, true); + if (result.IsLockedOut) { - return new RServiceResult(null, exp.ToString()); + return new RServiceResult(null, "نام کاربری شما به دلیل ورود متوالی ۵ بارهٔ رمزهای اشتباه قفل شده است. لطفاً ۵ دقیقهٔ‌دیگر مجدداً تلاش کنید."); } + + if (result.IsNotAllowed || result.RequiresTwoFactor) + { + return new RServiceResult(null, result.ToString()); + } + + if (!result.Succeeded) + { + return new RServiceResult(null, "نام کاربری و/یا رمز نادرست است."); + } + + if (appUser.Status == RAppUserStatus.Inactive) + { + return new RServiceResult(null, "نام کاربری شما غیرفعال شده است."); + } + + RServiceResult securableItems = await GetUserSecurableItemsStatus(appUser.Id); + if (!string.IsNullOrEmpty(securableItems.ExceptionString)) + return new RServiceResult(null, securableItems.ExceptionString); + + RTemporaryUserSession userSession = + new RTemporaryUserSession() + { + RAppUserId = appUser.Id, + ClientIPAddress = clientIPAddress, + ClientAppName = loginViewModel.ClientAppName, + Language = loginViewModel.Language, + LoginTime = DateTime.Now, + LastRenewal = DateTime.Now, + ValidUntil = DateTime.Now + TimeSpan.FromSeconds(DefaultTokenExpirationInSeconds), + Token = "" + }; + + + await _context.Sessions.AddAsync(userSession); + + await _context.SaveChangesAsync(); + + RServiceResult userToken = await GenerateToken(loginViewModel.Username, appUser.Id, userSession.Id); + if (userToken.Result == null) + { + return new RServiceResult(null, userToken.ExceptionString); + } + userSession.Token = userToken.Result; + _context.Sessions.Update(userSession); + _context.SaveChanges(); + + return + new RServiceResult( + new LoggedOnUserModel() + { + SessionId = userSession.Id, + User = new PublicRAppUser() + { + Id = appUser.Id, + Username = appUser.UserName, + Email = appUser.Email, + FirstName = appUser.FirstName, + SureName = appUser.SureName, + PhoneNumber = appUser.PhoneNumber, + RImageId = appUser.RImageId, + Status = appUser.Status, + NickName = appUser.NickName, + Website = appUser.Website, + Bio = appUser.Bio, + EmailConfirmed = appUser.EmailConfirmed + }, + Token = userToken.Result, + SecurableItem = securableItems.Result + } + ); } /// @@ -161,79 +151,74 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> ReLogin(Guid sessionId, string clientIPAddress) { - try + + RTemporaryUserSession oldSession = await _context.Sessions.Include(s => s.RAppUser).Where(s => s.Id == sessionId).SingleOrDefaultAsync(); + if (oldSession == null) { - RTemporaryUserSession oldSession = await _context.Sessions.Include(s => s.RAppUser).Where(s => s.Id == sessionId).SingleOrDefaultAsync(); - if (oldSession == null) - { - return new RServiceResult(null, "Invalid session"); - } - RAppUser appUser = oldSession.RAppUser; - if (appUser.Status == RAppUserStatus.Inactive) - { - return new RServiceResult(null, "User is disabled by an admin."); - } - RServiceResult securableItems = await GetUserSecurableItemsStatus(appUser.Id); - if (!string.IsNullOrEmpty(securableItems.ExceptionString)) - return new RServiceResult(null, securableItems.ExceptionString); - - RTemporaryUserSession newSession = - new RTemporaryUserSession() - { - RAppUserId = appUser.Id, - ClientIPAddress = clientIPAddress, - ClientAppName = oldSession.ClientAppName, - Language = oldSession.Language, - LoginTime = DateTime.Now, - LastRenewal = DateTime.Now, - ValidUntil = DateTime.Now + TimeSpan.FromSeconds(DefaultTokenExpirationInSeconds), - Token = "" - }; - - - await _context.Sessions.AddAsync(newSession); - _context.Sessions.Remove(oldSession); - - await _context.SaveChangesAsync(); - - RServiceResult userToken = await GenerateToken(appUser.UserName, appUser.Id, newSession.Id); - if (userToken.Result == null) - { - return new RServiceResult(null, userToken.ExceptionString); - } - newSession.Token = userToken.Result; - _context.Sessions.Update(newSession); - _context.SaveChanges(); - - return - new RServiceResult( - new LoggedOnUserModel() - { - SessionId = newSession.Id, - User = new PublicRAppUser() - { - Id = appUser.Id, - Username = appUser.UserName, - Email = appUser.Email, - FirstName = appUser.FirstName, - SureName = appUser.SureName, - PhoneNumber = appUser.PhoneNumber, - RImageId = appUser.RImageId, - Status = appUser.Status, - NickName = appUser.NickName, - Website = appUser.Website, - Bio = appUser.Bio, - EmailConfirmed = appUser.EmailConfirmed - }, - Token = userToken.Result, - SecurableItem = securableItems.Result - } - ); + return new RServiceResult(null, "Invalid session"); } - catch (Exception exp) + RAppUser appUser = oldSession.RAppUser; + if (appUser.Status == RAppUserStatus.Inactive) { - return new RServiceResult(null, exp.ToString()); + return new RServiceResult(null, "User is disabled by an admin."); } + RServiceResult securableItems = await GetUserSecurableItemsStatus(appUser.Id); + if (!string.IsNullOrEmpty(securableItems.ExceptionString)) + return new RServiceResult(null, securableItems.ExceptionString); + + RTemporaryUserSession newSession = + new RTemporaryUserSession() + { + RAppUserId = appUser.Id, + ClientIPAddress = clientIPAddress, + ClientAppName = oldSession.ClientAppName, + Language = oldSession.Language, + LoginTime = DateTime.Now, + LastRenewal = DateTime.Now, + ValidUntil = DateTime.Now + TimeSpan.FromSeconds(DefaultTokenExpirationInSeconds), + Token = "" + }; + + + await _context.Sessions.AddAsync(newSession); + _context.Sessions.Remove(oldSession); + + await _context.SaveChangesAsync(); + + RServiceResult userToken = await GenerateToken(appUser.UserName, appUser.Id, newSession.Id); + if (userToken.Result == null) + { + return new RServiceResult(null, userToken.ExceptionString); + } + newSession.Token = userToken.Result; + _context.Sessions.Update(newSession); + _context.SaveChanges(); + + return + new RServiceResult( + new LoggedOnUserModel() + { + SessionId = newSession.Id, + User = new PublicRAppUser() + { + Id = appUser.Id, + Username = appUser.UserName, + Email = appUser.Email, + FirstName = appUser.FirstName, + SureName = appUser.SureName, + PhoneNumber = appUser.PhoneNumber, + RImageId = appUser.RImageId, + Status = appUser.Status, + NickName = appUser.NickName, + Website = appUser.Website, + Bio = appUser.Bio, + EmailConfirmed = appUser.EmailConfirmed + }, + Token = userToken.Result, + SecurableItem = securableItems.Result + } + ); + } /// @@ -244,36 +229,31 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> AddUserToRole(Guid userId, string roleName) { - try + + RAppUser dbUserInfo = + await _userManager.Users.Where(u => u.Id == userId).SingleOrDefaultAsync(); + + if (dbUserInfo == null) { - RAppUser dbUserInfo = - await _userManager.Users.Where(u => u.Id == userId).SingleOrDefaultAsync(); - - if (dbUserInfo == null) - { - return new RServiceResult(false, $"کاربر مورد نظر با ایمیل {userId} پیدا نشد "); - } - - if (!await _roleManager.RoleExistsAsync(roleName)) - { - var identityResult = await _roleManager.CreateAsync(new RAppRole(roleName)); - if (!identityResult.Succeeded) - { - return new RServiceResult(false, $"Error creating {roleName} role : " + ErrorsToString(identityResult.Errors)); - } - } - - var addToRoleResult = await _userManager.AddToRoleAsync(dbUserInfo, roleName); - if (!addToRoleResult.Succeeded) - { - return new RServiceResult(false, $"Error adding admin to {roleName} role : " + ErrorsToString(addToRoleResult.Errors)); - } - return new RServiceResult(true); + return new RServiceResult(false, $"کاربر مورد نظر با ایمیل {userId} پیدا نشد "); } - catch(Exception exp) + + if (!await _roleManager.RoleExistsAsync(roleName)) { - return new RServiceResult(false, exp.ToString()); + var identityResult = await _roleManager.CreateAsync(new RAppRole(roleName)); + if (!identityResult.Succeeded) + { + return new RServiceResult(false, $"Error creating {roleName} role : " + ErrorsToString(identityResult.Errors)); + } } + + var addToRoleResult = await _userManager.AddToRoleAsync(dbUserInfo, roleName); + if (!addToRoleResult.Succeeded) + { + return new RServiceResult(false, $"Error adding admin to {roleName} role : " + ErrorsToString(addToRoleResult.Errors)); + } + return new RServiceResult(true); + } @@ -285,23 +265,15 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> Logout(Guid userId, Guid sessionId) { - try - { - RTemporaryUserSession session = - await _context.Sessions - .Where(s => s.Id == sessionId && s.RAppUserId == userId) - .FirstOrDefaultAsync(); - if (session == null) - return new RServiceResult(false, "session is invalid"); - _context.Sessions.Remove(session); - await _context.SaveChangesAsync(); - return new RServiceResult(true); - - } - catch (Exception exp) - { - return new RServiceResult(false, exp.ToString()); - } + RTemporaryUserSession session = + await _context.Sessions + .Where(s => s.Id == sessionId && s.RAppUserId == userId) + .FirstOrDefaultAsync(); + if (session == null) + return new RServiceResult(false, "session is invalid"); + _context.Sessions.Remove(session); + await _context.SaveChangesAsync(); + return new RServiceResult(true); } @@ -313,18 +285,11 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> SessionExists(Guid userId, Guid sessionId) { - try - { - return new RServiceResult( - await _context.Sessions - .Where(s => s.RAppUserId == userId && s.Id == sessionId) - .FirstOrDefaultAsync() != null - ); - } - catch (Exception exp) - { - return new RServiceResult(false, exp.ToString()); - } + return new RServiceResult( + await _context.Sessions + .Where(s => s.RAppUserId == userId && s.Id == sessionId) + .FirstOrDefaultAsync() != null + ); } @@ -339,36 +304,27 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> GetUserInformation(Guid userId) { - - try - { - RAppUser appUser = - await _userManager.Users.Where(u => u.Id == userId).SingleOrDefaultAsync(); - if (appUser == null) - return new RServiceResult(null); - return new RServiceResult( - new PublicRAppUser() - { - Id = appUser.Id, - Username = appUser.UserName, - Email = appUser.Email, - FirstName = appUser.FirstName, - SureName = appUser.SureName, - PhoneNumber = appUser.PhoneNumber, - RImageId = appUser.RImageId, - Status = appUser.Status, - NickName = appUser.NickName, - Website = appUser.Website, - Bio = appUser.Bio, - EmailConfirmed = appUser.EmailConfirmed - }); - } - catch (Exception exp) - { - return new RServiceResult(null, exp.ToString()); - - } - } + RAppUser appUser = + await _userManager.Users.Where(u => u.Id == userId).SingleOrDefaultAsync(); + if (appUser == null) + return new RServiceResult(null); + return new RServiceResult( + new PublicRAppUser() + { + Id = appUser.Id, + Username = appUser.UserName, + Email = appUser.Email, + FirstName = appUser.FirstName, + SureName = appUser.SureName, + PhoneNumber = appUser.PhoneNumber, + RImageId = appUser.RImageId, + Status = appUser.Status, + NickName = appUser.NickName, + Website = appUser.Website, + Bio = appUser.Bio, + EmailConfirmed = appUser.EmailConfirmed + }); + } /// @@ -377,14 +333,12 @@ namespace RSecurityBackend.Services.Implementation /// /// /// - public virtual async Task> + public virtual async Task> GetAllUsersInformation(PagingParameterModel paging, string filterByEmail) { - try - { - var source = _userManager.Users - .Where(appUser => string.IsNullOrEmpty(filterByEmail) || ( !string.IsNullOrEmpty(filterByEmail) && appUser.Email.Contains(filterByEmail))) - .Select(appUser => new PublicRAppUser() + var source = _userManager.Users + .Where(appUser => string.IsNullOrEmpty(filterByEmail) || (!string.IsNullOrEmpty(filterByEmail) && appUser.Email.Contains(filterByEmail))) + .Select(appUser => new PublicRAppUser() { Id = appUser.Id, Username = appUser.UserName, @@ -400,14 +354,10 @@ namespace RSecurityBackend.Services.Implementation EmailConfirmed = appUser.EmailConfirmed }); - return new RServiceResult<(PaginationMetadata PagingMeta, PublicRAppUser[] Items)>( - await QueryablePaginator.Paginate(source, paging)); - - } - catch (Exception exp) - { - return new RServiceResult<(PaginationMetadata PagingMeta, PublicRAppUser[] Items)>((PagingMeta: null, Items: null), exp.ToString()); - } + return new RServiceResult<(PaginationMetadata PagingMeta, PublicRAppUser[] Items)>( + await QueryablePaginator.Paginate(source, paging)); + + } /// @@ -417,52 +367,47 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> GetUserSessions(Guid? userId) { - try - { - List publicRUserSessions = new List(); - RTemporaryUserSession[] sessions = - userId == null ? - await _context.Sessions.ToArrayAsync() - : - await _context.Sessions.Where(s => s.RAppUserId == userId).ToArrayAsync() - ; + List publicRUserSessions = new List(); - foreach (RTemporaryUserSession rUserSession in sessions) - publicRUserSessions.Add( - new PublicRUserSession() + RTemporaryUserSession[] sessions = + userId == null ? + await _context.Sessions.ToArrayAsync() + : + await _context.Sessions.Where(s => s.RAppUserId == userId).ToArrayAsync() + ; + + foreach (RTemporaryUserSession rUserSession in sessions) + publicRUserSessions.Add( + new PublicRUserSession() + { + Id = rUserSession.Id, + RAppUser = new PublicRAppUser() { - Id = rUserSession.Id, - RAppUser = new PublicRAppUser() - { - Id = rUserSession.RAppUser.Id, - Username = rUserSession.RAppUser.UserName, - Email = rUserSession.RAppUser.Email, - FirstName = rUserSession.RAppUser.FirstName, - SureName = rUserSession.RAppUser.SureName, - PhoneNumber = rUserSession.RAppUser.PhoneNumber, - RImageId = rUserSession.RAppUser.RImageId, - Status = rUserSession.RAppUser.Status, - NickName = rUserSession.RAppUser.NickName, - Website = rUserSession.RAppUser.Website, - Bio = rUserSession.RAppUser.Bio, - EmailConfirmed = rUserSession.RAppUser.EmailConfirmed - }, - ClientAppName = rUserSession.ClientAppName, - ClientIPAddress = rUserSession.ClientIPAddress, - Language = rUserSession.Language, - LastRenewal = rUserSession.LastRenewal, - LoginTime = rUserSession.LoginTime - } - ); + Id = rUserSession.RAppUser.Id, + Username = rUserSession.RAppUser.UserName, + Email = rUserSession.RAppUser.Email, + FirstName = rUserSession.RAppUser.FirstName, + SureName = rUserSession.RAppUser.SureName, + PhoneNumber = rUserSession.RAppUser.PhoneNumber, + RImageId = rUserSession.RAppUser.RImageId, + Status = rUserSession.RAppUser.Status, + NickName = rUserSession.RAppUser.NickName, + Website = rUserSession.RAppUser.Website, + Bio = rUserSession.RAppUser.Bio, + EmailConfirmed = rUserSession.RAppUser.EmailConfirmed + }, + ClientAppName = rUserSession.ClientAppName, + ClientIPAddress = rUserSession.ClientIPAddress, + Language = rUserSession.Language, + LastRenewal = rUserSession.LastRenewal, + LoginTime = rUserSession.LoginTime + } + ); + + return new RServiceResult(publicRUserSessions.ToArray()); + - return new RServiceResult(publicRUserSessions.ToArray()); - - } - catch (Exception exp) - { - return new RServiceResult(null, exp.ToString()); - } } /// @@ -472,21 +417,16 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> IsAdmin(Guid userId) { - try + + RAppUser dbUserInfo = await _userManager.FindByIdAsync(userId.ToString()); + if (dbUserInfo == null) { - RAppUser dbUserInfo = await _userManager.FindByIdAsync(userId.ToString()); - if (dbUserInfo == null) - { - return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); - } - - bool res = await _userManager.IsInRoleAsync(dbUserInfo, _userRoleService.AdministratorRoleName); - return new RServiceResult(res); - } - catch(Exception exp) - { - return new RServiceResult(false, exp.ToString()); + return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); } + + bool res = await _userManager.IsInRoleAsync(dbUserInfo, _userRoleService.AdministratorRoleName); + return new RServiceResult(res); + } /// @@ -497,28 +437,23 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> IsInRoles(Guid userId, string[] roleNames) { - try - { - RAppUser dbUserInfo = await _userManager.FindByIdAsync(userId.ToString()); - if (dbUserInfo == null) - { - return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); - } - foreach(string roleName in roleNames) - { - if(await _userManager.IsInRoleAsync(dbUserInfo, roleName)) - { - return new RServiceResult(true); - } - } - - return new RServiceResult(false); - } - catch (Exception exp) + RAppUser dbUserInfo = await _userManager.FindByIdAsync(userId.ToString()); + if (dbUserInfo == null) { - return new RServiceResult(false, exp.ToString()); + return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); } + + foreach (string roleName in roleNames) + { + if (await _userManager.IsInRoleAsync(dbUserInfo, roleName)) + { + return new RServiceResult(true); + } + } + + return new RServiceResult(false); + } /// @@ -527,23 +462,15 @@ namespace RSecurityBackend.Services.Implementation /// /// public virtual async Task>> GetUserRoles(Guid userId) - { - - try + { + RAppUser dbUserInfo = await _userManager.FindByIdAsync(userId.ToString()); + if (dbUserInfo == null) { - - RAppUser dbUserInfo = await _userManager.FindByIdAsync(userId.ToString()); - if (dbUserInfo == null) - { - return new RServiceResult>(null, "کاربر مورد نظر یافت نشد"); - } + return new RServiceResult>(null, "کاربر مورد نظر یافت نشد"); + } + + return new RServiceResult>(await _userManager.GetRolesAsync(dbUserInfo)); - return new RServiceResult>(await _userManager.GetRolesAsync(dbUserInfo)); - } - catch (Exception exp) - { - return new RServiceResult>(null, exp.ToString()); - } } /// @@ -554,26 +481,19 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> RemoveFromRole(Guid id, string role) { - try + RAppUser dbUserInfo = await _userManager.FindByIdAsync(id.ToString()); + if (dbUserInfo == null) { - RAppUser dbUserInfo = await _userManager.FindByIdAsync(id.ToString()); - if (dbUserInfo == null) - { - return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); - } - - IdentityResult result = await _userManager.RemoveFromRoleAsync(dbUserInfo, role); - if (!result.Succeeded) - { - return new RServiceResult(false, ErrorsToString(result.Errors)); - } - - return new RServiceResult(true); + return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); } - catch (Exception exp) + + IdentityResult result = await _userManager.RemoveFromRoleAsync(dbUserInfo, role); + if (!result.Succeeded) { - return new RServiceResult(false, exp.ToString()); + return new RServiceResult(false, ErrorsToString(result.Errors)); } + + return new RServiceResult(true); } /// @@ -584,26 +504,19 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> AddToRole(Guid id, string role) { - try + RAppUser dbUserInfo = await _userManager.FindByIdAsync(id.ToString()); + if (dbUserInfo == null) { - RAppUser dbUserInfo = await _userManager.FindByIdAsync(id.ToString()); - if (dbUserInfo == null) - { - return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); - } - - IdentityResult result = await _userManager.AddToRoleAsync(dbUserInfo, role); - if (!result.Succeeded) - { - return new RServiceResult(false, ErrorsToString(result.Errors)); - } - - return new RServiceResult(true); + return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); } - catch (Exception exp) + + IdentityResult result = await _userManager.AddToRoleAsync(dbUserInfo, role); + if (!result.Succeeded) { - return new RServiceResult(false, exp.ToString()); + return new RServiceResult(false, ErrorsToString(result.Errors)); } + + return new RServiceResult(true); } /// @@ -613,37 +526,30 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> GetUserSecurableItemsStatus(Guid userId) { - try + SecurableItem[] securableItems = _userRoleService.GetSecurableItems(); + RServiceResult> roles = await GetUserRoles(userId); + if (!string.IsNullOrEmpty(roles.ExceptionString)) + return new RServiceResult(null, roles.ExceptionString); + + bool isAdmin = (await IsAdmin(userId)).Result; + + foreach (SecurableItem securableItem in securableItems) { - SecurableItem[] securableItems = _userRoleService.GetSecurableItems(); - RServiceResult> roles = await GetUserRoles(userId); - if(!string.IsNullOrEmpty(roles.ExceptionString)) - return new RServiceResult(null, roles.ExceptionString); - - bool isAdmin = (await IsAdmin(userId)).Result; - - foreach(SecurableItem securableItem in securableItems) + foreach (SecurableItemOperation operation in securableItem.Operations) { - foreach(SecurableItemOperation operation in securableItem.Operations) + foreach (string role in roles.Result) { - foreach(string role in roles.Result) + RServiceResult hasPermission = await _userRoleService.HasPermission(role, securableItem.ShortName, operation.ShortName); + if (!string.IsNullOrEmpty(hasPermission.ExceptionString)) + return new RServiceResult(null, hasPermission.ExceptionString); + if (isAdmin || hasPermission.Result) { - RServiceResult hasPermission = await _userRoleService.HasPermission(role, securableItem.ShortName, operation.ShortName); - if(!string.IsNullOrEmpty(hasPermission.ExceptionString)) - return new RServiceResult(null, hasPermission.ExceptionString); - if (isAdmin || hasPermission.Result) - { - operation.Status = true; - } + operation.Status = true; } } } - return new RServiceResult(securableItems); - } - catch (Exception exp) - { - return new RServiceResult(null, exp.ToString()); } + return new RServiceResult(securableItems); } /// @@ -655,34 +561,26 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> HasPermission(Guid userId, string securableItemShortName, string operationShortName) { - try - { - RServiceResult> roles = await GetUserRoles(userId); - if (!string.IsNullOrEmpty(roles.ExceptionString)) - return new RServiceResult(false, roles.ExceptionString); + RServiceResult> roles = await GetUserRoles(userId); + if (!string.IsNullOrEmpty(roles.ExceptionString)) + return new RServiceResult(false, roles.ExceptionString); - foreach (string role in roles.Result) + foreach (string role in roles.Result) + { + RServiceResult hasPermission = await _userRoleService.HasPermission(role, securableItemShortName, operationShortName); + if (!string.IsNullOrEmpty(hasPermission.ExceptionString)) + return new RServiceResult(false, hasPermission.ExceptionString); + if (hasPermission.Result) { - RServiceResult hasPermission = await _userRoleService.HasPermission(role, securableItemShortName, operationShortName); - if (!string.IsNullOrEmpty(hasPermission.ExceptionString)) - return new RServiceResult(false, hasPermission.ExceptionString); - if (hasPermission.Result) - { - return new RServiceResult(true); - } + return new RServiceResult(true); } - - return - new RServiceResult - ( - false - ); - - } - catch (Exception exp) - { - return new RServiceResult(false, exp.ToString()); } + + return + new RServiceResult + ( + false + ); } /// @@ -693,52 +591,42 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> GetUsersHavingPermission(string securableItemShortName, string operationShortName) { - try + var rolesResult = await _userRoleService.GetRolesHavingPermission(securableItemShortName, operationShortName); + if (!string.IsNullOrEmpty(rolesResult.ExceptionString)) { - var rolesResult = await _userRoleService.GetRolesHavingPermission(securableItemShortName, operationShortName); - if(!string.IsNullOrEmpty(rolesResult.ExceptionString)) + return new RServiceResult(null, rolesResult.ExceptionString); + } + List lstPublicUsersInfo = new List(); + + RAppRole[] roles = rolesResult.Result; + foreach (RAppRole role in roles) + { + var usersInRole = _userManager.GetUsersInRoleAsync(role.Name); + foreach (var appUser in usersInRole.Result) { - return new RServiceResult(null, rolesResult.ExceptionString); - } - - - - List lstPublicUsersInfo = new List(); - - RAppRole[] roles = rolesResult.Result; - foreach(RAppRole role in roles) - { - var usersInRole = _userManager.GetUsersInRoleAsync(role.Name); - foreach(var appUser in usersInRole.Result) + if (lstPublicUsersInfo.Where(u => u.Id == appUser.Id).FirstOrDefault() == null) { - if(lstPublicUsersInfo.Where(u => u.Id == appUser.Id).FirstOrDefault() == null ) - { - lstPublicUsersInfo.Add( - new PublicRAppUser() - { - Id = appUser.Id, - Username = appUser.UserName, - Email = appUser.Email, - FirstName = appUser.FirstName, - SureName = appUser.SureName, - PhoneNumber = appUser.PhoneNumber, - RImageId = appUser.RImageId, - Status = appUser.Status, - NickName = appUser.NickName, - Website = appUser.Website, - Bio = appUser.Bio, - EmailConfirmed = appUser.EmailConfirmed - }); - } + lstPublicUsersInfo.Add( + new PublicRAppUser() + { + Id = appUser.Id, + Username = appUser.UserName, + Email = appUser.Email, + FirstName = appUser.FirstName, + SureName = appUser.SureName, + PhoneNumber = appUser.PhoneNumber, + RImageId = appUser.RImageId, + Status = appUser.Status, + NickName = appUser.NickName, + Website = appUser.Website, + Bio = appUser.Bio, + EmailConfirmed = appUser.EmailConfirmed + }); } } - - return new RServiceResult(lstPublicUsersInfo.ToArray()); - } - catch (Exception exp) - { - return new RServiceResult(null, exp.ToString()); } + + return new RServiceResult(lstPublicUsersInfo.ToArray()); } @@ -748,79 +636,72 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> AddUser(RegisterRAppUser newUserInfo) { - try + if (!newUserInfo.IsAdmin) { - if(!newUserInfo.IsAdmin) + RServiceResult checkUserExists = await EnsureDefaultUserExists(); + if (!checkUserExists.Result) { - RServiceResult checkUserExists = await EnsureDefaultUserExists(); - if (!checkUserExists.Result) - { - return new RServiceResult(null, checkUserExists.ExceptionString); - } - } - - RAppUser existingInfo = await _userManager.FindByNameAsync(newUserInfo.Username); - if (existingInfo != null) - { - return new RServiceResult(null, "username is already taken"); + return new RServiceResult(null, checkUserExists.ExceptionString); } - - if(string.IsNullOrEmpty(newUserInfo.Password)) - { - newUserInfo.Password = Guid.NewGuid().ToString(); - } - - - RAppUser newDbUser = - new RAppUser() - { - UserName = newUserInfo.Username, - FirstName = newUserInfo.FirstName, - SureName = newUserInfo.SureName, - Email = newUserInfo.Email, - PhoneNumber = newUserInfo.PhoneNumber, - CreateDate = DateTime.Now, - Status = newUserInfo.Status - - }; - - - var result = await _userManager.CreateAsync(newDbUser, newUserInfo.Password); - - if(!result.Succeeded) - { - return new RServiceResult(null, ErrorsToString(result.Errors)); - } - - newUserInfo.Id = newDbUser.Id; - - if(newUserInfo.IsAdmin) - { - - if (!await _roleManager.RoleExistsAsync(_userRoleService.AdministratorRoleName)) - { - var roleCheckResult = await _roleManager.CreateAsync(new RAppRole(_userRoleService.AdministratorRoleName)); - if (!roleCheckResult.Succeeded) - { - return new RServiceResult(null, "Error creating Administrator role : " + ErrorsToString(roleCheckResult.Errors)); - } - } - - - var addToAdminRoleResult = await _userManager.AddToRoleAsync(newDbUser, _userRoleService.AdministratorRoleName); - if (!addToAdminRoleResult.Succeeded) - { - return new RServiceResult(null, $"Error adding {newDbUser.UserName} to Administrator role : " + ErrorsToString(addToAdminRoleResult.Errors)); - } - } - - - return new RServiceResult(newDbUser); } - catch (Exception exp) + + RAppUser existingInfo = await _userManager.FindByNameAsync(newUserInfo.Username); + if (existingInfo != null) { - return new RServiceResult(null, exp.ToString()); + return new RServiceResult(null, "username is already taken"); } + + if (string.IsNullOrEmpty(newUserInfo.Password)) + { + newUserInfo.Password = Guid.NewGuid().ToString(); + } + + + RAppUser newDbUser = + new RAppUser() + { + UserName = newUserInfo.Username, + FirstName = newUserInfo.FirstName, + SureName = newUserInfo.SureName, + Email = newUserInfo.Email, + PhoneNumber = newUserInfo.PhoneNumber, + CreateDate = DateTime.Now, + Status = newUserInfo.Status + + }; + + + var result = await _userManager.CreateAsync(newDbUser, newUserInfo.Password); + + if (!result.Succeeded) + { + return new RServiceResult(null, ErrorsToString(result.Errors)); + } + + newUserInfo.Id = newDbUser.Id; + + if (newUserInfo.IsAdmin) + { + + if (!await _roleManager.RoleExistsAsync(_userRoleService.AdministratorRoleName)) + { + var roleCheckResult = await _roleManager.CreateAsync(new RAppRole(_userRoleService.AdministratorRoleName)); + if (!roleCheckResult.Succeeded) + { + return new RServiceResult(null, "Error creating Administrator role : " + ErrorsToString(roleCheckResult.Errors)); + } + } + + + var addToAdminRoleResult = await _userManager.AddToRoleAsync(newDbUser, _userRoleService.AdministratorRoleName); + if (!addToAdminRoleResult.Succeeded) + { + return new RServiceResult(null, $"Error adding {newDbUser.UserName} to Administrator role : " + ErrorsToString(addToAdminRoleResult.Errors)); + } + } + + + return new RServiceResult(newDbUser); } @@ -832,107 +713,100 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> ModifyUser(Guid userId, RegisterRAppUser updateUserInfo) { - try + RAppUser existingInfo = await _userManager.FindByIdAsync(userId.ToString()); + if (existingInfo == null) { - RAppUser existingInfo = await _userManager.FindByIdAsync(userId.ToString()); - if (existingInfo == null) - { - return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); - } - - RServiceResult isAdmin = await IsAdmin(userId); - if(!string.IsNullOrEmpty(isAdmin.ExceptionString)) - { - return new RServiceResult(false, isAdmin.ExceptionString); - } - - if(isAdmin.Result && !updateUserInfo.IsAdmin) - { - List adminUsers = new List(await _userManager.GetUsersInRoleAsync(_userRoleService.AdministratorRoleName)); - int nActiveAdminUsers = 0; - foreach(RAppUser adminUser in adminUsers) - { - if (adminUser.Status == RAppUserStatus.Active) - nActiveAdminUsers++; - } - if(nActiveAdminUsers <= 1) - { - return new RServiceResult(false, "You cannot reduce number of active admin users to 0."); - } - } - - if(isAdmin.Result != updateUserInfo.IsAdmin) - { - return new RServiceResult(false, "امکان تغییر وضعیت مدیر کاربر از طریق این تابع وجود ندارد."); - } - - - - - if (existingInfo.UserName != updateUserInfo.Username) - { - - RAppUser anotheruserWithUserName = await _userManager.FindByNameAsync(updateUserInfo.Username); - - if(anotheruserWithUserName != null) - { - return new RServiceResult(false, "کلمهٔ عبور تکراری می باشد"); - } - - existingInfo.UserName = updateUserInfo.Username; - } - - if(updateUserInfo.RImageId != null && updateUserInfo.RImageId != Guid.Empty && updateUserInfo.RImageId != existingInfo.RImageId) - { - return new RServiceResult(false, "برای تغییر تصویر کاربر از تابع اختصاصی این کار استفاده کنید"); - } - - - - - existingInfo.FirstName = updateUserInfo.FirstName; - existingInfo.SureName = updateUserInfo.SureName; - existingInfo.Email = updateUserInfo.Email; - existingInfo.PhoneNumber = updateUserInfo.PhoneNumber; - existingInfo.Status = updateUserInfo.Status; - existingInfo.Bio = updateUserInfo.Bio; - existingInfo.NickName = updateUserInfo.NickName; - existingInfo.Website = updateUserInfo.Website; - - if (!string.IsNullOrEmpty(updateUserInfo.Password)) - { - foreach(var passwordValidator in _userManager.PasswordValidators) - { - var resPass = await passwordValidator.ValidateAsync(_userManager, existingInfo, updateUserInfo.Password); - if (!resPass.Succeeded) - { - return new RServiceResult(false, ErrorsToString(resPass.Errors)); - } - } - - existingInfo.PasswordHash = _userManager.PasswordHasher.HashPassword(existingInfo, updateUserInfo.Password); - } - - - var result = await _userManager.UpdateAsync(existingInfo); - if(!result.Succeeded) - { - return new RServiceResult(false, ErrorsToString(result.Errors)); - } - - - - - //updating admin status is not supported - - - - return new RServiceResult(true); + return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); } - catch (Exception exp) + + RServiceResult isAdmin = await IsAdmin(userId); + if (!string.IsNullOrEmpty(isAdmin.ExceptionString)) { - return new RServiceResult(false, exp.ToString()); + return new RServiceResult(false, isAdmin.ExceptionString); } + + if (isAdmin.Result && !updateUserInfo.IsAdmin) + { + List adminUsers = new List(await _userManager.GetUsersInRoleAsync(_userRoleService.AdministratorRoleName)); + int nActiveAdminUsers = 0; + foreach (RAppUser adminUser in adminUsers) + { + if (adminUser.Status == RAppUserStatus.Active) + nActiveAdminUsers++; + } + if (nActiveAdminUsers <= 1) + { + return new RServiceResult(false, "You cannot reduce number of active admin users to 0."); + } + } + + if (isAdmin.Result != updateUserInfo.IsAdmin) + { + return new RServiceResult(false, "امکان تغییر وضعیت مدیر کاربر از طریق این تابع وجود ندارد."); + } + + + + + if (existingInfo.UserName != updateUserInfo.Username) + { + + RAppUser anotheruserWithUserName = await _userManager.FindByNameAsync(updateUserInfo.Username); + + if (anotheruserWithUserName != null) + { + return new RServiceResult(false, "کلمهٔ عبور تکراری می باشد"); + } + + existingInfo.UserName = updateUserInfo.Username; + } + + if (updateUserInfo.RImageId != null && updateUserInfo.RImageId != Guid.Empty && updateUserInfo.RImageId != existingInfo.RImageId) + { + return new RServiceResult(false, "برای تغییر تصویر کاربر از تابع اختصاصی این کار استفاده کنید"); + } + + + + + existingInfo.FirstName = updateUserInfo.FirstName; + existingInfo.SureName = updateUserInfo.SureName; + existingInfo.Email = updateUserInfo.Email; + existingInfo.PhoneNumber = updateUserInfo.PhoneNumber; + existingInfo.Status = updateUserInfo.Status; + existingInfo.Bio = updateUserInfo.Bio; + existingInfo.NickName = updateUserInfo.NickName; + existingInfo.Website = updateUserInfo.Website; + + if (!string.IsNullOrEmpty(updateUserInfo.Password)) + { + foreach (var passwordValidator in _userManager.PasswordValidators) + { + var resPass = await passwordValidator.ValidateAsync(_userManager, existingInfo, updateUserInfo.Password); + if (!resPass.Succeeded) + { + return new RServiceResult(false, ErrorsToString(resPass.Errors)); + } + } + + existingInfo.PasswordHash = _userManager.PasswordHasher.HashPassword(existingInfo, updateUserInfo.Password); + } + + + var result = await _userManager.UpdateAsync(existingInfo); + if (!result.Succeeded) + { + return new RServiceResult(false, ErrorsToString(result.Errors)); + } + + + + + //updating admin status is not supported + + + + return new RServiceResult(true); } /// @@ -955,10 +829,7 @@ namespace RSecurityBackend.Services.Implementation if (!result.Succeeded) { return new RServiceResult(false, "Identity error details says: " + result.ToString()); - } - - - + } return new RServiceResult(true); } @@ -970,24 +841,18 @@ namespace RSecurityBackend.Services.Implementation /// true if succeeds public virtual async Task> DeleteUser(Guid userId) { - try + RAppUser dbUserInfo = await _userManager.FindByIdAsync(userId.ToString()); + if (dbUserInfo != null) { - RAppUser dbUserInfo = await _userManager.FindByIdAsync(userId.ToString()); - if (dbUserInfo != null) + var result = await _userManager.DeleteAsync(dbUserInfo); + if (!result.Succeeded) { - var result = await _userManager.DeleteAsync(dbUserInfo); - if(!result.Succeeded) - { - return new RServiceResult(false, ErrorsToString(result.Errors)); - } - return new RServiceResult(true); + return new RServiceResult(false, ErrorsToString(result.Errors)); } - return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); - } - catch (Exception exp) - { - return new RServiceResult(false, exp.ToString()); + return new RServiceResult(true); } + return new RServiceResult(false, "کاربر مورد نظر یافت نشد"); + } /// @@ -998,80 +863,74 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> SetUserImage(Guid userId, IFormFileCollection files) { - try + + RAppUser user = await _userManager.FindByIdAsync(userId.ToString()); + + if (files.Count == 0) { - - RAppUser user = await _userManager.FindByIdAsync(userId.ToString()); - - if(files.Count == 0) + user.RImageId = null; + } + else + { + if (files.Count != 1) { - user.RImageId = null; + return new RServiceResult(null, "files.Count != 1"); + } + + IFormFile file = files[0]; + + + int nImageWidth = 192; + using Stream stream = file.OpenReadStream(); + using Image img = Image.FromStream(stream); + if (img.Width > nImageWidth) + { + using Bitmap bmpPhase1 = new Bitmap(nImageWidth, nImageWidth); + using (Graphics g = Graphics.FromImage(bmpPhase1)) + { + g.DrawImage(img, new Rectangle(0, 0, nImageWidth, img.Height * nImageWidth / img.Height)); + } + + using Brush brush = new TextureBrush(bmpPhase1); + using Bitmap bmpPhase2 = new Bitmap(nImageWidth, nImageWidth); + using (Graphics g = Graphics.FromImage(bmpPhase2)) + { + g.FillEllipse(brush, new Rectangle(0, 0, nImageWidth, nImageWidth)); + } + bmpPhase2.MakeTransparent(); + + using MemoryStream ms = new MemoryStream(); + bmpPhase2.Save(ms, ImageFormat.Png); + + ms.Position = 0; + RServiceResult image = await _imageFileService.Add(null, ms, file.FileName, "UserProfiles"); + + if (!string.IsNullOrEmpty(image.ExceptionString)) + { + return new RServiceResult(null, image.ExceptionString); + } + user.RImage = image.Result; } else { - if (files.Count != 1) + RServiceResult image = await _imageFileService.Add(null, stream, file.FileName, "UserProfiles"); + + if (!string.IsNullOrEmpty(image.ExceptionString)) { - return new RServiceResult(null, "files.Count != 1"); + return new RServiceResult(null, image.ExceptionString); } - - IFormFile file = files[0]; - - - int nImageWidth = 192; - using Stream stream = file.OpenReadStream(); - using Image img = Image.FromStream(stream); - if (img.Width > nImageWidth) - { - using Bitmap bmpPhase1 = new Bitmap(nImageWidth, nImageWidth); - using (Graphics g = Graphics.FromImage(bmpPhase1)) - { - g.DrawImage(img, new Rectangle(0, 0, nImageWidth, img.Height * nImageWidth / img.Height)); - } - - using Brush brush = new TextureBrush(bmpPhase1); - using Bitmap bmpPhase2 = new Bitmap(nImageWidth, nImageWidth); - using (Graphics g = Graphics.FromImage(bmpPhase2)) - { - g.FillEllipse(brush, new Rectangle(0, 0, nImageWidth, nImageWidth)); - } - bmpPhase2.MakeTransparent(); - - using MemoryStream ms = new MemoryStream(); - bmpPhase2.Save(ms, ImageFormat.Png); - - ms.Position = 0; - RServiceResult image = await _imageFileService.Add(null, ms, file.FileName, "UserProfiles"); - - if (!string.IsNullOrEmpty(image.ExceptionString)) - { - return new RServiceResult(null, image.ExceptionString); - } - user.RImage = image.Result; - } - else - { - RServiceResult image = await _imageFileService.Add(null, stream, file.FileName, "UserProfiles"); - - if (!string.IsNullOrEmpty(image.ExceptionString)) - { - return new RServiceResult(null, image.ExceptionString); - } - user.RImage = image.Result; - } - } - - var result = await _userManager.UpdateAsync(user); - if(!result.Succeeded) - { - return new RServiceResult(null, ErrorsToString(result.Errors)); + user.RImage = image.Result; } + } - return new RServiceResult((Guid?)user.RImageId); - } - catch (Exception exp) + var result = await _userManager.UpdateAsync(user); + if (!result.Succeeded) { - return new RServiceResult(null, exp.ToString()); + return new RServiceResult(null, ErrorsToString(result.Errors)); } + + return new RServiceResult((Guid?)user.RImageId); + } /// @@ -1081,22 +940,15 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> GetUserImage(Guid userId) { - try + RAppUser user = await _userManager.FindByIdAsync(userId.ToString()); + + if (user.RImageId != null) { - - RAppUser user = await _userManager.FindByIdAsync(userId.ToString()); - - if(user.RImageId != null) - { - return await _imageFileService.GetImage((Guid)user.RImageId); - } - - return new RServiceResult(null); - } - catch (Exception exp) - { - return new RServiceResult(null, exp.ToString()); + return await _imageFileService.GetImage((Guid)user.RImageId); } + + return new RServiceResult(null); + } /// @@ -1109,67 +961,62 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> SignUp(string email, string clientIPAddress, string clientAppName, string langauge) { - try + + if (string.IsNullOrEmpty(clientIPAddress)) { - if(string.IsNullOrEmpty(clientIPAddress)) - { - return new RServiceResult(null, "client ip address is empty"); - } + return new RServiceResult(null, "client ip address is empty"); + } - if (string.IsNullOrEmpty(clientAppName)) - { - return new RServiceResult(null, "client app name is empty"); - } + if (string.IsNullOrEmpty(clientAppName)) + { + return new RServiceResult(null, "client app name is empty"); + } - RAppUser existingUser = await _userManager.FindByEmailAsync(email); - if (existingUser != null) - { - return new RServiceResult(null, "شما قبلا ثبت نام کرده‌اید. توجه بفرمایید که کاربران گنجینهٔ گنجور و پیشخان خوانشگران یکسانند و می‌توانید با همان نام کاربری اینجا وارد شوید."); - } + RAppUser existingUser = await _userManager.FindByEmailAsync(email); + if (existingUser != null) + { + return new RServiceResult(null, "شما قبلا ثبت نام کرده‌اید. توجه بفرمایید که کاربران گنجینهٔ گنجور و پیشخان خوانشگران یکسانند و می‌توانید با همان نام کاربری اینجا وارد شوید."); + } - existingUser = await _userManager.FindByNameAsync(email); - if (existingUser != null) - { - return new RServiceResult(null, "این نام کاربری قبلا استفاده شده است"); - } + existingUser = await _userManager.FindByNameAsync(email); + if (existingUser != null) + { + return new RServiceResult(null, "این نام کاربری قبلا استفاده شده است"); + } - var oldSecrets = await _context.VerifyQueueItems.Where(i => i.DateTime < DateTime.Now.AddDays(-1)).ToListAsync(); - if(oldSecrets.Count > 0) - { - _context.VerifyQueueItems.RemoveRange(oldSecrets); - await _context.SaveChangesAsync(); - } - - //checking this queue for previous signup attempts is unnecessary and is not done intentionally - RVerifyQueueItem item = new RVerifyQueueItem() - { - QueueType = RVerifyQueueType.SignUp, - Email = email, - DateTime = DateTime.Now, - ClientIPAddress = clientIPAddress, - ClientAppName = clientAppName, - Secret = $"{(new Random(DateTime.Now.Millisecond)).Next(0, 99999)}".PadLeft(6, '0'), - Language = langauge - }; - - var existingSecrets = await _context.VerifyQueueItems.Where(i => i.Secret == item.Secret).ToListAsync(); - if(existingSecrets.Count > 0) - { - _context.VerifyQueueItems.RemoveRange(existingSecrets); - await _context.SaveChangesAsync(); - } - - await _context.VerifyQueueItems.AddAsync - ( - item - ); + var oldSecrets = await _context.VerifyQueueItems.Where(i => i.DateTime < DateTime.Now.AddDays(-1)).ToListAsync(); + if (oldSecrets.Count > 0) + { + _context.VerifyQueueItems.RemoveRange(oldSecrets); await _context.SaveChangesAsync(); - return new RServiceResult(item); } - catch (Exception exp) + + //checking this queue for previous signup attempts is unnecessary and is not done intentionally + RVerifyQueueItem item = new RVerifyQueueItem() { - return new RServiceResult(null, exp.ToString()); + QueueType = RVerifyQueueType.SignUp, + Email = email, + DateTime = DateTime.Now, + ClientIPAddress = clientIPAddress, + ClientAppName = clientAppName, + Secret = $"{(new Random(DateTime.Now.Millisecond)).Next(0, 99999)}".PadLeft(6, '0'), + Language = langauge + }; + + var existingSecrets = await _context.VerifyQueueItems.Where(i => i.Secret == item.Secret).ToListAsync(); + if (existingSecrets.Count > 0) + { + _context.VerifyQueueItems.RemoveRange(existingSecrets); + await _context.SaveChangesAsync(); } + + await _context.VerifyQueueItems.AddAsync + ( + item + ); + await _context.SaveChangesAsync(); + return new RServiceResult(item); + } /// @@ -1180,21 +1027,16 @@ namespace RSecurityBackend.Services.Implementation /// associated email public virtual async Task> RetrieveEmailFromQueueSecret(RVerifyQueueType verifyQueueType, string secret) { - try - { - secret = secret.Trim(); - RVerifyQueueItem item = await _context.VerifyQueueItems.Where(i => i.QueueType == verifyQueueType && i.Secret == secret).SingleOrDefaultAsync(); - if(item == null) - { - return new RServiceResult(""); - } - return new RServiceResult(item.Email); - } - catch (Exception exp) + secret = secret.Trim(); + RVerifyQueueItem item = await _context.VerifyQueueItems.Where(i => i.QueueType == verifyQueueType && i.Secret == secret).SingleOrDefaultAsync(); + if (item == null) { - return new RServiceResult(null, exp.ToString()); + return new RServiceResult(""); } + + return new RServiceResult(item.Email); + } /// @@ -1219,83 +1061,76 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> FinalizeSignUp(string email, string secret, string password, string firstName, string sureName) { - try + RAppUser existingUser = await _userManager.FindByEmailAsync(email); + if (existingUser != null) { - - RAppUser existingUser = await _userManager.FindByEmailAsync(email); - if (existingUser != null) - { - return new RServiceResult(false, "این آدرس ایمیل قبلا استفاده شده است"); - } - - existingUser = await _userManager.FindByNameAsync(email); - if (existingUser != null) - { - return new RServiceResult(false, "این نام کاربری قبلا استفاده شده است"); - } - - bool verify = VerifyEmailOnSignUp; - - if (verify) - { - if ( - email - != - (await RetrieveEmailFromQueueSecret(RVerifyQueueType.SignUp, secret)).Result - ) - { - return new RServiceResult(false, "کد ارسالی به ایمیل اشتباه وارد شده است"); - } - } - - secret = secret.Trim(); - - firstName = firstName.Trim(); - sureName = sureName.Trim(); - - if (string.IsNullOrEmpty(firstName) && string.IsNullOrEmpty(sureName)) - { - return new RServiceResult(false, "لطفاً حداقل یکی از اطلاعات نام یا نام خانوادگی را وارد کنید."); - } - - RegisterRAppUser newUserInfo = new RegisterRAppUser() - { - Username = email, - Email = email, - Password = password, - Status = RAppUserStatus.Active, - IsAdmin = false, - FirstName = firstName, - SureName = sureName, - NickName = $"{firstName} {sureName}".Trim() - }; - - RServiceResult userAddResult = await AddUser(newUserInfo); - - if(userAddResult.Result == null) - { - return new RServiceResult(false, userAddResult.ExceptionString); - } - if(verify) - { - userAddResult.Result.EmailConfirmed = true; - await _userManager.UpdateAsync(userAddResult.Result); - } - - RVerifyQueueItem[] failedQueue = await _context.VerifyQueueItems.Where(i => i.Email == email && i.Secret != secret && i.QueueType == RVerifyQueueType.SignUp).ToArrayAsync(); - if(failedQueue.Length != 0) - { - _context.VerifyQueueItems.RemoveRange(failedQueue); - } - - await _context.SaveChangesAsync(); - - return new RServiceResult(true); + return new RServiceResult(false, "این آدرس ایمیل قبلا استفاده شده است"); } - catch (Exception exp) + + existingUser = await _userManager.FindByNameAsync(email); + if (existingUser != null) { - return new RServiceResult(false, exp.ToString()); + return new RServiceResult(false, "این نام کاربری قبلا استفاده شده است"); } + + bool verify = VerifyEmailOnSignUp; + + if (verify) + { + if ( + email + != + (await RetrieveEmailFromQueueSecret(RVerifyQueueType.SignUp, secret)).Result + ) + { + return new RServiceResult(false, "کد ارسالی به ایمیل اشتباه وارد شده است"); + } + } + + secret = secret.Trim(); + + firstName = firstName.Trim(); + sureName = sureName.Trim(); + + if (string.IsNullOrEmpty(firstName) && string.IsNullOrEmpty(sureName)) + { + return new RServiceResult(false, "لطفاً حداقل یکی از اطلاعات نام یا نام خانوادگی را وارد کنید."); + } + + RegisterRAppUser newUserInfo = new RegisterRAppUser() + { + Username = email, + Email = email, + Password = password, + Status = RAppUserStatus.Active, + IsAdmin = false, + FirstName = firstName, + SureName = sureName, + NickName = $"{firstName} {sureName}".Trim() + }; + + RServiceResult userAddResult = await AddUser(newUserInfo); + + if (userAddResult.Result == null) + { + return new RServiceResult(false, userAddResult.ExceptionString); + } + if (verify) + { + userAddResult.Result.EmailConfirmed = true; + await _userManager.UpdateAsync(userAddResult.Result); + } + + RVerifyQueueItem[] failedQueue = await _context.VerifyQueueItems.Where(i => i.Email == email && i.Secret != secret && i.QueueType == RVerifyQueueType.SignUp).ToArrayAsync(); + if (failedQueue.Length != 0) + { + _context.VerifyQueueItems.RemoveRange(failedQueue); + } + + await _context.SaveChangesAsync(); + + return new RServiceResult(true); + } /// @@ -1308,63 +1143,56 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> ForgotPassword(string email, string clientIPAddress, string clientAppName, string langauge) { - try + if (string.IsNullOrEmpty(clientIPAddress)) { - if (string.IsNullOrEmpty(clientIPAddress)) - { - return new RServiceResult(null, "client ip address is empty"); - } + return new RServiceResult(null, "client ip address is empty"); + } - if (string.IsNullOrEmpty(clientAppName)) - { - return new RServiceResult(null, "client app name is empty"); - } + if (string.IsNullOrEmpty(clientAppName)) + { + return new RServiceResult(null, "client app name is empty"); + } - RAppUser rAppUser = await _userManager.FindByEmailAsync(email); - if (rAppUser == null) - { - return new RServiceResult(null, "کاربر مورد نظر یافت نشد"); - } + RAppUser rAppUser = await _userManager.FindByEmailAsync(email); + if (rAppUser == null) + { + return new RServiceResult(null, "کاربر مورد نظر یافت نشد"); + } - var oldSecrets = await _context.VerifyQueueItems.Where(i => i.DateTime < DateTime.Now.AddDays(-1)).ToListAsync(); - if (oldSecrets.Count > 0) - { - _context.VerifyQueueItems.RemoveRange(oldSecrets); - await _context.SaveChangesAsync(); - } - - //checking this queue for previous signup attempts is unnecessary and is not done intentionally - RVerifyQueueItem item = new RVerifyQueueItem() - { - QueueType = RVerifyQueueType.ForgotPassword, - Email = email, - DateTime = DateTime.Now, - ClientIPAddress = clientIPAddress, - ClientAppName = clientAppName, - Secret = $"{(new Random(DateTime.Now.Millisecond)).Next(0, 99999)}".PadLeft(6, '0'), - Language = langauge - }; - - var existingSecrets = await _context.VerifyQueueItems.Where(i => i.Secret == item.Secret).ToListAsync(); - if (existingSecrets.Count > 0) - { - _context.VerifyQueueItems.RemoveRange(existingSecrets); - await _context.SaveChangesAsync(); - } - - - - await _context.VerifyQueueItems.AddAsync - ( - item - ); + var oldSecrets = await _context.VerifyQueueItems.Where(i => i.DateTime < DateTime.Now.AddDays(-1)).ToListAsync(); + if (oldSecrets.Count > 0) + { + _context.VerifyQueueItems.RemoveRange(oldSecrets); await _context.SaveChangesAsync(); - return new RServiceResult(item); } - catch (Exception exp) + + //checking this queue for previous signup attempts is unnecessary and is not done intentionally + RVerifyQueueItem item = new RVerifyQueueItem() { - return new RServiceResult(null, exp.ToString()); + QueueType = RVerifyQueueType.ForgotPassword, + Email = email, + DateTime = DateTime.Now, + ClientIPAddress = clientIPAddress, + ClientAppName = clientAppName, + Secret = $"{(new Random(DateTime.Now.Millisecond)).Next(0, 99999)}".PadLeft(6, '0'), + Language = langauge + }; + + var existingSecrets = await _context.VerifyQueueItems.Where(i => i.Secret == item.Secret).ToListAsync(); + if (existingSecrets.Count > 0) + { + _context.VerifyQueueItems.RemoveRange(existingSecrets); + await _context.SaveChangesAsync(); } + + + + await _context.VerifyQueueItems.AddAsync + ( + item + ); + await _context.SaveChangesAsync(); + return new RServiceResult(item); } /// @@ -1377,64 +1205,58 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> ResetPassword(string email, string secret, string password, string clientIPAddress) { - try + //we ignore input model in automatic auditing to prevent loginng password data, so we would add a manual auditing to have enough data on login intrusion and ... + REvent log = new REvent() { - //we ignore input model in automatic auditing to prevent loginng password data, so we would add a manual auditing to have enough data on login intrusion and ... - REvent log = new REvent() - { - EventType = "AppUser/ResetPassword (POST)(Manual)", - StartDate = DateTime.UtcNow, - UserName = email, - IpAddress = clientIPAddress - }; - _context.AuditLogs.Add(log); - await _context.SaveChangesAsync(); + EventType = "AppUser/ResetPassword (POST)(Manual)", + StartDate = DateTime.UtcNow, + UserName = email, + IpAddress = clientIPAddress + }; + _context.AuditLogs.Add(log); + await _context.SaveChangesAsync(); - RAppUser existingUser = await _userManager.FindByEmailAsync(email); - if (existingUser == null) - { - return new RServiceResult(false, "کاربر مورد نظر با این آدرس ایمیل یافت نشد"); - } - - - if ( - email - != - (await RetrieveEmailFromQueueSecret(RVerifyQueueType.ForgotPassword, secret)).Result - ) - { - return new RServiceResult(false, "کلمه عبور اشتباه وارد شده است"); - } - - foreach (var passwordValidator in _userManager.PasswordValidators) - { - var resPass = await passwordValidator.ValidateAsync(_userManager, existingUser, password); - if (!resPass.Succeeded) - { - return new RServiceResult(false, ErrorsToString(resPass.Errors)); - } - } - - existingUser.PasswordHash = _userManager.PasswordHasher.HashPassword(existingUser, password); - - await _userManager.UpdateAsync(existingUser); - - RVerifyQueueItem[] failedQueue = await _context.VerifyQueueItems.Where(i => i.Email == email && i.QueueType == RVerifyQueueType.ForgotPassword).ToArrayAsync(); - if (failedQueue.Length != 0) - { - _context.VerifyQueueItems.RemoveRange(failedQueue); - } - - - - await _context.SaveChangesAsync(); - - return new RServiceResult(true); - } - catch (Exception exp) + RAppUser existingUser = await _userManager.FindByEmailAsync(email); + if (existingUser == null) { - return new RServiceResult(false, exp.ToString()); + return new RServiceResult(false, "کاربر مورد نظر با این آدرس ایمیل یافت نشد"); } + + + if ( + email + != + (await RetrieveEmailFromQueueSecret(RVerifyQueueType.ForgotPassword, secret)).Result + ) + { + return new RServiceResult(false, "کلمه عبور اشتباه وارد شده است"); + } + + foreach (var passwordValidator in _userManager.PasswordValidators) + { + var resPass = await passwordValidator.ValidateAsync(_userManager, existingUser, password); + if (!resPass.Succeeded) + { + return new RServiceResult(false, ErrorsToString(resPass.Errors)); + } + } + + existingUser.PasswordHash = _userManager.PasswordHasher.HashPassword(existingUser, password); + + await _userManager.UpdateAsync(existingUser); + + RVerifyQueueItem[] failedQueue = await _context.VerifyQueueItems.Where(i => i.Email == email && i.QueueType == RVerifyQueueType.ForgotPassword).ToArrayAsync(); + if (failedQueue.Length != 0) + { + _context.VerifyQueueItems.RemoveRange(failedQueue); + } + + + + await _context.SaveChangesAsync(); + + return new RServiceResult(true); + } /// @@ -1444,32 +1266,26 @@ namespace RSecurityBackend.Services.Implementation /// public virtual async Task> FindUserByEmail(string email) { - try - { - RAppUser appUser = await _userManager.FindByEmailAsync(email); - if (appUser == null) - return new RServiceResult(null); - return new RServiceResult( - new PublicRAppUser() - { - Id = appUser.Id, - Username = appUser.UserName, - Email = appUser.Email, - FirstName = appUser.FirstName, - SureName = appUser.SureName, - PhoneNumber = appUser.PhoneNumber, - RImageId = appUser.RImageId, - Status = appUser.Status, - NickName = appUser.NickName, - Website = appUser.Website, - Bio = appUser.Bio, - EmailConfirmed = appUser.EmailConfirmed - }); - } - catch(Exception exp) - { - return new RServiceResult(null, exp.ToString()); - } + RAppUser appUser = await _userManager.FindByEmailAsync(email); + if (appUser == null) + return new RServiceResult(null); + return new RServiceResult( + new PublicRAppUser() + { + Id = appUser.Id, + Username = appUser.UserName, + Email = appUser.Email, + FirstName = appUser.FirstName, + SureName = appUser.SureName, + PhoneNumber = appUser.PhoneNumber, + RImageId = appUser.RImageId, + Status = appUser.Status, + NickName = appUser.NickName, + Website = appUser.Website, + Bio = appUser.Bio, + EmailConfirmed = appUser.EmailConfirmed + }); + } @@ -1479,15 +1295,9 @@ namespace RSecurityBackend.Services.Implementation /// public RServiceResult DeleteTenant() { - try - { - _context.DeleteDb(); - return new RServiceResult(true); - } - catch(Exception exp) - { - return new RServiceResult(false, exp.ToString()); - } + _context.DeleteDb(); + return new RServiceResult(true); + } /// @@ -1496,66 +1306,61 @@ namespace RSecurityBackend.Services.Implementation /// private async Task> EnsureDefaultUserExists() { - try + + //If no user exists create default one + if (_userManager.Users.Count() == 0) { - //If no user exists create default one - if (_userManager.Users.Count() == 0) + RAppUser admin = new RAppUser() { - RAppUser admin = new RAppUser() - { - UserName = "admin@ganjoor.net", - FirstName = "راهبر", - SureName = "سیستم", - Email = "admin@ganjoor.net", - PhoneNumber = "00989123456789", - CreateDate = DateTime.Now, - Status = RAppUserStatus.Active - }; + UserName = "admin@ganjoor.net", + FirstName = "راهبر", + SureName = "سیستم", + Email = "admin@ganjoor.net", + PhoneNumber = "00989123456789", + CreateDate = DateTime.Now, + Status = RAppUserStatus.Active + }; - var identityResult = await _userManager.CreateAsync( - admin, "Test!123" - ); + var identityResult = await _userManager.CreateAsync( + admin, "Test!123" + ); + if (!identityResult.Succeeded) + { + return new RServiceResult(false, "Error creating default user : " + ErrorsToString(identityResult.Errors)); + } + + if (!await _roleManager.RoleExistsAsync(_userRoleService.AdministratorRoleName)) + { + identityResult = await _roleManager.CreateAsync(new RAppRole(_userRoleService.AdministratorRoleName)); if (!identityResult.Succeeded) { - return new RServiceResult(false, "Error creating default user : " + ErrorsToString(identityResult.Errors)); - } - - if (!await _roleManager.RoleExistsAsync(_userRoleService.AdministratorRoleName)) - { - identityResult = await _roleManager.CreateAsync(new RAppRole(_userRoleService.AdministratorRoleName)); - if (!identityResult.Succeeded) - { - return new RServiceResult(false, "Error creating Administrator role : " + ErrorsToString(identityResult.Errors)); - } - } - - identityResult = await _userManager.AddToRoleAsync(admin, _userRoleService.AdministratorRoleName); - if (!identityResult.Succeeded) - { - return new RServiceResult(false, "Error adding admin to Administrator role : " + ErrorsToString(identityResult.Errors)); + return new RServiceResult(false, "Error creating Administrator role : " + ErrorsToString(identityResult.Errors)); } } - return new RServiceResult(true); - } - catch (Exception exp) - { - return new RServiceResult(false, exp.ToString()); + + identityResult = await _userManager.AddToRoleAsync(admin, _userRoleService.AdministratorRoleName); + if (!identityResult.Succeeded) + { + return new RServiceResult(false, "Error adding admin to Administrator role : " + ErrorsToString(identityResult.Errors)); + } } + return new RServiceResult(true); + } - + /// /// secret used for generating Jwt token /// - public string TokenSecret { get { return $"{Configuration.GetSection("Security")["Secret"]}"; } } + public string TokenSecret { get { return $"{Configuration.GetSection("Security")["Secret"]}"; } } /// /// JWT Tokens Expiration Time Out /// - public int DefaultTokenExpirationInSeconds { get { return int.Parse( $"{Configuration.GetSection("Security")["DefaultTokenExpirationInSeconds"]}"); } } + public int DefaultTokenExpirationInSeconds { get { return int.Parse($"{Configuration.GetSection("Security")["DefaultTokenExpirationInSeconds"]}"); } } @@ -1672,7 +1477,7 @@ namespace RSecurityBackend.Services.Implementation protected static string ErrorsToString(IEnumerable errors) { StringBuilder sb = new StringBuilder(); - foreach(IdentityError error in errors) + foreach (IdentityError error in errors) { sb.AppendLine(error.Description); }