Validate.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using InABox.API;
  2. using InABox.Clients;
  3. using InABox.Core;
  4. using InABox.Database;
  5. namespace InABox.Rpc
  6. {
  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. }
  27. if (user is null)
  28. {
  29. if (parameters.UsePIN)
  30. {
  31. Logger.Send(LogType.Information, "", $"Login request for PIN {parameters.PIN}");
  32. user = CredentialsCache.ValidateUser(parameters.PIN);
  33. }
  34. else
  35. {
  36. var userID = parameters.UserID;
  37. var password = parameters.Password;
  38. user = CredentialsCache.ValidateUser(userID, password);
  39. if (user?.ID != CoreUtils.FullGuid)
  40. {
  41. Logger.Send(LogType.Information, userID, $"Login request for {userID}");
  42. }
  43. }
  44. }
  45. if (user == null)
  46. {
  47. Logger.Send(LogType.Information, "", $"Login failed!");
  48. return new RpcValidateResult() { Status = ValidationStatus.INVALID };
  49. }
  50. Guid? sessionID = null;
  51. var result = new RpcValidateResult()
  52. {
  53. Status = ValidationStatus.VALID,
  54. UserGuid = user.ID,
  55. UserID = user.UserID,
  56. SecurityID = user.SecurityGroup.ID,
  57. PasswordExpiration = UserStore.PasswordExpirationTime > TimeSpan.Zero ? user.PasswordExpiration : DateTime.MinValue
  58. };
  59. if (user.ID != CoreUtils.FullGuid)
  60. {
  61. if (UserStore.PasswordExpirationTime != TimeSpan.Zero
  62. && user.PasswordExpiration > DateTime.MinValue
  63. && user.PasswordExpiration < DateTime.Now
  64. && !parameters.UsePIN)
  65. {
  66. Logger.Send(LogType.Information, user.UserID, $"Password for ({user.UserID}) has expired!");
  67. result.Status = ValidationStatus.PASSWORD_EXPIRED;
  68. }
  69. else if (reLogin)
  70. {
  71. Logger.Send(LogType.Information, user.UserID, $"Login ({user.UserID}) success!");
  72. }
  73. else if (user.Use2FA)
  74. {
  75. Logger.Send(LogType.Information, user.UserID, $"Login ({user.UserID}) requires 2FA. Sending code...");
  76. sessionID = CredentialsCache.SendCode(user.ID, out var recipient)
  77. ?? throw new Exception("Code failed to send!");
  78. result.Status = ValidationStatus.REQUIRE_2FA;
  79. result.Recipient2FA = recipient;
  80. }
  81. }
  82. result.SessionID = sessionID ??
  83. (reLogin
  84. ? parameters.SessionID
  85. : user.ID == CoreUtils.FullGuid
  86. ? CredentialsCache.NewSession(user, true, DateTime.MaxValue)
  87. : CredentialsCache.NewSession(user, true));
  88. // Store the CredentialsCache ID against the ServerSession
  89. session.ID = result.SessionID;
  90. session.UserID = user?.UserID ?? "";
  91. Logger.Send(LogType.Information, user?.UserID ?? "", $"Validation Status is {result.Status}");
  92. return result;
  93. }
  94. public RpcValidateHandler(IRpcServer sender) : base(sender)
  95. {
  96. }
  97. }
  98. }