瀏覽代碼

Move network configuration to MediaBrowser.Common

Patrick Barron 1 年之前
父節點
當前提交
e463dbda47
共有 24 個文件被更改,包括 247 次插入259 次删除
  1. 0 1
      Emby.Dlna/Main/DlnaHost.cs
  2. 0 1
      Emby.Server.Implementations/ApplicationHost.cs
  3. 1 1
      Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs
  4. 0 1
      Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs
  5. 1 1
      Jellyfin.Api/Controllers/StartupController.cs
  6. 1 1
      Jellyfin.Api/Middleware/BaseUrlRedirectionMiddleware.cs
  7. 0 1
      Jellyfin.Api/Middleware/LanFilteringMiddleware.cs
  8. 0 176
      Jellyfin.Networking/Configuration/NetworkConfiguration.cs
  9. 0 20
      Jellyfin.Networking/Configuration/NetworkConfigurationExtensions.cs
  10. 0 23
      Jellyfin.Networking/Configuration/NetworkConfigurationFactory.cs
  11. 0 24
      Jellyfin.Networking/Configuration/NetworkConfigurationStore.cs
  12. 0 1
      Jellyfin.Networking/Manager/NetworkManager.cs
  13. 1 1
      Jellyfin.Server/Extensions/ApiApplicationBuilderExtensions.cs
  14. 0 1
      Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs
  15. 1 1
      Jellyfin.Server/Migrations/PreStartupRoutines/MigrateNetworkConfiguration.cs
  16. 0 1
      Jellyfin.Server/Startup.cs
  17. 175 0
      MediaBrowser.Common/Net/NetworkConfiguration.cs
  18. 19 0
      MediaBrowser.Common/Net/NetworkConfigurationExtensions.cs
  19. 22 0
      MediaBrowser.Common/Net/NetworkConfigurationFactory.cs
  20. 23 0
      MediaBrowser.Common/Net/NetworkConfigurationStore.cs
  21. 1 1
      tests/Jellyfin.Networking.Tests/Configuration/NetworkConfigurationTests.cs
  22. 1 1
      tests/Jellyfin.Networking.Tests/NetworkManagerTests.cs
  23. 0 1
      tests/Jellyfin.Networking.Tests/NetworkParseTests.cs
  24. 1 1
      tests/Jellyfin.Server.Tests/ParseNetworkTests.cs

+ 0 - 1
Emby.Dlna/Main/DlnaHost.cs

@@ -9,7 +9,6 @@ using System.Threading;
 using System.Threading.Tasks;
 using Emby.Dlna.PlayTo;
 using Emby.Dlna.Ssdp;
-using Jellyfin.Networking.Configuration;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Net;

+ 0 - 1
Emby.Server.Implementations/ApplicationHost.cs

@@ -41,7 +41,6 @@ using Emby.Server.Implementations.Updates;
 using Jellyfin.Api.Helpers;
 using Jellyfin.Drawing;
 using Jellyfin.MediaEncoding.Hls.Playlist;
-using Jellyfin.Networking.Configuration;
 using Jellyfin.Networking.Manager;
 using Jellyfin.Server.Implementations;
 using MediaBrowser.Common;

+ 1 - 1
Emby.Server.Implementations/EntryPoints/ExternalPortForwarding.cs

@@ -9,7 +9,7 @@ using System.Net;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
-using Jellyfin.Networking.Configuration;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Plugins;

+ 0 - 1
Emby.Server.Implementations/EntryPoints/UdpServerEntryPoint.cs

@@ -6,7 +6,6 @@ using System.Net.Sockets;
 using System.Threading;
 using System.Threading.Tasks;
 using Emby.Server.Implementations.Udp;
-using Jellyfin.Networking.Configuration;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller;

+ 1 - 1
Jellyfin.Api/Controllers/StartupController.cs

@@ -3,7 +3,7 @@ using System.Linq;
 using System.Threading.Tasks;
 using Jellyfin.Api.Constants;
 using Jellyfin.Api.Models.StartupDtos;
-using Jellyfin.Networking.Configuration;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Library;
 using Microsoft.AspNetCore.Authorization;

+ 1 - 1
Jellyfin.Api/Middleware/BaseUrlRedirectionMiddleware.cs

@@ -1,6 +1,6 @@
 using System;
 using System.Threading.Tasks;
-using Jellyfin.Networking.Configuration;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using Microsoft.AspNetCore.Http;
 using Microsoft.Extensions.Configuration;

+ 0 - 1
Jellyfin.Api/Middleware/LanFilteringMiddleware.cs

