mirror of
https://github.com/opensim/opensim.git
synced 2026-08-10 11:33:28 +08:00
In teleports, pass the source region to the destination (similar to an HTTP referrer)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
/// <summary>
|
||||
/// Provides direct access to the 'm_serverURI' field, without returning a generated URL if m_serverURI is missing.
|
||||
/// </summary>
|
||||
public string RawServerURI
|
||||
{
|
||||
get { return m_serverURI; }
|
||||
set { m_serverURI = value; }
|
||||
}
|
||||
|
||||
|
||||
public string RegionName
|
||||
{
|
||||
get { return m_regionName; }
|
||||
|
||||
@@ -52,13 +52,14 @@ namespace OpenSim.Services.Interfaces
|
||||
/// <returns>The region the visitor should enter, or null if no region can be found / is allowed</returns>
|
||||
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);
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -53,11 +53,13 @@ namespace OpenSim.Services.Interfaces
|
||||
/// <summary>
|
||||
/// Ask the simulator hosting the destination to create an agent on that region.
|
||||
/// </summary>
|
||||
/// <param name="source">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.</param>
|
||||
/// <param name="destination"></param>
|
||||
/// <param name="aCircuit"></param>
|
||||
/// <param name="flags"></param>
|
||||
/// <param name="reason">Reason message in the event of a failure.</param>
|
||||
bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason);
|
||||
bool CreateAgent(GridRegion source, GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason);
|
||||
|
||||
/// <summary>
|
||||
/// Full child agent update.
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user