diff --git a/OpenSim/Framework/MainServer.cs b/OpenSim/Framework/MainServer.cs
index 0515b166e2..a3e0a26bb7 100644
--- a/OpenSim/Framework/MainServer.cs
+++ b/OpenSim/Framework/MainServer.cs
@@ -52,6 +52,11 @@ namespace OpenSim.Framework
return GetHttpServer(port,null);
}
+ public static void AddHttpServer(BaseHttpServer server)
+ {
+ m_Servers.Add(server.Port, server);
+ }
+
public static IHttpServer GetHttpServer(uint port, IPAddress ipaddr)
{
if (port == 0)
diff --git a/OpenSim/Framework/NetworkServersInfo.cs b/OpenSim/Framework/NetworkServersInfo.cs
index b25f8b9f60..5bb4111c90 100644
--- a/OpenSim/Framework/NetworkServersInfo.cs
+++ b/OpenSim/Framework/NetworkServersInfo.cs
@@ -49,6 +49,12 @@ namespace OpenSim.Framework
public string HttpSSLCN = "";
public uint httpSSLPort = 9001;
+ // "Out of band" managemnt https
+ public bool ssl_listener = false;
+ public uint https_port = 0;
+ public string cert_path = String.Empty;
+ public string cert_pass = String.Empty;
+
public string MessagingURL = String.Empty;
public NetworkServersInfo()
@@ -86,6 +92,15 @@ namespace OpenSim.Framework
secureInventoryServer = config.Configs["Network"].GetBoolean("secure_inventory_server", true);
MessagingURL = config.Configs["Network"].GetString("messaging_server_url", string.Empty);
+
+ // "Out of band management https"
+ ssl_listener = config.Configs["Network"].GetBoolean("https_listener",false);
+ if( ssl_listener)
+ {
+ cert_path = config.Configs["Network"].GetString("cert_path",String.Empty);
+ cert_pass = config.Configs["Network"].GetString("cert_pass",String.Empty);
+ https_port = (uint)config.Configs["Network"].GetInt("https_port", 0);
+ }
}
}
}
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index ba89e2117b..598e5d17cd 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -32,6 +32,7 @@ using System.Collections.Specialized;
using System.IO;
using System.Net;
using System.Net.Sockets;
+using System.Security.Cryptography.X509Certificates;
using System.Reflection;
using System.Globalization;
using System.Text;
@@ -72,6 +73,7 @@ namespace OpenSim.Framework.Servers.HttpServer
protected uint m_port;
protected uint m_sslport;
protected bool m_ssl;
+ private X509Certificate2 m_cert;
protected bool m_firstcaps = true;
protected string m_SSLCommonName = "";
@@ -123,6 +125,14 @@ namespace OpenSim.Framework.Servers.HttpServer
}
}
+ public BaseHttpServer(uint port, bool ssl, string CPath, string CPass) : this (port, ssl)
+ {
+ if (m_ssl)
+ {
+ m_cert = new X509Certificate2(CPath, CPass);
+ }
+ }
+
///
/// Add a stream handler to the http server. If the handler already exists, then nothing happens.
///
@@ -1683,6 +1693,7 @@ namespace OpenSim.Framework.Servers.HttpServer
try
{
//m_httpListener = new HttpListener();
+
NotSocketErrors = 0;
if (!m_ssl)
{
@@ -1702,6 +1713,9 @@ namespace OpenSim.Framework.Servers.HttpServer
{
//m_httpListener.Prefixes.Add("https://+:" + (m_sslport) + "/");
//m_httpListener.Prefixes.Add("http://+:" + m_port + "/");
+ m_httpListener2 = CoolHTTPListener.Create(IPAddress.Any, (int)m_port, m_cert);
+ m_httpListener2.ExceptionThrown += httpServerException;
+ m_httpListener2.LogWriter = httpserverlog;
}
m_httpListener2.RequestReceived += OnRequest;
diff --git a/OpenSim/Region/ClientStack/RegionApplicationBase.cs b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
index ea1317a19c..6e3a58e63a 100644
--- a/OpenSim/Region/ClientStack/RegionApplicationBase.cs
+++ b/OpenSim/Region/ClientStack/RegionApplicationBase.cs
@@ -96,6 +96,22 @@ namespace OpenSim.Region.ClientStack
MainServer.Instance = m_httpServer;
+ // "OOB" Server
+ if (m_networkServersInfo.ssl_listener)
+ {
+ BaseHttpServer server = null;
+ server = new BaseHttpServer(
+ m_networkServersInfo.https_port, m_networkServersInfo.ssl_listener, m_networkServersInfo.cert_path,
+ m_networkServersInfo.cert_pass);
+ // Add the server to m_Servers
+ if(server != null)
+ {
+ m_log.InfoFormat("[REGION SERVER]: Starting HTTPS server on port {0}", server.Port);
+ MainServer.AddHttpServer(server);
+ server.Start();
+ }
+ }
+
base.StartupSpecific();
}
diff --git a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
index 9b565ed85b..a552a28912 100644
--- a/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/LSLHttp/UrlModule.cs
@@ -78,7 +78,9 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
private int m_TotalUrls = 100;
+ private uint https_port = 0;
private IHttpServer m_HttpServer = null;
+ private IHttpServer m_HttpsServer = null;
private string m_ExternalHostNameForLSL = "";
@@ -100,6 +102,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
public void Initialise(IConfigSource config)
{
m_ExternalHostNameForLSL = config.Configs["Network"].GetString("ExternalHostNameForLSL", System.Environment.MachineName);
+ bool ssl_enabled = config.Configs["Network"].GetBoolean("https_listener",false);
+ if (ssl_enabled)
+ {
+ https_port = (uint) config.Configs["Network"].GetInt("https_port",0);
+ }
}
public void PostInitialise()
@@ -113,6 +120,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
// There can only be one
//
m_HttpServer = MainServer.Instance;
+ //
+ // We can use the https if it is enabled
+ if (https_port > 0)
+ {
+ m_HttpsServer = MainServer.GetHttpServer(https_port);
+ }
}
scene.RegisterModuleInterface(this);
@@ -171,7 +184,40 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
{
UUID urlcode = UUID.Random();
- engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
+ if (m_HttpsServer == null)
+ {
+ engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
+ return urlcode;
+ }
+
+ lock (m_UrlMap)
+ {
+ if (m_UrlMap.Count >= m_TotalUrls)
+ {
+ engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
+ return urlcode;
+ }
+ string url = "https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + "/lslhttps/" + urlcode.ToString() + "/";
+
+ UrlData urlData = new UrlData();
+ urlData.hostID = host.UUID;
+ urlData.itemID = itemID;
+ urlData.engine = engine;
+ urlData.url = url;
+ urlData.urlcode = urlcode;
+ urlData.requests = new Dictionary();
+
+
+ m_UrlMap[url] = urlData;
+
+ string uri = "/lslhttps/" + urlcode.ToString() + "/";
+
+ m_HttpsServer.AddPollServiceHTTPHandler(uri,HandleHttpPoll,
+ new PollServiceEventArgs(HttpRequestHandler,HasEvents, GetEvents, NoEvents,
+ urlcode));
+
+ engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_GRANTED", url });
+ }
return urlcode;
}
@@ -345,7 +391,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
}
private Hashtable GetEvents(UUID requestID, UUID sessionID, string request)
{
- UrlData url = null;
+ UrlData url = null;
RequestData requestData = null;
lock (m_RequestMap)
@@ -391,11 +437,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
lock (request)
{
string uri = request["uri"].ToString();
-
+ bool is_ssl = uri.Contains("lslhttps");
+
try
{
Hashtable headers = (Hashtable)request["headers"];
-
+
// string uri_full = "http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri;// "/lslhttp/" + urlcode.ToString() + "/";
int pos1 = uri.IndexOf("/");// /lslhttp
@@ -409,7 +456,11 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
pathInfo = uri.Substring(pos3);
- UrlData url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp];
+ UrlData url = null;
+ if (!is_ssl)
+ url = m_UrlMap["http://" + m_ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + uri_tmp];
+ else
+ url = m_UrlMap["https://" + m_ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + uri_tmp];
//for llGetHttpHeader support we need to store original URI here
//to make x-path-info / x-query-string / x-script-url / x-remote-ip headers
diff --git a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
index ab6a598ace..e983239b4a 100644
--- a/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
+++ b/OpenSim/Region/CoreModules/World/Region/RestartModule.cs
@@ -64,19 +64,26 @@ namespace OpenSim.Region.CoreModules.World.Region
public void AddRegion(Scene scene)
{
m_Scene = scene;
+
scene.RegisterModuleInterface(this);
MainConsole.Instance.Commands.AddCommand("RestartModule",
false, "region restart bluebox",
- "region restart bluebox