Validate.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using InABox.API;
  2. using InABox.Clients;
  3. using InABox.Core;
  4. using InABox.Database;
  5. using InABox.Server;
  6. namespace InABox.Rpc;
  7. public class RpcValidateHandler : RpcCommandHandler<IRpcServer, RpcValidateCommand, RpcValidateParameters, RpcValidateResult>
  8. {
  9. protected override RpcValidateResult Execute(IRpcSession session, RpcValidateParameters? parameters)
  10. {
  11. if (parameters == null)
  12. return new RpcValidateResult() { Status = ValidationStatus.INVALID };
  13. session.Platform = parameters.Platform;
  14. session.Version = parameters.Version;
  15. User? user = null;
  16. bool reLogin = false;
  17. if (parameters.SessionID != Guid.Empty)
  18. {
  19. user = CredentialsCache.Validate(parameters.SessionID);
  20. if (user != null)
  21. {
  22. Logger.Send(LogType.Information, "", $"{parameters.SessionID} re-logged in!");
  23. CredentialsCache.RefreshSessionExpiry(parameters.SessionID);
  24. reLogin = true;
  25. }
  26. else
  27. {
  28. Logger.Send(LogType.Information, "", $"{parameters.SessionID} re-logging failed!");
  29. }
  30. }
  31. if (user is null)
  32. {
  33. if (parameters.UsePIN)
  34. {
  35. Logger.Send(LogType.Information, "", $"Login request for PIN {parameters.PIN}");
  36. user = CredentialsCache.ValidateUser(parameters.PIN);
  37. }
  38. else
  39. {
  40. var userID = parameters.UserID;
  41. var password = parameters.Password;
  42. user = CredentialsCache.ValidateUser(userID, password);
  43. if (user?.ID != CoreUtils.FullGuid)
  44. {
  45. Logger.Send(LogType.Information, userID, $"Login request for {userID}");
  46. }
  47. }
  48. }
  49. if (user == null)
  50. {
  51. Logger.Send(LogType.Information, "", $"Login failed!");
  52. return new RpcValidateResult() { Status = ValidationStatus.INVALID };
  53. }
  54. Guid? sessionID = null;
  55. var result = new RpcValidateResult()
  56. {
  57. Status = ValidationStatus.VALID,
  58. UserGuid = user.ID,
  59. UserID = user.UserID,
  60. SecurityID = user.SecurityGroup.ID,
  61. PasswordExpiration = UserStore.PasswordExpirationTime > TimeSpan.Zero ? user.PasswordExpiration : DateTime.MinValue
  62. };
  63. if (user.ID != CoreUtils.FullGuid)
  64. {
  65. if (UserStore.PasswordExpirationTime != TimeSpan.Zero
  66. && user.PasswordExpiration > DateTime.MinValue
  67. && user.PasswordExpiration < DateTime.Now
  68. && !parameters.UsePIN)
  69. {
  70. Logger.Send(LogType.Information, user.UserID, $"Password for ({user.UserID}) has expired!");
  71. result.Status = ValidationStatus.PASSWORD_EXPIRED;
  72. }
  73. else if (reLogin)
  74. {
  75. Logger.Send(LogType.Information, user.UserID, $"Login ({user.UserID}) success!");
  76. }
  77. else if (user.Use2FA)
  78. {
  79. Logger.Send(LogType.Information, user.UserID, $"Login ({user.UserID}) requires 2FA. Sending code...");
  80. sessionID = CredentialsCache.SendCode(user.ID, out var recipient)
  81. ?? throw new Exception("Code failed to send!");
  82. result.Status = ValidationStatus.REQUIRE_2FA;
  83. result.Recipient2FA = recipient;
  84. }
  85. }
  86. result.SessionID = sessionID ??
  87. (reLogin
  88. ? parameters.SessionID
  89. : user.ID == CoreUtils.FullGuid
  90. ? CredentialsCache.NewSession(user, true, DateTime.MaxValue)
  91. : CredentialsCache.NewSession(user, true));
  92. // Store the CredentialsCache ID against the ServerSession
  93. session.ID = result.SessionID;
  94. session.UserID = user?.UserID ?? "";
  95. Logger.Send(LogType.Information, user?.UserID ?? "", $"Validation Status is {result.Status}");
  96. return result;
  97. }
  98. public RpcValidateHandler(IRpcServer sender) : base(sender)
  99. {
  100. }
  101. }