@@ -1,5 +1,4 @@
 using System.Threading.Tasks;
-using Jellyfin.Networking.Configuration;
 using MediaBrowser.Common.Extensions;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;

+ 0 - 176
Jellyfin.Networking/Configuration/NetworkConfiguration.cs

@@ -1,176 +0,0 @@
-#pragma warning disable CA1819 // Properties should not return arrays
-
-using System;
-
-namespace Jellyfin.Networking.Configuration
-{
-    /// <summary>
-    /// Defines the <see cref="NetworkConfiguration" />.
-    /// </summary>
-    public class NetworkConfiguration
-    {
-        /// <summary>
-        /// The default value for <see cref="InternalHttpPort"/>.
-        /// </summary>
-        public const int DefaultHttpPort = 8096;
-
-        /// <summary>
-        /// The default value for <see cref="PublicHttpsPort"/> and <see cref="InternalHttpsPort"/>.
-        /// </summary>
-        public const int DefaultHttpsPort = 8920;
-
-        private string _baseUrl = string.Empty;
-
-        /// <summary>
-        /// Gets or sets a value used to specify the URL prefix that your Jellyfin instance can be accessed at.
-        /// </summary>
-        public string BaseUrl
-        {
-            get => _baseUrl;
-            set
-            {
-                // Normalize the start of the string
-                if (string.IsNullOrWhiteSpace(value))
-                {
-                    // If baseUrl is empty, set an empty prefix string
-                    _baseUrl = string.Empty;
-                    return;
-                }
-
-                if (value[0] != '/')
-                {
-                    // If baseUrl was not configured with a leading slash, append one for consistency
-                    value = "/" + value;
-                }
-
-                // Normalize the end of the string
-                if (value[^1] == '/')
-                {
-                    // If baseUrl was configured with a trailing slash, remove it for consistency
-                    value = value.Remove(value.Length - 1);
-                }
-
-                _baseUrl = value;
-            }
-        }
-
-        /// <summary>
-        /// Gets or sets a value indicating whether to use HTTPS.
-        /// </summary>
-        /// <remarks>
-        /// In order for HTTPS to be used, in addition to setting this to true, valid values must also be
-        /// provided for <see cref="CertificatePath"/> and <see cref="CertificatePassword"/>.
-        /// </remarks>
-        public bool EnableHttps { get; set; }
-
-        /// <summary>
-        /// Gets or sets a value indicating whether the server should force connections over HTTPS.
-        /// </summary>
-        public bool RequireHttps { get; set; }
-
-        /// <summary>
-        /// Gets or sets the filesystem path of an X.509 certificate to use for SSL.
-        /// </summary>
-        public string CertificatePath { get; set; } = string.Empty;
-
-        /// <summary>
-        /// Gets or sets the password required to access the X.509 certificate data in the file specified by <see cref="CertificatePath"/>.
-        /// </summary>
-        public string CertificatePassword { get; set; } = string.Empty;
-
-        /// <summary>
-        /// Gets or sets the internal HTTP server port.
-        /// </summary>
-        /// <value>The HTTP server port.</value>
-        public int InternalHttpPort { get; set; } = DefaultHttpPort;
-
-        /// <summary>
-        /// Gets or sets the internal HTTPS server port.
-        /// </summary>
-        /// <value>The HTTPS server port.</value>
-        public int InternalHttpsPort { get; set; } = DefaultHttpsPort;
-
-        /// <summary>
-        /// Gets or sets the public HTTP port.
-        /// </summary>
-        /// <value>The public HTTP port.</value>
-        public int PublicHttpPort { get; set; } = DefaultHttpPort;
-
-        /// <summary>
-        /// Gets or sets the public HTTPS port.
-        /// </summary>
-        /// <value>The public HTTPS port.</value>
-        public int PublicHttpsPort { get; set; } = DefaultHttpsPort;
-
-        /// <summary>
-        /// Gets or sets a value indicating whether Autodiscovery is enabled.
-        /// </summary>
-        public bool AutoDiscovery { get; set; } = true;
-
-        /// <summary>
-        /// Gets or sets a value indicating whether to enable automatic port forwarding.
-        /// </summary>
-        public bool EnableUPnP { get; set; }
-
-        /// <summary>
-        /// Gets or sets a value indicating whether IPv6 is enabled.
-        /// </summary>
-        public bool EnableIPv4 { get; set; } = true;
-
-        /// <summary>
-        /// Gets or sets a value indicating whether IPv6 is enabled.
-        /// </summary>
-        public bool EnableIPv6 { get; set; }
-
-        /// <summary>
-        /// Gets or sets a value indicating whether access from outside of the LAN is permitted.
-        /// </summary>
-        public bool EnableRemoteAccess { get; set; } = true;
-
-        /// <summary>
-        /// Gets or sets the subnets that are deemed to make up the LAN.
-        /// </summary>
-        public string[] LocalNetworkSubnets { get; set; } = Array.Empty<string>();
-
-        /// <summary>
-        /// Gets or sets the interface addresses which Jellyfin will bind to. If empty, all interfaces will be used.
-        /// </summary>
-        public string[] LocalNetworkAddresses { get; set; } = Array.Empty<string>();
-
-        /// <summary>
-        /// Gets or sets the known proxies.
-        /// </summary>
-        public string[] KnownProxies { get; set; } = Array.Empty<string>();
-
-        /// <summary>
-        /// Gets or sets a value indicating whether address names that match <see cref="VirtualInterfaceNames"/> should be ignored for the purposes of binding.
-        /// </summary>
-        public bool IgnoreVirtualInterfaces { get; set; } = true;
-
-        /// <summary>
-        /// Gets or sets a value indicating the interface name prefixes that should be ignored. The list can be comma separated and values are case-insensitive. <seealso cref="IgnoreVirtualInterfaces"/>.
-        /// </summary>
-        public string[] VirtualInterfaceNames { get; set; } = new string[] { "veth" };
-
-        /// <summary>
-        /// Gets or sets a value indicating whether the published server uri is based on information in HTTP requests.
-        /// </summary>
-        public bool EnablePublishedServerUriByRequest { get; set; } = false;
-
-        /// <summary>
-        /// Gets or sets the PublishedServerUriBySubnet
-        /// Gets or sets PublishedServerUri to advertise for specific subnets.
-        /// </summary>
-        public string[] PublishedServerUriBySubnet { get; set; } = Array.Empty<string>();
-
-        /// <summary>
-        /// Gets or sets the filter for remote IP connectivity. Used in conjunction with <seealso cref="IsRemoteIPFilterBlacklist"/>.
-        /// </summary>
-        public string[] RemoteIPFilter { get; set; } = Array.Empty<string>();
-
-        /// <summary>
-        /// Gets or sets a value indicating whether <seealso cref="RemoteIPFilter"/> contains a blacklist or a whitelist. Default is a whitelist.
-        /// </summary>
-        public bool IsRemoteIPFilterBlacklist { get; set; }
-    }
-}

