1
0

BanPanelEui.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System.Net;
  2. using System.Net.Sockets;
  3. using Content.Server.Administration.Managers;
  4. using Content.Server.Administration.Systems;
  5. using Content.Server.Chat.Managers;
  6. using Content.Server.EUI;
  7. using Content.Shared.Administration;
  8. using Content.Shared.Database;
  9. using Content.Shared.Eui;
  10. using Robust.Shared.Network;
  11. namespace Content.Server.Administration;
  12. public sealed class BanPanelEui : BaseEui
  13. {
  14. [Dependency] private readonly IBanManager _banManager = default!;
  15. [Dependency] private readonly IEntityManager _entities = default!;
  16. [Dependency] private readonly ILogManager _log = default!;
  17. [Dependency] private readonly IPlayerLocator _playerLocator = default!;
  18. [Dependency] private readonly IChatManager _chat = default!;
  19. [Dependency] private readonly IAdminManager _admins = default!;
  20. private readonly ISawmill _sawmill;
  21. private NetUserId? PlayerId { get; set; }
  22. private string PlayerName { get; set; } = string.Empty;
  23. private IPAddress? LastAddress { get; set; }
  24. private ImmutableTypedHwid? LastHwid { get; set; }
  25. private const int Ipv4_CIDR = 32;
  26. private const int Ipv6_CIDR = 64;
  27. public BanPanelEui()
  28. {
  29. IoCManager.InjectDependencies(this);
  30. _sawmill = _log.GetSawmill("admin.bans_eui");
  31. }
  32. public override EuiStateBase GetNewState()
  33. {
  34. var hasBan = _admins.HasAdminFlag(Player, AdminFlags.Ban);
  35. return new BanPanelEuiState(PlayerName, hasBan);
  36. }
  37. public override void HandleMessage(EuiMessageBase msg)
  38. {
  39. base.HandleMessage(msg);
  40. switch (msg)
  41. {
  42. case BanPanelEuiStateMsg.CreateBanRequest r:
  43. BanPlayer(r.Player, r.IpAddress, r.UseLastIp, r.Hwid, r.UseLastHwid, r.Minutes, r.Severity, r.Reason, r.Roles, r.Erase);
  44. break;
  45. case BanPanelEuiStateMsg.GetPlayerInfoRequest r:
  46. ChangePlayer(r.PlayerUsername);
  47. break;
  48. }
  49. }
  50. private async void BanPlayer(string? target, string? ipAddressString, bool useLastIp, ImmutableTypedHwid? hwid, bool useLastHwid, uint minutes, NoteSeverity severity, string reason, IReadOnlyCollection<string>? roles, bool erase)
  51. {
  52. if (!_admins.HasAdminFlag(Player, AdminFlags.Ban))
  53. {
  54. _sawmill.Warning($"{Player.Name} ({Player.UserId}) tried to create a ban with no ban flag");
  55. return;
  56. }
  57. if (target == null && string.IsNullOrWhiteSpace(ipAddressString) && hwid == null)
  58. {
  59. _chat.DispatchServerMessage(Player, Loc.GetString("ban-panel-no-data"));
  60. return;
  61. }
  62. (IPAddress, int)? addressRange = null;
  63. if (ipAddressString is not null)
  64. {
  65. var hid = "0";
  66. var split = ipAddressString.Split('/', 2);
  67. ipAddressString = split[0];
  68. if (split.Length > 1)
  69. hid = split[1];
  70. if (!IPAddress.TryParse(ipAddressString, out var ipAddress) || !uint.TryParse(hid, out var hidInt) || hidInt > Ipv6_CIDR || hidInt > Ipv4_CIDR && ipAddress.AddressFamily == AddressFamily.InterNetwork)
  71. {
  72. _chat.DispatchServerMessage(Player, Loc.GetString("ban-panel-invalid-ip"));
  73. return;
  74. }
  75. if (hidInt == 0)
  76. hidInt = (uint) (ipAddress.AddressFamily == AddressFamily.InterNetworkV6 ? Ipv6_CIDR : Ipv4_CIDR);
  77. addressRange = (ipAddress, (int) hidInt);
  78. }
  79. var targetUid = target is not null ? PlayerId : null;
  80. addressRange = useLastIp && LastAddress is not null ? (LastAddress, LastAddress.AddressFamily == AddressFamily.InterNetworkV6 ? Ipv6_CIDR : Ipv4_CIDR) : addressRange;
  81. var targetHWid = useLastHwid ? LastHwid : hwid;
  82. if (target != null && target != PlayerName || Guid.TryParse(target, out var parsed) && parsed != PlayerId)
  83. {
  84. var located = await _playerLocator.LookupIdByNameOrIdAsync(target);
  85. if (located == null)
  86. {
  87. _chat.DispatchServerMessage(Player, Loc.GetString("cmd-ban-player"));
  88. return;
  89. }
  90. targetUid = located.UserId;
  91. var targetAddress = located.LastAddress;
  92. if (useLastIp && targetAddress != null)
  93. {
  94. if (targetAddress.IsIPv4MappedToIPv6)
  95. targetAddress = targetAddress.MapToIPv4();
  96. // Ban /64 for IPv6, /32 for IPv4.
  97. var hid = targetAddress.AddressFamily == AddressFamily.InterNetworkV6 ? Ipv6_CIDR : Ipv4_CIDR;
  98. addressRange = (targetAddress, hid);
  99. }
  100. targetHWid = useLastHwid ? located.LastHWId : hwid;
  101. }
  102. if (roles?.Count > 0)
  103. {
  104. var now = DateTimeOffset.UtcNow;
  105. foreach (var role in roles)
  106. {
  107. _banManager.CreateRoleBan(targetUid, target, Player.UserId, addressRange, targetHWid, role, minutes, severity, reason, now);
  108. }
  109. Close();
  110. return;
  111. }
  112. if (erase &&
  113. targetUid != null)
  114. {
  115. try
  116. {
  117. if (_entities.TrySystem(out AdminSystem? adminSystem))
  118. adminSystem.Erase(targetUid.Value);
  119. }
  120. catch (Exception e)
  121. {
  122. _sawmill.Error($"Error while erasing banned player:\n{e}");
  123. }
  124. }
  125. _banManager.CreateServerBan(targetUid, target, Player.UserId, addressRange, targetHWid, minutes, severity, reason);
  126. Close();
  127. }
  128. public async void ChangePlayer(string playerNameOrId)
  129. {
  130. var located = await _playerLocator.LookupIdByNameOrIdAsync(playerNameOrId);
  131. ChangePlayer(located?.UserId, located?.Username ?? string.Empty, located?.LastAddress, located?.LastHWId);
  132. }
  133. public void ChangePlayer(NetUserId? playerId, string playerName, IPAddress? lastAddress, ImmutableTypedHwid? lastHwid)
  134. {
  135. PlayerId = playerId;
  136. PlayerName = playerName;
  137. LastAddress = lastAddress;
  138. LastHwid = lastHwid;
  139. StateDirty();
  140. }
  141. public override async void Opened()
  142. {
  143. base.Opened();
  144. _admins.OnPermsChanged += OnPermsChanged;
  145. }
  146. public override void Closed()
  147. {
  148. base.Closed();
  149. _admins.OnPermsChanged -= OnPermsChanged;
  150. }
  151. private void OnPermsChanged(AdminPermsChangedEventArgs args)
  152. {
  153. if (args.Player != Player)
  154. {
  155. return;
  156. }
  157. StateDirty();
  158. }
  159. }