diff --git a/Application/Application.csproj b/Application/Application.csproj index de1ecd9c..3097038e 100644 --- a/Application/Application.csproj +++ b/Application/Application.csproj @@ -2,11 +2,11 @@ Exe - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.1 false RaidMax.IW4MAdmin.Application - 2.2.4.9 + 2.2.5.0 RaidMax Forever None IW4MAdmin @@ -25,14 +25,14 @@ - + true true - 2.2.4.9 - 2.2.4.9 + 2.2.5.0 + 2.2.5.0 @@ -79,7 +79,7 @@ - + diff --git a/Application/IW4MServer.cs b/Application/IW4MServer.cs index 291ba8b6..e60d79c0 100644 --- a/Application/IW4MServer.cs +++ b/Application/IW4MServer.cs @@ -690,6 +690,7 @@ namespace IW4MAdmin { RconParser = Manager.AdditionalRConParsers.FirstOrDefault(_parser => _parser.Version == version.Value) ?? RconParser; EventParser = Manager.AdditionalEventParsers.FirstOrDefault(_parser => _parser.Version == version.Value) ?? EventParser; + Version = RconParser.Version; } var infoResponse = RconParser.Configuration.CommandPrefixes.RConGetInfo != null ? await this.GetInfoAsync() : null; diff --git a/Master/Master.pyproj b/Master/Master.pyproj index c8f24655..6f867b69 100644 --- a/Master/Master.pyproj +++ b/Master/Master.pyproj @@ -11,7 +11,7 @@ . - Web launcher + Standard Python launcher http://localhost . true @@ -25,6 +25,7 @@ script script + False true diff --git a/Master/master/resources/instance.py b/Master/master/resources/instance.py index e6323137..6864757a 100644 --- a/Master/master/resources/instance.py +++ b/Master/master/resources/instance.py @@ -5,6 +5,7 @@ from marshmallow import ValidationError from master.schema.instanceschema import InstanceSchema from master import ctx import json +from netaddr import IPAddress class Instance(Resource): def get(self, id=None): @@ -23,7 +24,7 @@ class Instance(Resource): def put(self, id): try: for server in request.json['servers']: - if 'ip' not in server or server['ip'] == 'localhost': + if 'ip' not in server or IPAddress(server['ip']).is_private() or IPAddress(server['ip']).is_loopback(): server['ip'] = request.remote_addr if 'version' not in server: server['version'] = 'Unknown' diff --git a/Master/master/schema/serverschema.py b/Master/master/schema/serverschema.py index 27ecf488..aa56347b 100644 --- a/Master/master/schema/serverschema.py +++ b/Master/master/schema/serverschema.py @@ -4,7 +4,7 @@ from master.models.servermodel import ServerModel class ServerSchema(Schema): id = fields.Int( required=True, - validate=validate.Range(1, 25525525525565535, 'invalid id') + validate=validate.Range(0, 25525525525565535, 'invalid id') ) ip = fields.Str( required=True @@ -35,7 +35,7 @@ class ServerSchema(Schema): ) map = fields.String( required=True, - validate=validate.Length(1, 32, 'invalid map name') + validate=validate.Length(0, 64, 'invalid map name') ) gametype = fields.String( required=True, diff --git a/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj b/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj index cc9b9a2a..a1add8d0 100644 --- a/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj +++ b/Plugins/IW4ScriptCommands/IW4ScriptCommands.csproj @@ -2,8 +2,8 @@ Library - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.2 Debug;Release;Prerelease @@ -19,7 +19,7 @@ - + diff --git a/Plugins/Login/Login.csproj b/Plugins/Login/Login.csproj index 5375174f..647aa41d 100644 --- a/Plugins/Login/Login.csproj +++ b/Plugins/Login/Login.csproj @@ -2,8 +2,8 @@ Library - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.2 RaidMax.IW4MAdmin.Plugins.Login @@ -22,7 +22,7 @@ - + diff --git a/Plugins/ProfanityDeterment/ProfanityDeterment.csproj b/Plugins/ProfanityDeterment/ProfanityDeterment.csproj index b0db5bdb..1872099b 100644 --- a/Plugins/ProfanityDeterment/ProfanityDeterment.csproj +++ b/Plugins/ProfanityDeterment/ProfanityDeterment.csproj @@ -2,8 +2,8 @@ Library - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.2 RaidMax.IW4MAdmin.Plugins.ProfanityDeterment @@ -20,7 +20,7 @@ - + diff --git a/Plugins/Stats/Stats.csproj b/Plugins/Stats/Stats.csproj index 9a41b152..84280722 100644 --- a/Plugins/Stats/Stats.csproj +++ b/Plugins/Stats/Stats.csproj @@ -2,8 +2,8 @@ Library - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.2 RaidMax.IW4MAdmin.Plugins.Stats @@ -27,7 +27,7 @@ - + diff --git a/Plugins/Tests/Tests.csproj b/Plugins/Tests/Tests.csproj index 2d1e768b..84255c5d 100644 --- a/Plugins/Tests/Tests.csproj +++ b/Plugins/Tests/Tests.csproj @@ -2,8 +2,8 @@ Library - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.2 @@ -23,7 +23,7 @@ - + diff --git a/Plugins/Welcome/Welcome.csproj b/Plugins/Welcome/Welcome.csproj index 66dac03e..010bc58e 100644 --- a/Plugins/Welcome/Welcome.csproj +++ b/Plugins/Welcome/Welcome.csproj @@ -2,8 +2,8 @@ Library - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.2 RaidMax.IW4MAdmin.Plugins.Welcome @@ -20,7 +20,7 @@ - + diff --git a/SharedLibraryCore/Configuration/ApplicationConfiguration.cs b/SharedLibraryCore/Configuration/ApplicationConfiguration.cs index f1a89bef..1daeb4bd 100644 --- a/SharedLibraryCore/Configuration/ApplicationConfiguration.cs +++ b/SharedLibraryCore/Configuration/ApplicationConfiguration.cs @@ -25,6 +25,8 @@ namespace SharedLibraryCore.Configuration public int RConPollRate { get; set; } = 5000; public bool IgnoreBots { get; set; } public TimeSpan MaximumTempBanTime { get; set; } = new TimeSpan(24 * 30, 0, 0); + public bool EnableWebfrontConnectionWhitelist { get; set; } + public List WebfrontConnectionWhitelist { get; set; } public string Id { get; set; } public List Servers { get; set; } public int AutoMessagePeriod { get; set; } diff --git a/SharedLibraryCore/SharedLibraryCore.csproj b/SharedLibraryCore/SharedLibraryCore.csproj index 39c7d82f..dae6cb63 100644 --- a/SharedLibraryCore/SharedLibraryCore.csproj +++ b/SharedLibraryCore/SharedLibraryCore.csproj @@ -2,8 +2,8 @@ Library - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.1 RaidMax.IW4MAdmin.SharedLibraryCore @@ -21,9 +21,9 @@ - - - + + + all runtime; build; native; contentfiles; analyzers @@ -35,12 +35,12 @@ - + - + diff --git a/WebfrontCore/Middleware/IPWhitelist.cs b/WebfrontCore/Middleware/IPWhitelist.cs new file mode 100644 index 00000000..16b34cb8 --- /dev/null +++ b/WebfrontCore/Middleware/IPWhitelist.cs @@ -0,0 +1,46 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace WebfrontCore.Middleware +{ + /// + /// Defines the middleware functioning to whitelist connection from + /// a set of IP Addresses + /// + internal sealed class IPWhitelist + { + private readonly List whitelistedIps; + private readonly RequestDelegate nextRequest; + + /// + /// constructor + /// + /// + /// + /// list of textual ip addresses + public IPWhitelist(RequestDelegate nextRequest, ILogger logger, List whitelistedIps) + { + this.whitelistedIps = whitelistedIps.Select(_ip => System.Net.IPAddress.Parse(_ip).GetAddressBytes()).ToList(); + this.nextRequest = nextRequest; + } + + public async Task Invoke(HttpContext context) + { + bool isAlllowed = whitelistedIps.Any(_ip => _ip.SequenceEqual(context.Connection.RemoteIpAddress.GetAddressBytes())); + + if (isAlllowed) + { + await nextRequest.Invoke(context); + } + + else + { + context.Abort(); + } + } + } +} diff --git a/WebfrontCore/Startup.cs b/WebfrontCore/Startup.cs index aa0f2491..b216b4f8 100644 --- a/WebfrontCore/Startup.cs +++ b/WebfrontCore/Startup.cs @@ -6,6 +6,8 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using SharedLibraryCore.Database; +using System.Linq; +using WebfrontCore.Middleware; namespace WebfrontCore { @@ -47,16 +49,20 @@ namespace WebfrontCore options.AccessDeniedPath = "/"; options.LoginPath = "/"; }); + +#if DEBUG + services.AddLogging(_builder => + { + _builder.AddDebug(); + }); +#endif } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { - //loggerFactory.AddConsole(Configuration.GetSection("Logging")); - if (env.IsDevelopment()) { - loggerFactory.AddDebug(); app.UseDeveloperExceptionPage(); } @@ -65,6 +71,11 @@ namespace WebfrontCore app.UseExceptionHandler("/Home/Error"); } + if (Program.Manager.GetApplicationSettings().Configuration().EnableWebfrontConnectionWhitelist) + { + app.UseMiddleware(Program.Manager.GetApplicationSettings().Configuration().WebfrontConnectionWhitelist); + } + app.UseStaticFiles(); app.UseAuthentication(); diff --git a/WebfrontCore/WebfrontCore.csproj b/WebfrontCore/WebfrontCore.csproj index bf92a126..384924a3 100644 --- a/WebfrontCore/WebfrontCore.csproj +++ b/WebfrontCore/WebfrontCore.csproj @@ -1,8 +1,8 @@  - netcoreapp2.1 - 2.1.5 + netcoreapp2.2 + 2.2.1 false false true @@ -56,16 +56,16 @@ - - - - - - - - - - + + + + + + + + + +