+ 0 - 20
Jellyfin.Networking/Configuration/NetworkConfigurationExtensions.cs

@@ -1,20 +0,0 @@
-using MediaBrowser.Common.Configuration;
-
-namespace Jellyfin.Networking.Configuration
-{
-    /// <summary>
-    /// Defines the <see cref="NetworkConfigurationExtensions" />.
-    /// </summary>
-    public static class NetworkConfigurationExtensions
-    {
-        /// <summary>
-        /// Retrieves the network configuration.
-        /// </summary>
-        /// <param name="config">The <see cref="IConfigurationManager"/>.</param>
-        /// <returns>The <see cref="NetworkConfiguration"/>.</returns>
-        public static NetworkConfiguration GetNetworkConfiguration(this IConfigurationManager config)
-        {
-            return config.GetConfiguration<NetworkConfiguration>(NetworkConfigurationStore.StoreKey);
-        }
-    }
-}

+ 0 - 23
Jellyfin.Networking/Configuration/NetworkConfigurationFactory.cs

@@ -1,23 +0,0 @@
-using System.Collections.Generic;
-using MediaBrowser.Common.Configuration;
-
-namespace Jellyfin.Networking.Configuration
-{
-    /// <summary>
-    /// Defines the <see cref="NetworkConfigurationFactory" />.
-    /// </summary>
-    public class NetworkConfigurationFactory : IConfigurationFactory
-    {
-        /// <summary>
-        /// The GetConfigurations.
-        /// </summary>
-        /// <returns>The <see cref="IEnumerable{ConfigurationStore}"/>.</returns>
-        public IEnumerable<ConfigurationStore> GetConfigurations()
-        {
-            return new[]
-            {
-                new NetworkConfigurationStore()
-            };
-        }
-    }
-}

+ 0 - 24
Jellyfin.Networking/Configuration/NetworkConfigurationStore.cs

