mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-11-04 03:27:21 -05:00 
			
		
		
		
	Merge pull request #5274 from BaronGreenback/bindfix
This commit is contained in:
		
						commit
						14605280a0
					
				@ -1,6 +1,7 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Collections.ObjectModel;
 | 
			
		||||
using System.Diagnostics.CodeAnalysis;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Net;
 | 
			
		||||
@ -691,11 +692,11 @@ namespace Jellyfin.Networking.Manager
 | 
			
		||||
        /// Checks the string to see if it matches any interface names.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="token">String to check.</param>
 | 
			
		||||
        /// <param name="index">Interface index number.</param>
 | 
			
		||||
        /// <param name="index">Interface index numbers that match.</param>
 | 
			
		||||
        /// <returns><c>true</c> if an interface name matches the token, <c>False</c> otherwise.</returns>
 | 
			
		||||
        private bool IsInterface(string token, out int index)
 | 
			
		||||
        private bool TryGetInterfaces(string token, [NotNullWhen(true)] out List<int>? index)
 | 
			
		||||
        {
 | 
			
		||||
            index = -1;
 | 
			
		||||
            index = null;
 | 
			
		||||
 | 
			
		||||
            // Is it the name of an interface (windows) eg, Wireless LAN adapter Wireless Network Connection 1.
 | 
			
		||||
            // Null check required here for automated testing.
 | 
			
		||||
@ -712,13 +713,13 @@ namespace Jellyfin.Networking.Manager
 | 
			
		||||
                    if ((!partial && string.Equals(interfc, token, StringComparison.OrdinalIgnoreCase))
 | 
			
		||||
                        || (partial && interfc.StartsWith(token, true, CultureInfo.InvariantCulture)))
 | 
			
		||||
                    {
 | 
			
		||||
                        index = interfcIndex;
 | 
			
		||||
                        return true;
 | 
			
		||||
                        index ??= new List<int>();
 | 
			
		||||
                        index.Add(interfcIndex);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return false;
 | 
			
		||||
            return index != null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
@ -730,14 +731,14 @@ namespace Jellyfin.Networking.Manager
 | 
			
		||||
        {
 | 
			
		||||
            // Is it the name of an interface (windows) eg, Wireless LAN adapter Wireless Network Connection 1.
 | 
			
		||||
            // Null check required here for automated testing.
 | 
			
		||||
            if (IsInterface(token, out int index))
 | 
			
		||||
            if (TryGetInterfaces(token, out var indices))
 | 
			
		||||
            {
 | 
			
		||||
                _logger.LogInformation("Interface {Token} used in settings. Using its interface addresses.", token);
 | 
			
		||||
 | 
			
		||||
                // Replace interface tags with the interface IP's.
 | 
			
		||||
                // Replace all the interface tags with the interface IP's.
 | 
			
		||||
                foreach (IPNetAddress iface in _interfaceAddresses)
 | 
			
		||||
                {
 | 
			
		||||
                    if (Math.Abs(iface.Tag) == index
 | 
			
		||||
                    if (indices.Contains(Math.Abs(iface.Tag))
 | 
			
		||||
                        && ((IsIP4Enabled && iface.Address.AddressFamily == AddressFamily.InterNetwork)
 | 
			
		||||
                            || (IsIP6Enabled && iface.Address.AddressFamily == AddressFamily.InterNetworkV6)))
 | 
			
		||||
                    {
 | 
			
		||||
@ -916,12 +917,20 @@ namespace Jellyfin.Networking.Manager
 | 
			
		||||
                // Add virtual machine interface names to the list of bind exclusions, so that they are auto-excluded.
 | 
			
		||||
                if (config.IgnoreVirtualInterfaces)
 | 
			
		||||
                {
 | 
			
		||||
                    var virtualInterfaceNames = config.VirtualInterfaceNames.Split(',');
 | 
			
		||||
                    // each virtual interface name must be pre-pended with the exclusion symbol !
 | 
			
		||||
                    var virtualInterfaceNames = config.VirtualInterfaceNames.Split(',').Select(p => "!" + p).ToArray();
 | 
			
		||||
                    if (lanAddresses.Length > 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        var newList = new string[lanAddresses.Length + virtualInterfaceNames.Length];
 | 
			
		||||
                        Array.Copy(lanAddresses, newList, lanAddresses.Length);
 | 
			
		||||
                        Array.Copy(virtualInterfaceNames, 0, newList, lanAddresses.Length, virtualInterfaceNames.Length);
 | 
			
		||||
                        lanAddresses = newList;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        lanAddresses = virtualInterfaceNames;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Read and parse bind addresses and exclusions, removing ones that don't exist.
 | 
			
		||||
                _bindAddresses = CreateIPCollection(lanAddresses).Union(_interfaceAddresses);
 | 
			
		||||
 | 
			
		||||
@ -52,15 +52,20 @@ namespace Jellyfin.Networking.Tests
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Checks the ability to ignore interfaces
 | 
			
		||||
        /// Checks the ability to ignore virtual interfaces.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="interfaces">Mock network setup, in the format (IP address, interface index, interface name) | .... </param>
 | 
			
		||||
        /// <param name="lan">LAN addresses.</param>
 | 
			
		||||
        /// <param name="value">Bind addresses that are excluded.</param>
 | 
			
		||||
        [Theory]
 | 
			
		||||
        // All valid
 | 
			
		||||
        [InlineData("192.168.1.208/24,-16,eth16|200.200.200.200/24,11,eth11", "192.168.1.0/24;200.200.200.0/24", "[192.168.1.208/24,200.200.200.200/24]")]
 | 
			
		||||
        // eth16 only
 | 
			
		||||
        [InlineData("192.168.1.208/24,-16,eth16|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[192.168.1.208/24]")]
 | 
			
		||||
        [InlineData("192.168.1.208/24,-16,vEthernet1|192.168.1.208/24,-16,vEthernet212|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[192.168.1.208/24]")]
 | 
			
		||||
        // All interfaces excluded.
 | 
			
		||||
        [InlineData("192.168.1.208/24,-16,vEthernet1|192.168.2.208/24,-16,vEthernet212|200.200.200.200/24,11,eth11", "192.168.1.0/24", "[]")]
 | 
			
		||||
        // vEthernet1 and vEthernet212 should be excluded.
 | 
			
		||||
        [InlineData("192.168.1.200/24,-20,vEthernet1|192.168.2.208/24,-16,vEthernet212|200.200.200.200/24,11,eth11", "192.168.1.0/24;200.200.200.200/24", "[200.200.200.200/24]")]
 | 
			
		||||
        public void IgnoreVirtualInterfaces(string interfaces, string lan, string value)
 | 
			
		||||
        {
 | 
			
		||||
            var conf = new NetworkConfiguration()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user