Browse Source

Merge pull request #969 from jabbera/ssl2

Ssl in mediabrowser against new listener.
Luke 10 years ago
parent
commit
bb02d68ceb

+ 22 - 0
MediaBrowser.Controller/IServerApplicationHost.cs

@@ -36,6 +36,28 @@ namespace MediaBrowser.Controller
         /// <value>The HTTP server port.</value>
         int HttpServerPort { get; }
 
+        /// <summary>
+        /// Gets the HTTPS server port.
+        /// </summary>
+        /// <value>The HTTPS server port.</value>
+        int HttpsServerPort { get; }
+
+        /// <summary>
+        /// Gets the value indiciating if an https port should be hosted.
+        /// </summary>
+        /// <value>
+        /// The value indiciating if an https port should be hosted.
+        /// </value>
+        bool UseHttps { get; }
+
+        /// <summary>
+        /// Gets the value pointing to the file system where the ssl certiifcate is located.
+        /// </summary>
+        /// <value>
+        /// The value pointing to the file system where the ssl certiifcate is located.
+        /// </value>
+        string CertificatePath { get; }
+
         /// <summary>
         /// Gets a value indicating whether this instance has update available.
         /// </summary>

+ 3 - 1
MediaBrowser.Controller/Net/IHttpServer.cs

@@ -19,7 +19,9 @@ namespace MediaBrowser.Controller.Net
         /// Starts the specified server name.
         /// </summary>
         /// <param name="urlPrefixes">The URL prefixes.</param>
-        void StartServer(IEnumerable<string> urlPrefixes);
+        /// <param name="certificatePath">If an https prefix is specified, 
+        /// the ssl certificate localtion on the file system.</param>
+        void StartServer(IEnumerable<string> urlPrefixes, string certificatePath);
 
         /// <summary>
         /// Gets the local end points.

+ 3 - 1
MediaBrowser.Controller/Net/IServerManager.cs

@@ -15,7 +15,9 @@ namespace MediaBrowser.Controller.Net
         /// Starts this instance.
         /// </summary>
         /// <param name="urlPrefixes">The URL prefixes.</param>
-        void Start(IEnumerable<string> urlPrefixes);
+        /// <param name="certificatePath">If an https prefix is specified, 
+        /// the ssl certificate localtion on the file system.</param>
+        void Start(IEnumerable<string> urlPrefixes, string certificatePath);
 
         /// <summary>
         /// Sends a message to all clients currently connected via a web socket

+ 16 - 1
MediaBrowser.Model/Configuration/ServerConfiguration.cs

@@ -1,4 +1,5 @@
-using MediaBrowser.Model.Dto;
+using System.Xml.Schema;
+using MediaBrowser.Model.Dto;
 using MediaBrowser.Model.Entities;
 
 namespace MediaBrowser.Model.Configuration
@@ -32,6 +33,17 @@ namespace MediaBrowser.Model.Configuration
         /// <value>The HTTPS server port number.</value>
         public int HttpsPortNumber { get; set; }
         
+        /// Gets or sets the value pointing to the file system where the ssl certiifcate is located.
+        /// </summary>
+        /// <value>The value pointing to the file system where the ssl certiifcate is located.</value>
+        public bool UseHttps { get; set; }
+
+        /// <summary>
+        /// Gets or sets the value pointing to the file system where the ssl certiifcate is located..
+        /// </summary>
+        /// <value>The value pointing to the file system where the ssl certiifcate is located..</value>
+        public string CertificatePath { get; set; }
+
         /// <summary>
         /// Gets or sets a value indicating whether [enable internet providers].
         /// </summary>
@@ -187,6 +199,7 @@ namespace MediaBrowser.Model.Configuration
         public string[] InsecureApps8 { get; set; }
 
         public bool SaveMetadataHidden { get; set; }
+
         public bool EnableWin8HttpListener { get; set; }
 
         public NameValuePair[] ContentTypes { get; set; }
@@ -204,6 +217,8 @@ namespace MediaBrowser.Model.Configuration
             PublicPort = 8096;
             HttpServerPortNumber = 8096;
             HttpsPortNumber = 8920;
