using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using ZeroLevel.Models; namespace ZeroLevel.SqLite { public class AuthRepository { private static byte[] DEFAULT_ADMIN_PWD_HASH = null; private readonly SqLiteUserRepository _userRepository = new SqLiteUserRepository(); public UserInfo GetUserInfo(string username, string password) { if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password)) { return UserInfo.GetAnonimus(); } // Check built-in admin if (DEFAULT_ADMIN_PWD_HASH != null && DEFAULT_ADMIN_PWD_HASH.Length > 0 && (username.Equals("root", System.StringComparison.Ordinal) || username.Equals("admin", System.StringComparison.Ordinal)) && DEFAULT_ADMIN_PWD_HASH.SequenceEqual(ComputeHash(password))) { return new UserInfo { Role = UserRole.SysAdmin, UserId = -1, UserName = "sysadmin", DisplayName = "System Administrator", Created = DateTime.Now }; } else { var user = _userRepository.Get(username, ComputeHash(password)); if (user != null) { return new UserInfo { Created = new DateTime(user.Timestamp, DateTimeKind.Utc), DisplayName = user.DisplayName, Role = user.Role, UserId = user.Id, UserName = user.UserName }; } } return null; } public InvokeResult CreateUser(string username, string pwd, string displayName, UserRole role, long currentUserId) { return _userRepository.SaveUser(new User { Creator = currentUserId, DisplayName = displayName, PasswordHash = ComputeHash(pwd), Role = role, Timestamp = DateTime.UtcNow.Ticks, UserName = username }); } public InvokeResult> GetUsers() { try { return InvokeResult>.Succeeding(_userRepository.GetAll()); } catch (Exception ex) { return InvokeResult>.Fault>(ex.Message); } } public InvokeResult RemoveUser(string login) { return _userRepository.RemoveUser(login); } public void SetAdminPassword(string rootPwd) => DEFAULT_ADMIN_PWD_HASH = ComputeHash(rootPwd); private byte[] ComputeHash(string pwd) { using (SHA256 shaM = new SHA256Managed()) { return shaM.ComputeHash(Encoding.UTF8.GetBytes(pwd)); } } } }