Compare commits

..

5 Commits

Author SHA1 Message Date
e6d159fc03 Update _customcallbacks.gsc 2023-10-11 23:40:40 -05:00
f3adb75d55 Fix possible infinite loop
Possibility of an exploiter killing an enemy and disconnecting within the `wait` window to trigger an infinite loop.
2023-10-11 23:40:40 -05:00
d7c24dc98f add clear all reports command 2023-09-14 21:40:35 -05:00
005a8b050d require login for wildcard ip search 2023-09-13 22:50:37 -05:00
13d4ec3033 update l4d2 parser name 2023-09-02 15:45:03 -05:00
10 changed files with 62 additions and 17 deletions

View File

@ -0,0 +1,31 @@
using System.Threading.Tasks;
using Data.Models.Client;
using SharedLibraryCore;
using SharedLibraryCore.Configuration;
using SharedLibraryCore.Interfaces;
namespace IW4MAdmin.Application.Commands;
public class ClearAllReportsCommand : Command
{
public ClearAllReportsCommand(CommandConfiguration config, ITranslationLookup layout) : base(config, layout)
{
Name = "clearallreports";
Description = _translationLookup["COMMANDS_REPORTS_CLEAR_DESC"];
Alias = "car";
Permission = EFClient.Permission.Administrator;
RequiresTarget = false;
}
public override Task ExecuteAsync(GameEvent gameEvent)
{
foreach (var server in gameEvent.Owner.Manager.GetServers())
{
server.Reports.Clear();
}
gameEvent.Origin.Tell(_translationLookup["COMMANDS_REPORTS_CLEAR_SUCCESS"]);
return Task.CompletedTask;
}
}

View File

