Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 1 addition & 28 deletions EssentialCSharp.Web/Extensions/IServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System.Net;
using System.Net.Sockets;
using EssentialCSharp.Web.Services;
using Microsoft.AspNetCore.HttpOverrides;

Expand Down Expand Up @@ -48,7 +47,7 @@ public static void AddTrustedForwardedHeaders(this IServiceCollection services,

foreach (var cidr in trustedProxyCidrs)
{
if (!TryParseCidr(cidr, out var network))
if (string.IsNullOrWhiteSpace(cidr) || !System.Net.IPNetwork.TryParse(cidr.Trim(), out var network))
throw new InvalidOperationException($"Invalid ForwardedHeaders:TrustedProxyCidrs entry '{cidr}'. Use CIDR notation, e.g. '10.0.0.0/8'.");

options.KnownIPNetworks.Add(network);
Expand All @@ -63,30 +62,4 @@ public static void AddTrustedForwardedHeaders(this IServiceCollection services,
}
});
}

private static bool TryParseCidr(string cidr, out System.Net.IPNetwork network)
{
network = default!;
if (string.IsNullOrWhiteSpace(cidr))
return false;

string[] parts = cidr.Split('/', 2, StringSplitOptions.TrimEntries);
if (parts.Length != 2
|| !IPAddress.TryParse(parts[0], out var networkAddress)
|| !int.TryParse(parts[1], out var prefixLength))
return false;

int maxPrefixLength = networkAddress.AddressFamily switch
{
AddressFamily.InterNetwork => 32,
AddressFamily.InterNetworkV6 => 128,
_ => -1
};

if (maxPrefixLength < 0 || prefixLength < 0 || prefixLength > maxPrefixLength)
return false;

network = new System.Net.IPNetwork(networkAddress, prefixLength);
return true;
}
}
Loading