@@ -1,24 +0,0 @@
-using MediaBrowser.Common.Configuration;
-
-namespace Jellyfin.Networking.Configuration
-{
-    /// <summary>
-    /// A configuration that stores network related settings.
-    /// </summary>
-    public class NetworkConfigurationStore : ConfigurationStore
-    {
-        /// <summary>
-        /// The name of the configuration in the storage.
-        /// </summary>
-        public const string StoreKey = "network";
-
-        /// <summary>
-        /// Initializes a new instance of the <see cref="NetworkConfigurationStore"/> class.
-        /// </summary>
-        public NetworkConfigurationStore()
-        {
-            ConfigurationType = typeof(NetworkConfiguration);
-            Key = StoreKey;
-        }
-    }
-}

+ 0 - 1
Jellyfin.Networking/Manager/NetworkManager.cs

@@ -7,7 +7,6 @@ using System.Net;
 using System.Net.NetworkInformation;
 using System.Net.Sockets;
 using System.Threading;
-using Jellyfin.Networking.Configuration;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Model.Net;

+ 1 - 1
Jellyfin.Server/Extensions/ApiApplicationBuilderExtensions.cs

@@ -1,6 +1,6 @@
 using System.Collections.Generic;
 using Jellyfin.Api.Middleware;
-using Jellyfin.Networking.Configuration;
+using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.OpenApi.Models;

+ 0 - 1
Jellyfin.Server/Extensions/ApiServiceCollectionExtensions.cs

@@ -20,7 +20,6 @@ using Jellyfin.Api.Formatters;
 using Jellyfin.Api.ModelBinders;
 using Jellyfin.Data.Enums;
 using Jellyfin.Extensions.Json;
-using Jellyfin.Networking.Configuration;
 using Jellyfin.Server.Configuration;
 using Jellyfin.Server.Filters;
 using MediaBrowser.Common.Net;

+ 1 - 1
Jellyfin.Server/Migrations/PreStartupRoutines/MigrateNetworkConfiguration.cs

@@ -3,7 +3,7 @@ using System.IO;
 using System.Xml;
 using System.Xml.Serialization;
 using Emby.Server.Implementations;
-using Jellyfin.Networking.Configuration;
+using MediaBrowser.Common.Net;
 using Microsoft.Extensions.Logging;
 
 namespace Jellyfin.Server.Migrations.PreStartupRoutines;

+ 0 - 1
Jellyfin.Server/Startup.cs

@@ -7,7 +7,6 @@ using System.Text;
 using Emby.Dlna.Extensions;
 using Jellyfin.Api.Middleware;
 using Jellyfin.MediaEncoding.Hls.Extensions;
-using Jellyfin.Networking.Configuration;
 using Jellyfin.Networking.HappyEyeballs;
 using Jellyfin.Server.Extensions;
 using Jellyfin.Server.HealthChecks;

+ 175 - 0
MediaBrowser.Common/Net/NetworkConfiguration.cs

