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