ParseNetworkTests.cs 4.3 KB

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