@@ -0,0 +1,175 @@
+#pragma warning disable CA1819 // Properties should not return arrays
+
+using System;
+
+namespace MediaBrowser.Common.Net;
+
+/// <summary>
+/// Defines the <see cref="NetworkConfiguration" />.
+/// </summary>
+public class NetworkConfiguration
+{
+    /// <summary>
+    /// The default value for <see cref="InternalHttpPort"/>.
+    /// </summary>
+    public const int DefaultHttpPort = 8096;
+
+    /// <summary>
+    /// The default value for <see cref="PublicHttpsPort"/> and <see cref="InternalHttpsPort"/>.
+    /// </summary>
+    public const int DefaultHttpsPort = 8920;
+
+    private string _baseUrl = string.Empty;
+
+    /// <summary>
+    /// Gets or sets a value used to specify the URL prefix that your Jellyfin instance can be accessed at.
+    /// </summary>
+    public string BaseUrl
+    {
+        get => _baseUrl;
+        set
+        {
+            // Normalize the start of the string
+            if (string.IsNullOrWhiteSpace(value))
+            {
+                // If baseUrl is empty, set an empty prefix string
+                _baseUrl = string.Empty;
+                return;
+            }
+
+            if (value[0] != '/')
+            {
+                // If baseUrl was not configured with a leading slash, append one for consistency
+                value = "/" + value;
+            }
+
+            // Normalize the end of the string
+            if (value[^1] == '/')
+            {
+                // If baseUrl was configured with a trailing slash, remove it for consistency
+                value = value.Remove(value.Length - 1);
+            }
+
+            _baseUrl = value;
+        }
+    }
+
+    /// <summary>
+    /// Gets or sets a value indicating whether to use HTTPS.
+    /// </summary>
+    /// <remarks>
+    /// In order for HTTPS to be used, in addition to setting this to true, valid values must also be
+    /// provided for <see cref="CertificatePath"/> and <see cref="CertificatePassword"/>.
+    /// </remarks>
+    public bool EnableHttps { get; set; }
+
+    /// <summary>
+    /// Gets or sets a value indicating whether the server should force connections over HTTPS.
+    /// </summary>
+    public bool RequireHttps { get; set; }
+
+    /// <summary>
+    /// Gets or sets the filesystem path of an X.509 certificate to use for SSL.
+    /// </summary>
+    public string CertificatePath { get; set; } = string.Empty;
+
+    /// <summary>
+    /// Gets or sets the password required to access the X.509 certificate data in the file specified by <see cref="CertificatePath"/>.
+    /// </summary>
+    public string CertificatePassword { get; set; } = string.Empty;
+
+    /// <summary>
+    /// Gets or sets the internal HTTP server port.
+    /// </summary>
+    /// <value>The HTTP server port.</value>
+    public int InternalHttpPort { get; set; } = DefaultHttpPort;
+
+    /// <summary>
+    /// Gets or sets the internal HTTPS server port.
+    /// </summary>
+    /// <value>The HTTPS server port.</value>
+    public int InternalHttpsPort { get; set; } = DefaultHttpsPort;
+
+    /// <summary>
+    /// Gets or sets the public HTTP port.
+    /// </summary>
+    /// <value>The public HTTP port.</value>
+    public int PublicHttpPort { get; set; } = DefaultHttpPort;
+
+    /// <summary>
+    /// Gets or sets the public HTTPS port.
+    /// </summary>
+    /// <value>The public HTTPS port.</value>
+    public int PublicHttpsPort { get; set; } = DefaultHttpsPort;
+
+    /// <summary>
+    /// Gets or sets a value indicating whether Autodiscovery is enabled.
+    /// </summary>
+    public bool AutoDiscovery { get; set; } = true;
+
+    /// <summary>
+    /// Gets or sets a value indicating whether to enable automatic port forwarding.
+    /// </summary>
+    public bool EnableUPnP { get; set; }
+
+    /// <summary>
+    /// Gets or sets a value indicating whether IPv6 is enabled.
+    /// </summary>
+    public bool EnableIPv4 { get; set; } = true;
+
+    /// <summary>
+    /// Gets or sets a value indicating whether IPv6 is enabled.
+    /// </summary>
+    public bool EnableIPv6 { get; set; }
+
+    /// <summary>
+    /// Gets or sets a value indicating whether access from outside of the LAN is permitted.
+    /// </summary>
+    public bool EnableRemoteAccess { get; set; } = true;
+
+    /// <summary>
+    /// Gets or sets the subnets that are deemed to make up the LAN.
+    /// </summary>
+    public string[] LocalNetworkSubnets { get; set; } = Array.Empty<string>();
+
+    /// <summary>
+    /// Gets or sets the interface addresses which Jellyfin will bind to. If empty, all interfaces will be used.
+    /// </summary>
+    public string[] LocalNetworkAddresses { get; set; } = Array.Empty<string>();
+
+    /// <summary>
+    /// Gets or sets the known proxies.
+    /// </summary>
+    public string[] KnownProxies { get; set; } = Array.Empty<string>();
+
+    /// <summary>
+    /// Gets or sets a value indicating whether address names that match <see cref="VirtualInterfaceNames"/> should be ignored for the purposes of binding.
+    /// </summary>
+    public bool IgnoreVirtualInterfaces { get; set; } = true;
+
+    /// <summary>
+    /// Gets or sets a value indicating the interface name prefixes that should be ignored. The list can be comma separated and values are case-insensitive. <seealso cref="IgnoreVirtualInterfaces"/>.
+    /// </summary>
+    public string[] VirtualInterfaceNames { get; set; } = new string[] { "veth" };
+
+    /// <summary>
+    /// Gets or sets a value indicating whether the published server uri is based on information in HTTP requests.
+    /// </summary>
+    public bool EnablePublishedServerUriByRequest { get; set; } = false;
+
+    /// <summary>
+    /// Gets or sets the PublishedServerUriBySubnet
+    /// Gets or sets PublishedServerUri to advertise for specific subnets.
+    /// </summary>
+    public string[] PublishedServerUriBySubnet { get; set; } = Array.Empty<string>();
+
+    /// <summary>
+    /// Gets or sets the filter for remote IP connectivity. Used in conjunction with <seealso cref="IsRemoteIPFilterBlacklist"/>.
+    /// </summary>
+    public string[] RemoteIPFilter { get; set; } = Array.Empty<string>();
+
+    /// <summary>
+    /// Gets or sets a value indicating whether <seealso cref="RemoteIPFilter"/> contains a blacklist or a whitelist. Default is a whitelist.
+    /// </summary>
+    public bool IsRemoteIPFilterBlacklist { get; set; }
+}

