Apply review suggestions

This commit is contained in:
Shadowghost 2023-07-03 10:03:39 +02:00
parent 9b0e44019a
commit 3f65851520
2 changed files with 61 additions and 102 deletions

View File

@ -590,35 +590,22 @@ namespace Jellyfin.Networking.Manager
/// <inheritdoc/> /// <inheritdoc/>
public bool TryParseInterface(string intf, [NotNullWhen(true)] out IReadOnlyList<IPData>? result) public bool TryParseInterface(string intf, [NotNullWhen(true)] out IReadOnlyList<IPData>? result)
{ {
var resultList = new List<IPData>(); if (string.IsNullOrEmpty(intf)
if (string.IsNullOrEmpty(intf) || _interfaces is null) || _interfaces is null
|| _interfaces.Count == 0)
{ {
result = resultList.AsReadOnly(); result = null;
return false; return false;
} }
// Match all interfaces starting with names starting with token // Match all interfaces starting with names starting with token
var matchedInterfaces = _interfaces.Where(s => s.Name.Equals(intf, StringComparison.OrdinalIgnoreCase)).OrderBy(x => x.Index).ToList(); result = _interfaces
if (matchedInterfaces.Count > 0) .Where(i => i.Name.Equals(intf, StringComparison.OrdinalIgnoreCase)
{ && ((IsIPv4Enabled && i.Address.AddressFamily == AddressFamily.InterNetwork)
_logger.LogInformation("Interface {Token} used in settings. Using its interface addresses.", intf); || (IsIPv6Enabled && i.Address.AddressFamily == AddressFamily.InterNetworkV6)))
.OrderBy(x => x.Index)
// Use interface IP instead of name .ToArray();
foreach (var iface in matchedInterfaces) return result.Count > 0;
{
if ((IsIPv4Enabled && iface.Address.AddressFamily == AddressFamily.InterNetwork)
|| (IsIPv6Enabled && iface.Address.AddressFamily == AddressFamily.InterNetworkV6))
{
resultList.Add(iface);
}
}
result = resultList.AsReadOnly();
return true;
}
result = resultList.AsReadOnly();
return false;
} }
/// <inheritdoc/> /// <inheritdoc/>
@ -693,11 +680,7 @@ namespace Jellyfin.Networking.Manager
if (individualInterfaces) if (individualInterfaces)
{ {
foreach (var iface in _interfaces) result.AddRange(_interfaces);
{
result.Add(iface);
}
return result; return result;
} }
@ -792,37 +775,37 @@ namespace Jellyfin.Networking.Manager
.ThenBy(x => x.Index) .ThenBy(x => x.Index)
.ToList(); .ToList();
if (availableInterfaces.Count > 0) if (availableInterfaces.Count == 0)
{ {
// If no source address is given, use the preferred (first) interface // There isn't any others, so we'll use the loopback.
if (source is null) result = IsIPv4Enabled && !IsIPv6Enabled ? "127.0.0.1" : "::1";
{ _logger.LogWarning("{Source}: Only loopback {Result} returned, using that as bind address.", source, result);
result = NetworkExtensions.FormatIPString(availableInterfaces.First().Address);
_logger.LogDebug("{Source}: Using first internal interface as bind address: {Result}", source, result);
return result;
}
// Does the request originate in one of the interface subnets?
// (For systems with multiple internal network cards, and multiple subnets)
foreach (var intf in availableInterfaces)
{
if (intf.Subnet.Contains(source))
{
result = NetworkExtensions.FormatIPString(intf.Address);
_logger.LogDebug("{Source}: Found interface with matching subnet, using it as bind address: {Result}", source, result);
return result;
}
}
// Fallback to first available interface
result = NetworkExtensions.FormatIPString(availableInterfaces[0].Address);
_logger.LogDebug("{Source}: No matching interfaces found, using preferred interface as bind address: {Result}", source, result);
return result; return result;
} }
// There isn't any others, so we'll use the loopback. // If no source address is given, use the preferred (first) interface
result = IsIPv4Enabled && !IsIPv6Enabled ? "127.0.0.1" : "::1"; if (source is null)
_logger.LogWarning("{Source}: Only loopback {Result} returned, using that as bind address.", source, result); {
result = NetworkExtensions.FormatIPString(availableInterfaces.First().Address);
_logger.LogDebug("{Source}: Using first internal interface as bind address: {Result}", source, result);
return result;
}
// Does the request originate in one of the interface subnets?
// (For systems with multiple internal network cards, and multiple subnets)
foreach (var intf in availableInterfaces)
{
if (intf.Subnet.Contains(source))
{
result = NetworkExtensions.FormatIPString(intf.Address);
_logger.LogDebug("{Source}: Found interface with matching subnet, using it as bind address: {Result}", source, result);
return result;
}
}
// Fallback to first available interface
result = NetworkExtensions.FormatIPString(availableInterfaces[0].Address);
_logger.LogDebug("{Source}: No matching interfaces found, using preferred interface as bind address: {Result}", source, result);
return result; return result;
} }
@ -845,18 +828,13 @@ namespace Jellyfin.Networking.Manager
if (NetworkExtensions.TryParseHost(address, out var addresses, IsIPv4Enabled, IsIPv6Enabled)) if (NetworkExtensions.TryParseHost(address, out var addresses, IsIPv4Enabled, IsIPv6Enabled))
{ {
bool match = false;
foreach (var ept in addresses) foreach (var ept in addresses)
{ {
match = match || IPAddress.IsLoopback(ept) || (_lanSubnets.Any(x => x.Contains(ept)) && !_excludedSubnets.Any(x => x.Contains(ept))); if (IPAddress.IsLoopback(ept) || (_lanSubnets.Any(x => x.Contains(ept)) && !_excludedSubnets.Any(x => x.Contains(ept))))
if (match)
{ {
break; return true;
} }
} }
return match;
} }
return false; return false;
@ -881,33 +859,23 @@ namespace Jellyfin.Networking.Manager
private bool CheckIfLanAndNotExcluded(IPAddress address) private bool CheckIfLanAndNotExcluded(IPAddress address)
{ {
bool match = false;
foreach (var lanSubnet in _lanSubnets) foreach (var lanSubnet in _lanSubnets)
{ {
match = lanSubnet.Contains(address); if (lanSubnet.Contains(address))
if (match)
{ {
break; foreach (var excludedSubnet in _excludedSubnets)
{
if (excludedSubnet.Contains(address))
{
return false;
}
}
return true;
} }
} }
if (!match) return false;
{
return match;
}
foreach (var excludedSubnet in _excludedSubnets)
{
match = match && !excludedSubnet.Contains(address);
if (!match)
{
break;
}
}
return match;
} }
/// <summary> /// <summary>
@ -1017,14 +985,11 @@ namespace Jellyfin.Networking.Manager
.OrderByDescending(x => x.Subnet.Contains(source)) .OrderByDescending(x => x.Subnet.Contains(source))
.ThenBy(x => x.Index) .ThenBy(x => x.Index)
.Select(x => x.Address) .Select(x => x.Address)
.FirstOrDefault(); .First();
if (bindAddress is not null) result = NetworkExtensions.FormatIPString(bindAddress);
{ _logger.LogDebug("{Source}: External request received, matching external bind address found: {Result}", source, result);
result = NetworkExtensions.FormatIPString(bindAddress); return true;
_logger.LogDebug("{Source}: External request received, matching external bind address found: {Result}", source, result);
return true;
}
} }
_logger.LogWarning("{Source}: External request received, no matching external bind address found, trying internal addresses.", source); _logger.LogWarning("{Source}: External request received, no matching external bind address found, trying internal addresses.", source);
@ -1073,7 +1038,7 @@ namespace Jellyfin.Networking.Manager
// (For systems with multiple network cards and/or multiple subnets) // (For systems with multiple network cards and/or multiple subnets)
foreach (var intf in extResult) foreach (var intf in extResult)
{ {
if (!IsInLocalNetwork(intf.Address) && intf.Subnet.Contains(source)) if (intf.Subnet.Contains(source))
{ {
result = NetworkExtensions.FormatIPString(intf.Address); result = NetworkExtensions.FormatIPString(intf.Address);
_logger.LogDebug("{Source}: Found external interface with matching subnet, using it as bind address: {Result}", source, result); _logger.LogDebug("{Source}: Found external interface with matching subnet, using it as bind address: {Result}", source, result);

View File

@ -183,14 +183,8 @@ namespace MediaBrowser.Common.Net
} }
} }
if (tmpResult.Count > 0) result = tmpResult;
{ return tmpResult.Count > 0;
result = tmpResult;
return true;
}
result = null;
return false;
} }
/// <summary> /// <summary>
@ -307,8 +301,8 @@ namespace MediaBrowser.Common.Net
// Is an IP4 or IP4:port // Is an IP4 or IP4:port
if (IPAddress.TryParse(hosts[0].AsSpan().LeftPart('/'), out var address)) if (IPAddress.TryParse(hosts[0].AsSpan().LeftPart('/'), out var address))
{ {
if (((address.AddressFamily == AddressFamily.InterNetwork) && (!isIPv4Enabled && isIPv6Enabled)) || if (((address.AddressFamily == AddressFamily.InterNetwork) && (!isIPv4Enabled && isIPv6Enabled))
((address.AddressFamily == AddressFamily.InterNetworkV6) && (isIPv4Enabled && !isIPv6Enabled))) || ((address.AddressFamily == AddressFamily.InterNetworkV6) && (isIPv4Enabled && !isIPv6Enabled)))
{ {
addresses = Array.Empty<IPAddress>(); addresses = Array.Empty<IPAddress>();
return false; return false;