+            UseHttps = false;
+            CertificatePath = null;
             EnableDashboardResponseCaching = true;
 
             EnableAutomaticRestart = true;

+ 18 - 0
MediaBrowser.Model/System/SystemInfo.cs

@@ -122,6 +122,24 @@ namespace MediaBrowser.Model.System
         /// <value>The HTTP server port number.</value>
         public int HttpServerPortNumber { get; set; }
 
+        /// <summary>
+        /// Gets or sets the value pointing to the file system where the ssl certiifcate is located.
+        /// </summary>
+        /// <value>The value pointing to the file system where the ssl certiifcate is located.</value>
+        public bool UseHttps { get; set; }
+
+        /// <summary>
+        /// Gets or sets the value pointing to the file system where the ssl certiifcate is located..
+        /// </summary>
+        /// <value>The value pointing to the file system where the ssl certiifcate is located..</value>
+        public string CertificatePath { get; set; }
+
+        /// <summary>
+        /// Gets or sets the HTTPS server port number.
+        /// </summary>
+        /// <value>The HTTPS server port number.</value>
+        public int HttpsPortNumber { get; set; }
+
         /// <summary>
         /// Gets or sets a value indicating whether this instance has update available.
         /// </summary>

+ 7 - 2
MediaBrowser.Server.Implementations/HttpServer/HttpListenerHost.cs

@@ -44,6 +44,8 @@ namespace MediaBrowser.Server.Implementations.HttpServer
 
         private readonly bool _supportsNativeWebSocket;
 
+        private string _certificatePath;
+
         /// <summary>
         /// Gets the local end points.
         /// </summary>
@@ -217,10 +219,12 @@ namespace MediaBrowser.Server.Implementations.HttpServer
         {
             if (_supportsNativeWebSocket && NativeWebSocket.IsSupported)
             {
+                // Certificate location is ignored here. You need to use netsh 
+                // to assign the certificate to the proper port.
                 return new HttpListenerServer(_logger, OnRequestReceived);
             }
 
-            return new WebSocketSharpListener(_logger, OnRequestReceived);
+            return new WebSocketSharpListener(_logger, OnRequestReceived, _certificatePath);
         }
 
         private void WebSocketHandler(WebSocketConnectEventArgs args)
@@ -425,8 +429,9 @@ namespace MediaBrowser.Server.Implementations.HttpServer
             GC.SuppressFinalize(this);
         }
 
-        public void StartServer(IEnumerable<string> urlPrefixes)
+        public void StartServer(IEnumerable<string> urlPrefixes, string certificatePath)
         {
+            _certificatePath = certificatePath;
             UrlPrefixes = urlPrefixes.ToList();
             Start(UrlPrefixes.First());
         }

+ 5 - 2
MediaBrowser.Server.Implementations/HttpServer/SocketSharp/WebSocketSharpListener.cs

@@ -18,11 +18,14 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
 
         private readonly ILogger _logger;
         private readonly Action<string> _endpointListener;
+        private readonly string  _certificatePath ;
 
-        public WebSocketSharpListener(ILogger logger, Action<string> endpointListener)
+        public WebSocketSharpListener(ILogger logger, Action<string> endpointListener, 
+            string certificatePath)
         {
             _logger = logger;
             _endpointListener = endpointListener;
+            _certificatePath = certificatePath;
         }
 
         public Action<Exception, IRequest> ErrorHandler { get; set; }
