diff --git a/.gitignore b/.gitignore index d29d3c0..011b6c7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ **/obj/ **/bin/ out/ +**.pem diff --git a/Nyangate.sln b/Nyangate.sln index 5f56c08..98918e7 100644 --- a/Nyangate.sln +++ b/Nyangate.sln @@ -15,6 +15,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nyangate", "src\Nyangate\Ny EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Nyangate.Lib", "src\Nyangate.Lib\Nyangate.Lib.csproj", "{273954D9-C2DC-430F-A62D-DD55B908BA6C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Femsci.Nyangate.Client", "src\Femsci.Nyangate.Client\Femsci.Nyangate.Client.csproj", "{70C92E14-613E-4808-85A1-0F38ABD3AB52}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -40,11 +42,16 @@ Global {273954D9-C2DC-430F-A62D-DD55B908BA6C}.Debug|Any CPU.Build.0 = Debug|Any CPU {273954D9-C2DC-430F-A62D-DD55B908BA6C}.Release|Any CPU.ActiveCfg = Release|Any CPU {273954D9-C2DC-430F-A62D-DD55B908BA6C}.Release|Any CPU.Build.0 = Release|Any CPU + {70C92E14-613E-4808-85A1-0F38ABD3AB52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70C92E14-613E-4808-85A1-0F38ABD3AB52}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70C92E14-613E-4808-85A1-0F38ABD3AB52}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70C92E14-613E-4808-85A1-0F38ABD3AB52}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {65ADE5CC-F1ED-4D18-A64E-7C4C625334D7} = {9B32EA6C-F2D3-4A38-99FC-0C5F522B338A} {8CCADE0F-436B-4CF0-A885-CEE0F96121D4} = {D389138A-1E17-4AFE-A0C8-D71DA9C2967B} {D1171FEB-30A7-4D0B-B1AF-2DF5857E25A1} = {D389138A-1E17-4AFE-A0C8-D71DA9C2967B} {273954D9-C2DC-430F-A62D-DD55B908BA6C} = {D389138A-1E17-4AFE-A0C8-D71DA9C2967B} + {70C92E14-613E-4808-85A1-0F38ABD3AB52} = {D389138A-1E17-4AFE-A0C8-D71DA9C2967B} EndGlobalSection EndGlobal diff --git a/main.key.pem b/main.key.pem deleted file mode 100644 index e6769fc..0000000 --- a/main.key.pem +++ /dev/null @@ -1,52 +0,0 @@ ------BEGIN PRIVATE KEY----- -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 -A6a/XxsG5QEM+okhljJX1TmpmsjsiA== ------END PRIVATE KEY----- diff --git a/main.pem b/main.pem deleted file mode 100644 index a94379e..0000000 --- a/main.pem +++ /dev/null @@ -1,29 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFAzCCAuugAwIBAgIUSSnKwcDCcz5MhNWZ/eV+uhBap6kwDQYJKoZIhvcNAQEL -BQAwETEPMA0GA1UEAwwGTllBTkVUMB4XDTIzMDMyODEwMzMxM1oXDTI0MDMyNzEw -MzMxM1owETEPMA0GA1UEAwwGTllBTkVUMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAtxOJBxEe9EWGYZgzQfH9mnvoTwVMVPgIPpos4PYYFvJeXrCitwIA -j0ZCmT4Pekvq/5RH4n4NOltpSEXjM1ghbt8Yo/W5y5YquQGO74nK6HQhQBT+ix0l -9M3xKvZZv8H8R6FLHT0Y0IHz5dV0BjAXsztT2tFvYDOXZHz+gehp9fZ2ToqJKa4W -2avhMWL4v/OaP48WmW/42q6sDIqbvQ+TvAQKMFRrDSKoeC8wN1uOh2BFv0FIsrA5 -PhGlFnD9GmNYW5HZAi0RmiQVdlq6abZud9Ve/ny9SpT7+3XP2QjE737lRbkELnfQ -KTo17eHfFGv82yUY0PImzkSBojuZg4wf44dpml5RiXYprJGVirxeTkMVOS3tnFA4 -75Ux0MoS9xSxwznHJpDQ+7NMooxQSDk1KY5cBqAdymSAptAL0jJBMg83hkBpGEx6 -tzEoIlH4skGKoV4HuSBlihk8uLcV/NpW49Th8THVr55lZZwXCma8JgWpFd9eF1Es -mPGzQzRUeiunBpWwDvGKjWZ6jxXR/2OCofKPQOMOkWq8TXZiV0Xbg6KXFJTisZB2 -nwC6hqKzaudGxuBnbogwMaLBqqfndrcWO9pJhEMIow6OEUhEIvmUl8B8HFXu+dOR -dxRyNQldEBU7erN+dLrhIjbO0LayRHIQge6mjiikLJF0IHEVL4v5GOECAwEAAaNT -MFEwHQYDVR0OBBYEFPwC9awfqcrGqfdfByhXS7eF0/9JMB8GA1UdIwQYMBaAFPwC -9awfqcrGqfdfByhXS7eF0/9JMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL -BQADggIBAKN1U3DSTamMqHb5mETk55wokbGGOJfxz7WDfqzbOnpUkyuvMEiZ0QI9 -nMHFJd7LHGca2f28y3yZWAcvGkhLk2A6LDeBBoE1q+V2Ss4LR7dMK/UU895yJKLC -whs+04cR8kKPLOlaOUdO/uqCJ0JDBxXTsIj2VIHVeF3FybvRgPSjuO0nej+SQDT1 -dG3ZJV09AVujWBA9gYLl/7Cr9GdgJmfx+JJ685R7qDrO5n7hpW5P7HAa+7viXzhd -x34er0l8b4pLzBXn2bl2gsaKvXCBXs6TkL2i+FwoihDk7rMiMpxKvzaHmk/9F6xD -HrOrJHCSv5vTxsPTHsfgGa2D8eNg7qK8rySEbzOiMw2CgT6peQMlDTvQbSCE4E/q -7g5rOc4GSFOd6C6HMP18BGBFNW3iGwrB7I3s+sonLzEesKlG9JnmQTTIC0bnZjzl -5RDkpaQjawBkU0jVYx7//2Fmj7SplLCuAj54LHTh1bhk8kduEi7qX2TmaTJboVX2 -J1JB3OhEOkaJ4rd+u3LED6sbkO8TWNsI7/Vyz3gbfB5E/nop8jibpoZ67LI1Yjf4 -eior7k6HOJ7uisnCp3n69aVkUd0FEEVEXr1+LcNt2V5iR24jhs76XSLYqsUwVdU/ -6zfPt1qT//7MS/KZNU69oJzstqkprXRkelc0SoBB+BY4oWUIvSXR ------END CERTIFICATE----- diff --git a/src/Femsci.Nyangate.Client/Client.cs b/src/Femsci.Nyangate.Client/Client.cs new file mode 100644 index 0000000..3e2dad3 --- /dev/null +++ b/src/Femsci.Nyangate.Client/Client.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +namespace Femsci.Nyangate.Client; + +public static class Client +{ + public static IServiceCollection AddNyangate(this IServiceCollection c, Action options) + { + NyangateClientOptions opts = new(); + options.Invoke(opts); + + throw new NotImplementedException(); + } + + public static IApplicationBuilder UseNyangate(this IApplicationBuilder b) + { + b.UseMiddleware(); + return b; + } +} + +public class NyangateClientOptions +{ + +} diff --git a/src/Femsci.Nyangate.Client/Femsci.Nyangate.Client.csproj b/src/Femsci.Nyangate.Client/Femsci.Nyangate.Client.csproj new file mode 100644 index 0000000..a30dc70 --- /dev/null +++ b/src/Femsci.Nyangate.Client/Femsci.Nyangate.Client.csproj @@ -0,0 +1,14 @@ + + + + net7.0 + enable + enable + + + + + + + + diff --git a/src/Femsci.Nyangate.Client/ProxyMiddleware.cs b/src/Femsci.Nyangate.Client/ProxyMiddleware.cs new file mode 100644 index 0000000..5c3097c --- /dev/null +++ b/src/Femsci.Nyangate.Client/ProxyMiddleware.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Primitives; + +namespace Femsci.Nyangate.Client; + +public class ProxyMiddleware +{ + private readonly RequestDelegate _next; + + public ProxyMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task InvokeAsync(HttpContext ctx) + { + if (!ctx.Request.Headers.TryGetValue("Forwarded", out StringValues header)) + { + await _next(ctx); + return; + } + + // Retrieve 'Forwarded' header + + var values = header.ToDictionary(s => s[..s.IndexOf('=')], s => s[(s.IndexOf('=') + 1)..]); + + IPAddress remote = IPAddress.Parse(values["for"]); + IPAddress proxy = IPAddress.Parse(values["by"]); + ctx.Request.Scheme = values["proto"]; + + ctx.Connection.RemoteIpAddress = remote; + ctx.Items["proxy"] = proxy; + + await _next(ctx); + + // Code to execute after calling the next middleware component. + } +} diff --git a/src/Nyangate.Lib/Collections/FixedSizeQueue.cs b/src/Nyangate.Lib/Collections/FixedSizeQueue.cs new file mode 100644 index 0000000..100b9c9 --- /dev/null +++ b/src/Nyangate.Lib/Collections/FixedSizeQueue.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Threading.Tasks; + +namespace Nyangate.Lib.Collections; + +public class FixedSizedQueue : IEnumerable, IReadOnlyCollection +{ + public FixedSizedQueue(int size) + { + Size = size; + } + + public int Size { get; private init; } + + public int Count => _queue.Count; + + public bool IsReadOnly => false; + + private readonly ConcurrentQueue _queue = new(); + + public void Enqueue(T obj) + { + _queue.Enqueue(obj); + while (_queue.Count > Size) + { + _queue.TryDequeue(out _); + } + } + + public bool TryDequeue([MaybeNullWhen(false)] out T t) + { + return _queue.TryDequeue(out t); + } + + public IEnumerator GetEnumerator() + { + return _queue.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _queue.GetEnumerator(); + } +} + diff --git a/src/Nyangate.Lib/Data/BalancingStrategy.cs b/src/Nyangate.Lib/Data/BalancingStrategy.cs new file mode 100644 index 0000000..89e4da5 --- /dev/null +++ b/src/Nyangate.Lib/Data/BalancingStrategy.cs @@ -0,0 +1,6 @@ +namespace Nyangate.Lib.Data; + +public enum BalancingStrategy +{ + RoundRobin +} diff --git a/src/Nyangate.Lib/Data/ServiceInstance.cs b/src/Nyangate.Lib/Data/ServiceInstance.cs new file mode 100644 index 0000000..7fc68e6 --- /dev/null +++ b/src/Nyangate.Lib/Data/ServiceInstance.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Nyangate.Lib.Data; + +public class ServiceInstance +{ + public required string Name { get; set; } +} diff --git a/src/Nyangate.Lib/Data/WebService.cs b/src/Nyangate.Lib/Data/WebService.cs new file mode 100644 index 0000000..469147b --- /dev/null +++ b/src/Nyangate.Lib/Data/WebService.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Nyangate.Lib.Data; + +public class WebService +{ + public BalancingStrategy BalancingStrategy { get; set; } + public List ServiceInstances { get; set; } = new(); + private int _counter = 0; +} diff --git a/src/Nyangate/Controllers/RouteController.cs b/src/Nyangate/Controllers/RouteController.cs new file mode 100644 index 0000000..f55c703 --- /dev/null +++ b/src/Nyangate/Controllers/RouteController.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace Nyangate.Controllers; + +[ApiController] +[Route("/api/route")] +public class RouteController : ControllerBase +{ + [HttpGet("meow")] + public async Task Meow() + { + return Ok("nya"); + } +} diff --git a/src/Nyangate/Middleware/HostSelector.cs b/src/Nyangate/Middleware/HostSelector.cs new file mode 100644 index 0000000..e4e5ba3 --- /dev/null +++ b/src/Nyangate/Middleware/HostSelector.cs @@ -0,0 +1,33 @@ +using Nyangate.Lib.Data; +using Nyangate.Services; + +namespace Nyangate.Middleware; + +public class HostSelector +{ + private readonly RequestDelegate _next; + private readonly RoutingMap _map; + + public HostSelector(RequestDelegate next, RoutingMap map) + { + _next = next; + _map = map; + } + + public async Task Invoke(HttpContext ctx) + { + var host = _map.Get(ctx.Request.Host.Host); + + if (host is null) + { + ctx.Response.StatusCode = 404; + await ctx.Response.WriteAsync("meowless~"); + await ctx.Response.CompleteAsync(); + return; + } + + ctx.Features[typeof(ServerHost)] = host; + + await _next.Invoke(ctx); + } +} diff --git a/src/Nyangate/Middleware/IDSFilter.cs b/src/Nyangate/Middleware/IDSFilter.cs deleted file mode 100644 index 8582bfc..0000000 --- a/src/Nyangate/Middleware/IDSFilter.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Nyangate.Middleware; - -public class IDSFilter -{ - private readonly RequestDelegate _next; - - public IDSFilter(RequestDelegate next) - { - _next = next; - } - - public async Task Invoke(HttpContext ctx) - { - //do smth - await _next.Invoke(ctx); - } -} diff --git a/src/Nyangate/Middleware/IPFilter.cs b/src/Nyangate/Middleware/IPFilter.cs deleted file mode 100644 index 7d2ea9b..0000000 --- a/src/Nyangate/Middleware/IPFilter.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace Nyangate.Middleware; - -public class IPFilter -{ - private readonly RequestDelegate _next; - - public IPFilter(RequestDelegate next) - { - _next = next; - } - - public async Task Invoke(HttpContext ctx) - { - //do smth - await _next.Invoke(ctx); - } -} diff --git a/src/Nyangate/Middleware/Logger.cs b/src/Nyangate/Middleware/Logger.cs new file mode 100644 index 0000000..8f234d6 --- /dev/null +++ b/src/Nyangate/Middleware/Logger.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Nyangate.Middleware; + +public class Logger +{ + private readonly RequestDelegate _next; + + public Logger(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext ctx) + { + Console.WriteLine(ctx.ToString()); + await _next.Invoke(ctx); + Console.WriteLine(ctx.ToString()); + } +} diff --git a/src/Nyangate/Program.cs b/src/Nyangate/Program.cs index 8f3074e..d40ecb5 100644 --- a/src/Nyangate/Program.cs +++ b/src/Nyangate/Program.cs @@ -5,6 +5,7 @@ var builder = WebApplication.CreateBuilder(args); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddControllers(); //TODO: Replace with DI var certs = new ServerCertificateRegistry(); @@ -25,11 +26,11 @@ builder.WebHost.UseKestrel(o => var app = builder.Build(); +app.UseMiddleware(); +app.UseMiddleware(); app.UseMiddleware(); app.UseMiddleware(); -app.UseMiddleware(); -app.UseMiddleware(); app.UseMiddleware(); -app.UseMiddleware(); +app.UseMiddleware(); app.Run(); diff --git a/src/Nyangate/Services/BlacklistRegistry.cs b/src/Nyangate/Services/BlacklistRegistry.cs index 2346da4..2ff13d2 100644 --- a/src/Nyangate/Services/BlacklistRegistry.cs +++ b/src/Nyangate/Services/BlacklistRegistry.cs @@ -11,6 +11,7 @@ public class BlacklistRegistry public async Task IsBlacklisted(HttpContext ctx) { + await Task.Yield(); throw new NotImplementedException(); } } diff --git a/src/Nyangate/Services/RateLimitService.cs b/src/Nyangate/Services/RateLimitService.cs index 1079c8a..9c390cd 100644 --- a/src/Nyangate/Services/RateLimitService.cs +++ b/src/Nyangate/Services/RateLimitService.cs @@ -1,26 +1,31 @@ +using System.Collections.Concurrent; using System.Net; namespace Nyangate.Services; public class RateLimitService { - public async Task IsRateLimited(IPAddress addr, bool update = true) - { - throw new NotImplementedException(); - } + private readonly ConcurrentDictionary _actionList = new(); public async Task IsRateLimited(HttpContext ctx, bool update = true) { + IPAddress addr = ctx.Connection.RemoteIpAddress!; + int actions = _actionList.GetValueOrDefault(addr, 0); + + if (update) + { + await UpdateActivity(ctx); + } + throw new NotImplementedException(); } public async Task UpdateActivity(HttpContext ctx) { - throw new NotImplementedException(); - } + IPAddress addr = ctx.Connection.RemoteIpAddress!; - public async Task UpdateActivity(IPAddress addr) - { - throw new NotImplementedException(); + _actionList.AddOrUpdate(addr, (_) => 0, (_, i) => i + 1); + + await Task.Yield(); } } diff --git a/src/Nyangate/Services/RoutingMap.cs b/src/Nyangate/Services/RoutingMap.cs index cf3666c..9acdb26 100644 --- a/src/Nyangate/Services/RoutingMap.cs +++ b/src/Nyangate/Services/RoutingMap.cs @@ -6,16 +6,6 @@ public class RoutingMap { public RoutingMap() { - _hosts.Add("meow", new() - { - Hostname = "meow", - Route = new() - { - UsesTls = false, - Port = 8888, - Route = new("localhost") - } - }); } private readonly Dictionary _hosts = new(); diff --git a/src/Nyangate/Services/ServerCertificateRegistry.cs b/src/Nyangate/Services/ServerCertificateRegistry.cs index b46b535..8b7eaaa 100644 --- a/src/Nyangate/Services/ServerCertificateRegistry.cs +++ b/src/Nyangate/Services/ServerCertificateRegistry.cs @@ -6,7 +6,7 @@ public class ServerCertificateRegistry { public ServerCertificateRegistry() { - _main = X509Certificate2.CreateFromPemFile("/home/nya/Dev/csharp/nyangate/main.pem", "/home/nya/Dev/csharp/nyangate/main.key.pem"); + _main = X509Certificate2.CreateFromPemFile("../../main.pem", "../../main.key.pem"); } private readonly Dictionary _registry = new();