From 40d8e91008b7d76ce6b9398484c591eb51c85bdb Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Sun, 31 Jan 2010 11:10:57 -0800
Subject: * Added a few files that were missing in the repo. * New
 HGInventoryService which allows restricted access to inventory while outside

---
 .../Hypergrid/HGInventoryServerInConnector.cs      | 104 ++++++++++++
 .../Server/Handlers/Hypergrid/HomeAgentHandlers.cs | 181 +++++++++++++++++++++
 .../Inventory/InventoryServerInConnector.cs        |  46 +-----
 3 files changed, 290 insertions(+), 41 deletions(-)
 create mode 100644 OpenSim/Server/Handlers/Hypergrid/HGInventoryServerInConnector.cs
 create mode 100644 OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs

(limited to 'OpenSim/Server')

diff --git a/OpenSim/Server/Handlers/Hypergrid/HGInventoryServerInConnector.cs b/OpenSim/Server/Handlers/Hypergrid/HGInventoryServerInConnector.cs
new file mode 100644
index 0000000..cf5d521
--- /dev/null
+++ b/OpenSim/Server/Handlers/Hypergrid/HGInventoryServerInConnector.cs
@@ -0,0 +1,104 @@
+/*
+ * 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.Collections.Generic;
+using System.Net;
+using System.Reflection;
+using log4net;
+using Nini.Config;
+using Nwc.XmlRpc;
+using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Inventory;
+using OpenSim.Services.Interfaces;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Server.Handlers.Base;
+using OpenMetaverse;
+
+namespace OpenSim.Server.Handlers.Hypergrid
+{
+    public class HGInventoryServiceInConnector : InventoryServiceInConnector
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+        //private static readonly int INVENTORY_DEFAULT_SESSION_TIME = 30; // secs
+        //private AuthedSessionCache m_session_cache = new AuthedSessionCache(INVENTORY_DEFAULT_SESSION_TIME);
+
+        private IUserAgentService m_UserAgentService;
+
+        public HGInventoryServiceInConnector(IConfigSource config, IHttpServer server, string configName) :
+                base(config, server, configName)
+        {
+            IConfig serverConfig = config.Configs[m_ConfigName];
+            if (serverConfig == null)
+                throw new Exception(String.Format("No section '{0}' in config file", m_ConfigName));
+
+            string userAgentService = serverConfig.GetString("UserAgentService", string.Empty);
+            string m_userserver_url = serverConfig.GetString("UserAgentURI", String.Empty);
+            if (m_userserver_url != string.Empty)
+            {
+                Object[] args = new Object[] { m_userserver_url };
+                m_UserAgentService = ServerUtils.LoadPlugin<IUserAgentService>(userAgentService, args);
+            }
+
+            AddHttpHandlers(server);
+            m_log.Debug("[HG HG INVENTORY HANDLER]: handlers initialized");
+        }
+
+        /// <summary>
+        /// Check that the source of an inventory request for a particular agent is a current session belonging to
+        /// that agent.
+        /// </summary>
+        /// <param name="session_id"></param>
+        /// <param name="avatar_id"></param>
+        /// <returns></returns>
+        public override bool CheckAuthSession(string session_id, string avatar_id)
+        {
+            m_log.InfoFormat("[HG INVENTORY IN CONNECTOR]: checking authed session {0} {1}", session_id, avatar_id);
+            // This doesn't work
+
+        //    if (m_session_cache.getCachedSession(session_id, avatar_id) == null)
+        //    {
+        //         //cache miss, ask userserver
+        //        m_UserAgentService.VerifyAgent(session_id, ???);
+        //    }
+        //    else
+        //    {
+        //        // cache hits
+        //        m_log.Info("[HG INVENTORY IN CONNECTOR]: got authed session from cache");
+        //        return true;
+        //    }
+
+        //        m_log.Warn("[HG INVENTORY IN CONNECTOR]: unknown session_id, request rejected");
+        //    return false;
+        
+            return true;
+        }
+    }
+}
diff --git a/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs
new file mode 100644
index 0000000..17d7850
--- /dev/null
+++ b/OpenSim/Server/Handlers/Hypergrid/HomeAgentHandlers.cs
@@ -0,0 +1,181 @@
+/*
+ * 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.IO;
+using System.Reflection;
+using System.Net;
+using System.Text;
+
+using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Base;
+using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Server.Handlers.Simulation;
+using Utils = OpenSim.Server.Handlers.Simulation.Utils;
+
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using Nini.Config;
+using log4net;
+
+
+namespace OpenSim.Server.Handlers.Hypergrid
+{
+    public class HomeAgentHandler 
+    {
+        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+        private IUserAgentService m_UserAgentService;
+
+        public HomeAgentHandler(IUserAgentService userAgentService)
+        {
+            m_UserAgentService = userAgentService;
+        }
+
+        public Hashtable Handler(Hashtable request)
+        {
+            m_log.Debug("[CONNECTION DEBUGGING]: HomeAgentHandler Called");
+
+            m_log.Debug("---------------------------");
+            m_log.Debug(" >> uri=" + request["uri"]);
+            m_log.Debug(" >> content-type=" + request["content-type"]);
+            m_log.Debug(" >> http-method=" + request["http-method"]);
+            m_log.Debug("---------------------------\n");
+
+            Hashtable responsedata = new Hashtable();
+            responsedata["content_type"] = "text/html";
+            responsedata["keepalive"] = false;
+
+
+            UUID agentID;
+            UUID regionID;
+            string action;
+            if (!Utils.GetParams((string)request["uri"], out agentID, out regionID, out action))
+            {
+                m_log.InfoFormat("[HOME AGENT HANDLER]: Invalid parameters for agent message {0}", request["uri"]);
+                responsedata["int_response_code"] = 404;
+                responsedata["str_response_string"] = "false";
+
+                return responsedata;
+            }
+
+            // Next, let's parse the verb
+            string method = (string)request["http-method"];
+            if (method.Equals("POST"))
+            {
+                DoAgentPost(request, responsedata, agentID);
+                return responsedata;
+            }
+            else
+            {
+                m_log.InfoFormat("[HOME AGENT HANDLER]: method {0} not supported in agent message", method);
+                responsedata["int_response_code"] = HttpStatusCode.MethodNotAllowed;
+                responsedata["str_response_string"] = "Method not allowed";
+
+                return responsedata;
+            }
+
+        }
+
+        protected void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id)
+        {
+            OSDMap args = Utils.GetOSDMap((string)request["body"]);
+            if (args == null)
+            {
+                responsedata["int_response_code"] = HttpStatusCode.BadRequest;
+                responsedata["str_response_string"] = "Bad request";
+                return;
+            }
+
+            // retrieve the input arguments
+            int x = 0, y = 0;
+            UUID uuid = UUID.Zero;
+            string regionname = string.Empty;
+            string gatekeeper_host = string.Empty;
+            int gatekeeper_port = 0;
+
+            if (args.ContainsKey("gatekeeper_host") && args["gatekeeper_host"] != null)
+                gatekeeper_host = args["gatekeeper_host"].AsString();
+            if (args.ContainsKey("gatekeeper_port") && args["gatekeeper_port"] != null)
+                Int32.TryParse(args["gatekeeper_port"].AsString(), out gatekeeper_port);
+
+            GridRegion gatekeeper = new GridRegion();
+            gatekeeper.ExternalHostName = gatekeeper_host;
+            gatekeeper.HttpPort = (uint)gatekeeper_port;
+            gatekeeper.InternalEndPoint = new IPEndPoint(IPAddress.Parse("0.0.0.0"), 0);
+
+            if (args.ContainsKey("destination_x") && args["destination_x"] != null)
+                Int32.TryParse(args["destination_x"].AsString(), out x);
+            else
+                m_log.WarnFormat("  -- request didn't have destination_x");
+            if (args.ContainsKey("destination_y") && args["destination_y"] != null)
+                Int32.TryParse(args["destination_y"].AsString(), out y);
+            else
+                m_log.WarnFormat("  -- request didn't have destination_y");
+            if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null)
+                UUID.TryParse(args["destination_uuid"].AsString(), out uuid);
+            if (args.ContainsKey("destination_name") && args["destination_name"] != null)
+                regionname = args["destination_name"].ToString();
+
+            GridRegion destination = new GridRegion();
+            destination.RegionID = uuid;
+            destination.RegionLocX = x;
+            destination.RegionLocY = y;
+            destination.RegionName = regionname;
+
+            AgentCircuitData aCircuit = new AgentCircuitData();
+            try
+            {
+                aCircuit.UnpackAgentCircuitData(args);
+            }
+            catch (Exception ex)
+            {
+                m_log.InfoFormat("[HOME AGENT HANDLER]: exception on unpacking ChildCreate message {0}", ex.Message);
+                responsedata["int_response_code"] = HttpStatusCode.BadRequest;
+                responsedata["str_response_string"] = "Bad request";
+                return;
+            }
+
+            OSDMap resp = new OSDMap(2);
+            string reason = String.Empty;
+
+            bool result = m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, out reason);
+
+            resp["reason"] = OSD.FromString(reason);
+            resp["success"] = OSD.FromBoolean(result);
+
+            // TODO: add reason if not String.Empty?
+            responsedata["int_response_code"] = HttpStatusCode.OK;
+            responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp);
+        }
+
+    }
+
+}
diff --git a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs
index 3c92209..53db739 100644
--- a/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs
+++ b/OpenSim/Server/Handlers/Inventory/InventoryServerInConnector.cs
@@ -46,7 +46,7 @@ namespace OpenSim.Server.Handlers.Inventory
     {
         private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 
-        private IInventoryService m_InventoryService;
+        protected IInventoryService m_InventoryService;
 
         private bool m_doLookup = false;
 
@@ -54,11 +54,12 @@ namespace OpenSim.Server.Handlers.Inventory
         //private AuthedSessionCache m_session_cache = new AuthedSessionCache(INVENTORY_DEFAULT_SESSION_TIME);
 
         private string m_userserver_url;
-        private string m_ConfigName = "InventoryService";
+        protected string m_ConfigName = "InventoryService";
 
         public InventoryServiceInConnector(IConfigSource config, IHttpServer server, string configName) :
                 base(config, server, configName)
         {
+            m_ConfigName = configName;
             IConfig serverConfig = config.Configs[m_ConfigName];
             if (serverConfig == null)
                 throw new Exception(String.Format("No section '{0}' in config file", m_ConfigName));
@@ -328,46 +329,9 @@ namespace OpenSim.Server.Handlers.Inventory
         /// <param name="session_id"></param>
         /// <param name="avatar_id"></param>
         /// <returns></returns>
-        public bool CheckAuthSession(string session_id, string avatar_id)
+        public virtual bool CheckAuthSession(string session_id, string avatar_id)
         {
-            if (m_doLookup)
-            {
-                m_log.InfoFormat("[INVENTORY IN CONNECTOR]: checking authed session {0} {1}", session_id, avatar_id);
-
-                //if (m_session_cache.getCachedSession(session_id, avatar_id) == null)
-                //{
-                    // cache miss, ask userserver
-                    Hashtable requestData = new Hashtable();
-                    requestData["avatar_uuid"] = avatar_id;
-                    requestData["session_id"] = session_id;
-                    ArrayList SendParams = new ArrayList();
-                    SendParams.Add(requestData);
-                    XmlRpcRequest UserReq = new XmlRpcRequest("check_auth_session", SendParams);
-                    XmlRpcResponse UserResp = UserReq.Send(m_userserver_url, 3000);
-
-                    Hashtable responseData = (Hashtable)UserResp.Value;
-                    if (responseData.ContainsKey("auth_session") && responseData["auth_session"].ToString() == "TRUE")
-                    {
-                        m_log.Info("[INVENTORY IN CONNECTOR]: got authed session from userserver");
-                        //// add to cache; the session time will be automatically renewed
-                        //m_session_cache.Add(session_id, avatar_id);
-                        return true;
-                    }
-                //}
-                //else
-                //{
-                //    // cache hits
-                //    m_log.Info("[GRID AGENT INVENTORY]: got authed session from cache");
-                //    return true;
-                //}
-
-                    m_log.Warn("[INVENTORY IN CONNECTOR]: unknown session_id, request rejected");
-                return false;
-            }
-            else
-            {
-                return true;
-            }
+            return true;
         }
 
     }
-- 
cgit v1.1