using System.Linq; using WebDesktopBackend.Contract.Logic; using WebDesktopBackend.Contract.Persistance; using WebDesktopBackend.Entitys.Tokens; using WebDesktopBackend.Entitys.User; using WebDesktopBackend.LogicResults; using WebDesktopBackend.Security; namespace WebDesktopBackend.Logic { public class UserLogic : IUserLogic { private readonly IUserRepository _users; private readonly ITokenRepository _tokens; private readonly IGroupRepository _groups; private readonly IFileRepository _files; private readonly ITokenContext _context; public UserLogic(IUserRepository users, ITokenRepository tokens, ITokenContext context, IGroupRepository groups, IFileRepository files) { _users = users; _tokens = tokens; _context = context; _groups = groups; _files = files; } public ILogicResult Login(UserLogin login) { if (!_users.Login(login)) return LogicResult.Conflict(); User user = _users.GetUserFromLogin(login); _tokens.DeleteUserTokens(_context.UserId); RefreshToken refreshToken = _tokens.CreateRefreshToken(user.Id); AccessToken accessToken = _tokens.CreateAccessToken(refreshToken.Id); return LogicResult.Ok(new Tokens {refreshToken = refreshToken, accessToken = accessToken}); } public ILogicResult Register(UserEditor editor) { editor.Trim(); if (!ValidateUserdata(editor)) return LogicResult.BadRequest(); User user = _users.AddUser(editor); _files.InitUser(user.Id); RefreshToken refreshToken = _tokens.CreateRefreshToken(user.Id); AccessToken accessToken = _tokens.CreateAccessToken(refreshToken.Id); return LogicResult.Ok(new Tokens {refreshToken = refreshToken, accessToken = accessToken}); } public ILogicResult Logout() { _tokens.DeleteRefreshToken(_context.RefreshTokenId); return LogicResult.Ok(); } public ILogicResult EditUser(string id, UserEditor editor) { editor.Trim(); if (!ValidateEdit(editor)) return LogicResult.BadRequest(); if (_users.GetUser(id) == null) return LogicResult.NotFound(); _users.EditUser(id, editor); return LogicResult.Ok(); } public ILogicResult DeleteUser(string id) { _tokens.DeleteUserTokens(id); _users.DeleteUser(id); _files.DeleteUserFolder(id); return LogicResult.Ok(); } public ILogicResult GetUser(string id) { User user = _users.GetUser(id); if (user == null) return LogicResult.NotFound(); return LogicResult.Ok(user.CreateCopy()); } public ILogicResult GetUsers() { User[] users = _users.GetUsers(); User[] exports = new User[users.Length]; for (var i = 0; i < users.Length; i++) { exports[i] = users[i].CreateCopy(); } return LogicResult.Ok(exports); } public ILogicResult Valdiate() { if (string.IsNullOrEmpty(_context.RefreshTokenId) || string.IsNullOrEmpty(_context.AccessTokenId)) return LogicResult.Forbidden(); if (!_tokens.ValidateRefreshToken(_context.RefreshTokenId)) { _tokens.DeleteRefreshToken(_context.RefreshTokenId); return LogicResult.Forbidden(); } return _tokens.ValidateAccessToken(_context.AccessTokenId) ? LogicResult.Ok() : LogicResult.Forbidden(); } public ILogicResult GetToken(string refreshTokenId) { if (refreshTokenId == null) return LogicResult.Forbidden(); if (!_tokens.ValidateRefreshToken(refreshTokenId)) { _tokens.DeleteRefreshToken(refreshTokenId); return LogicResult.Forbidden(); } return LogicResult.Ok(new AccessTokenResponse {Id = _tokens.CreateAccessToken(refreshTokenId).Id}); } public ILogicResult GetOwnUser() { return LogicResult.Ok(_users.GetUser(_context.UserId).CreateCopy()); } public ILogicResult GetPermissions(string id) { return LogicResult.Ok(_groups.GetUserPermissions(id).Select(perm => perm.PermissionName).ToArray()); } public ILogicResult GetRawPermissions(string id) { return LogicResult.Ok(_tokens.GetUserPermissions(id).Select(perm => perm.PermissionName).ToArray()); } public ILogicResult AddPermission(string id, string permission) { _tokens.AddPermission(id, permission); return LogicResult.Ok(); } public ILogicResult DeletePermission(string id, string permission) { _tokens.DeletePermission(id, permission); return LogicResult.Ok(); } private bool ValidateUserdata(UserEditor editor) { if (string.IsNullOrEmpty(editor.FirstName)) return false; if (string.IsNullOrEmpty(editor.LastName)) return false; if (string.IsNullOrEmpty(editor.Email)) return false; if (string.IsNullOrEmpty(editor.Username)) return false; if (string.IsNullOrEmpty(editor.Password)) return false; if (editor.FirstName.Length > 255) return false; if (editor.LastName.Length > 255) return false; if (editor.Email.Length > 255) return false; if (editor.Username.Length > 255) return false; if (editor.Password.Length > 255) return false; if (!editor.Email.Contains('@') || !editor.Email.Contains('.')) return false; if (editor.Username.Contains('@')) return false; if (editor.Password.Length < 8) return false; if (_users.GetUserByUsername(editor.Username) != null) return false; if (_users.GetUserByEmail(editor.Email) != null) return false; return true; } private bool ValidateEdit(UserEditor editor) { if (editor.FirstName.Length > 255) return false; if (editor.LastName.Length > 255) return false; if (editor.Email.Length > 255) return false; if (editor.Username.Length > 255) return false; if (editor.Password.Length > 255) return false; if (!string.IsNullOrEmpty(editor.Email)) { if (!editor.Email.Contains('@') || !editor.Email.Contains('.')) return false; if (_users.GetUserByEmail(editor.Email) != null) return false; } if (!string.IsNullOrEmpty(editor.Username)) { if (editor.Username.Contains('@')) return false; if (_users.GetUserByUsername(editor.Username) != null) return false; } if (!string.IsNullOrEmpty(editor.Password)) { if (editor.Password.Length < 8) return false; } return true; } } }