1
0

PardonCommand.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. using System.Linq;
  2. using Content.Server.Database;
  3. using Robust.Server.Console;
  4. using Robust.Server.Player;
  5. using Robust.Shared.Network;
  6. namespace Content.IntegrationTests.Tests.Commands
  7. {
  8. [TestFixture]
  9. [TestOf(typeof(PardonCommand))]
  10. public sealed class PardonCommand
  11. {
  12. private static readonly TimeSpan MarginOfError = TimeSpan.FromMinutes(1);
  13. [Test]
  14. public async Task PardonTest()
  15. {
  16. await using var pair = await PoolManager.GetServerClient(new PoolSettings { Connected = true });
  17. var server = pair.Server;
  18. var client = pair.Client;
  19. var sPlayerManager = server.ResolveDependency<IPlayerManager>();
  20. var sConsole = server.ResolveDependency<IServerConsoleHost>();
  21. var sDatabase = server.ResolveDependency<IServerDbManager>();
  22. var netMan = client.ResolveDependency<IClientNetManager>();
  23. var clientSession = sPlayerManager.Sessions.Single();
  24. var clientId = clientSession.UserId;
  25. Assert.That(netMan.IsConnected);
  26. Assert.That(sPlayerManager.Sessions, Has.Length.EqualTo(1));
  27. // No bans on record
  28. Assert.Multiple(async () =>
  29. {
  30. Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Null);
  31. Assert.That(await sDatabase.GetServerBanAsync(1), Is.Null);
  32. Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Is.Empty);
  33. });
  34. // Try to pardon a ban that does not exist
  35. await server.WaitPost(() => sConsole.ExecuteCommand("pardon 1"));
  36. // Still no bans on record
  37. Assert.Multiple(async () =>
  38. {
  39. Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Null);
  40. Assert.That(await sDatabase.GetServerBanAsync(1), Is.Null);
  41. Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Is.Empty);
  42. });
  43. var banReason = "test";
  44. Assert.That(sPlayerManager.Sessions, Has.Length.EqualTo(1));
  45. // Ban the client for 24 hours
  46. await server.WaitPost(() => sConsole.ExecuteCommand($"ban {clientSession.Name} {banReason} 1440"));
  47. // Should have one ban on record now
  48. Assert.Multiple(async () =>
  49. {
  50. Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Not.Null);
  51. Assert.That(await sDatabase.GetServerBanAsync(1), Is.Not.Null);
  52. Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Has.Count.EqualTo(1));
  53. });
  54. await pair.RunTicksSync(5);
  55. Assert.That(sPlayerManager.Sessions, Has.Length.EqualTo(0));
  56. Assert.That(!netMan.IsConnected);
  57. // Try to pardon a ban that does not exist
  58. await server.WaitPost(() => sConsole.ExecuteCommand("pardon 2"));
  59. // The existing ban is unaffected
  60. Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Not.Null);
  61. var ban = await sDatabase.GetServerBanAsync(1);
  62. Assert.Multiple(async () =>
  63. {
  64. Assert.That(ban, Is.Not.Null);
  65. Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Has.Count.EqualTo(1));
  66. // Check that it matches
  67. Assert.That(ban.Id, Is.EqualTo(1));
  68. Assert.That(ban.UserId, Is.EqualTo(clientId));
  69. Assert.That(ban.BanTime.UtcDateTime - DateTime.UtcNow, Is.LessThanOrEqualTo(MarginOfError));
  70. Assert.That(ban.ExpirationTime, Is.Not.Null);
  71. Assert.That(ban.ExpirationTime.Value.UtcDateTime - DateTime.UtcNow.AddHours(24), Is.LessThanOrEqualTo(MarginOfError));
  72. Assert.That(ban.Reason, Is.EqualTo(banReason));
  73. // Done through the console
  74. Assert.That(ban.BanningAdmin, Is.Null);
  75. Assert.That(ban.Unban, Is.Null);
  76. });
  77. // Pardon the actual ban
  78. await server.WaitPost(() => sConsole.ExecuteCommand("pardon 1"));
  79. // No bans should be returned
  80. Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Null);
  81. // Direct id lookup returns a pardoned ban
  82. var pardonedBan = await sDatabase.GetServerBanAsync(1);
  83. Assert.Multiple(async () =>
  84. {
  85. // Check that it matches
  86. Assert.That(pardonedBan, Is.Not.Null);
  87. // The list is still returned since that ignores pardons
  88. Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Has.Count.EqualTo(1));
  89. Assert.That(pardonedBan.Id, Is.EqualTo(1));
  90. Assert.That(pardonedBan.UserId, Is.EqualTo(clientId));
  91. Assert.That(pardonedBan.BanTime.UtcDateTime - DateTime.UtcNow, Is.LessThanOrEqualTo(MarginOfError));
  92. Assert.That(pardonedBan.ExpirationTime, Is.Not.Null);
  93. Assert.That(pardonedBan.ExpirationTime.Value.UtcDateTime - DateTime.UtcNow.AddHours(24), Is.LessThanOrEqualTo(MarginOfError));
  94. Assert.That(pardonedBan.Reason, Is.EqualTo(banReason));
  95. // Done through the console
  96. Assert.That(pardonedBan.BanningAdmin, Is.Null);
  97. Assert.That(pardonedBan.Unban, Is.Not.Null);
  98. Assert.That(pardonedBan.Unban.BanId, Is.EqualTo(1));
  99. // Done through the console
  100. Assert.That(pardonedBan.Unban.UnbanningAdmin, Is.Null);
  101. Assert.That(pardonedBan.Unban.UnbanTime.UtcDateTime - DateTime.UtcNow, Is.LessThanOrEqualTo(MarginOfError));
  102. });
  103. // Try to pardon it again
  104. await server.WaitPost(() => sConsole.ExecuteCommand("pardon 1"));
  105. // Nothing changes
  106. Assert.Multiple(async () =>
  107. {
  108. // No bans should be returned
  109. Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Null);
  110. // Direct id lookup returns a pardoned ban
  111. Assert.That(await sDatabase.GetServerBanAsync(1), Is.Not.Null);
  112. // The list is still returned since that ignores pardons
  113. Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Has.Count.EqualTo(1));
  114. });
  115. // Reconnect client. Slightly faster than dirtying the pair.
  116. Assert.That(sPlayerManager.Sessions, Is.Empty);
  117. client.SetConnectTarget(server);
  118. await client.WaitPost(() => netMan.ClientConnect(null!, 0, null!));
  119. await pair.RunTicksSync(5);
  120. Assert.That(sPlayerManager.Sessions, Has.Length.EqualTo(1));
  121. await pair.CleanReturnAsync();
  122. }
  123. }
  124. }