ParseNetworkTests.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. using System;
  2. using System.Linq;
  3. using System.Net;
  4. using Jellyfin.Networking.Configuration;
  5. using Jellyfin.Networking.Manager;
  6. using Jellyfin.Server.Extensions;
  7. using MediaBrowser.Common.Configuration;
  8. using Microsoft.AspNetCore.Builder;
  9. using Microsoft.AspNetCore.HttpOverrides;
  10. using Microsoft.Extensions.Logging.Abstractions;
  11. using Moq;
  12. using Xunit;
  13. namespace Jellyfin.Server.Tests
  14. {
  15. public class ParseNetworkTests
  16. {
  17. public static TheoryData<bool, bool, string[], IPAddress[], IPNetwork[]> TestNetworks_TestData()
  18. {
  19. var data = new TheoryData<bool, bool, string[], IPAddress[], IPNetwork[]>();
  20. data.Add(
  21. true,
  22. true,
  23. new string[] { "192.168.t", "127.0.0.1", "1234.1232.12.1234" },
  24. new IPAddress[] { IPAddress.Loopback.MapToIPv6() },
  25. Array.Empty<IPNetwork>());
  26. data.Add(
  27. true,
  28. false,
  29. new string[] { "192.168.x", "127.0.0.1", "1234.1232.12.1234" },
  30. new IPAddress[] { IPAddress.Loopback },
  31. Array.Empty<IPNetwork>());
  32. data.Add(
  33. true,
  34. true,
  35. new string[] { "::1" },
  36. Array.Empty<IPAddress>(),
  37. new IPNetwork[] { new IPNetwork(IPAddress.IPv6Loopback, 128) });
  38. data.Add(
  39. false,
  40. false,
  41. new string[] { "localhost" },
  42. Array.Empty<IPAddress>(),
  43. Array.Empty<IPNetwork>());
  44. data.Add(
  45. true,
  46. false,
  47. new string[] { "localhost" },
  48. new IPAddress[] { IPAddress.Loopback },
  49. Array.Empty<IPNetwork>());
  50. data.Add(
  51. false,
  52. true,
  53. new string[] { "localhost" },
  54. Array.Empty<IPAddress>(),
  55. new IPNetwork[] { new IPNetwork(IPAddress.IPv6Loopback, 128) });
  56. data.Add(
  57. true,
  58. true,
  59. new string[] { "localhost" },
  60. new IPAddress[] { IPAddress.Loopback.MapToIPv6() },
  61. new IPNetwork[] { new IPNetwork(IPAddress.IPv6Loopback, 128) });
  62. return data;
  63. }
  64. [Theory]
  65. [MemberData(nameof(TestNetworks_TestData))]
  66. public void TestNetworks(bool ip4, bool ip6, string[] hostList, IPAddress[] knownProxies, IPNetwork[] knownNetworks)
  67. {
  68. using var nm = CreateNetworkManager();
  69. var settings = new NetworkConfiguration
  70. {
  71. EnableIPV4 = ip4,
  72. EnableIPV6 = ip6
  73. };
  74. ForwardedHeadersOptions options = new ForwardedHeadersOptions();
  75. // Need this here as ::1 and 127.0.0.1 are in them by default.
  76. options.KnownProxies.Clear();
  77. options.KnownNetworks.Clear();
  78. ApiServiceCollectionExtensions.AddProxyAddresses(settings, hostList, options);
  79. Assert.Equal(knownProxies.Length, options.KnownProxies.Count);
  80. foreach (var item in knownProxies)
  81. {
  82. Assert.True(options.KnownProxies.Contains(item));
  83. }
  84. Assert.Equal(knownNetworks.Length, options.KnownNetworks.Count);
  85. foreach (var item in knownNetworks)
  86. {
  87. Assert.NotNull(options.KnownNetworks.FirstOrDefault(x => x.Prefix.Equals(item.Prefix) && x.PrefixLength == item.PrefixLength));
  88. }
  89. }
  90. private static IConfigurationManager GetMockConfig(NetworkConfiguration conf)
  91. {
  92. var configManager = new Mock<IConfigurationManager>
  93. {
  94. CallBase = true
  95. };
  96. configManager.Setup(x => x.GetConfiguration(It.IsAny<string>())).Returns(conf);
  97. return configManager.Object;
  98. }
  99. private static NetworkManager CreateNetworkManager()
  100. {
  101. var conf = new NetworkConfiguration()
  102. {
  103. EnableIPV6 = true,
  104. EnableIPV4 = true,
  105. };
  106. return new NetworkManager(GetMockConfig(conf), new NullLogger<NetworkManager>());
  107. }
  108. }
  109. }