@ -8,9 +8,11 @@ using Data.Abstractions;
using Data.Models; using Data.Models;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using SharedLibraryCore; using SharedLibraryCore;
using SharedLibraryCore.Configuration;
using SharedLibraryCore.Dtos; using SharedLibraryCore.Dtos;
using SharedLibraryCore.Helpers; using SharedLibraryCore.Helpers;
using SharedLibraryCore.Interfaces; using SharedLibraryCore.Interfaces;
using WebfrontCore.Permissions;
using WebfrontCore.QueryHelpers.Models; using WebfrontCore.QueryHelpers.Models;
using EFClient = Data.Models.Client.EFClient; using EFClient = Data.Models.Client.EFClient;
@ -18,6 +20,7 @@ namespace IW4MAdmin.Application.QueryHelpers;
public class ClientResourceQueryHelper : IResourceQueryHelper<ClientResourceRequest, ClientResourceResponse> public class ClientResourceQueryHelper : IResourceQueryHelper<ClientResourceRequest, ClientResourceResponse>
{ {
public ApplicationConfiguration _appConfig { get; }
private readonly IDatabaseContextFactory _contextFactory; private readonly IDatabaseContextFactory _contextFactory;
private readonly IGeoLocationService _geoLocationService; private readonly IGeoLocationService _geoLocationService;
@ -27,8 +30,10 @@ public class ClientResourceQueryHelper : IResourceQueryHelper<ClientResourceRequ
public EFAlias Alias { get; set; } public EFAlias Alias { get; set; }
} }
public ClientResourceQueryHelper(IDatabaseContextFactory contextFactory, IGeoLocationService geoLocationService) public ClientResourceQueryHelper(IDatabaseContextFactory contextFactory, IGeoLocationService geoLocationService,
ApplicationConfiguration appConfig)
{ {
_appConfig = appConfig;
_contextFactory = contextFactory; _contextFactory = contextFactory;
_geoLocationService = geoLocationService; _geoLocationService = geoLocationService;
} }
@ -75,7 +80,9 @@ public class ClientResourceQueryHelper : IResourceQueryHelper<ClientResourceRequ
if (!string.IsNullOrWhiteSpace(query.ClientIp)) if (!string.IsNullOrWhiteSpace(query.ClientIp))
{ {
clientAliases = SearchByIp(query, clientAliases); clientAliases = SearchByIp(query, clientAliases,
_appConfig.HasPermission(query.RequesterPermission, WebfrontEntity.ClientIPAddress,
WebfrontPermission.Read));
} }
var iqGroupedClientAliases = clientAliases.GroupBy(a => new { a.Client.ClientId, a.Client.LastConnection }); var iqGroupedClientAliases = clientAliases.GroupBy(a => new { a.Client.ClientId, a.Client.LastConnection });
@ -203,7 +210,7 @@ public class ClientResourceQueryHelper : IResourceQueryHelper<ClientResourceRequ
} }
private static IQueryable<ClientAlias> SearchByIp(ClientResourceRequest query, private static IQueryable<ClientAlias> SearchByIp(ClientResourceRequest query,
IQueryable<ClientAlias> clientAliases) IQueryable<ClientAlias> clientAliases, bool canSearchIP)
{ {
var ipString = query.ClientIp.Trim(); var ipString = query.ClientIp.Trim();
var ipAddress = ipString.ConvertToIP(); var ipAddress = ipString.ConvertToIP();
@ -213,7 +220,7 @@ public class ClientResourceQueryHelper : IResourceQueryHelper<ClientResourceRequ
clientAliases = clientAliases.Where(clientAlias => clientAliases = clientAliases.Where(clientAlias =>
clientAlias.Alias.IPAddress != null && clientAlias.Alias.IPAddress == ipAddress); clientAlias.Alias.IPAddress != null && clientAlias.Alias.IPAddress == ipAddress);
} }
else else if(canSearchIP)
{ {
clientAliases = clientAliases.Where(clientAlias => clientAliases = clientAliases.Where(clientAlias =>
EF.Functions.Like(clientAlias.Alias.SearchableIPAddress, $"{ipString}%")); EF.Functions.Like(clientAlias.Alias.SearchableIPAddress, $"{ipString}%"));

View File

@ -17,7 +17,7 @@
SHG1 = 9, SHG1 = 9,
CSGO = 10, CSGO = 10,
H1 = 11, H1 = 11,
LFD2 = 12, L4D2 = 12,
} }
public enum ConnectionType public enum ConnectionType

View File

