Agent gets there through the Gatekeeper, but still a few quirks to fix.

slimupdates
Diva Canto 2010-01-17 18:04:55 -08:00
parent 5e034f5933
commit b2e6ec9e12
16 changed files with 561 additions and 95 deletions

View File

@ -194,9 +194,11 @@ namespace OpenSim.Framework
OSDArray urls = new OSDArray(ServiceURLs.Count * 2); OSDArray urls = new OSDArray(ServiceURLs.Count * 2);
foreach (KeyValuePair<string, object> kvp in ServiceURLs) foreach (KeyValuePair<string, object> kvp in ServiceURLs)
{ {
//System.Console.WriteLine("XXX " + kvp.Key + "=" + kvp.Value);
urls.Add(OSD.FromString(kvp.Key)); urls.Add(OSD.FromString(kvp.Key));
urls.Add(OSD.FromString((kvp.Value == null) ? string.Empty : kvp.Value.ToString())); urls.Add(OSD.FromString((kvp.Value == null) ? string.Empty : kvp.Value.ToString()));
} }
args["service_urls"] = urls;
} }
return args; return args;
@ -289,6 +291,8 @@ namespace OpenSim.Framework
for (int i = 0; i < urls.Count / 2; i++) for (int i = 0; i < urls.Count / 2; i++)
{ {
ServiceURLs[urls[i * 2].AsString()] = urls[(i * 2) + 1].AsString(); ServiceURLs[urls[i * 2].AsString()] = urls[(i * 2) + 1].AsString();
//System.Console.WriteLine("XXX " + urls[i * 2].AsString() + "=" + urls[(i * 2) + 1].AsString());
} }
} }
} }

View File

@ -239,12 +239,14 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
//avatar.Scene.RemoveCapsHandler(avatar.UUID); //avatar.Scene.RemoveCapsHandler(avatar.UUID);
string capsPath = String.Empty; string capsPath = String.Empty;
AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo(); AgentCircuitData agentCircuit = sp.ControllingClient.RequestClientInfo();
agentCircuit.BaseFolder = UUID.Zero;
agentCircuit.InventoryFolder = UUID.Zero;
agentCircuit.startpos = position; agentCircuit.startpos = position;
agentCircuit.child = true; agentCircuit.child = true;
agentCircuit.Appearance = sp.Appearance; agentCircuit.Appearance = sp.Appearance;
if (currentAgentCircuit != null)
agentCircuit.ServiceURLs = currentAgentCircuit.ServiceURLs;
if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY)) if (NeedsNewAgent(oldRegionX, newRegionX, oldRegionY, newRegionY))
{ {
@ -255,9 +257,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
string reason = String.Empty; string reason = String.Empty;
// Let's create an agent there if one doesn't exist yet. // Let's create an agent there if one doesn't exist yet.
if (!m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason)) if (!CreateAgent(reg, finalDestination, agentCircuit, teleportFlags, out reason))
{ {
sp.ControllingClient.SendTeleportFailed(String.Format("Destination is not accepting teleports: {0}", sp.ControllingClient.SendTeleportFailed(String.Format("Destination refused: {0}",
reason)); reason));
return; return;
} }
@ -345,8 +347,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
agent.CallbackURI = "http://" + sp.Scene.RegionInfo.ExternalHostName + ":" + sp.Scene.RegionInfo.HttpPort + agent.CallbackURI = "http://" + sp.Scene.RegionInfo.ExternalHostName + ":" + sp.Scene.RegionInfo.HttpPort +
"/agent/" + sp.UUID.ToString() + "/" + sp.Scene.RegionInfo.RegionID.ToString() + "/release/"; "/agent/" + sp.UUID.ToString() + "/" + sp.Scene.RegionInfo.RegionID.ToString() + "/release/";
// Straight to the region. Safe. UpdateAgent(reg, finalDestination, agent);
m_aScene.SimulationService.UpdateAgent(reg, agent);
m_log.DebugFormat( m_log.DebugFormat(
"[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID); "[ENTITY TRANSFER MODULE]: Sending new CAPS seed url {0} to client {1}", capsPath, sp.UUID);
@ -444,6 +445,16 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
} }
} }
protected virtual bool CreateAgent(GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason)
{
return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason);
}
protected virtual bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent)
{
return m_aScene.SimulationService.UpdateAgent(reg, agent);
}
protected void KillEntity(Scene scene, uint localID) protected void KillEntity(Scene scene, uint localID)
{ {
scene.SendKillObject(localID); scene.SendKillObject(localID);

View File

@ -29,6 +29,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Connectors.Hypergrid; using OpenSim.Services.Connectors.Hypergrid;
@ -58,6 +59,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
} }
} }
private GatekeeperServiceConnector m_GatekeeperConnector;
#region ISharedRegionModule #region ISharedRegionModule
public override string Name public override string Name
@ -74,6 +77,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (name == Name) if (name == Name)
{ {
m_agentsInTransit = new List<UUID>(); m_agentsInTransit = new List<UUID>();
m_GatekeeperConnector = new GatekeeperServiceConnector();
m_Enabled = true; m_Enabled = true;
m_log.InfoFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name); m_log.InfoFormat("[HG ENTITY TRANSFER MODULE]: {0} enabled.", Name);
} }
@ -131,6 +135,29 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return true; return true;
} }
protected override bool CreateAgent(GridRegion reg, GridRegion finalDestination, AgentCircuitData agentCircuit, uint teleportFlags, out string reason)
{
reason = string.Empty;
if (reg.RegionLocX != finalDestination.RegionLocX && reg.RegionLocY != finalDestination.RegionLocY)
{
// this user is going to another grid
reg.RegionName = finalDestination.RegionName;
return m_GatekeeperConnector.CreateAgent(reg, agentCircuit, teleportFlags, out reason);
}
return m_aScene.SimulationService.CreateAgent(reg, agentCircuit, teleportFlags, out reason);
}
protected override bool UpdateAgent(GridRegion reg, GridRegion finalDestination, AgentData agent)
{
if (reg.RegionLocX != finalDestination.RegionLocX && reg.RegionLocY != finalDestination.RegionLocY)
{
// this user is going to another grid
return m_GatekeeperConnector.UpdateAgent(reg, agent);
}
return m_aScene.SimulationService.UpdateAgent(reg, agent);
}
#endregion #endregion
} }

