@ -1,10 +1,15 @@
using System ;
using System.Collections.Generic ;
using System.Globalization ;
using System.Linq ;
using System.Net ;
using System.Text ;
using Jellyfin.Networking.Configuration ;
using Jellyfin.Networking.Manager ;
using Jellyfin.Server.Extensions ;
using MediaBrowser.Common.Configuration ;
using Microsoft.AspNetCore.Builder ;
using Microsoft.AspNetCore.HttpOverrides ;
using Microsoft.Extensions.Logging.Abstractions ;
using Moq ;
using Xunit ;
@ -13,20 +18,63 @@ namespace Jellyfin.Server.Tests
{
public class ParseNetworkTests
{
/// <summary>
/// Order of the result has always got to be hosts, then networks.
/// </summary>
/// <param name="ip4">IP4 enabled.</param>
/// <param name="ip6">IP6 enabled.</param>
/// <param name="hostList">List to parse.</param>
/// <param name="match">What it should match.</param>
public static TheoryData < bool , bool , string [ ] , IPAddress [ ] , IPNetwork [ ] > TestNetworks_TestData ( )
{
var data = new TheoryData < bool , bool , string [ ] , IPAddress [ ] , IPNetwork [ ] > ( ) ;
data . Add (
true ,
true ,
new string [ ] { "192.168.t" , "127.0.0.1" , "1234.1232.12.1234" } ,
new IPAddress [ ] { IPAddress . Loopback . MapToIPv6 ( ) } ,
Array . Empty < IPNetwork > ( ) ) ;
data . Add (
true ,
false ,
new string [ ] { "192.168.x" , "127.0.0.1" , "1234.1232.12.1234" } ,
new IPAddress [ ] { IPAddress . Loopback } ,
Array . Empty < IPNetwork > ( ) ) ;
data . Add (
true ,
true ,
new string [ ] { "::1" } ,
Array . Empty < IPAddress > ( ) ,
new IPNetwork [ ] { new IPNetwork ( IPAddress . IPv6Loopback , 128 ) } ) ;
data . Add (
false ,
false ,
new string [ ] { "localhost" } ,
Array . Empty < IPAddress > ( ) ,
Array . Empty < IPNetwork > ( ) ) ;
data . Add (
true ,
false ,
new string [ ] { "localhost" } ,
new IPAddress [ ] { IPAddress . Loopback } ,
Array . Empty < IPNetwork > ( ) ) ;
data . Add (
false ,
true ,
new string [ ] { "localhost" } ,
Array . Empty < IPAddress > ( ) ,
new IPNetwork [ ] { new IPNetwork ( IPAddress . IPv6Loopback , 128 ) } ) ;
data . Add (
true ,
true ,
new string [ ] { "localhost" } ,
new IPAddress [ ] { IPAddress . Loopback . MapToIPv6 ( ) } ,
new IPNetwork [ ] { new IPNetwork ( IPAddress . IPv6Loopback , 128 ) } ) ;
return data ;
}
[Theory]
// [InlineData(true, true, "192.168.0.0/16,www.yahoo.co.uk", "::ffff:212.82.100.150,::ffff:192.168.0.0/16")] <- fails on Max. www.yahoo.co.uk resolves to a different ip address.
// [InlineData(true, false, "192.168.0.0/16,www.yahoo.co.uk", "212.82.100.150,192.168.0.0/16")]
[InlineData(true, true, "192.168.t,127.0.0.1,1234.1232.12.1234", "::ffff:127.0.0.1")]
[InlineData(true, false, "192.168.x,127.0.0.1,1234.1232.12.1234", "127.0.0.1")]
[InlineData(true, true, "::1", "::1/128")]
public void TestNetworks ( bool ip4 , bool ip6 , string hostList , string match )
[MemberData(nameof(TestNetworks_TestData))]
public void TestNetworks ( bool ip4 , bool ip6 , string [ ] hostList , IPAddress [ ] knownProxies , IPNetwork [ ] knownNetworks )
{
using var nm = CreateNetworkManager ( ) ;
@ -36,31 +84,25 @@ namespace Jellyfin.Server.Tests
EnableIPV6 = ip6
} ;
var result = match + "," ;
ForwardedHeadersOptions options = new ForwardedHeadersOptions ( ) ;
// Need this here as ::1 and 127.0.0.1 are in them by default.
options . KnownProxies . Clear ( ) ;
options . KnownNetworks . Clear ( ) ;
ApiServiceCollectionExtensions . AddProxyAddresses ( settings , hostList .Split ( ',' ) , options ) ;
ApiServiceCollectionExtensions . AddProxyAddresses ( settings , hostList , options ) ;
var sb = new StringBuilder ( ) ;
foreach ( var item in options. K nownProxies)
Assert . Equal ( knownProxies . Length , options . KnownProxies . Count ) ;
foreach ( var item in k nownProxies)
{
sb . Append ( item )
. Append ( ',' ) ;
Assert . True ( options . KnownProxies . Contains ( item ) ) ;
}
foreach ( var item in options . KnownNetworks )
Assert . Equal ( knownNetworks . Length , options . KnownNetworks . Count ) ;
foreach ( var item in knownNetworks )
{
sb . Append ( item . Prefix )
. Append ( '/' )
. Append ( item . PrefixLength . ToString ( CultureInfo . InvariantCulture ) )
. Append ( ',' ) ;
Assert . NotNull ( options . KnownNetworks . FirstOrDefault ( x = > x . Prefix . Equals ( item . Prefix ) & & x . PrefixLength = = item . PrefixLength ) ) ;
}
Assert . Equal ( sb . ToString ( ) , result ) ;
}
private static IConfigurationManager GetMockConfig ( NetworkConfiguration conf )