/// <summary> /// Sets up the proxy configuration based on the addresses in <paramref name="allowedProxies"/>. /// </summary> /// <param name="config">The <see cref="NetworkConfiguration"/> containing the config settings.</param> /// <param name="allowedProxies">The string array to parse.</param> /// <param name="options">The <see cref="ForwardedHeadersOptions"/> instance.</param> internal static void AddProxyAddresses(NetworkConfiguration config, string[] allowedProxies, ForwardedHeadersOptions options) { for (var i = 0; i < allowedProxies.Length; i++) { if (IPNetAddress.TryParse(allowedProxies[i], out var addr)) { AddIpAddress(config, options, addr.Address, addr.PrefixLength); } else if (IPHost.TryParse(allowedProxies[i], out var host)) { foreach (var address in host.GetAddresses()) { AddIpAddress(config, options, address, address.AddressFamily == AddressFamily.InterNetwork ? 32 : 128); } } } }
public void TestBindInterfaces(string source, string bindAddresses, bool ipv6enabled, string result) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (bindAddresses == null) { throw new ArgumentNullException(nameof(bindAddresses)); } if (result == null) { throw new ArgumentNullException(nameof(result)); } var conf = new NetworkConfiguration() { LocalNetworkAddresses = bindAddresses.Split(','), EnableIPV6 = ipv6enabled, EnableIPV4 = true }; NetworkManager.MockNetworkSettings = "192.168.1.208/24,-16,eth16|200.200.200.200/24,11,eth11"; using var nm = new NetworkManager(GetMockConfig(conf), new NullLogger <NetworkManager>()); NetworkManager.MockNetworkSettings = string.Empty; _ = nm.TryParseInterface(result, out Collection <IPObject>?resultObj); // Check to see if dns resolution is working. If not, skip test. _ = IPHost.TryParse(source, out var host); if (resultObj != null && host?.HasAddress == true) { result = ((IPNetAddress)resultObj[0]).ToString(true); var intf = nm.GetBindInterface(source, out _); Assert.Equal(intf, result); } }
/// <summary> /// Tries to identify the string and return an object of that class. /// </summary> /// <param name="addr">String to parse.</param> /// <param name="result">IPObject to return.</param> /// <returns>True if the value parsed successfully.</returns> private static bool TryParse(string addr, out IPObject result) { if (!string.IsNullOrEmpty(addr)) { // Is it an IP address if (IPNetAddress.TryParse(addr, out IPNetAddress nw)) { result = nw; return(true); } if (IPHost.TryParse(addr, out IPHost h)) { result = h; return(true); } } result = IPNetAddress.None; return(false); }
public void ValidHostStrings(string address) { Assert.True(IPHost.TryParse(address, out _)); }
public void InvalidAddressString(string address) { Assert.False(IPNetAddress.TryParse(address, out _)); Assert.False(IPHost.TryParse(address, out _)); }
/// <summary> /// Extension method for adding the jellyfin API to the service collection. /// </summary> /// <param name="serviceCollection">The service collection.</param> /// <param name="pluginAssemblies">An IEnumerable containing all plugin assemblies with API controllers.</param> /// <param name="knownProxies">A list of all known proxies to trust for X-Forwarded-For.</param> /// <returns>The MVC builder.</returns> public static IMvcBuilder AddJellyfinApi(this IServiceCollection serviceCollection, IEnumerable <Assembly> pluginAssemblies, IReadOnlyList <string> knownProxies) { IMvcBuilder mvcBuilder = serviceCollection .AddCors() .AddTransient <ICorsPolicyProvider, CorsPolicyProvider>() .Configure <ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; if (knownProxies.Count == 0) { options.KnownNetworks.Clear(); options.KnownProxies.Clear(); } else { for (var i = 0; i < knownProxies.Count; i++) { if (IPHost.TryParse(knownProxies[i], out var host)) { options.KnownProxies.Add(host.Address); } } } }) .AddMvc(opts => { // Allow requester to change between camelCase and PascalCase opts.RespectBrowserAcceptHeader = true; opts.OutputFormatters.Insert(0, new CamelCaseJsonProfileFormatter()); opts.OutputFormatters.Insert(0, new PascalCaseJsonProfileFormatter()); opts.OutputFormatters.Add(new CssOutputFormatter()); opts.OutputFormatters.Add(new XmlOutputFormatter()); opts.ModelBinderProviders.Insert(0, new NullableEnumModelBinderProvider()); }) // Clear app parts to avoid other assemblies being picked up .ConfigureApplicationPartManager(a => a.ApplicationParts.Clear()) .AddApplicationPart(typeof(StartupController).Assembly) .AddJsonOptions(options => { // Update all properties that are set in JsonDefaults var jsonOptions = JsonDefaults.GetPascalCaseOptions(); // From JsonDefaults options.JsonSerializerOptions.ReadCommentHandling = jsonOptions.ReadCommentHandling; options.JsonSerializerOptions.WriteIndented = jsonOptions.WriteIndented; options.JsonSerializerOptions.DefaultIgnoreCondition = jsonOptions.DefaultIgnoreCondition; options.JsonSerializerOptions.NumberHandling = jsonOptions.NumberHandling; options.JsonSerializerOptions.PropertyNameCaseInsensitive = jsonOptions.PropertyNameCaseInsensitive; options.JsonSerializerOptions.Converters.Clear(); foreach (var converter in jsonOptions.Converters) { options.JsonSerializerOptions.Converters.Add(converter); } // From JsonDefaults.PascalCase options.JsonSerializerOptions.PropertyNamingPolicy = jsonOptions.PropertyNamingPolicy; }); foreach (Assembly pluginAssembly in pluginAssemblies) { mvcBuilder.AddApplicationPart(pluginAssembly); } return(mvcBuilder.AddControllersAsServices()); }
public static void TryParse_InvalidAddressString_False(string address) => Assert.False(IPHost.TryParse(address, out _));
public static Property TryParse_IPv6Address_True(IPv6Address address) => IPHost.TryParse(address.Item.ToString(), out _).ToProperty();
public static void TryParse_ValidHostStrings_True(string address) => Assert.True(IPHost.TryParse(address, out _));