From 42215e7d28d6144e5a19f77ddc060c42b7afdad5 Mon Sep 17 00:00:00 2001 From: crupest Date: Thu, 23 Jan 2020 20:51:02 +0800 Subject: ... --- Timeline/Services/JwtBadVersionException.cs | 36 ------------- Timeline/Services/UserService.cs | 67 ++++++++++++------------- Timeline/Services/UsernameBadFormatException.cs | 11 ++-- 3 files changed, 38 insertions(+), 76 deletions(-) delete mode 100644 Timeline/Services/JwtBadVersionException.cs (limited to 'Timeline/Services') diff --git a/Timeline/Services/JwtBadVersionException.cs b/Timeline/Services/JwtBadVersionException.cs deleted file mode 100644 index 4ce17710..00000000 --- a/Timeline/Services/JwtBadVersionException.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using Timeline.Helpers; - -namespace Timeline.Services -{ - [Serializable] - public class JwtBadVersionException : Exception - { - public JwtBadVersionException() : base(Resources.Services.Exception.JwtBadVersionException) { } - public JwtBadVersionException(string message) : base(message) { } - public JwtBadVersionException(string message, Exception inner) : base(message, inner) { } - - public JwtBadVersionException(long tokenVersion, long requiredVersion) - : base(Log.Format(Resources.Services.Exception.JwtBadVersionException, - ("Token Version", tokenVersion), - ("Required Version", requiredVersion))) - { - TokenVersion = tokenVersion; - RequiredVersion = requiredVersion; - } - - protected JwtBadVersionException( - System.Runtime.Serialization.SerializationInfo info, - System.Runtime.Serialization.StreamingContext context) : base(info, context) { } - - /// - /// The version in the token. - /// - public long? TokenVersion { get; set; } - - /// - /// The version required. - /// - public long? RequiredVersion { get; set; } - } -} diff --git a/Timeline/Services/UserService.cs b/Timeline/Services/UserService.cs index db2350a2..104db1b0 100644 --- a/Timeline/Services/UserService.cs +++ b/Timeline/Services/UserService.cs @@ -139,19 +139,30 @@ namespace Timeline.Services _logger.LogInformation(Log.Format(Resources.Services.UserService.LogCacheRemove, ("Key", key))); } - private void CheckUsernameFormat(string username, string? additionalMessage = null) + private void CheckUsernameFormat(string username, string? message = null) { - var (result, message) = _usernameValidator.Validate(username); + var (result, validationMessage) = _usernameValidator.Validate(username); if (!result) { - if (additionalMessage == null) - throw new UsernameBadFormatException(username, message); + if (message == null) + throw new UsernameBadFormatException(username, validationMessage); else - throw new UsernameBadFormatException(username, additionalMessage + message); + throw new UsernameBadFormatException(username, validationMessage, message); } } - public async Task CheckCredential(string username, string password) + private static UserInfo CreateUserInfoFromEntity(UserEntity user) + { + return new UserInfo + { + Id = user.Id, + Username = user.Name, + Administrator = UserRoleConvert.ToBool(user.RoleString), + Version = user.Version + }; + } + + public async Task VerifyCredential(string username, string password) { if (username == null) throw new ArgumentNullException(nameof(username)); @@ -169,30 +180,13 @@ namespace Timeline.Services if (!_passwordService.VerifyPassword(user.EncryptedPassword, password)) throw new BadPasswordException(password); - var token = _jwtService.GenerateJwtToken(new TokenInfo - { - Id = user.Id, - Version = user.Version - }, expires); - - return new CreateTokenResult - { - Token = token, - User = UserConvert.CreateUserInfo(user) - }; + return CreateUserInfoFromEntity(user); } - public async Task VerifyToken(string token) + public async Task GetUserById(long id) { - if (token == null) - throw new ArgumentNullException(nameof(token)); - - TokenInfo tokenInfo; - tokenInfo = _jwtService.VerifyJwtToken(token); - - var id = tokenInfo.Id; var key = GenerateCacheKeyByUserId(id); - if (!_memoryCache.TryGetValue(key, out var cache)) + if (!_memoryCache.TryGetValue(key, out var cache)) { // no cache, check the database var user = await _databaseContext.Users.Where(u => u.Id == id).SingleOrDefaultAsync(); @@ -201,34 +195,35 @@ namespace Timeline.Services throw new UserNotExistException(id); // create cache - cache = UserConvert.CreateUserCache(user); + cache = CreateUserInfoFromEntity(user); _memoryCache.CreateEntry(key).SetValue(cache); _logger.LogInformation(Log.Format(Resources.Services.UserService.LogCacheCreate, ("Key", key))); } - if (tokenInfo.Version != cache.Version) - throw new JwtUserTokenBadFormatException(new JwtBadVersionException(tokenInfo.Version, cache.Version), JwtUserTokenBadFormatException.ErrorCodes.OldVersion); - - return cache.ToUserInfo(); + return cache; } public async Task GetUserByUsername(string username) { if (username == null) throw new ArgumentNullException(nameof(username)); + CheckUsernameFormat(username); - return await _databaseContext.Users + var entity = await _databaseContext.Users .Where(user => user.Name == username) - .Select(user => UserConvert.CreateUserInfo(user)) .SingleOrDefaultAsync(); + + if (entity == null) + throw new UserNotExistException(username); + + return CreateUserInfoFromEntity(entity); } public async Task ListUsers() { - return await _databaseContext.Users - .Select(user => UserConvert.CreateUserInfo(user)) - .ToArrayAsync(); + var entities = await _databaseContext.Users.ToArrayAsync(); + return entities.Select(user => CreateUserInfoFromEntity(user)).ToArray(); } public async Task PutUser(string username, string password, bool administrator) diff --git a/Timeline/Services/UsernameBadFormatException.cs b/Timeline/Services/UsernameBadFormatException.cs index 991be7df..ad0350b5 100644 --- a/Timeline/Services/UsernameBadFormatException.cs +++ b/Timeline/Services/UsernameBadFormatException.cs @@ -9,11 +9,12 @@ namespace Timeline.Services public class UsernameBadFormatException : Exception { public UsernameBadFormatException() : base(Resources.Services.Exception.UsernameBadFormatException) { } - public UsernameBadFormatException(string username) : this() { Username = username; } - public UsernameBadFormatException(string username, Exception inner) : base(Resources.Services.Exception.UsernameBadFormatException, inner) { Username = username; } + public UsernameBadFormatException(string message) : base(message) { } + public UsernameBadFormatException(string message, Exception inner) : base(message, inner) { } - public UsernameBadFormatException(string username, string message) : base(message) { Username = username; } - public UsernameBadFormatException(string username, string message, Exception inner) : base(message, inner) { Username = username; } + public UsernameBadFormatException(string username, string validationMessage) : this() { Username = username; ValidationMessage = validationMessage; } + + public UsernameBadFormatException(string username, string validationMessage, string message) : this(message) { Username = username; ValidationMessage = validationMessage; } protected UsernameBadFormatException( System.Runtime.Serialization.SerializationInfo info, @@ -23,5 +24,7 @@ namespace Timeline.Services /// Username of bad format. /// public string Username { get; private set; } = ""; + + public string ValidationMessage { get; private set; } = ""; } } -- cgit v1.2.3