|
|
|
@ -547,13 +547,6 @@ namespace Emby.Server.Implementations
|
|
|
|
|
|
|
|
|
|
serviceCollection.AddSingleton<IJsonSerializer, JsonSerializer>();
|
|
|
|
|
|
|
|
|
|
// TODO: Remove support for injecting ILogger completely
|
|
|
|
|
serviceCollection.AddSingleton((provider) =>
|
|
|
|
|
{
|
|
|
|
|
Logger.LogWarning("Injecting ILogger directly is deprecated and should be replaced with ILogger<T>");
|
|
|
|
|
return Logger;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// TODO: properly set up scoping and switch to AddDbContextPool
|
|
|
|
|
serviceCollection.AddDbContext<JellyfinDb>(
|
|
|
|
|
options => options.UseSqlite($"Filename={Path.Combine(ApplicationPaths.DataPath, "jellyfin.db")}"),
|
|
|
|
@ -1156,9 +1149,6 @@ namespace Emby.Server.Implementations
|
|
|
|
|
ItemsByNamePath = ApplicationPaths.InternalMetadataPath,
|
|
|
|
|
InternalMetadataPath = ApplicationPaths.InternalMetadataPath,
|
|
|
|
|
CachePath = ApplicationPaths.CachePath,
|
|
|
|
|
HttpServerPortNumber = HttpPort,
|
|
|
|
|
SupportsHttps = SupportsHttps,
|
|
|
|
|
HttpsPortNumber = HttpsPort,
|
|
|
|
|
OperatingSystem = OperatingSystem.Id.ToString(),
|
|
|
|
|
OperatingSystemDisplayName = OperatingSystem.Name,
|
|
|
|
|
CanSelfRestart = CanSelfRestart,
|
|
|
|
@ -1194,23 +1184,22 @@ namespace Emby.Server.Implementations
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool EnableHttps => SupportsHttps && ServerConfigurationManager.Configuration.EnableHttps;
|
|
|
|
|
|
|
|
|
|
public bool SupportsHttps => Certificate != null || ServerConfigurationManager.Configuration.IsBehindProxy;
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public bool ListenWithHttps => Certificate != null && ServerConfigurationManager.Configuration.EnableHttps;
|
|
|
|
|
|
|
|
|
|
public async Task<string> GetLocalApiUrl(CancellationToken cancellationToken, bool forceHttp = false)
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public async Task<string> GetLocalApiUrl(CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// Return the first matched address, if found, or the first known local address
|
|
|
|
|
var addresses = await GetLocalIpAddressesInternal(false, 1, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
|
|
|
|
|
foreach (var address in addresses)
|
|
|
|
|
if (addresses.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
return GetLocalApiUrl(address, forceHttp);
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
return GetLocalApiUrl(addresses.First());
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
@ -1237,7 +1226,7 @@ namespace Emby.Server.Implementations
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public string GetLocalApiUrl(IPAddress ipAddress, bool forceHttp = false)
|
|
|
|
|
public string GetLocalApiUrl(IPAddress ipAddress)
|
|
|
|
|
{
|
|
|
|
|
if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
|
|
|
|
|
{
|
|
|
|
@ -1247,29 +1236,30 @@ namespace Emby.Server.Implementations
|
|
|
|
|
str.CopyTo(span.Slice(1));
|
|
|
|
|
span[^1] = ']';
|
|
|
|
|
|
|
|
|
|
return GetLocalApiUrl(span, forceHttp);
|
|
|
|
|
return GetLocalApiUrl(span);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return GetLocalApiUrl(ipAddress.ToString(), forceHttp);
|
|
|
|
|
return GetLocalApiUrl(ipAddress.ToString());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public string GetLocalApiUrl(ReadOnlySpan<char> host, bool forceHttp = false)
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public string GetLoopbackHttpApiUrl()
|
|
|
|
|
{
|
|
|
|
|
var url = new StringBuilder(64);
|
|
|
|
|
bool useHttps = EnableHttps && !forceHttp;
|
|
|
|
|
url.Append(useHttps ? "https://" : "http://")
|
|
|
|
|
.Append(host)
|
|
|
|
|
.Append(':')
|
|
|
|
|
.Append(useHttps ? HttpsPort : HttpPort);
|
|
|
|
|
|
|
|
|
|
string baseUrl = ServerConfigurationManager.Configuration.BaseUrl;
|
|
|
|
|
if (baseUrl.Length != 0)
|
|
|
|
|
{
|
|
|
|
|
url.Append(baseUrl);
|
|
|
|
|
}
|
|
|
|
|
return GetLocalApiUrl("127.0.0.1", Uri.UriSchemeHttp, HttpPort);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return url.ToString();
|
|
|
|
|
/// <inheritdoc/>
|
|
|
|
|
public string GetLocalApiUrl(ReadOnlySpan<char> host, string scheme = null, int? port = null)
|
|
|
|
|
{
|
|
|
|
|
// NOTE: If no BaseUrl is set then UriBuilder appends a trailing slash, but if there is no BaseUrl it does
|
|
|
|
|
// not. For consistency, always trim the trailing slash.
|
|
|
|
|
return new UriBuilder
|
|
|
|
|
{
|
|
|
|
|
Scheme = scheme ?? (ListenWithHttps ? Uri.UriSchemeHttps : Uri.UriSchemeHttp),
|
|
|
|
|
Host = host.ToString(),
|
|
|
|
|
Port = port ?? (ListenWithHttps ? HttpsPort : HttpPort),
|
|
|
|
|
Path = ServerConfigurationManager.Configuration.BaseUrl
|
|
|
|
|
}.ToString().TrimEnd('/');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task<List<IPAddress>> GetLocalIpAddresses(CancellationToken cancellationToken)
|
|
|
|
@ -1303,7 +1293,7 @@ namespace Emby.Server.Implementations
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var valid = await IsIpAddressValidAsync(address, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
var valid = await IsLocalIpAddressValidAsync(address, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
if (valid)
|
|
|
|
|
{
|
|
|
|
|
resultList.Add(address);
|
|
|
|
@ -1337,7 +1327,7 @@ namespace Emby.Server.Implementations
|
|
|
|
|
|
|
|
|
|
private readonly ConcurrentDictionary<string, bool> _validAddressResults = new ConcurrentDictionary<string, bool>(StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
|
|
|
|
|
private async Task<bool> IsIpAddressValidAsync(IPAddress address, CancellationToken cancellationToken)
|
|
|
|
|
private async Task<bool> IsLocalIpAddressValidAsync(IPAddress address, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
if (address.Equals(IPAddress.Loopback)
|
|
|
|
|
|| address.Equals(IPAddress.IPv6Loopback))
|
|
|
|
@ -1345,8 +1335,7 @@ namespace Emby.Server.Implementations
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var apiUrl = GetLocalApiUrl(address);
|
|
|
|
|
apiUrl += "/system/ping";
|
|
|
|
|
var apiUrl = GetLocalApiUrl(address) + "/system/ping";
|
|
|
|
|
|
|
|
|
|
if (_validAddressResults.TryGetValue(apiUrl, out var cachedResult))
|
|
|
|
|
{
|
|
|
|
|