View File

@ -66,6 +66,7 @@
<RegionModule id="LLLoginServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Login.LLLoginServiceInConnectorModule" /> \ <RegionModule id="LLLoginServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Login.LLLoginServiceInConnectorModule" /> \
<RegionModule id="SimulationServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Simulation.SimulationServiceInConnectorModule" /> \ <RegionModule id="SimulationServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Simulation.SimulationServiceInConnectorModule" /> \
<RegionModule id="GridInfoServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid.GridInfoServiceInConnectorModule" /> \ <RegionModule id="GridInfoServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Grid.GridInfoServiceInConnectorModule" /> \
<RegionModule id="AuthenticationServiceInConnectorModule" type="OpenSim.Region.CoreModules.ServiceConnectorsIn.Authentication.AuthenticationServiceInConnectorModule" />
<RegionModule id="AccessModule" type="OpenSim.Region.CoreModules.World.AccessModule" /> \ <RegionModule id="AccessModule" type="OpenSim.Region.CoreModules.World.AccessModule" /> \
</Extension> </Extension>

View File

@ -0,0 +1,119 @@
/*
* 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.Reflection;
using System.Collections.Generic;
using log4net;
using Nini.Config;
using OpenSim.Framework;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Server.Base;
using OpenSim.Server.Handlers.Base;
using OpenSim.Server.Handlers.Authentication;
using OpenSim.Services.Interfaces;
namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Authentication
{
public class AuthenticationServiceInConnectorModule : ISharedRegionModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static bool m_Enabled = false;
private IConfigSource m_Config;
bool m_Registered = false;
#region IRegionModule interface
public void Initialise(IConfigSource config)
{
m_Config = config;
IConfig moduleConfig = config.Configs["Modules"];
if (moduleConfig != null)
{
m_Enabled = moduleConfig.GetBoolean("AuthenticationServiceInConnector", false);
if (m_Enabled)
{
m_log.Info("[AUTHENTICATION IN CONNECTOR]: Authentication Service In Connector enabled");
}
}
}
public void PostInitialise()
{
}
public void Close()
{
}
public Type ReplaceableInterface
{
get { return null; }
}
public string Name
{
get { return "AuthenticationServiceInConnectorModule"; }
}
public void AddRegion(Scene scene)
{
if (!m_Enabled)
return;
}
public void RemoveRegion(Scene scene)
{
if (!m_Enabled)
return;
}
public void RegionLoaded(Scene scene)
{
if (!m_Enabled)
return;
if (!m_Registered)
{
m_Registered = true;
m_log.Info("[AUTHENTICATION IN CONNECTOR]: Starting...");
new AuthenticationServiceConnector(m_Config, MainServer.Instance, "AuthenticationService");
}
}
#endregion
}
}

View File

@ -0,0 +1,79 @@
/*
* 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 AgentHandler : OpenSim.Server.Handlers.Simulation.AgentHandler
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private IGatekeeperService m_GatekeeperService;
public AgentHandler(IGatekeeperService gatekeeper)
{
m_GatekeeperService = gatekeeper;
}
protected override bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason)
{
return m_GatekeeperService.LoginAgent(aCircuit, destination, out reason);
}
protected override bool UpdateAgent(GridRegion destination, AgentData agent)
{
return m_GatekeeperService.UpdateAgent(destination, agent);
}
protected override void ReleaseAgent(UUID regionID, UUID id)
{
m_GatekeeperService.ReleaseAgent(regionID, id);
}
}
}

View File

@ -26,21 +26,16 @@
*/ */
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using System.Net;
using Nini.Config; using Nini.Config;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Server.Base; using OpenSim.Server.Base;
using OpenSim.Services.Interfaces; using OpenSim.Services.Interfaces;
using OpenSim.Framework.Servers.HttpServer; using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Server.Handlers.Base; using OpenSim.Server.Handlers.Base;
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
using OpenMetaverse;
using log4net; using log4net;
using Nwc.XmlRpc;
namespace OpenSim.Server.Handlers.Hypergrid namespace OpenSim.Server.Handlers.Hypergrid
{ {
@ -65,8 +60,13 @@ namespace OpenSim.Server.Handlers.Hypergrid
if (m_GatekeeperService == null) if (m_GatekeeperService == null)
throw new Exception("Gatekeeper server connector cannot proceed because of missing service"); throw new Exception("Gatekeeper server connector cannot proceed because of missing service");
server.AddXmlRPCHandler("link_region", LinkRegionRequest, false); HypergridHandlers hghandlers = new HypergridHandlers(m_GatekeeperService);
server.AddXmlRPCHandler("get_region", GetRegion, false); server.AddXmlRPCHandler("link_region", hghandlers.LinkRegionRequest, false);
server.AddXmlRPCHandler("get_region", hghandlers.GetRegion, false);
server.AddHTTPHandler("/foreignagent/", new AgentHandler(m_GatekeeperService).Handler);
server.AddHTTPHandler("/foreignobject/", new ObjectHandler(m_GatekeeperService).Handler);
} }
public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server) public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server)
@ -74,65 +74,5 @@ namespace OpenSim.Server.Handlers.Hypergrid
{ {
} }
/// <summary>
/// Someone wants to link to us
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public XmlRpcResponse LinkRegionRequest(XmlRpcRequest request, IPEndPoint remoteClient)
{
Hashtable requestData = (Hashtable)request.Params[0];
//string host = (string)requestData["host"];
//string portstr = (string)requestData["port"];
string name = (string)requestData["region_name"];
UUID regionID = UUID.Zero;
string imageURL = string.Empty;
ulong regionHandle = 0;
string reason = string.Empty;
bool success = m_GatekeeperService.LinkRegion(name, out regionID, out regionHandle, out imageURL, out reason);
Hashtable hash = new Hashtable();
hash["result"] = success.ToString();
hash["uuid"] = regionID.ToString();
hash["handle"] = regionHandle.ToString();
hash["region_image"] = imageURL;
XmlRpcResponse response = new XmlRpcResponse();
response.Value = hash;
return response;
}
public XmlRpcResponse GetRegion(XmlRpcRequest request, IPEndPoint remoteClient)
{
Hashtable requestData = (Hashtable)request.Params[0];
//string host = (string)requestData["host"];
//string portstr = (string)requestData["port"];
string regionID_str = (string)requestData["region_uuid"];
UUID regionID = UUID.Zero;
UUID.TryParse(regionID_str, out regionID);
GridRegion regInfo = m_GatekeeperService.GetHyperlinkRegion(regionID);
Hashtable hash = new Hashtable();
if (regInfo == null)
hash["result"] = "false";
else
{
hash["result"] = "true";
hash["uuid"] = regInfo.RegionID.ToString();
hash["x"] = regInfo.RegionLocX.ToString();
hash["y"] = regInfo.RegionLocY.ToString();
hash["region_name"] = regInfo.RegionName;
hash["hostname"] = regInfo.ExternalHostName;
hash["http_port"] = regInfo.HttpPort.ToString();
hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString();
}
XmlRpcResponse response = new XmlRpcResponse();
response.Value = hash;
return response;
}
} }
} }

