ParseNetworkTests.cs 4.4 KB

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