| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | 
							- using InABox.API;
 
- using InABox.Clients;
 
- using InABox.Core;
 
- using InABox.Database;
 
- namespace InABox.Rpc
 
- {
 
-     
 
-     public class RpcValidateHandler : RpcCommandHandler<IRpcServer, RpcValidateCommand, RpcValidateParameters, RpcValidateResult> 
 
-     {
 
-         protected override RpcValidateResult Execute(IRpcSession session, RpcValidateParameters? parameters)
 
-         {
 
-             if (parameters == null)
 
-                 return new RpcValidateResult() { Status = ValidationStatus.INVALID };
 
-             
 
-             session.Platform = parameters.Platform;
 
-             session.Version = parameters.Version;
 
-             
 
-             User? user = null;
 
-             bool reLogin = false;
 
-             if (parameters.SessionID != Guid.Empty)
 
-             {
 
-                 user = CredentialsCache.Validate(parameters.SessionID);
 
-                 if (user != null)
 
-                 {
 
-                     Logger.Send(LogType.Information, "", $"{parameters.SessionID} re-logged in!");
 
-                     CredentialsCache.RefreshSessionExpiry(parameters.SessionID);
 
-                     reLogin = true;
 
-                 }
 
-                 else
 
-                 {
 
-                     Logger.Send(LogType.Information, "", $"{parameters.SessionID} re-logging failed!");
 
-                 }
 
-             }
 
-             if (user is null)
 
-             {
 
-                 if (parameters.UsePIN)
 
-                 {
 
-                     Logger.Send(LogType.Information, "", $"Login request for PIN {parameters.PIN}");
 
-                     user = CredentialsCache.ValidateUser(parameters.PIN);
 
-                 }
 
-                 else
 
-                 {
 
-                     var userID = parameters.UserID;
 
-                     var password = parameters.Password;
 
-                     user = CredentialsCache.ValidateUser(userID, password);
 
-                     if (user?.ID != CoreUtils.FullGuid)
 
-                     {
 
-                         Logger.Send(LogType.Information, userID, $"Login request for {userID}");
 
-                     }
 
-                 }
 
-             }
 
-             
 
-             if (user == null)
 
-             {
 
-                 Logger.Send(LogType.Information, "", $"Login failed!");
 
-                 return new RpcValidateResult() { Status = ValidationStatus.INVALID };
 
-             }
 
-             Guid? sessionID = null;
 
-             var result = new RpcValidateResult()
 
-             {
 
-                 Status = ValidationStatus.VALID,
 
-                 UserGuid = user.ID,
 
-                 UserID = user.UserID,
 
-                 SecurityID = user.SecurityGroup.ID,
 
-                 PasswordExpiration = UserStore.PasswordExpirationTime > TimeSpan.Zero ? user.PasswordExpiration : DateTime.MinValue
 
-             };
 
-             if (user.ID != CoreUtils.FullGuid)
 
-             {
 
-                 if (UserStore.PasswordExpirationTime != TimeSpan.Zero
 
-                     && user.PasswordExpiration > DateTime.MinValue
 
-                     && user.PasswordExpiration < DateTime.Now
 
-                     && !parameters.UsePIN)
 
-                 {
 
-                     Logger.Send(LogType.Information, user.UserID, $"Password for ({user.UserID}) has expired!");
 
-                     result.Status = ValidationStatus.PASSWORD_EXPIRED;
 
-                 }
 
-                 else if (reLogin)
 
-                 {
 
-                     Logger.Send(LogType.Information, user.UserID, $"Login ({user.UserID}) success!");
 
-                 }
 
-                 else if (user.Use2FA)
 
-                 {
 
-                     Logger.Send(LogType.Information, user.UserID, $"Login ({user.UserID}) requires 2FA. Sending code...");
 
-                     sessionID = CredentialsCache.SendCode(user.ID, out var recipient)
 
-                         ?? throw new Exception("Code failed to send!");
 
-                     result.Status = ValidationStatus.REQUIRE_2FA;
 
-                     result.Recipient2FA = recipient;
 
-                 }
 
-             }
 
-             result.SessionID = sessionID ??
 
-                 (reLogin
 
-                 ? parameters.SessionID
 
-                 : user.ID == CoreUtils.FullGuid
 
-                     ? CredentialsCache.NewSession(user, true, DateTime.MaxValue)
 
-                     : CredentialsCache.NewSession(user, true));
 
-             // Store the CredentialsCache ID against the ServerSession
 
-             session.ID = result.SessionID;
 
-             session.UserID = user?.UserID ?? "";
 
-             
 
-             Logger.Send(LogType.Information, user?.UserID ?? "", $"Validation Status is {result.Status}");
 
-             
 
-             return result;
 
-         }
 
-         public RpcValidateHandler(IRpcServer sender) : base(sender)
 
-         {
 
-         }
 
-     }
 
- }
 
 
  |