+ 19 - 0
MediaBrowser.Common/Net/NetworkConfigurationExtensions.cs

@@ -0,0 +1,19 @@
+using MediaBrowser.Common.Configuration;
+
+namespace MediaBrowser.Common.Net;
+
+/// <summary>
+/// Defines the <see cref="NetworkConfigurationExtensions" />.
+/// </summary>
+public static class NetworkConfigurationExtensions
+{
+    /// <summary>
+    /// Retrieves the network configuration.
+    /// </summary>
+    /// <param name="config">The <see cref="IConfigurationManager"/>.</param>
+    /// <returns>The <see cref="NetworkConfiguration"/>.</returns>
+    public static NetworkConfiguration GetNetworkConfiguration(this IConfigurationManager config)
+    {
+        return config.GetConfiguration<NetworkConfiguration>(NetworkConfigurationStore.StoreKey);
+    }
+}

+ 22 - 0
MediaBrowser.Common/Net/NetworkConfigurationFactory.cs

@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+using MediaBrowser.Common.Configuration;
+
+namespace MediaBrowser.Common.Net;
+
+/// <summary>
+/// Defines the <see cref="NetworkConfigurationFactory" />.
+/// </summary>
+public class NetworkConfigurationFactory : IConfigurationFactory
+{
+    /// <summary>
+    /// The GetConfigurations.
+    /// </summary>
+    /// <returns>The <see cref="IEnumerable{ConfigurationStore}"/>.</returns>
+    public IEnumerable<ConfigurationStore> GetConfigurations()
+    {
+        return new[]
+        {
+            new NetworkConfigurationStore()
+        };
+    }
+}

+ 23 - 0
MediaBrowser.Common/Net/NetworkConfigurationStore.cs

@@ -0,0 +1,23 @@
+using MediaBrowser.Common.Configuration;
+
+namespace MediaBrowser.Common.Net;
+
+/// <summary>
+/// A configuration that stores network related settings.
+/// </summary>
+public class NetworkConfigurationStore : ConfigurationStore
+{
+    /// <summary>
+    /// The name of the configuration in the storage.
+    /// </summary>
+    public const string StoreKey = "network";
+
+    /// <summary>
+    /// Initializes a new instance of the <see cref="NetworkConfigurationStore"/> class.
+    /// </summary>
+    public NetworkConfigurationStore()
+    {
+        ConfigurationType = typeof(NetworkConfiguration);
+        Key = StoreKey;
+    }
+}

+ 1 - 1
tests/Jellyfin.Networking.Tests/Configuration/NetworkConfigurationTests.cs

@@ -1,4 +1,4 @@
-using Jellyfin.Networking.Configuration;
+using MediaBrowser.Common.Net;
 using Xunit;
 
 namespace Jellyfin.Networking.Tests.Configuration;

+ 1 - 1
tests/Jellyfin.Networking.Tests/NetworkManagerTests.cs

@@ -1,6 +1,6 @@
 using System.Net;
-using Jellyfin.Networking.Configuration;
 using Jellyfin.Networking.Manager;
+using MediaBrowser.Common.Net;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Logging.Abstractions;
 using Moq;

+ 0 - 1
tests/Jellyfin.Networking.Tests/NetworkParseTests.cs

@@ -2,7 +2,6 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net;
-using Jellyfin.Networking.Configuration;
 using Jellyfin.Networking.Manager;
 using MediaBrowser.Common.Configuration;
 using MediaBrowser.Common.Net;

+ 1 - 1
tests/Jellyfin.Server.Tests/ParseNetworkTests.cs

@@ -1,10 +1,10 @@
 using System;
 using System.Linq;
 using System.Net;
-using Jellyfin.Networking.Configuration;
 using Jellyfin.Networking.Manager;
 using Jellyfin.Server.Extensions;
 using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.Net;
 using Microsoft.AspNetCore.Builder;
 using Microsoft.AspNetCore.HttpOverrides;
 using Microsoft.Extensions.Configuration;