From 06e0528d0b9929cbd8d2b360b0baa00288340d13 Mon Sep 17 00:00:00 2001
From: Oren Hurvitz
Date: Wed, 9 Apr 2014 08:03:25 +0300
Subject: In teleports, pass the source region to the destination (similar to
an HTTP referrer)
---
.../Hypergrid/UserAgentServiceConnector.cs | 43 +++-------------------
.../Simulation/SimulationServiceConnector.cs | 30 ++++++++++-----
.../Services/HypergridService/GatekeeperService.cs | 14 ++++---
.../Services/HypergridService/UserAgentService.cs | 12 +++---
OpenSim/Services/Interfaces/IGridService.cs | 14 ++++++-
OpenSim/Services/Interfaces/IHypergridServices.cs | 5 ++-
OpenSim/Services/Interfaces/ISimulationService.cs | 4 +-
OpenSim/Services/LLLoginService/LLLoginService.cs | 11 +-----
8 files changed, 61 insertions(+), 72 deletions(-)
(limited to 'OpenSim/Services')
diff --git a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
index 61f8516..8abd046 100644
--- a/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/UserAgentServiceConnector.cs
@@ -116,7 +116,7 @@ namespace OpenSim.Services.Connectors.Hypergrid
// The Login service calls this interface with fromLogin=true
// Sims call it with fromLogin=false
// Either way, this is verified by the handler
- public bool LoginAgentToGrid(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, bool fromLogin, out string reason)
+ public bool LoginAgentToGrid(GridRegion source, AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, bool fromLogin, out string reason)
{
reason = String.Empty;
@@ -138,56 +138,25 @@ namespace OpenSim.Services.Connectors.Hypergrid
Console.WriteLine(" >>> LoginAgentToGrid <<< " + home.ServerURI);
uint flags = fromLogin ? (uint)TeleportFlags.ViaLogin : (uint)TeleportFlags.ViaHome;
- return CreateAgent(home, aCircuit, flags, out reason);
+ return CreateAgent(source, home, aCircuit, flags, out reason);
}
// The simulators call this interface
- public bool LoginAgentToGrid(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, out string reason)
+ public bool LoginAgentToGrid(GridRegion source, AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, out string reason)
{
- return LoginAgentToGrid(aCircuit, gatekeeper, destination, false, out reason);
+ return LoginAgentToGrid(source, aCircuit, gatekeeper, destination, false, out reason);
}
- protected override void PackData(OSDMap args, AgentCircuitData aCircuit, GridRegion destination, uint flags)
+ protected override void PackData(OSDMap args, GridRegion source, AgentCircuitData aCircuit, GridRegion destination, uint flags)
{
- base.PackData(args, aCircuit, destination, flags);
+ base.PackData(args, source, aCircuit, destination, flags);
args["gatekeeper_serveruri"] = OSD.FromString(m_Gatekeeper.ServerURI);
args["gatekeeper_host"] = OSD.FromString(m_Gatekeeper.ExternalHostName);
args["gatekeeper_port"] = OSD.FromString(m_Gatekeeper.HttpPort.ToString());
args["destination_serveruri"] = OSD.FromString(destination.ServerURI);
}
- protected OSDMap PackCreateAgentArguments(AgentCircuitData aCircuit, GridRegion gatekeeper, GridRegion destination, IPEndPoint ipaddress)
- {
- OSDMap args = null;
- try
- {
- args = aCircuit.PackAgentCircuitData();
- }
- catch (Exception e)
- {
- m_log.Debug("[USER AGENT CONNECTOR]: PackAgentCircuitData failed with exception: " + e.Message);
- }
-
- // Add the input arguments
- args["gatekeeper_serveruri"] = OSD.FromString(gatekeeper.ServerURI);
- args["gatekeeper_host"] = OSD.FromString(gatekeeper.ExternalHostName);
- args["gatekeeper_port"] = OSD.FromString(gatekeeper.HttpPort.ToString());
- args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
- args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
- args["destination_name"] = OSD.FromString(destination.RegionName);
- args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
- args["destination_serveruri"] = OSD.FromString(destination.ServerURI);
-
- // 10/3/2010
- // I added the client_ip up to the regular AgentCircuitData, so this doesn't need to be here.
- // This need cleaning elsewhere...
- //if (ipaddress != null)
- // args["client_ip"] = OSD.FromString(ipaddress.Address.ToString());
-
- return args;
- }
-
public void SetClientToken(UUID sessionID, string token)
{
// no-op
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index 98686f8..a5520c4 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -79,22 +79,32 @@ namespace OpenSim.Services.Connectors.Simulation
return "agent/";
}
- protected virtual void PackData(OSDMap args, AgentCircuitData aCircuit, GridRegion destination, uint flags)
+ protected virtual void PackData(OSDMap args, GridRegion source, AgentCircuitData aCircuit, GridRegion destination, uint flags)
{
- args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
- args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
- args["destination_name"] = OSD.FromString(destination.RegionName);
- args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
- args["teleport_flags"] = OSD.FromString(flags.ToString());
+ if (source != null)
+ {
+ args["source_x"] = OSD.FromString(source.RegionLocX.ToString());
+ args["source_y"] = OSD.FromString(source.RegionLocY.ToString());
+ args["source_name"] = OSD.FromString(source.RegionName);
+ args["source_uuid"] = OSD.FromString(source.RegionID.ToString());
+ if (!String.IsNullOrEmpty(source.RawServerURI))
+ args["source_server_uri"] = OSD.FromString(source.RawServerURI);
+ }
+
+ args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
+ args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
+ args["destination_name"] = OSD.FromString(destination.RegionName);
+ args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
+ args["teleport_flags"] = OSD.FromString(flags.ToString());
}
- public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
+ public bool CreateAgent(GridRegion source, GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
{
string tmp = String.Empty;
- return CreateAgent(destination, aCircuit, flags, out tmp, out reason);
+ return CreateAgent(source, destination, aCircuit, flags, out tmp, out reason);
}
- public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string myipaddress, out string reason)
+ public bool CreateAgent(GridRegion source, GridRegion destination, AgentCircuitData aCircuit, uint flags, out string myipaddress, out string reason)
{
m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Creating agent at {0}", destination.ServerURI);
reason = String.Empty;
@@ -111,7 +121,7 @@ namespace OpenSim.Services.Connectors.Simulation
try
{
OSDMap args = aCircuit.PackAgentCircuitData();
- PackData(args, aCircuit, destination, flags);
+ PackData(args, source, aCircuit, destination, flags);
OSDMap result = WebUtil.PostToServiceCompressed(uri, args, 30000);
bool success = result["success"].AsBoolean();
diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs
index 24b98fd..69a593b 100644
--- a/OpenSim/Services/HypergridService/GatekeeperService.cs
+++ b/OpenSim/Services/HypergridService/GatekeeperService.cs
@@ -230,16 +230,18 @@ namespace OpenSim.Services.HypergridService
}
#region Login Agent
- public bool LoginAgent(AgentCircuitData aCircuit, GridRegion destination, out string reason)
+ public bool LoginAgent(GridRegion source, AgentCircuitData aCircuit, GridRegion destination, out string reason)
{
reason = string.Empty;
string authURL = string.Empty;
if (aCircuit.ServiceURLs.ContainsKey("HomeURI"))
authURL = aCircuit.ServiceURLs["HomeURI"].ToString();
- m_log.InfoFormat("[GATEKEEPER SERVICE]: Login request for {0} {1} @ {2} ({3}) at {4} using viewer {5}, channel {6}, IP {7}, Mac {8}, Id0 {9} Teleport Flags {10}",
- aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionName,
- aCircuit.Viewer, aCircuit.Channel, aCircuit.IPAddress, aCircuit.Mac, aCircuit.Id0, aCircuit.teleportFlags.ToString());
+
+ m_log.InfoFormat("[GATEKEEPER SERVICE]: Login request for {0} {1} @ {2} ({3}) at {4} using viewer {5}, channel {6}, IP {7}, Mac {8}, Id0 {9}, Teleport Flags: {10}. From region {11}",
+ aCircuit.firstname, aCircuit.lastname, authURL, aCircuit.AgentID, destination.RegionID,
+ aCircuit.Viewer, aCircuit.Channel, aCircuit.IPAddress, aCircuit.Mac, aCircuit.Id0, (TeleportFlags)aCircuit.teleportFlags,
+ (source == null) ? "Unknown" : string.Format("{0} ({1}){2}", source.RegionName, source.RegionID, (source.RawServerURI == null) ? "" : " @ " + source.ServerURI));
string curViewer = Util.GetViewerName(aCircuit);
@@ -428,9 +430,9 @@ namespace OpenSim.Services.HypergridService
// Preserve our TeleportFlags we have gathered so-far
loginFlag |= (Constants.TeleportFlags) aCircuit.teleportFlags;
- m_log.DebugFormat("[GATEKEEPER SERVICE]: Launching {0} {1}", aCircuit.Name, loginFlag);
+ m_log.DebugFormat("[GATEKEEPER SERVICE]: Launching {0}, Teleport Flags: {1}", aCircuit.Name, loginFlag);
- return m_SimulationService.CreateAgent(destination, aCircuit, (uint)loginFlag, out reason);
+ return m_SimulationService.CreateAgent(source, destination, aCircuit, (uint)loginFlag, out reason);
}
protected bool Authenticate(AgentCircuitData aCircuit)
diff --git a/OpenSim/Services/HypergridService/UserAgentService.cs b/OpenSim/Services/HypergridService/UserAgentService.cs
index b414aca..6ec2f19 100644
--- a/OpenSim/Services/HypergridService/UserAgentService.cs
+++ b/OpenSim/Services/HypergridService/UserAgentService.cs
@@ -215,7 +215,7 @@ namespace OpenSim.Services.HypergridService
return home;
}
- public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, bool fromLogin, out string reason)
+ public bool LoginAgentToGrid(GridRegion source, AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, bool fromLogin, out string reason)
{
m_log.DebugFormat("[USER AGENT SERVICE]: Request to login user {0} {1} (@{2}) to grid {3}",
agentCircuit.firstname, agentCircuit.lastname, (fromLogin ? agentCircuit.IPAddress : "stored IP"), gatekeeper.ServerURI);
@@ -274,10 +274,12 @@ namespace OpenSim.Services.HypergridService
m_log.DebugFormat("[USER AGENT SERVICE]: this grid: {0}, desired grid: {1}, desired region: {2}", m_GridName, gridName, region.RegionID);
if (m_GridName == gridName)
- success = m_GatekeeperService.LoginAgent(agentCircuit, finalDestination, out reason);
+ {
+ success = m_GatekeeperService.LoginAgent(source, agentCircuit, finalDestination, out reason);
+ }
else
{
- success = m_GatekeeperConnector.CreateAgent(region, agentCircuit, (uint)Constants.TeleportFlags.ViaLogin, out myExternalIP, out reason);
+ success = m_GatekeeperConnector.CreateAgent(source, region, agentCircuit, (uint)Constants.TeleportFlags.ViaLogin, out myExternalIP, out reason);
if (success)
// Report them as nowhere
m_PresenceService.ReportAgent(agentCircuit.SessionID, UUID.Zero);
@@ -307,10 +309,10 @@ namespace OpenSim.Services.HypergridService
return true;
}
- public bool LoginAgentToGrid(AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, out string reason)
+ public bool LoginAgentToGrid(GridRegion source, AgentCircuitData agentCircuit, GridRegion gatekeeper, GridRegion finalDestination, out string reason)
{
reason = string.Empty;
- return LoginAgentToGrid(agentCircuit, gatekeeper, finalDestination, false, out reason);
+ return LoginAgentToGrid(source, agentCircuit, gatekeeper, finalDestination, false, out reason);
}
TravelingAgentInfo CreateTravelInfo(AgentCircuitData agentCircuit, GridRegion region, bool fromLogin, out TravelingAgentInfo existing)
diff --git a/OpenSim/Services/Interfaces/IGridService.cs b/OpenSim/Services/Interfaces/IGridService.cs
index 8e6279e..bbf95ad 100644
--- a/OpenSim/Services/Interfaces/IGridService.cs
+++ b/OpenSim/Services/Interfaces/IGridService.cs
@@ -142,7 +142,7 @@ namespace OpenSim.Services.Interfaces
public string ServerURI
{
get {
- if ( m_serverURI != string.Empty ) {
+ if (!String.IsNullOrEmpty(m_serverURI)) {
return m_serverURI;
} else {
if (m_httpPort == 0)
@@ -152,7 +152,7 @@ namespace OpenSim.Services.Interfaces
}
}
set {
- if ( value.EndsWith("/") ) {
+ if (value.EndsWith("/")) {
m_serverURI = value;
} else {
m_serverURI = value + '/';
@@ -161,6 +161,16 @@ namespace OpenSim.Services.Interfaces
}
protected string m_serverURI;
+ ///
+ /// Provides direct access to the 'm_serverURI' field, without returning a generated URL if m_serverURI is missing.
+ ///
+ public string RawServerURI
+ {
+ get { return m_serverURI; }
+ set { m_serverURI = value; }
+ }
+
+
public string RegionName
{
get { return m_regionName; }
diff --git a/OpenSim/Services/Interfaces/IHypergridServices.cs b/OpenSim/Services/Interfaces/IHypergridServices.cs
index 30f27ee..5e012fb 100644
--- a/OpenSim/Services/Interfaces/IHypergridServices.cs
+++ b/OpenSim/Services/Interfaces/IHypergridServices.cs
@@ -52,13 +52,14 @@ namespace OpenSim.Services.Interfaces
/// The region the visitor should enter, or null if no region can be found / is allowed
GridRegion GetHyperlinkRegion(UUID regionID, UUID agentID, string agentHomeURI, out string message);
- bool LoginAgent(AgentCircuitData aCircuit, GridRegion destination, out string reason);
+ bool LoginAgent(GridRegion source, AgentCircuitData aCircuit, GridRegion destination, out string reason);
}
public interface IUserAgentService
{
- bool LoginAgentToGrid(AgentCircuitData agent, GridRegion gatekeeper, GridRegion finalDestination, bool fromLogin, out string reason);
+ bool LoginAgentToGrid(GridRegion source, AgentCircuitData agent, GridRegion gatekeeper, GridRegion finalDestination, bool fromLogin, out string reason);
+
void LogoutAgent(UUID userID, UUID sessionID);
///
diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs
index d359056..375a35c 100644
--- a/OpenSim/Services/Interfaces/ISimulationService.cs
+++ b/OpenSim/Services/Interfaces/ISimulationService.cs
@@ -53,11 +53,13 @@ namespace OpenSim.Services.Interfaces
///
/// Ask the simulator hosting the destination to create an agent on that region.
///
+ /// The region that the user is coming from. Will be null if the user
+ /// logged-in directly, or arrived from a simulator that doesn't send this parameter.
///
///
///
/// Reason message in the event of a failure.
- bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason);
+ bool CreateAgent(GridRegion source, GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason);
///
/// Full child agent update.
diff --git a/OpenSim/Services/LLLoginService/LLLoginService.cs b/OpenSim/Services/LLLoginService/LLLoginService.cs
index a2fb308..25c9417 100644
--- a/OpenSim/Services/LLLoginService/LLLoginService.cs
+++ b/OpenSim/Services/LLLoginService/LLLoginService.cs
@@ -905,13 +905,6 @@ namespace OpenSim.Services.LLLoginService
SetServiceURLs(aCircuit, account);
return aCircuit;
-
- //m_UserAgentService.LoginAgentToGrid(aCircuit, GatekeeperServiceConnector, region, out reason);
- //if (simConnector.CreateAgent(region, aCircuit, 0, out reason))
- // return aCircuit;
-
- //return null;
-
}
private void SetServiceURLs(AgentCircuitData aCircuit, UserAccount account)
@@ -966,13 +959,13 @@ namespace OpenSim.Services.LLLoginService
private bool LaunchAgentDirectly(ISimulationService simConnector, GridRegion region, AgentCircuitData aCircuit, TeleportFlags flags, out string reason)
{
- return simConnector.CreateAgent(region, aCircuit, (uint)flags, out reason);
+ return simConnector.CreateAgent(null, region, aCircuit, (uint)flags, out reason);
}
private bool LaunchAgentIndirectly(GridRegion gatekeeper, GridRegion destination, AgentCircuitData aCircuit, IPEndPoint clientIP, out string reason)
{
m_log.Debug("[LLOGIN SERVICE] Launching agent at " + destination.RegionName);
- if (m_UserAgentService.LoginAgentToGrid(aCircuit, gatekeeper, destination, true, out reason))
+ if (m_UserAgentService.LoginAgentToGrid(null, aCircuit, gatekeeper, destination, true, out reason))
return true;
return false;
}
--
cgit v1.1