@ -137,6 +137,8 @@ waitForFrameThread()
waitForAdditionalAngles( logString, beforeFrameCount, afterFrameCount ) waitForAdditionalAngles( logString, beforeFrameCount, afterFrameCount )
{ {
self endon( "disconnect" );
currentIndex = self.currentAnglePosition; currentIndex = self.currentAnglePosition;
wait( 0.05 * afterFrameCount ); wait( 0.05 * afterFrameCount );

View File

@ -143,6 +143,8 @@ waitForFrameThread()
waitForAdditionalAngles( logString, beforeFrameCount, afterFrameCount ) waitForAdditionalAngles( logString, beforeFrameCount, afterFrameCount )
{ {
self endon( "disconnect" );
currentIndex = self.currentAnglePosition; currentIndex = self.currentAnglePosition;
wait( 0.05 * afterFrameCount ); wait( 0.05 * afterFrameCount );

View File

@ -53,7 +53,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ScriptPlugins", "ScriptPlug
Plugins\ScriptPlugins\ParserPlutoniumT5.js = Plugins\ScriptPlugins\ParserPlutoniumT5.js Plugins\ScriptPlugins\ParserPlutoniumT5.js = Plugins\ScriptPlugins\ParserPlutoniumT5.js
Plugins\ScriptPlugins\ServerBanner.js = Plugins\ScriptPlugins\ServerBanner.js Plugins\ScriptPlugins\ServerBanner.js = Plugins\ScriptPlugins\ServerBanner.js
Plugins\ScriptPlugins\ParserBOIII.js = Plugins\ScriptPlugins\ParserBOIII.js Plugins\ScriptPlugins\ParserBOIII.js = Plugins\ScriptPlugins\ParserBOIII.js
Plugins\ScriptPlugins\ParserLFD2SM.js = Plugins\ScriptPlugins\ParserLFD2SM.js Plugins\ScriptPlugins\ParserL4D2SM.js = Plugins\ScriptPlugins\ParserL4D2SM.js
EndProjectSection EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutomessageFeed", "Plugins\AutomessageFeed\AutomessageFeed.csproj", "{F5815359-CFC7-44B4-9A3B-C04BACAD5836}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AutomessageFeed", "Plugins\AutomessageFeed\AutomessageFeed.csproj", "{F5815359-CFC7-44B4-9A3B-C04BACAD5836}"

View File

@ -4,7 +4,7 @@ let eventParser;
const plugin = { const plugin = {
author: 'RaidMax', author: 'RaidMax',
version: 0.1, version: 0.1,
name: 'LFD2 (SourceMod) Parser', name: 'L4D2 (SourceMod) Parser',
engine: 'Source', engine: 'Source',
isParser: true, isParser: true,
@ -120,10 +120,10 @@ const plugin = {
eventParser.Configuration.Time.Pattern = '^L [01]\\d/[0-3]\\d/\\d+ - [0-2]\\d:[0-5]\\d:[0-5]\\d:'; eventParser.Configuration.Time.Pattern = '^L [01]\\d/[0-3]\\d/\\d+ - [0-2]\\d:[0-5]\\d:[0-5]\\d:';
rconParser.Version = 'LFD2SM'; rconParser.Version = 'L4D2SM';
rconParser.GameName = 10; // LFD2 rconParser.GameName = 12; // L4D2
eventParser.Version = 'LFD2SM'; eventParser.Version = 'L4D2SM';
eventParser.GameName = 10; // LFD2 eventParser.GameName = 12; // L4D2
eventParser.URLProtocolFormat = 'steam://connect/{{ip}}:{{port}}'; eventParser.URLProtocolFormat = 'steam://connect/{{ip}}:{{port}}';
}, },

View File

@ -36,7 +36,7 @@ namespace SharedLibraryCore
SHG1 = 9, SHG1 = 9,
CSGO = 10, CSGO = 10,
H1 = 11, H1 = 11,
LFD2 = 12 L4D2 = 12
} }
// only here for performance // only here for performance

View File

@ -250,6 +250,7 @@ namespace WebfrontCore.Controllers
ViewBag.Title = Localization["WEBFRONT_SEARCH_RESULTS_TITLE"]; ViewBag.Title = Localization["WEBFRONT_SEARCH_RESULTS_TITLE"];
ViewBag.ClientResourceRequest = request; ViewBag.ClientResourceRequest = request;
request.RequesterPermission = Client.Level;
var response = await _clientResourceHelper.QueryResource(request); var response = await _clientResourceHelper.QueryResource(request);
return request.Offset > 0 return request.Offset > 0
? PartialView("Find/_AdvancedFindList", response.Results) ? PartialView("Find/_AdvancedFindList", response.Results)

View File

@ -17,6 +17,8 @@ public class ClientResourceRequest : ClientPaginationRequest
public Reference.Game? GameName { get; set; } public Reference.Game? GameName { get; set; }
public bool IncludeGeolocationData { get; set; } = true; public bool IncludeGeolocationData { get; set; } = true;
public EFClient.Permission RequesterPermission { get; set; } = EFClient.Permission.User;
public bool HasData => !string.IsNullOrEmpty(ClientName) || !string.IsNullOrEmpty(ClientIp) || public bool HasData => !string.IsNullOrEmpty(ClientName) || !string.IsNullOrEmpty(ClientIp) ||
!string.IsNullOrEmpty(ClientGuid) || ClientLevel is not null || GameName is not null; !string.IsNullOrEmpty(ClientGuid) || ClientLevel is not null || GameName is not null;
} }