diff --git a/MediaBrowser.Common/Net/NetworkUtils.cs b/MediaBrowser.Common/Net/NetworkUtils.cs
index a498d6271b..24ed47a81b 100644
--- a/MediaBrowser.Common/Net/NetworkUtils.cs
+++ b/MediaBrowser.Common/Net/NetworkUtils.cs
@@ -198,14 +198,25 @@ public static partial class NetworkUtils
/// True if parsing was successful.
public static bool TryParseToSubnet(ReadOnlySpan value, [NotNullWhen(true)] out IPNetwork? result, bool negated = false)
{
+ // If multiple IP addresses are in a comma-separated string, the individual addresses may contain leading and/or trailing whitespace
value = value.Trim();
+
+ bool isAddressNegated = false;
+ if (value.StartsWith('!'))
+ {
+ isAddressNegated = true;
+ value = value[1..]; // Remove leading '!' character
+ }
+
+ if (isAddressNegated != negated)
+ {
+ result = null;
+ return false;
+ }
+
if (value.Contains('/'))
{
- if (negated && value.StartsWith("!") && IPNetwork.TryParse(value[1..], out result))
- {
- return true;
- }
- else if (!negated && IPNetwork.TryParse(value, out result))
+ if (IPNetwork.TryParse(value, out result))
{
return true;
}
diff --git a/tests/Jellyfin.Networking.Tests/NetworkParseTests.cs b/tests/Jellyfin.Networking.Tests/NetworkParseTests.cs
index 4144300da0..ef87e46a78 100644
--- a/tests/Jellyfin.Networking.Tests/NetworkParseTests.cs
+++ b/tests/Jellyfin.Networking.Tests/NetworkParseTests.cs
@@ -79,7 +79,10 @@ namespace Jellyfin.Networking.Tests
[InlineData("[fe80::7add:12ff:febb:c67b%16]")]
[InlineData("fd23:184f:2029:0:3139:7386:67d7:d517/56")]
public static void TryParseValidIPStringsTrue(string address)
- => Assert.True(NetworkUtils.TryParseToSubnet(address, out _));
+ {
+ Assert.True(NetworkUtils.TryParseToSubnet(address, out _));
+ Assert.True(NetworkUtils.TryParseToSubnet('!' + address, out _, true));
+ }
///
/// Checks invalid IP address formats.