|  | @@ -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.KnownProxies)
 | 
	
		
			
				|  |  | +            Assert.Equal(knownProxies.Length, options.KnownProxies.Count);
 | 
	
		
			
				|  |  | +            foreach (var item in knownProxies)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                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)
 |