From 7a9c85526cb99495bdd436150679941ef021b782 Mon Sep 17 00:00:00 2001
From: diva
Date: Sun, 14 Jun 2009 15:35:09 +0000
Subject: Pulled out HelloNeighbour into its own service, INeighbourService,
which may get more functions as we go along. It's a very simple service and
service connectors, and it served primarily to establish the design of
services that dependent on Scenes and that must always have a local
connector. More refactoring coming, as this showed how to do it right.
---
OpenSim/Server/Handlers/Base/Utils.cs | 97 ++++++++++
.../Server/Handlers/Neighbour/NeighbourHandlers.cs | 203 +++++++++++++++++++++
.../Neighbour/NeighbourServiceInConnector.cs | 68 +++++++
.../Server/Handlers/Simulation/AgentHandlers.cs | 5 +-
OpenSim/Server/Handlers/Simulation/Utils.cs | 97 ----------
5 files changed, 371 insertions(+), 99 deletions(-)
create mode 100644 OpenSim/Server/Handlers/Base/Utils.cs
create mode 100644 OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
create mode 100644 OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs
delete mode 100644 OpenSim/Server/Handlers/Simulation/Utils.cs
(limited to 'OpenSim/Server/Handlers')
diff --git a/OpenSim/Server/Handlers/Base/Utils.cs b/OpenSim/Server/Handlers/Base/Utils.cs
new file mode 100644
index 0000000..f1610ff
--- /dev/null
+++ b/OpenSim/Server/Handlers/Base/Utils.cs
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.Net;
+
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Services.Interfaces;
+using OpenMetaverse;
+
+namespace OpenSim.Server.Handlers.Base
+{
+ public class RestHandlerUtils
+ {
+ ///
+ /// Extract the param from an uri.
+ ///
+ /// Something like this: /uuid/ or /uuid/handle/release
+ /// uuid on uuid field
+ /// optional action
+ public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action)
+ {
+ uuid = UUID.Zero;
+ action = "";
+ regionHandle = 0;
+
+ path = path.Trim(new char[] { '/' });
+ string[] parts = path.Split('/');
+ if (parts.Length <= 1)
+ {
+ return false;
+ }
+ else
+ {
+ if (!UUID.TryParse(parts[0], out uuid))
+ return false;
+
+ if (parts.Length >= 2)
+ UInt64.TryParse(parts[1], out regionHandle);
+ if (parts.Length >= 3)
+ action = parts[2];
+
+ return true;
+ }
+ }
+
+ public static bool GetAuthentication(OSHttpRequest httpRequest, out string authority, out string authKey)
+ {
+ authority = string.Empty;
+ authKey = string.Empty;
+
+ Uri authUri;
+
+ string auth = httpRequest.Headers["authentication"];
+ // Authentication keys look like this:
+ // http://orgrid.org:8002/
+ if ((auth != null) && (!string.Empty.Equals(auth)) && auth != "None")
+ {
+ if (Uri.TryCreate(auth, UriKind.Absolute, out authUri))
+ {
+ authority = authUri.Authority;
+ authKey = authUri.PathAndQuery.Trim('/');
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ }
+}
diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
new file mode 100644
index 0000000..6336f4f
--- /dev/null
+++ b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.IO;
+using System.Reflection;
+using System.Net;
+using System.Text;
+
+using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Base;
+using OpenSim.Services.Interfaces;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using Nini.Config;
+using log4net;
+
+
+namespace OpenSim.Server.Handlers.Neighbour
+{
+ public class NeighbourGetHandler : BaseStreamHandler
+ {
+ // TODO: unused: private ISimulationService m_SimulationService;
+ // TODO: unused: private IAuthenticationService m_AuthenticationService;
+
+ public NeighbourGetHandler(INeighbourService service, IAuthenticationService authentication) :
+ base("GET", "/region")
+ {
+ // TODO: unused: m_SimulationService = service;
+ // TODO: unused: m_AuthenticationService = authentication;
+ }
+
+ public override byte[] Handle(string path, Stream request,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ // Not implemented yet
+ Console.WriteLine("--- Get region --- " + path);
+ httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
+ return new byte[] { };
+ }
+ }
+
+ public class NeighbourPostHandler : BaseStreamHandler
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private INeighbourService m_NeighbourService;
+ private IAuthenticationService m_AuthenticationService;
+ // TODO: unused: private bool m_AllowForeignGuests;
+
+ public NeighbourPostHandler(INeighbourService service, IAuthenticationService authentication) :
+ base("POST", "/region")
+ {
+ m_NeighbourService = service;
+ m_AuthenticationService = authentication;
+ // TODO: unused: m_AllowForeignGuests = foreignGuests;
+ }
+
+ public override byte[] Handle(string path, Stream request,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ byte[] result = new byte[0];
+
+ UUID regionID;
+ string action;
+ ulong regionHandle;
+ if (RestHandlerUtils.GetParams(path, out regionID, out regionHandle, out action))
+ {
+ m_log.InfoFormat("[RegionPostHandler]: Invalid parameters for neighbour message {0}", path);
+ httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
+ httpResponse.StatusDescription = "Invalid parameters for neighbour message " + path;
+
+ return result;
+ }
+
+ if (m_AuthenticationService != null)
+ {
+ // Authentication
+ string authority = string.Empty;
+ string authToken = string.Empty;
+ if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken))
+ {
+ m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path);
+ httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized;
+ return result;
+ }
+ if (!m_AuthenticationService.VerifyUserKey(regionID, authToken))
+ {
+ m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path);
+ httpResponse.StatusCode = (int)HttpStatusCode.Forbidden;
+ return result;
+ }
+ m_log.DebugFormat("[RegionPostHandler]: Authentication succeeded for {0}", regionID);
+ }
+
+ OSDMap args = Util.GetOSDMap(request, (int)httpRequest.ContentLength);
+ if (args == null)
+ {
+ httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
+ httpResponse.StatusDescription = "Unable to retrieve data";
+ m_log.DebugFormat("[RegionPostHandler]: Unable to retrieve data for post {0}", path);
+ return result;
+ }
+
+ // retrieve the regionhandle
+ ulong regionhandle = 0;
+ if (args["destination_handle"] != null)
+ UInt64.TryParse(args["destination_handle"].AsString(), out regionhandle);
+
+ RegionInfo aRegion = new RegionInfo();
+ try
+ {
+ aRegion.UnpackRegionInfoData(args);
+ }
+ catch (Exception ex)
+ {
+ m_log.InfoFormat("[RegionPostHandler]: exception on unpacking region info {0}", ex.Message);
+ httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
+ httpResponse.StatusDescription = "Problems with data deserialization";
+ return result;
+ }
+
+ // Finally!
+ bool success = m_NeighbourService.HelloNeighbour(regionhandle, aRegion);
+
+ OSDMap resp = new OSDMap(1);
+
+ resp["success"] = OSD.FromBoolean(success);
+
+ httpResponse.StatusCode = (int)HttpStatusCode.OK;
+
+ return Encoding.UTF8.GetBytes(OSDParser.SerializeJsonString(resp));
+ }
+ }
+
+ public class NeighbourPutHandler : BaseStreamHandler
+ {
+ // TODO: unused: private ISimulationService m_SimulationService;
+ // TODO: unused: private IAuthenticationService m_AuthenticationService;
+
+ public NeighbourPutHandler(INeighbourService service, IAuthenticationService authentication) :
+ base("PUT", "/region")
+ {
+ // TODO: unused: m_SimulationService = service;
+ // TODO: unused: m_AuthenticationService = authentication;
+ }
+
+ public override byte[] Handle(string path, Stream request,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ // Not implemented yet
+ httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
+ return new byte[] { };
+ }
+ }
+
+ public class NeighbourDeleteHandler : BaseStreamHandler
+ {
+ // TODO: unused: private ISimulationService m_SimulationService;
+ // TODO: unused: private IAuthenticationService m_AuthenticationService;
+
+ public NeighbourDeleteHandler(INeighbourService service, IAuthenticationService authentication) :
+ base("DELETE", "/region")
+ {
+ // TODO: unused: m_SimulationService = service;
+ // TODO: unused: m_AuthenticationService = authentication;
+ }
+
+ public override byte[] Handle(string path, Stream request,
+ OSHttpRequest httpRequest, OSHttpResponse httpResponse)
+ {
+ // Not implemented yet
+ httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented;
+ return new byte[] { };
+ }
+ }
+}
diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs
new file mode 100644
index 0000000..a708b37
--- /dev/null
+++ b/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using log4net;
+using Nini.Config;
+using OpenSim.Server.Base;
+using OpenSim.Services.Interfaces;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Server.Handlers.Base;
+
+namespace OpenSim.Server.Handlers.Neighbour
+{
+ public class NeighbourServiceInConnector : ServiceConnector
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ private INeighbourService m_NeighbourService;
+ private IAuthenticationService m_AuthenticationService = null;
+
+ public NeighbourServiceInConnector(IConfigSource source, IHttpServer server, INeighbourService nService, IScene scene) :
+ base(source, server)
+ {
+
+ m_NeighbourService = nService;
+ if (m_NeighbourService == null)
+ {
+ m_log.Error("[NEIGHBOUR IN CONNECTOR]: neighbour service was not provided");
+ return;
+ }
+
+ //bool authentication = neighbourConfig.GetBoolean("RequireAuthentication", false);
+ //if (authentication)
+ // m_AuthenticationService = scene.RequestModuleInterface();
+
+
+ server.AddStreamHandler(new NeighbourPostHandler(m_NeighbourService, m_AuthenticationService));
+ server.AddStreamHandler(new NeighbourGetHandler(m_NeighbourService, m_AuthenticationService));
+ }
+ }
+}
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
index c14ad99..8e4d7d0 100644
--- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
@@ -32,6 +32,7 @@ using System.Net;
using System.Text;
using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Base;
using OpenSim.Services.Interfaces;
using OpenSim.Framework;
using OpenSim.Framework.Servers.HttpServer;
@@ -88,7 +89,7 @@ namespace OpenSim.Server.Handlers.Simulation
UUID agentID;
string action;
ulong regionHandle;
- if (!Utils.GetParams(path, out agentID, out regionHandle, out action))
+ if (!RestHandlerUtils.GetParams(path, out agentID, out regionHandle, out action))
{
m_log.InfoFormat("[AgentPostHandler]: Invalid parameters for agent message {0}", path);
httpResponse.StatusCode = (int)HttpStatusCode.BadRequest;
@@ -102,7 +103,7 @@ namespace OpenSim.Server.Handlers.Simulation
// Authentication
string authority = string.Empty;
string authToken = string.Empty;
- if (!Utils.GetAuthentication(httpRequest, out authority, out authToken))
+ if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken))
{
m_log.InfoFormat("[AgentPostHandler]: Authentication failed for agent message {0}", path);
httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized;
diff --git a/OpenSim/Server/Handlers/Simulation/Utils.cs b/OpenSim/Server/Handlers/Simulation/Utils.cs
deleted file mode 100644
index e21d1b8..0000000
--- a/OpenSim/Server/Handlers/Simulation/Utils.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the OpenSimulator Project nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Collections;
-using System.Net;
-
-using OpenSim.Framework;
-using OpenSim.Framework.Servers.HttpServer;
-using OpenSim.Services.Interfaces;
-using OpenMetaverse;
-
-namespace OpenSim.Server.Handlers.Simulation
-{
- public class Utils
- {
- ///
- /// Extract the param from an uri.
- ///
- /// Something like this: /uuid/ or /uuid/handle/release
- /// uuid on uuid field
- /// optional action
- public static bool GetParams(string path, out UUID uuid, out ulong regionHandle, out string action)
- {
- uuid = UUID.Zero;
- action = "";
- regionHandle = 0;
-
- path = path.Trim(new char[] { '/' });
- string[] parts = path.Split('/');
- if (parts.Length <= 1)
- {
- return false;
- }
- else
- {
- if (!UUID.TryParse(parts[0], out uuid))
- return false;
-
- if (parts.Length >= 2)
- UInt64.TryParse(parts[1], out regionHandle);
- if (parts.Length >= 3)
- action = parts[2];
-
- return true;
- }
- }
-
- public static bool GetAuthentication(OSHttpRequest httpRequest, out string authority, out string authKey)
- {
- authority = string.Empty;
- authKey = string.Empty;
-
- Uri authUri;
-
- string auth = httpRequest.Headers["authentication"];
- // Authentication keys look like this:
- // http://orgrid.org:8002/
- if ((auth != null) && (!string.Empty.Equals(auth)) && auth != "None")
- {
- if (Uri.TryCreate(auth, UriKind.Absolute, out authUri))
- {
- authority = authUri.Authority;
- authKey = authUri.PathAndQuery.Trim('/');
- return true;
- }
- }
-
- return false;
- }
-
- }
-}
--
cgit v1.1