Add banlist command (#3163)

* Add banlist command

* Fix up args
This commit is contained in:
DrSmugleaf
2021-02-12 13:04:32 +01:00
committed by GitHub
parent 6eb0dd4f50
commit 9f5fca2334
7 changed files with 191 additions and 2 deletions

View File

@@ -8,6 +8,7 @@ namespace Content.Server.Database
{
public sealed class ServerBanDef
{
public int? Id { get; }
public NetUserId? UserId { get; }
public (IPAddress address, int cidrMask)? Address { get; }
@@ -16,7 +17,7 @@ namespace Content.Server.Database
public string Reason { get; }
public NetUserId? BanningAdmin { get; }
public ServerBanDef(NetUserId? userId, (IPAddress, int)? address, DateTimeOffset banTime, DateTimeOffset? expirationTime, string reason, NetUserId? banningAdmin)
public ServerBanDef(int? id, NetUserId? userId, (IPAddress, int)? address, DateTimeOffset banTime, DateTimeOffset? expirationTime, string reason, NetUserId? banningAdmin)
{
if (userId == null && address == null)
{
@@ -30,6 +31,7 @@ namespace Content.Server.Database
address = (addr.Item1.MapToIPv4(), addr.Item2 - 96);
}
Id = id;
UserId = userId;
Address = address;
BanTime = banTime;

View File

@@ -230,6 +230,7 @@ namespace Content.Server.Database
* BAN STUFF
*/
public abstract Task<ServerBanDef?> GetServerBanAsync(IPAddress? address, NetUserId? userId);
public abstract Task<List<ServerBanDef>> GetServerBansAsync(IPAddress? address, NetUserId? userId);
public abstract Task AddServerBanAsync(ServerBanDef serverBan);
/*

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Threading;
@@ -41,6 +42,7 @@ namespace Content.Server.Database
// Ban stuff
Task<ServerBanDef?> GetServerBanAsync(IPAddress? address, NetUserId? userId);
Task<List<ServerBanDef>> GetServerBansAsync(IPAddress? address, NetUserId? userId);
Task AddServerBanAsync(ServerBanDef serverBan);
// Player records
@@ -142,6 +144,11 @@ namespace Content.Server.Database
return _db.GetServerBanAsync(address, userId);
}
public Task<List<ServerBanDef>> GetServerBansAsync(IPAddress? address, NetUserId? userId)
{
return _db.GetServerBansAsync(address, userId);
}
public Task AddServerBanAsync(ServerBanDef serverBan)
{
return _db.AddServerBanAsync(serverBan);

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
@@ -74,6 +75,56 @@ namespace Content.Server.Database
return ConvertBan(ban);
}
public override async Task<List<ServerBanDef>> GetServerBansAsync(IPAddress? address, NetUserId? userId)
{
if (address == null && userId == null)
{
throw new ArgumentException("Address and userId cannot both be null");
}
await using var db = await GetDbImpl();
var query = db.PgDbContext.Ban
.Include(p => p.Unban).AsQueryable();
if (userId is { } uid)
{
if (address == null)
{
// Only have a user ID.
query = query.Where(p => p.UserId == uid.UserId);
}
else
{
// Have both user ID and IP address.
query = query.Where(p =>
(p.Address != null && EF.Functions.ContainsOrEqual(p.Address.Value, address))
|| p.UserId == uid.UserId);
}
}
else
{
// Only have a connecting address.
query = query.Where(
p => p.Address != null && EF.Functions.ContainsOrEqual(p.Address.Value, address));
}
var queryBans = await query.ToArrayAsync();
var bans = new List<ServerBanDef>();
foreach (var ban in queryBans)
{
var banDef = ConvertBan(ban);
if (banDef != null)
{
bans.Add(banDef);
}
}
return bans;
}
private static ServerBanDef? ConvertBan(PostgresServerBan? ban)
{
if (ban == null)
@@ -94,6 +145,7 @@ namespace Content.Server.Database
}
return new ServerBanDef(
ban.Id,
uid,
ban.Address,
ban.BanTime,

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
@@ -72,6 +73,42 @@ namespace Content.Server.Database
return null;
}
public override async Task<List<ServerBanDef>> GetServerBansAsync(IPAddress? address, NetUserId? userId)
{
await using var db = await GetDbImpl();
// SQLite can't do the net masking stuff we need to match IP address ranges.
// So just pull down the whole list into memory.
var queryBans = await db.SqliteDbContext.Ban
.Include(p => p.Unban)
.ToListAsync();
var bans = new List<ServerBanDef>();
foreach (var ban in queryBans)
{
ServerBanDef? banDef = null;
if (address != null && ban.Address != null && address.IsInSubnet(ban.Address))
{
banDef = ConvertBan(ban);
}
else if (userId is { } id && ban.UserId == id.UserId)
{
banDef = ConvertBan(ban);
}
if (banDef == null)
{
continue;
}
bans.Add(banDef);
}
return bans;
}
public override async Task AddServerBanAsync(ServerBanDef serverBan)
{
await using var db = await GetDbImpl();
@@ -182,6 +219,7 @@ namespace Content.Server.Database
}
return new ServerBanDef(
ban.Id,
uid,
addrTuple,
ban.BanTime,