View File

@ -0,0 +1,115 @@
/*
* 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 OpenSim.Services.Interfaces;
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
using log4net;
using Nwc.XmlRpc;
using OpenMetaverse;
namespace OpenSim.Server.Handlers.Hypergrid
{
public class HypergridHandlers
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private IGatekeeperService m_GatekeeperService;
public HypergridHandlers(IGatekeeperService gatekeeper)
{
m_GatekeeperService = gatekeeper;
}
/// <summary>
/// Someone wants to link to us
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
public XmlRpcResponse LinkRegionRequest(XmlRpcRequest request, IPEndPoint remoteClient)
{
Hashtable requestData = (Hashtable)request.Params[0];
//string host = (string)requestData["host"];
//string portstr = (string)requestData["port"];
string name = (string)requestData["region_name"];
UUID regionID = UUID.Zero;
string imageURL = string.Empty;
ulong regionHandle = 0;
string reason = string.Empty;
bool success = m_GatekeeperService.LinkRegion(name, out regionID, out regionHandle, out imageURL, out reason);
Hashtable hash = new Hashtable();
hash["result"] = success.ToString();
hash["uuid"] = regionID.ToString();
hash["handle"] = regionHandle.ToString();
hash["region_image"] = imageURL;
XmlRpcResponse response = new XmlRpcResponse();
response.Value = hash;
return response;
}
public XmlRpcResponse GetRegion(XmlRpcRequest request, IPEndPoint remoteClient)
{
Hashtable requestData = (Hashtable)request.Params[0];
//string host = (string)requestData["host"];
//string portstr = (string)requestData["port"];
string regionID_str = (string)requestData["region_uuid"];
UUID regionID = UUID.Zero;
UUID.TryParse(regionID_str, out regionID);
GridRegion regInfo = m_GatekeeperService.GetHyperlinkRegion(regionID);
Hashtable hash = new Hashtable();
if (regInfo == null)
hash["result"] = "false";
else
{
hash["result"] = "true";
hash["uuid"] = regInfo.RegionID.ToString();
hash["x"] = regInfo.RegionLocX.ToString();
hash["y"] = regInfo.RegionLocY.ToString();
hash["region_name"] = regInfo.RegionName;
hash["hostname"] = regInfo.ExternalHostName;
hash["http_port"] = regInfo.HttpPort.ToString();
hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString();
}
XmlRpcResponse response = new XmlRpcResponse();
response.Value = hash;
return response;
}
}
}

View File

@ -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;
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 ObjectHandler : OpenSim.Server.Handlers.Simulation.ObjectHandler
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private IGatekeeperService m_GatekeeperService;
public ObjectHandler(IGatekeeperService gatekeeper)
{
m_GatekeeperService = gatekeeper;
}
protected override bool CreateObject(GridRegion destination, ISceneObject sog)
{
return m_GatekeeperService.LoginAttachment(destination, sog);
}
}
}

View File

@ -52,6 +52,8 @@ namespace OpenSim.Server.Handlers.Simulation
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private ISimulationService m_SimulationService; private ISimulationService m_SimulationService;
public AgentHandler() { }
public AgentHandler(ISimulationService sim) public AgentHandler(ISimulationService sim)
{ {
m_SimulationService = sim; m_SimulationService = sim;
@ -117,7 +119,7 @@ namespace OpenSim.Server.Handlers.Simulation
} }
protected virtual void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id) protected void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id)
{ {
OSDMap args = Utils.GetOSDMap((string)request["body"]); OSDMap args = Utils.GetOSDMap((string)request["body"]);
if (args == null) if (args == null)
@ -171,7 +173,8 @@ namespace OpenSim.Server.Handlers.Simulation
// This is the meaning of POST agent // This is the meaning of POST agent
//m_regionClient.AdjustUserInformation(aCircuit); //m_regionClient.AdjustUserInformation(aCircuit);
bool result = m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason); //bool result = m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason);
bool result = CreateAgent(destination, aCircuit, teleportFlags, out reason);
resp["reason"] = OSD.FromString(reason); resp["reason"] = OSD.FromString(reason);
resp["success"] = OSD.FromBoolean(result); resp["success"] = OSD.FromBoolean(result);
@ -181,7 +184,13 @@ namespace OpenSim.Server.Handlers.Simulation
responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp);
} }
protected virtual void DoAgentPut(Hashtable request, Hashtable responsedata) // subclasses can override this
protected virtual bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason)
{
return m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason);
}
protected void DoAgentPut(Hashtable request, Hashtable responsedata)
{ {
OSDMap args = Utils.GetOSDMap((string)request["body"]); OSDMap args = Utils.GetOSDMap((string)request["body"]);
if (args == null) if (args == null)
@ -237,7 +246,7 @@ namespace OpenSim.Server.Handlers.Simulation
//agent.Dump(); //agent.Dump();
// This is one of the meanings of PUT agent // This is one of the meanings of PUT agent
result = m_SimulationService.UpdateAgent(destination, agent); result = UpdateAgent(destination, agent);
} }
else if ("AgentPosition".Equals(messageType)) else if ("AgentPosition".Equals(messageType))
@ -263,6 +272,12 @@ namespace OpenSim.Server.Handlers.Simulation
//responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); ??? instead //responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); ??? instead
} }
// subclasses cab override this
protected virtual bool UpdateAgent(GridRegion destination, AgentData agent)
{
return m_SimulationService.UpdateAgent(destination, agent);
}
protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID)
{ {
GridRegion destination = new GridRegion(); GridRegion destination = new GridRegion();
@ -305,7 +320,7 @@ namespace OpenSim.Server.Handlers.Simulation
} }
} }
protected virtual void DoAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, UUID regionID) protected void DoAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, UUID regionID)
{ {
m_log.Debug(" >>> DoDelete action:" + action + "; RegionID:" + regionID); m_log.Debug(" >>> DoDelete action:" + action + "; RegionID:" + regionID);
@ -313,7 +328,7 @@ namespace OpenSim.Server.Handlers.Simulation
destination.RegionID = regionID; destination.RegionID = regionID;
if (action.Equals("release")) if (action.Equals("release"))
m_SimulationService.ReleaseAgent(regionID, id, ""); ReleaseAgent(regionID, id);
else else
m_SimulationService.CloseAgent(destination, id); m_SimulationService.CloseAgent(destination, id);
@ -322,6 +337,11 @@ namespace OpenSim.Server.Handlers.Simulation
m_log.Debug("[AGENT HANDLER]: Agent Released/Deleted."); m_log.Debug("[AGENT HANDLER]: Agent Released/Deleted.");
} }
protected virtual void ReleaseAgent(UUID regionID, UUID id)
{
m_SimulationService.ReleaseAgent(regionID, id, "");
}
} }
} }

View File

@ -52,6 +52,8 @@ namespace OpenSim.Server.Handlers.Simulation
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private ISimulationService m_SimulationService; private ISimulationService m_SimulationService;
public ObjectHandler() { }
public ObjectHandler(ISimulationService sim) public ObjectHandler(ISimulationService sim)
{ {
m_SimulationService = sim; m_SimulationService = sim;
@ -110,7 +112,7 @@ namespace OpenSim.Server.Handlers.Simulation
} }
protected virtual void DoObjectPost(Hashtable request, Hashtable responsedata, UUID regionID) protected void DoObjectPost(Hashtable request, Hashtable responsedata, UUID regionID)
{ {
OSDMap args = Utils.GetOSDMap((string)request["body"]); OSDMap args = Utils.GetOSDMap((string)request["body"]);
if (args == null) if (args == null)
@ -181,7 +183,7 @@ namespace OpenSim.Server.Handlers.Simulation
try try
{ {
// This is the meaning of POST object // This is the meaning of POST object
result = m_SimulationService.CreateObject(destination, sog, false); result = CreateObject(destination, sog);
} }
catch (Exception e) catch (Exception e)
{ {
@ -192,6 +194,12 @@ namespace OpenSim.Server.Handlers.Simulation
responsedata["str_response_string"] = result.ToString(); responsedata["str_response_string"] = result.ToString();
} }
// subclasses can override this
protected virtual bool CreateObject(GridRegion destination, ISceneObject sog)
{
return m_SimulationService.CreateObject(destination, sog, false);
}
protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, UUID regionID) protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, UUID regionID)
{ {
OSDMap args = Utils.GetOSDMap((string)request["body"]); OSDMap args = Utils.GetOSDMap((string)request["body"]);

View File

@ -65,6 +65,11 @@ namespace OpenSim.Services.Connectors.Simulation
#region Agents #region Agents
protected virtual string AgentPath()
{
return "/agent/";
}
public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason) public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
{ {
reason = String.Empty; reason = String.Empty;
@ -80,7 +85,7 @@ namespace OpenSim.Services.Connectors.Simulation
string uri = string.Empty; string uri = string.Empty;
try try
{ {
uri = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + "/agent/" + aCircuit.AgentID + "/"; uri = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + AgentPath() + aCircuit.AgentID + "/";
} }
catch (Exception e) catch (Exception e)
{ {
@ -197,7 +202,8 @@ namespace OpenSim.Services.Connectors.Simulation
catch (WebException ex) catch (WebException ex)
{ {
m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", ex.Message); m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", ex.Message);
// ignore, really reason = "Destination did not reply";
return false;
} }
finally finally
{ {
@ -224,7 +230,7 @@ namespace OpenSim.Services.Connectors.Simulation
string uri = string.Empty; string uri = string.Empty;
try try
{ {
uri = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + "/agent/" + cAgentData.AgentID + "/"; uri = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + AgentPath() + cAgentData.AgentID + "/";
} }
catch (Exception e) catch (Exception e)
{ {
@ -329,7 +335,7 @@ namespace OpenSim.Services.Connectors.Simulation
{ {
agent = null; agent = null;
// Eventually, we want to use a caps url instead of the agentID // Eventually, we want to use a caps url instead of the agentID
string uri = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + "/agent/" + id + "/" + destination.RegionID.ToString() + "/"; string uri = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
//Console.WriteLine(" >>> DoRetrieveRootAgentCall <<< " + uri); //Console.WriteLine(" >>> DoRetrieveRootAgentCall <<< " + uri);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
@ -426,7 +432,7 @@ namespace OpenSim.Services.Connectors.Simulation
string uri = string.Empty; string uri = string.Empty;
try try
{ {
uri = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + "/agent/" + id + "/" + destination.RegionID.ToString() + "/"; uri = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
} }
catch (Exception e) catch (Exception e)
{ {
@ -474,10 +480,15 @@ namespace OpenSim.Services.Connectors.Simulation
#region Objects #region Objects
protected virtual string ObjectPath()
{
return "/object/";
}
public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall) public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
{ {
string uri string uri
= "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + "/object/" + sog.UUID + "/"; = "http://" + destination.ExternalEndPoint.Address + ":" + destination.HttpPort + ObjectPath() + sog.UUID + "/";
//m_log.Debug(" >>> DoCreateObjectCall <<< " + uri); //m_log.Debug(" >>> DoCreateObjectCall <<< " + uri);
WebRequest ObjectCreateRequest = WebRequest.Create(uri); WebRequest ObjectCreateRequest = WebRequest.Create(uri);

View File

@ -164,57 +164,103 @@ namespace OpenSim.Services.HypergridService
return region; return region;
} }
public bool LoginAgent(AgentCircuitData aCircuit, GridRegion destination) public bool LoginAgent(AgentCircuitData aCircuit, GridRegion destination, out string reason)
{ {
reason = string.Empty;
string authURL = string.Empty; string authURL = string.Empty;
if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
authURL = aCircuit.ServiceURLs["HomeURI"].ToString(); authURL = aCircuit.ServiceURLs["HomeURI"].ToString();
m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to login foreign agent {0} {1} @ {2} ({3}) at destination {4}", m_log.DebugFormat("[GATEKEEPER SERVICE]: Request to login foreign agent {0} {1} @ {2} ({3}) at destination {4}",
aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName); aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName);
if (!Authenticate(aCircuit)) if (!Authenticate(aCircuit))
{ {
reason = "Unable to verify identity";
m_log.InfoFormat("[GATEKEEPER SERVICE]: Unable to verify identity of agent {0} {1}. Refusing service.", aCircuit.firstname, aCircuit.lastname); m_log.InfoFormat("[GATEKEEPER SERVICE]: Unable to verify identity of agent {0} {1}. Refusing service.", aCircuit.firstname, aCircuit.lastname);
return false; return false;
} }
m_log.DebugFormat("[GATEKEEPER SERVICE]: Identity verified for {0} {1} @ {2}", aCircuit.firstname, aCircuit.lastname, authURL);
// Check to see if we have a local user with that UUID // Check to see if we have a local user with that UUID
UserAccount account = m_UserAccountService.GetUserAccount(m_ScopeID, aCircuit.AgentID); UserAccount account = m_UserAccountService.GetUserAccount(m_ScopeID, aCircuit.AgentID);
if (account != null) if (account != null)
{ {
// No, sorry; go away // No, sorry; go away
reason = "User identifier not allowed on this grid";
m_log.InfoFormat("[GATEKEEPER SERVICE]: Foreign agent {0} {1} has UUID of local user {3}. Refusing service.", m_log.InfoFormat("[GATEKEEPER SERVICE]: Foreign agent {0} {1} has UUID of local user {3}. Refusing service.",
aCircuit.firstname, aCircuit.lastname, aCircuit.AgentID); aCircuit.firstname, aCircuit.lastname, aCircuit.AgentID);
return false; return false;
} }
m_log.DebugFormat("[GATEKEEPER SERVICE]: User ID ok");
// May want to authorize // May want to authorize
// Login the presence // Login the presence
if (!m_PresenceService.LoginAgent(aCircuit.AgentID.ToString(), aCircuit.SessionID, aCircuit.SecureSessionID)) if (!m_PresenceService.LoginAgent(aCircuit.AgentID.ToString(), aCircuit.SessionID, aCircuit.SecureSessionID))
{ {
reason = "Unable to login presence";
m_log.InfoFormat("[GATEKEEPER SERVICE]: Presence login failed for foreign agent {0} {1}. Refusing service.", m_log.InfoFormat("[GATEKEEPER SERVICE]: Presence login failed for foreign agent {0} {1}. Refusing service.",
aCircuit.firstname, aCircuit.lastname); aCircuit.firstname, aCircuit.lastname);
return false; return false;
} }
m_log.DebugFormat("[GATEKEEPER SERVICE]: Login presence ok");
// Get the region
destination = m_GridService.GetRegionByUUID(m_ScopeID, destination.RegionID);
if (destination == null)
{
reason = "Destination region not found";
return false;
}
m_log.DebugFormat("[GATEKEEPER SERVICE]: destination ok : {0}", destination.RegionName);
// Finally launch the agent at the destination // Finally launch the agent at the destination
string reason = string.Empty;
aCircuit.firstname = aCircuit.firstname + "." + aCircuit.lastname; aCircuit.firstname = aCircuit.firstname + "." + aCircuit.lastname;
aCircuit.lastname = "@" + aCircuit.ServiceURLs["HomeURI"].ToString(); aCircuit.lastname = "@" + aCircuit.ServiceURLs["HomeURI"].ToString();
return m_SimulationService.CreateAgent(destination, aCircuit, 0, out reason); return m_SimulationService.CreateAgent(destination, aCircuit, 0, out reason);
} }
public bool LoginAttachments(ISceneObject sog, GridRegion destination) public bool UpdateAgent(GridRegion destination, AgentData agent)
{ {
// Get the region
destination = m_GridService.GetRegionByUUID(m_ScopeID, destination.RegionID);
if (destination == null)
{
return false;
}
return m_SimulationService.UpdateAgent(destination, agent);
}
public bool LoginAttachment(GridRegion destination, ISceneObject sog)
{
// Get the region
destination = m_GridService.GetRegionByUUID(m_ScopeID, destination.RegionID);
if (destination == null)
{
return false;
}
// May want to filter attachments // May want to filter attachments
return m_SimulationService.CreateObject(destination, sog, false); return m_SimulationService.CreateObject(destination, sog, false);
} }
public void ReleaseAgent(UUID regionID, UUID agentID)
{
GridRegion region = m_GridService.GetRegionByUUID(m_ScopeID, regionID);
if (region != null)
{
string uri = "http://" + region.ExternalHostName + ":" + region.HttpPort +
"/agent/" + agentID.ToString() + "/" + regionID.ToString() + "/release/";
m_SimulationService.ReleaseAgent(regionID, agentID, uri);
}
}
protected bool Authenticate(AgentCircuitData aCircuit) protected bool Authenticate(AgentCircuitData aCircuit)
{ {
string authURL = string.Empty; string authURL = string.Empty;
if (aCircuit.ServiceURLs.ContainsKey("HomeURI")) if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
authURL = aCircuit.ServiceURLs["HomeURI"].ToString(); authURL = aCircuit.ServiceURLs["HomeURI"].ToString();
@ -227,7 +273,17 @@ namespace OpenSim.Services.HypergridService
Object[] args = new Object[] { authURL }; Object[] args = new Object[] { authURL };
IAuthenticationService authService = ServerUtils.LoadPlugin<IAuthenticationService>(m_AuthDll, args); IAuthenticationService authService = ServerUtils.LoadPlugin<IAuthenticationService>(m_AuthDll, args);
if (authService != null) if (authService != null)
return authService.Verify(aCircuit.AgentID, aCircuit.SecureSessionID.ToString(), 30); {
try
{
return authService.Verify(aCircuit.AgentID, aCircuit.SecureSessionID.ToString(), 30);
}
catch
{
m_log.DebugFormat("[GATEKEEPER SERVICE]: Unable to contact authentication service at {0}", authURL);
return false;
}
}
return false; return false;
} }

View File

@ -28,6 +28,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using OpenSim.Framework;
using OpenMetaverse; using OpenMetaverse;
namespace OpenSim.Services.Interfaces namespace OpenSim.Services.Interfaces
@ -36,5 +37,11 @@ namespace OpenSim.Services.Interfaces
{ {
bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string imageURL, out string reason); bool LinkRegion(string regionDescriptor, out UUID regionID, out ulong regionHandle, out string imageURL, out string reason);
GridRegion GetHyperlinkRegion(UUID regionID); GridRegion GetHyperlinkRegion(UUID regionID);
bool LoginAgent(AgentCircuitData aCircuit, GridRegion destination, out string reason);
bool UpdateAgent(GridRegion destination, AgentData agent);
void ReleaseAgent(UUID regionID, UUID agentID);
bool LoginAttachment(GridRegion destination, ISceneObject sog);
} }
} }

View File

@ -44,4 +44,5 @@ namespace OpenSim.Services.Interfaces
List<GridRegion> GetRegionsByName(string name); List<GridRegion> GetRegionsByName(string name);
List<GridRegion> GetRegionRange(int xmin, int xmax, int ymin, int ymax); List<GridRegion> GetRegionRange(int xmin, int xmax, int ymin, int ymax);
} }
} }

View File

@ -28,8 +28,7 @@
NeighbourServiceInConnector = true NeighbourServiceInConnector = true
LibraryModule = true LibraryModule = true
LLLoginServiceInConnector = true LLLoginServiceInConnector = true
;; err, temporary AuthenticationServiceInConnector = true
SimulationServiceInConnector = true
[AssetService] [AssetService]
; For the AssetServiceInConnector ; For the AssetServiceInConnector