using System; using System.Globalization; using System.IO; using Emby.Server.Implementations.AppBase; using MediaBrowser.Common.Configuration; using MediaBrowser.Controller; using MediaBrowser.Controller.Configuration; using MediaBrowser.Model.Configuration; using MediaBrowser.Model.Events; using MediaBrowser.Model.IO; using MediaBrowser.Model.Serialization; using Microsoft.Extensions.Logging; namespace Emby.Server.Implementations.Configuration { /// /// Class ServerConfigurationManager. /// public class ServerConfigurationManager : BaseConfigurationManager, IServerConfigurationManager { /// /// Initializes a new instance of the class. /// /// The application paths. /// The paramref name="loggerFactory" factory. /// The XML serializer. /// The file system. public ServerConfigurationManager(IApplicationPaths applicationPaths, ILoggerFactory loggerFactory, IXmlSerializer xmlSerializer, IFileSystem fileSystem) : base(applicationPaths, loggerFactory, xmlSerializer, fileSystem) { UpdateMetadataPath(); } /// /// Configuration updating event. /// public event EventHandler> ConfigurationUpdating; /// /// Gets the type of the configuration. /// /// The type of the configuration. protected override Type ConfigurationType => typeof(ServerConfiguration); /// /// Gets the application paths. /// /// The application paths. public IServerApplicationPaths ApplicationPaths => (IServerApplicationPaths)CommonApplicationPaths; /// /// Gets the configuration. /// /// The configuration. public ServerConfiguration Configuration => (ServerConfiguration)CommonConfiguration; /// /// Called when [configuration updated]. /// protected override void OnConfigurationUpdated() { UpdateMetadataPath(); base.OnConfigurationUpdated(); } /// /// Updates the metadata path. /// private void UpdateMetadataPath() { if (string.IsNullOrWhiteSpace(Configuration.MetadataPath)) { ((ServerApplicationPaths)ApplicationPaths).InternalMetadataPath = Path.Combine(ApplicationPaths.ProgramDataPath, "metadata"); } else { ((ServerApplicationPaths)ApplicationPaths).InternalMetadataPath = Configuration.MetadataPath; } } /// /// Replaces the configuration. /// /// The new configuration. /// public override void ReplaceConfiguration(BaseApplicationConfiguration newConfiguration) { var newConfig = (ServerConfiguration)newConfiguration; ValidateMetadataPath(newConfig); ValidateSslCertificate(newConfig); ConfigurationUpdating?.Invoke(this, new GenericEventArgs(newConfig)); base.ReplaceConfiguration(newConfiguration); } /// /// Validates the SSL certificate. /// /// The new configuration. /// The certificate path doesn't exist. private void ValidateSslCertificate(BaseApplicationConfiguration newConfig) { var serverConfig = (ServerConfiguration)newConfig; var newPath = serverConfig.CertificatePath; if (!string.IsNullOrWhiteSpace(newPath) && !string.Equals(Configuration.CertificatePath, newPath, StringComparison.Ordinal)) { // Validate if (!File.Exists(newPath)) { throw new FileNotFoundException( string.Format( CultureInfo.InvariantCulture, "Certificate file '{0}' does not exist.", newPath)); } } } /// /// Validates the metadata path. /// /// The new configuration. /// The new config path doesn't exist. private void ValidateMetadataPath(ServerConfiguration newConfig) { var newPath = newConfig.MetadataPath; if (!string.IsNullOrWhiteSpace(newPath) && !string.Equals(Configuration.MetadataPath, newPath, StringComparison.Ordinal)) { // Validate if (!Directory.Exists(newPath)) { throw new DirectoryNotFoundException( string.Format( CultureInfo.InvariantCulture, "{0} does not exist.", newPath)); } EnsureWriteAccess(newPath); } } /// /// Sets all configuration values to their optimal values. /// /// If the configuration changed. public bool SetOptimalValues() { var config = Configuration; var changed = false; if (!config.EnableCaseSensitiveItemIds) { config.EnableCaseSensitiveItemIds = true; changed = true; } if (!config.SkipDeserializationForBasicTypes) { config.SkipDeserializationForBasicTypes = true; changed = true; } if (!config.EnableSimpleArtistDetection) { config.EnableSimpleArtistDetection = true; changed = true; } if (!config.EnableNormalizedItemByNameIds) { config.EnableNormalizedItemByNameIds = true; changed = true; } if (!config.DisableLiveTvChannelUserDataName) { config.DisableLiveTvChannelUserDataName = true; changed = true; } if (!config.EnableNewOmdbSupport) { config.EnableNewOmdbSupport = true; changed = true; } if (!config.CameraUploadUpgraded) { config.CameraUploadUpgraded = true; changed = true; } if (!config.CollectionsUpgraded) { config.CollectionsUpgraded = true; changed = true; } return changed; } } }