@ -6,6 +6,8 @@ using System.Globalization;
using System.IO ;
using System.Linq ;
using System.Net ;
using System.Net.Http ;
using System.Net.Sockets ;
using System.Reflection ;
using System.Runtime.InteropServices ;
using System.Security.Cryptography.X509Certificates ;
@ -106,9 +108,9 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http ;
using Microsoft.AspNetCore.Http.Extensions ;
using Microsoft.Extensions.Configuration ;
using Microsoft.Extensions.Logging ;
using Microsoft.Extensions.DependencyInjection ;
using Microsoft.Extensions.DependencyInjection.Extensions ;
using Microsoft.Extensions.Logging ;
using ServiceStack ;
using OperatingSystem = MediaBrowser . Common . System . OperatingSystem ;
@ -119,6 +121,10 @@ namespace Emby.Server.Implementations
/// </summary>
public abstract class ApplicationHost : IServerApplicationHost , IDisposable
{
private SqliteUserRepository _userRepository ;
private SqliteDisplayPreferencesRepository _displayPreferencesRepository ;
/// <summary>
/// Gets a value indicating whether this instance can self restart.
/// </summary>
@ -231,11 +237,6 @@ namespace Emby.Server.Implementations
/// <value>The server configuration manager.</value>
public IServerConfigurationManager ServerConfigurationManager = > ( IServerConfigurationManager ) ConfigurationManager ;
protected virtual IResourceFileManager CreateResourceFileManager ( )
{
return new ResourceFileManager ( HttpResultFactory , LoggerFactory , FileSystemManager ) ;
}
/// <summary>
/// Gets or sets the user manager.
/// </summary>
@ -294,8 +295,6 @@ namespace Emby.Server.Implementations
/// <value>The user data repository.</value>
private IUserDataManager UserDataManager { get ; set ; }
private IUserRepository UserRepository { get ; set ; }
internal SqliteItemRepository ItemRepository { get ; set ; }
private INotificationManager NotificationManager { get ; set ; }
@ -316,8 +315,6 @@ namespace Emby.Server.Implementations
private IMediaSourceManager MediaSourceManager { get ; set ; }
private IPlaylistManager PlaylistManager { get ; set ; }
private readonly IConfiguration _configuration ;
/// <summary>
@ -326,14 +323,6 @@ namespace Emby.Server.Implementations
/// <value>The installation manager.</value>
protected IInstallationManager InstallationManager { get ; private set ; }
/// <summary>
/// Gets or sets the zip client.
/// </summary>
/// <value>The zip client.</value>
protected IZipClient ZipClient { get ; private set ; }
protected IHttpResultFactory HttpResultFactory { get ; private set ; }
protected IAuthService AuthService { get ; private set ; }
public IStartupOptions StartupOptions { get ; }
@ -389,7 +378,7 @@ namespace Emby.Server.Implementations
fileSystem . AddShortcutHandler ( new MbLinkShortcutHandler ( fileSystem ) ) ;
NetworkManager . NetworkChanged + = NetworkManager_ NetworkChanged;
NetworkManager . NetworkChanged + = On NetworkChanged;
}
public string ExpandVirtualPath ( string path )
@ -413,7 +402,7 @@ namespace Emby.Server.Implementations
return ServerConfigurationManager . Configuration . LocalNetworkSubnets ;
}
private void NetworkManager_ NetworkChanged( object sender , EventArgs e )
private void On NetworkChanged( object sender , EventArgs e )
{
_validAddressResults . Clear ( ) ;
}
@ -421,10 +410,10 @@ namespace Emby.Server.Implementations
public string ApplicationVersion { get ; } = typeof ( ApplicationHost ) . Assembly . GetName ( ) . Version . ToString ( 3 ) ;
/// <summary>
/// Gets the current application user agent
/// Gets the current application user agent .
/// </summary>
/// <value>The application user agent.</value>
public string ApplicationUserAgent = > Name . Replace ( ' ' , '-' ) + "/" + ApplicationVersion ;
public string ApplicationUserAgent = > Name . Replace ( ' ' , '-' ) + "/" + ApplicationVersion ;
/// <summary>
/// Gets the email address for use within a comment section of a user agent field.
@ -432,14 +421,11 @@ namespace Emby.Server.Implementations
/// </summary>
public string ApplicationUserAgentAddress { get ; } = "team@jellyfin.org" ;
private string _productName ;
/// <summary>
/// Gets the current application name
/// Gets the current application name.
/// </summary>
/// <value>The application name.</value>
public string ApplicationProductName
= > _productName ? ? ( _productName = FileVersionInfo . GetVersionInfo ( Assembly . GetEntryAssembly ( ) . Location ) . ProductName ) ;
public string ApplicationProductName { get ; } = FileVersionInfo . GetVersionInfo ( Assembly . GetEntryAssembly ( ) . Location ) . ProductName ;
private DeviceId _deviceId ;
@ -473,8 +459,8 @@ namespace Emby.Server.Implementations
/// <summary>
/// Creates an instance of type and resolves all constructor dependencies
/// </summary>
/// /// <typeparam name="T">The type </typeparam>
/// <returns>T </returns>
/// /// <typeparam name="T">The type . </typeparam>
/// <returns>T . </returns>
public T CreateInstance < T > ( )
= > ActivatorUtilities . CreateInstance < T > ( _serviceProvider ) ;
@ -516,13 +502,8 @@ namespace Emby.Server.Implementations
return AllConcreteTypes . Where ( i = > currentType . IsAssignableFrom ( i ) ) ;
}
/// <summary>
/// Gets the exports.
/// </summary>
/// <typeparam name="T">The type</typeparam>
/// <param name="manageLifetime">if set to <c>true</c> [manage lifetime].</param>
/// <returns>IEnumerable{``0}.</returns>
public IEnumerable < T > GetExports < T > ( bool manageLifetime = true )
/// <inheritdoc />
public IReadOnlyCollection < T > GetExports < T > ( bool manageLifetime = true )
{
var parts = GetExportTypes < T > ( )
. Select ( CreateInstanceSafe )
@ -544,6 +525,7 @@ namespace Emby.Server.Implementations
/// <summary>
/// Runs the startup tasks.
/// </summary>
/// <returns><see cref="Task" />.</returns>
public async Task RunStartupTasksAsync ( )
{
Logger . LogInformation ( "Running startup tasks" ) ;
@ -556,7 +538,7 @@ namespace Emby.Server.Implementations
Logger . LogInformation ( "ServerId: {0}" , SystemId ) ;
var entryPoints = GetExports < IServerEntryPoint > ( ) .ToList ( ) ;
var entryPoints = GetExports < IServerEntryPoint > ( ) ;
var stopWatch = new Stopwatch ( ) ;
stopWatch . Start ( ) ;
@ -607,10 +589,15 @@ namespace Emby.Server.Implementations
foreach ( var plugin in Plugins )
{
pluginBuilder . AppendLine ( string . Format ( "{0} {1}" , plugin . Name , plugin . Version ) ) ;
pluginBuilder . AppendLine (
string . Format (
CultureInfo . InvariantCulture ,
"{0} {1}" ,
plugin . Name ,
plugin . Version ) ) ;
}
Logger . LogInformation ( "Plugins: {plugins}" , pluginBuilder . ToString ( ) ) ;
Logger . LogInformation ( "Plugins: { P lugins}", pluginBuilder . ToString ( ) ) ;
}
DiscoverTypes ( ) ;
@ -632,7 +619,7 @@ namespace Emby.Server.Implementations
if ( EnableHttps & & Certificate ! = null )
{
options . ListenAnyIP ( HttpsPort , listenOptions = > { listenOptions . UseHttps ( Certificate ) ; } ) ;
options . ListenAnyIP ( HttpsPort , listenOptions = > listenOptions . UseHttps ( Certificate ) ) ;
}
} )
. UseContentRoot ( contentRoot )
@ -646,6 +633,7 @@ namespace Emby.Server.Implementations
app . UseWebSockets ( ) ;
app . UseResponseCompression ( ) ;
// TODO app.UseMiddleware<WebSocketMiddleware>();
app . Use ( ExecuteWebsocketHandlerAsync ) ;
app . Use ( ExecuteHttpHandlerAsync ) ;
@ -679,16 +667,9 @@ namespace Emby.Server.Implementations
var localPath = context . Request . Path . ToString ( ) ;
var req = new WebSocketSharpRequest ( request , response , request . Path , Logger ) ;
await HttpServer . RequestHandler ( req , request . GetDisplayUrl ( ) , request . Host . ToString ( ) , localPath , CancellationToken . None ) . ConfigureAwait ( false ) ;
}
protected virtual IHttpClient CreateHttpClient ( )
{
return new HttpClientManager . HttpClientManager ( ApplicationPaths , LoggerFactory , FileSystemManager , ( ) = > ApplicationUserAgent ) ;
await HttpServer . RequestHandler ( req , request . GetDisplayUrl ( ) , request . Host . ToString ( ) , localPath , context . RequestAborted ) . ConfigureAwait ( false ) ;
}
public static IStreamHelper StreamHelper { get ; set ; }
/// <summary>
/// Registers resources that classes will depend on
/// </summary>
@ -712,7 +693,11 @@ namespace Emby.Server.Implementations
serviceCollection . AddSingleton ( FileSystemManager ) ;
serviceCollection . AddSingleton < TvDbClientManager > ( ) ;
HttpClient = CreateHttpClient ( ) ;
HttpClient = new HttpClientManager . HttpClientManager (
ApplicationPaths ,
LoggerFactory . CreateLogger < HttpClientManager . HttpClientManager > ( ) ,
FileSystemManager ,
( ) = > ApplicationUserAgent ) ;
serviceCollection . AddSingleton ( HttpClient ) ;
serviceCollection . AddSingleton ( NetworkManager ) ;
@ -728,8 +713,7 @@ namespace Emby.Server.Implementations
ProcessFactory = new ProcessFactory ( ) ;
serviceCollection . AddSingleton ( ProcessFactory ) ;
ApplicationHost . StreamHelper = new StreamHelper ( ) ;
serviceCollection . AddSingleton ( StreamHelper ) ;
serviceCollection . AddSingleton ( typeof ( IStreamHelper ) , typeof ( StreamHelper ) ) ;
serviceCollection . AddSingleton ( typeof ( ICryptoProvider ) , typeof ( CryptographyProvider ) ) ;
@ -738,18 +722,16 @@ namespace Emby.Server.Implementations
serviceCollection . AddSingleton ( typeof ( IInstallationManager ) , typeof ( InstallationManager ) ) ;
ZipClient = new ZipClient ( ) ;
serviceCollection . AddSingleton ( ZipClient ) ;
serviceCollection . AddSingleton ( typeof ( IZipClient ) , typeof ( ZipClient ) ) ;
HttpResultFactory = new HttpResultFactory ( LoggerFactory , FileSystemManager , JsonSerializer , StreamHelper ) ;
serviceCollection . AddSingleton ( HttpResultFactory ) ;
serviceCollection . AddSingleton ( typeof ( IHttpResultFactory ) , typeof ( HttpResultFactory ) ) ;
serviceCollection . AddSingleton < IServerApplicationHost > ( this ) ;
serviceCollection . AddSingleton < IServerApplicationPaths > ( ApplicationPaths ) ;
serviceCollection . AddSingleton ( ServerConfigurationManager ) ;
LocalizationManager = new LocalizationManager ( ServerConfigurationManager , JsonSerializer , LoggerFactory );
LocalizationManager = new LocalizationManager ( ServerConfigurationManager , JsonSerializer , LoggerFactory .CreateLogger < LocalizationManager > ( ) );
await LocalizationManager . LoadAll ( ) . ConfigureAwait ( false ) ;
serviceCollection . AddSingleton < ILocalizationManager > ( LocalizationManager ) ;
@ -758,12 +740,12 @@ namespace Emby.Server.Implementations
UserDataManager = new UserDataManager ( LoggerFactory , ServerConfigurationManager , ( ) = > UserManager ) ;
serviceCollection . AddSingleton ( UserDataManager ) ;
UserRepository = GetUserRepository ( ) ;
// This is only needed for disposal purposes. If removing this, make sure to have the manager handle disposing it
serviceCollection . AddSingleton ( UserRepository ) ;
var displayPreferencesRepo = new SqliteDisplayPreferencesRepository ( LoggerFactory , JsonSerializer , ApplicationPaths , FileSystemManager ) ;
serviceCollection . AddSingleton < IDisplayPreferencesRepository > ( displayPreferencesRepo) ;
_displayPreferencesRepository = new SqliteDisplayPreferencesRepository (
LoggerFactory . CreateLogger < SqliteDisplayPreferencesRepository > ( ) ,
JsonSerializer ,
ApplicationPaths ,
FileSystemManager ) ;
serviceCollection . AddSingleton < IDisplayPreferencesRepository > ( _ displayPreferencesRepository ) ;
ItemRepository = new SqliteItemRepository ( ServerConfigurationManager , this , JsonSerializer , LoggerFactory , LocalizationManager ) ;
serviceCollection . AddSingleton < IItemRepository > ( ItemRepository ) ;
@ -771,7 +753,10 @@ namespace Emby.Server.Implementations
AuthenticationRepository = GetAuthenticationRepository ( ) ;
serviceCollection . AddSingleton ( AuthenticationRepository ) ;
UserManager = new UserManager ( LoggerFactory , ServerConfigurationManager , UserRepository , XmlSerializer , NetworkManager , ( ) = > ImageProcessor , ( ) = > DtoService , this , JsonSerializer , FileSystemManager ) ;
_userRepository = GetUserRepository ( ) ;
UserManager = new UserManager ( LoggerFactory . CreateLogger < UserManager > ( ) , _userRepository , XmlSerializer , NetworkManager , ( ) = > ImageProcessor , ( ) = > DtoService , this , JsonSerializer , FileSystemManager ) ;
serviceCollection . AddSingleton ( UserManager ) ;
LibraryManager = new LibraryManager ( this , LoggerFactory , TaskManager , UserManager , ServerConfigurationManager , UserDataManager , ( ) = > LibraryMonitor , FileSystemManager , ( ) = > ProviderManager , ( ) = > UserViewManager ) ;
@ -791,7 +776,7 @@ namespace Emby.Server.Implementations
HttpServer = new HttpListenerHost (
this ,
LoggerFactory ,
LoggerFactory .CreateLogger < HttpListenerHost > ( ) ,
ServerConfigurationManager ,
_configuration ,
NetworkManager ,
@ -804,14 +789,13 @@ namespace Emby.Server.Implementations
serviceCollection . AddSingleton ( HttpServer ) ;
ImageProcessor = GetImageProcessor ( ) ;
ImageProcessor = new ImageProcessor ( LoggerFactory . CreateLogger < ImageProcessor > ( ) , ServerConfigurationManager . ApplicationPaths , FileSystemManager , ImageEncoder , ( ) = > LibraryManager , ( ) = > MediaEncoder ) ;
serviceCollection . AddSingleton ( ImageProcessor ) ;
TVSeriesManager = new TVSeriesManager ( UserManager , UserDataManager , LibraryManager , ServerConfigurationManager ) ;
serviceCollection . AddSingleton ( TVSeriesManager ) ;
DeviceManager = new DeviceManager ( AuthenticationRepository , JsonSerializer , LibraryManager , LocalizationManager , UserManager , FileSystemManager , LibraryMonitor , ServerConfigurationManager ) ;
serviceCollection . AddSingleton ( DeviceManager ) ;
MediaSourceManager = new MediaSourceManager ( ItemRepository , ApplicationPaths , LocalizationManager , UserManager , LibraryManager , LoggerFactory , JsonSerializer , FileSystemManager , UserDataManager , ( ) = > MediaEncoder ) ;
@ -826,10 +810,10 @@ namespace Emby.Server.Implementations
DtoService = new DtoService ( LoggerFactory , LibraryManager , UserDataManager , ItemRepository , ImageProcessor , ProviderManager , this , ( ) = > MediaSourceManager , ( ) = > LiveTvManager ) ;
serviceCollection . AddSingleton ( DtoService ) ;
ChannelManager = new ChannelManager ( UserManager , DtoService , LibraryManager , LoggerFactory , ServerConfigurationManager , FileSystemManager , UserDataManager , JsonSerializer , LocalizationManager, HttpClient , ProviderManager) ;
ChannelManager = new ChannelManager ( UserManager , DtoService , LibraryManager , LoggerFactory , ServerConfigurationManager , FileSystemManager , UserDataManager , JsonSerializer , ProviderManager) ;
serviceCollection . AddSingleton ( ChannelManager ) ;
SessionManager = new SessionManager ( UserDataManager , LoggerFactory , LibraryManager , UserManager , musicManager , DtoService , ImageProcessor , JsonSerializer , this , HttpClient , AuthenticationRepository , DeviceManager , MediaSourceManager ) ;
SessionManager = new SessionManager ( UserDataManager , LoggerFactory , LibraryManager , UserManager , musicManager , DtoService , ImageProcessor , this , AuthenticationRepository , DeviceManager , MediaSourceManager ) ;
serviceCollection . AddSingleton ( SessionManager ) ;
serviceCollection . AddSingleton < IDlnaManager > (
@ -838,8 +822,7 @@ namespace Emby.Server.Implementations
CollectionManager = new CollectionManager ( LibraryManager , ApplicationPaths , LocalizationManager , FileSystemManager , LibraryMonitor , LoggerFactory , ProviderManager ) ;
serviceCollection . AddSingleton ( CollectionManager ) ;
PlaylistManager = new PlaylistManager ( LibraryManager , FileSystemManager , LibraryMonitor , LoggerFactory , UserManager , ProviderManager ) ;
serviceCollection . AddSingleton ( PlaylistManager ) ;
serviceCollection . AddSingleton ( typeof ( IPlaylistManager ) , typeof ( PlaylistManager ) ) ;
LiveTvManager = new LiveTvManager ( this , ServerConfigurationManager , LoggerFactory , ItemRepository , ImageProcessor , UserDataManager , DtoService , UserManager , LibraryManager , TaskManager , LocalizationManager , JsonSerializer , FileSystemManager , ( ) = > ChannelManager ) ;
serviceCollection . AddSingleton ( LiveTvManager ) ;
@ -880,15 +863,15 @@ namespace Emby.Server.Implementations
serviceCollection . AddSingleton < IAuthorizationContext > ( authContext ) ;
serviceCollection . AddSingleton < ISessionContext > ( new SessionContext ( UserManager , authContext , SessionManager ) ) ;
AuthService = new AuthService ( UserManager, authContext, ServerConfigurationManager , SessionManager , NetworkManager ) ;
AuthService = new AuthService ( authContext, ServerConfigurationManager , SessionManager , NetworkManager ) ;
serviceCollection . AddSingleton ( AuthService ) ;
SubtitleEncoder = new MediaBrowser . MediaEncoding . Subtitles . SubtitleEncoder ( LibraryManager , LoggerFactory , ApplicationPaths , FileSystemManager , MediaEncoder , JsonSerializer , HttpClient , MediaSourceManager , ProcessFactory ) ;
serviceCollection . AddSingleton ( SubtitleEncoder ) ;
serviceCollection . AddSingleton ( CreateResourceFileManager ( ) ) ;
serviceCollection . AddSingleton ( typeof ( IResourceFileManager ) , typeof ( ResourceFileManager ) ) ;
displayPreferencesRepo. Initialize ( ) ;
_ displayPreferencesRepository . Initialize ( ) ;
var userDataRepo = new SqliteUserDataRepository ( LoggerFactory , ApplicationPaths ) ;
@ -957,18 +940,16 @@ namespace Emby.Server.Implementations
}
}
private IImageProcessor GetImageProcessor ( )
{
return new ImageProcessor ( LoggerFactory , ServerConfigurationManager . ApplicationPaths , FileSystemManager , ImageEncoder , ( ) = > LibraryManager , ( ) = > MediaEncoder ) ;
}
/// <summary>
/// Gets the user repository.
/// </summary>
/// <returns> Task{IUserRepository} .</returns>
private I UserRepository GetUserRepository ( )
/// <returns><see cref="Task{SqliteUserRepository}" />.</returns>
private SqliteUserRepository GetUserRepository ( )
{
var repo = new SqliteUserRepository ( LoggerFactory , ApplicationPaths , JsonSerializer ) ;
var repo = new SqliteUserRepository (
LoggerFactory . CreateLogger < SqliteUserRepository > ( ) ,
ApplicationPaths ,
JsonSerializer ) ;
repo . Initialize ( ) ;
@ -1014,7 +995,6 @@ namespace Emby.Server.Implementations
Video . LiveTvManager = LiveTvManager ;
Folder . UserViewManager = UserViewManager ;
UserView . TVSeriesManager = TVSeriesManager ;
UserView . PlaylistManager = PlaylistManager ;
UserView . CollectionManager = CollectionManager ;
BaseItem . MediaSourceManager = MediaSourceManager ;
CollectionFolder . XmlSerializer = XmlSerializer ;
@ -1052,8 +1032,8 @@ namespace Emby.Server.Implementations
. Cast < IServerEntryPoint > ( )
. ToList ( ) ;
await Task . WhenAll ( StartEntryPoints ( entries , true ) ) ;
await Task . WhenAll ( StartEntryPoints ( entries , false ) ) ;
await Task . WhenAll ( StartEntryPoints ( entries , true ) ) .ConfigureAwait ( false ) ;
await Task . WhenAll ( StartEntryPoints ( entries , false ) ) .ConfigureAwait ( false ) ;
}
/// <summary>
@ -1092,7 +1072,7 @@ namespace Emby.Server.Implementations
GetExports < IMetadataSaver > ( ) ,
GetExports < IExternalId > ( ) ) ;
ImageProcessor . AddParts( GetExports < IImageEnhancer > ( ) ) ;
ImageProcessor . ImageEnhancers = GetExports < IImageEnhancer > ( ) ;
LiveTvManager . AddParts ( GetExports < ILiveTvService > ( ) , GetExports < ITunerHost > ( ) , GetExports < IListingsProvider > ( ) ) ;
@ -1228,7 +1208,7 @@ namespace Emby.Server.Implementations
// Generate self-signed cert
var certHost = GetHostnameFromExternalDns ( ServerConfigurationManager . Configuration . WanDdns ) ;
var certPath = Path . Combine ( ServerConfigurationManager . ApplicationPaths . ProgramDataPath , "ssl" , "cert_" + ( certHost + "2" ) . GetMD5 ( ) . ToString ( "N" ) + ".pfx" ) ;
var certPath = Path . Combine ( ServerConfigurationManager . ApplicationPaths . ProgramDataPath , "ssl" , "cert_" + ( certHost + "2" ) . GetMD5 ( ) . ToString ( "N" , CultureInfo . InvariantCulture ) + ".pfx" ) ;
const string Password = "embycert" ;
return new CertificateInfo
@ -1466,15 +1446,10 @@ namespace Emby.Server.Implementations
} ;
}
public WakeOnLanInfo [ ] GetWakeOnLanInfo ( )
{
return NetworkManager . GetMacAddresses ( )
. Select ( i = > new WakeOnLanInfo
{
MacAddress = i
} )
. ToArray ( ) ;
}
public IEnumerable < WakeOnLanInfo > GetWakeOnLanInfo ( )
= > NetworkManager . GetMacAddresses ( )
. Select ( i = > new WakeOnLanInfo ( i ) )
. ToList ( ) ;
public async Task < PublicSystemInfo > GetPublicSystemInfo ( CancellationToken cancellationToken )
{
@ -1490,6 +1465,7 @@ namespace Emby.Server.Implementations
{
wanAddress = GetWanApiUrl ( ServerConfigurationManager . Configuration . WanDdns ) ;
}
return new PublicSystemInfo
{
Version = ApplicationVersion ,
@ -1537,14 +1513,12 @@ namespace Emby.Server.Implementations
{
Url = Url ,
LogErrorResponseBody = false ,
LogErrors = false ,
LogRequest = false ,
TimeoutMs = 10000 ,
BufferContent = false ,
CancellationToken = cancellationToken
} ) . ConfigureAwait ( false ) )
{
return GetWanApiUrl ( response . ReadToEnd ( ) . Trim ( ) ) ;
string res = await response . ReadToEndAsync ( ) . ConfigureAwait ( false ) ;
return GetWanApiUrl ( res . Trim ( ) ) ;
}
}
catch ( Exception ex )
@ -1555,14 +1529,32 @@ namespace Emby.Server.Implementations
return null ;
}
public string GetLocalApiUrl ( IpAddressInfo ipAddress )
/// <summary>
/// Removes the scope id from IPv6 addresses.
/// </summary>
/// <param name="address">The IPv6 address.</param>
/// <returns>The IPv6 address without the scope id.</returns>
private string RemoveScopeId ( string address )
{
var index = address . IndexOf ( '%' ) ;
if ( index = = - 1 )
{
return address ;
}
return address . Substring ( 0 , index ) ;
}
public string GetLocalApiUrl ( IPAddress ipAddress )
{
if ( ipAddress . AddressFamily = = IpAddressFamily . InterNetworkV6 )
if ( ipAddress . AddressFamily = = AddressFamily. InterNetworkV6 )
{
return GetLocalApiUrl ( "[" + ipAddress . Address + "]" ) ;
var str = RemoveScopeId ( ipAddress . ToString ( ) ) ;
return GetLocalApiUrl ( "[" + str + "]" ) ;
}
return GetLocalApiUrl ( ipAddress . Address ) ;
return GetLocalApiUrl ( ipAddress . ToString( ) ) ;
}
public string GetLocalApiUrl ( string host )
@ -1573,19 +1565,22 @@ namespace Emby.Server.Implementations
host ,
HttpsPort . ToString ( CultureInfo . InvariantCulture ) ) ;
}
return string . Format ( "http://{0}:{1}" ,
host ,
HttpPort . ToString ( CultureInfo . InvariantCulture ) ) ;
}
public string GetWanApiUrl ( I pAddressInfo ipAddress )
public string GetWanApiUrl ( I PAddress ipAddress )
{
if ( ipAddress . AddressFamily = = Ip AddressFamily. InterNetworkV6 )
if ( ipAddress . AddressFamily = = AddressFamily. InterNetworkV6 )
{
return GetWanApiUrl ( "[" + ipAddress . Address + "]" ) ;
var str = RemoveScopeId ( ipAddress . ToString ( ) ) ;
return GetWanApiUrl ( "[" + str + "]" ) ;
}
return GetWanApiUrl ( ipAddress . Address ) ;
return GetWanApiUrl ( ipAddress . ToString( ) ) ;
}
public string GetWanApiUrl ( string host )
@ -1596,17 +1591,18 @@ namespace Emby.Server.Implementations
host ,
ServerConfigurationManager . Configuration . PublicHttpsPort . ToString ( CultureInfo . InvariantCulture ) ) ;
}
return string . Format ( "http://{0}:{1}" ,
host ,
ServerConfigurationManager . Configuration . PublicPort . ToString ( CultureInfo . InvariantCulture ) ) ;
}
public Task < List < I pAddressInfo > > GetLocalIpAddresses ( CancellationToken cancellationToken )
public Task < List < I PAddress > > GetLocalIpAddresses ( CancellationToken cancellationToken )
{
return GetLocalIpAddressesInternal ( true , 0 , cancellationToken ) ;
}
private async Task < List < I pAddressInfo > > GetLocalIpAddressesInternal ( bool allowLoopback , int limit , CancellationToken cancellationToken )
private async Task < List < I PAddress > > GetLocalIpAddressesInternal ( bool allowLoopback , int limit , CancellationToken cancellationToken )
{
var addresses = ServerConfigurationManager
. Configuration
@ -1620,13 +1616,13 @@ namespace Emby.Server.Implementations
addresses . AddRange ( NetworkManager . GetLocalIpAddresses ( ServerConfigurationManager . Configuration . IgnoreVirtualInterfaces ) ) ;
}
var resultList = new List < I pAddressInfo > ( ) ;
var resultList = new List < I PAddress > ( ) ;
foreach ( var address in addresses )
{
if ( ! allowLoopback )
{
if ( address . Equals ( I pAddressInfo . Loopback ) | | address . Equals ( I pAddressInfo . IPv6Loopback ) )
if ( address . Equals ( I PAddress . Loopback ) | | address . Equals ( I PAddress . IPv6Loopback ) )
{
continue ;
}
@ -1647,7 +1643,7 @@ namespace Emby.Server.Implementations
return resultList ;
}
private I pAddressInfo NormalizeConfiguredLocalAddress ( string address )
private I PAddress NormalizeConfiguredLocalAddress ( string address )
{
var index = address . Trim ( '/' ) . IndexOf ( '/' ) ;
@ -1656,7 +1652,7 @@ namespace Emby.Server.Implementations
address = address . Substring ( index + 1 ) ;
}
if ( NetworkManager. TryParseIpAddress ( address . Trim ( '/' ) , out I pAddressInfo result ) )
if ( IPAddress. TryParse ( address . Trim ( '/' ) , out I PAddress result ) )
{
return result ;
}
@ -1666,10 +1662,10 @@ namespace Emby.Server.Implementations
private readonly ConcurrentDictionary < string , bool > _validAddressResults = new ConcurrentDictionary < string , bool > ( StringComparer . OrdinalIgnoreCase ) ;
private async Task < bool > IsIpAddressValidAsync ( I pAddressInfo address , CancellationToken cancellationToken )
private async Task < bool > IsIpAddressValidAsync ( I PAddress address , CancellationToken cancellationToken )
{
if ( address . Equals ( I pAddressInfo. Loopback ) | |
address . Equals ( I pAddressInfo . IPv6Loopback ) )
if ( address . Equals ( I PAddress. Loopback )
| | address . Equals ( I PAddress . IPv6Loopback ) )
{
return true ;
}
@ -1682,12 +1678,6 @@ namespace Emby.Server.Implementations
return cachedResult ;
}
#if DEBUG
const bool LogPing = true ;
# else
const bool LogPing = false ;
# endif
try
{
using ( var response = await HttpClient . SendAsync (
@ -1695,17 +1685,13 @@ namespace Emby.Server.Implementations
{
Url = apiUrl ,
LogErrorResponseBody = false ,
LogErrors = LogPing ,
LogRequest = LogPing ,
TimeoutMs = 5000 ,
BufferContent = false ,
CancellationToken = cancellationToken
} , "POST" ) . ConfigureAwait ( false ) )
} , HttpMethod . Post ) . ConfigureAwait ( false ) )
{
using ( var reader = new StreamReader ( response . Content ) )
{
var result = reader . ReadToEnd ( ) ;
var result = await reader . ReadToEnd Async ( ) . ConfigureAwait ( false ) ;
var valid = string . Equals ( Name , result , StringComparison . OrdinalIgnoreCase ) ;
_validAddressResults . AddOrUpdate ( apiUrl , valid , ( k , v ) = > valid ) ;
@ -1898,8 +1884,14 @@ namespace Emby.Server.Implementations
Logger . LogError ( ex , "Error disposing {Type}" , part . GetType ( ) . Name ) ;
}
}
_userRepository ? . Dispose ( ) ;
_displayPreferencesRepository . Dispose ( ) ;
}
_userRepository = null ;
_displayPreferencesRepository = null ;
_disposed = true ;
}
}