@@ -34,7 +37,7 @@ namespace MediaBrowser.Server.Implementations.HttpServer.SocketSharp
         public void Start(IEnumerable<string> urlPrefixes)
         {
             if (_listener == null)
-                _listener = new HttpListener(new PatternsLogger(_logger), null);
+                _listener = new HttpListener(new PatternsLogger(_logger), _certificatePath);
 
             foreach (var prefix in urlPrefixes)
             {

+ 8 - 0
MediaBrowser.Server.Implementations/Localization/Server/server.json

@@ -508,6 +508,14 @@
     "LabelLocalHttpServerPortNumberHelp": "The tcp port number that Media Browser's http server should bind to.",
     "LabelPublicPort": "Public port number:",
     "LabelPublicPortHelp": "The public port number that should be mapped to the local port.",
+
+    "LabelUseHttps": "Enable SSL",
+    "LabelUseHttpsHelp": "Check to enable SSL hosting.",
+    "LabelHttpsPort":  "Local http port:",
+    "LabelHttpsPortHelp": "The tcp port number that Media Browser's https server should bind to.",
+    "LabelCertificatePath": "SSL Certificate path:",
+    "LabelCertificatePathHelp": "The path on the filesystem to the ssl certificate pfx file.",
+
     "LabelWebSocketPortNumber": "Web socket port number:",
     "LabelEnableAutomaticPortMap": "Enable automatic port mapping",
     "LabelEnableAutomaticPortMapHelp": "Attempt to automatically map the public port to the local port via UPnP. This may not work with some router models.",

+ 4 - 4
MediaBrowser.Server.Implementations/ServerManager/ServerManager.cs

@@ -99,22 +99,22 @@ namespace MediaBrowser.Server.Implementations.ServerManager
         /// <summary>
         /// Starts this instance.
         /// </summary>
-        public void Start(IEnumerable<string> urlPrefixes)
+        public void Start(IEnumerable<string> urlPrefixes, string certificatePath)
         {
-            ReloadHttpServer(urlPrefixes);
+            ReloadHttpServer(urlPrefixes, certificatePath);
         }
 
         /// <summary>
         /// Restarts the Http Server, or starts it if not currently running
         /// </summary>
-        private void ReloadHttpServer(IEnumerable<string> urlPrefixes)
+        private void ReloadHttpServer(IEnumerable<string> urlPrefixes, string certificatePath)
         {
             _logger.Info("Loading Http Server");
 
             try
             {
                 HttpServer = _applicationHost.Resolve<IHttpServer>();
-                HttpServer.StartServer(urlPrefixes);
+                HttpServer.StartServer(urlPrefixes, certificatePath);
             }
             catch (SocketException ex)
             {

+ 23 - 1
MediaBrowser.Server.Startup.Common/ApplicationHost.cs

@@ -133,6 +133,11 @@ namespace MediaBrowser.Server.Startup.Common
                     "http://+:" + ServerConfigurationManager.Configuration.HttpServerPortNumber + "/" + WebApplicationName + "/"
                 };
 
+                if (ServerConfigurationManager.Configuration.UseHttps)
+                {
+                    list.Add("https://+:" + ServerConfigurationManager.Configuration.HttpsPortNumber + "/" + WebApplicationName + "/");
+                }
+
                 return list;
             }
         }
@@ -805,7 +810,7 @@ namespace MediaBrowser.Server.Startup.Common
         {
             try
             {
-                ServerManager.Start(HttpServerUrlPrefixes);
+                ServerManager.Start(HttpServerUrlPrefixes, CertificatePath);
             }
             catch (Exception ex)
             {
@@ -972,6 +977,8 @@ namespace MediaBrowser.Server.Startup.Common
                 CachePath = ApplicationPaths.CachePath,
                 MacAddress = GetMacAddress(),
                 HttpServerPortNumber = HttpServerPort,
+                UseHttps = UseHttps,
+                CertificatePath = CertificatePath,
                 OperatingSystem = OperatingSystemDisplayName,
                 CanSelfRestart = CanSelfRestart,
                 CanSelfUpdate = CanSelfUpdate,
@@ -1046,6 +1053,21 @@ namespace MediaBrowser.Server.Startup.Common
             get { return ServerConfigurationManager.Configuration.HttpServerPortNumber; }
         }
 
+        public bool UseHttps
+        {
+            get { return this.ServerConfigurationManager.Configuration.UseHttps; }
+        }
+
+        public string CertificatePath
+        {
+            get { return this.ServerConfigurationManager.Configuration.CertificatePath; }
+        }
+
+        public int HttpsServerPort
+        {
+            get { return ServerConfigurationManager.Configuration.HttpsPortNumber; }
+        }
+
         /// <summary>
         /// Gets the mac address.
         /// </summary>