Added simulation version compatibility check so that agents coming from 0.7.6 to a varregion running in 0.8 and above will be denied teleport, rather than be allowed and crash the viewer.
parent
72456f90a4
commit
ffe07527fc
|
@ -208,7 +208,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
protected virtual void InitialiseCommon(IConfigSource source)
|
protected virtual void InitialiseCommon(IConfigSource source)
|
||||||
{
|
{
|
||||||
string transferVersionName = "SIMULATION";
|
string transferVersionName = "SIMULATION";
|
||||||
float maxTransferVersion = 0.2f;
|
float maxTransferVersion = 0.3f;
|
||||||
|
|
||||||
IConfig hypergridConfig = source.Configs["Hypergrid"];
|
IConfig hypergridConfig = source.Configs["Hypergrid"];
|
||||||
if (hypergridConfig != null)
|
if (hypergridConfig != null)
|
||||||
|
@ -760,8 +760,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
|
|
||||||
string reason;
|
string reason;
|
||||||
string version;
|
string version;
|
||||||
|
string myversion = string.Format("{0}/{1}", OutgoingTransferVersionName, MaxOutgoingTransferVersion);
|
||||||
if (!Scene.SimulationService.QueryAccess(
|
if (!Scene.SimulationService.QueryAccess(
|
||||||
finalDestination, sp.ControllingClient.AgentId, homeURI, true, position, out version, out reason))
|
finalDestination, sp.ControllingClient.AgentId, homeURI, true, position, myversion, out version, out reason))
|
||||||
{
|
{
|
||||||
sp.ControllingClient.SendTeleportFailed(reason);
|
sp.ControllingClient.SendTeleportFailed(reason);
|
||||||
|
|
||||||
|
@ -833,7 +834,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
if (versionComponents.Length >= 2)
|
if (versionComponents.Length >= 2)
|
||||||
float.TryParse(versionComponents[1], out versionNumber);
|
float.TryParse(versionComponents[1], out versionNumber);
|
||||||
|
|
||||||
if (versionNumber == 0.2f && MaxOutgoingTransferVersion >= versionNumber)
|
if (versionNumber >= 0.2f && MaxOutgoingTransferVersion >= versionNumber)
|
||||||
TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
|
TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
|
||||||
else
|
else
|
||||||
TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
|
TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
|
||||||
|
@ -1509,8 +1510,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if we have access to the target region.
|
// Check to see if we have access to the target region.
|
||||||
|
string myversion = string.Format("{0}/{1}", OutgoingTransferVersionName, MaxOutgoingTransferVersion);
|
||||||
if (neighbourRegion != null
|
if (neighbourRegion != null
|
||||||
&& !scene.SimulationService.QueryAccess(neighbourRegion, agentID, homeURI, false, newpos, out version, out failureReason))
|
&& !scene.SimulationService.QueryAccess(neighbourRegion, agentID, homeURI, false, newpos, myversion, out version, out failureReason))
|
||||||
{
|
{
|
||||||
// remember banned
|
// remember banned
|
||||||
m_bannedRegionCache.Add(neighbourRegion.RegionHandle, agentID);
|
m_bannedRegionCache.Add(neighbourRegion.RegionHandle, agentID);
|
||||||
|
|
|
@ -52,6 +52,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
/// Currently valid versions are "SIMULATION/0.1" and "SIMULATION/0.2"
|
/// Currently valid versions are "SIMULATION/0.1" and "SIMULATION/0.2"
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public string ServiceVersion { get; set; }
|
public string ServiceVersion { get; set; }
|
||||||
|
private float m_VersionNumber = 0.3f;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Map region ID to scene.
|
/// Map region ID to scene.
|
||||||
|
@ -84,15 +85,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
|
|
||||||
public void InitialiseService(IConfigSource configSource)
|
public void InitialiseService(IConfigSource configSource)
|
||||||
{
|
{
|
||||||
ServiceVersion = "SIMULATION/0.2";
|
ServiceVersion = "SIMULATION/0.3";
|
||||||
IConfig config = configSource.Configs["SimulationService"];
|
IConfig config = configSource.Configs["SimulationService"];
|
||||||
if (config != null)
|
if (config != null)
|
||||||
{
|
{
|
||||||
ServiceVersion = config.GetString("ConnectorProtocolVersion", ServiceVersion);
|
ServiceVersion = config.GetString("ConnectorProtocolVersion", ServiceVersion);
|
||||||
|
|
||||||
if (ServiceVersion != "SIMULATION/0.1" && ServiceVersion != "SIMULATION/0.2")
|
if (ServiceVersion != "SIMULATION/0.1" && ServiceVersion != "SIMULATION/0.2" && ServiceVersion != "SIMULATION/0.3")
|
||||||
throw new Exception(string.Format("Invalid ConnectorProtocolVersion {0}", ServiceVersion));
|
throw new Exception(string.Format("Invalid ConnectorProtocolVersion {0}", ServiceVersion));
|
||||||
|
|
||||||
|
string[] versionComponents = ServiceVersion.Split(new char[] { '/' });
|
||||||
|
if (versionComponents.Length >= 2)
|
||||||
|
float.TryParse(versionComponents[1], out m_VersionNumber);
|
||||||
|
|
||||||
m_log.InfoFormat(
|
m_log.InfoFormat(
|
||||||
"[LOCAL SIMULATION CONNECTOR]: Initialized with connector protocol version {0}", ServiceVersion);
|
"[LOCAL SIMULATION CONNECTOR]: Initialized with connector protocol version {0}", ServiceVersion);
|
||||||
}
|
}
|
||||||
|
@ -264,7 +269,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, out string version, out string reason)
|
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string theirversion, out string version, out string reason)
|
||||||
{
|
{
|
||||||
reason = "Communications failure";
|
reason = "Communications failure";
|
||||||
version = ServiceVersion;
|
version = ServiceVersion;
|
||||||
|
@ -276,6 +281,21 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
|
// "[LOCAL SIMULATION CONNECTOR]: Found region {0} {1} to send AgentUpdate",
|
||||||
// s.RegionInfo.RegionName, destination.RegionHandle);
|
// s.RegionInfo.RegionName, destination.RegionHandle);
|
||||||
|
uint size = m_scenes[destination.RegionID].RegionInfo.RegionSizeX;
|
||||||
|
|
||||||
|
float theirVersionNumber = 0f;
|
||||||
|
string[] versionComponents = theirversion.Split(new char[] { '/' });
|
||||||
|
if (versionComponents.Length >= 2)
|
||||||
|
float.TryParse(versionComponents[1], out theirVersionNumber);
|
||||||
|
|
||||||
|
// Var regions here, and the requesting simulator is in an older version.
|
||||||
|
// We will forbide this, because it crashes the viewers
|
||||||
|
if (theirVersionNumber < 0.3f && size > 256)
|
||||||
|
{
|
||||||
|
reason = "Destination is a variable-sized region, and source is an old simulator. Consider upgrading.";
|
||||||
|
m_log.DebugFormat("[LOCAL SIMULATION CONNECTOR]: Request to access this variable-sized region from {0} simulator was denied", theirVersionNumber);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return m_scenes[destination.RegionID].QueryAccess(agentID, agentHomeURI, viaTeleport, position, out reason);
|
return m_scenes[destination.RegionID].QueryAccess(agentID, agentHomeURI, viaTeleport, position, out reason);
|
||||||
}
|
}
|
||||||
|
|
|
@ -207,7 +207,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
return m_remoteConnector.UpdateAgent(destination, cAgentData);
|
return m_remoteConnector.UpdateAgent(destination, cAgentData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, out string version, out string reason)
|
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string sversion, out string version, out string reason)
|
||||||
{
|
{
|
||||||
reason = "Communications failure";
|
reason = "Communications failure";
|
||||||
version = "Unknown";
|
version = "Unknown";
|
||||||
|
@ -216,12 +216,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Try local first
|
// Try local first
|
||||||
if (m_localBackend.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, out version, out reason))
|
if (m_localBackend.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, sversion, out version, out reason))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// else do the remote thing
|
// else do the remote thing
|
||||||
if (!m_localBackend.IsLocalRegion(destination.RegionID))
|
if (!m_localBackend.IsLocalRegion(destination.RegionID))
|
||||||
return m_remoteConnector.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, out version, out reason);
|
return m_remoteConnector.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, sversion, out version, out reason);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,12 +144,16 @@ namespace OpenSim.Server.Handlers.Simulation
|
||||||
if (args.ContainsKey("agent_home_uri"))
|
if (args.ContainsKey("agent_home_uri"))
|
||||||
agentHomeURI = args["agent_home_uri"].AsString();
|
agentHomeURI = args["agent_home_uri"].AsString();
|
||||||
|
|
||||||
|
string theirVersion = string.Empty;
|
||||||
|
if (args.ContainsKey("my_version"))
|
||||||
|
theirVersion = args["my_version"].AsString();
|
||||||
|
|
||||||
GridRegion destination = new GridRegion();
|
GridRegion destination = new GridRegion();
|
||||||
destination.RegionID = regionID;
|
destination.RegionID = regionID;
|
||||||
|
|
||||||
string reason;
|
string reason;
|
||||||
string version;
|
string version;
|
||||||
bool result = m_SimulationService.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, out version, out reason);
|
bool result = m_SimulationService.QueryAccess(destination, agentID, agentHomeURI, viaTeleport, position, theirVersion, out version, out reason);
|
||||||
|
|
||||||
responsedata["int_response_code"] = HttpStatusCode.OK;
|
responsedata["int_response_code"] = HttpStatusCode.OK;
|
||||||
|
|
||||||
|
|
|
@ -282,7 +282,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, out string version, out string reason)
|
public bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string myversion, out string version, out string reason)
|
||||||
{
|
{
|
||||||
reason = "Failed to contact destination";
|
reason = "Failed to contact destination";
|
||||||
version = "Unknown";
|
version = "Unknown";
|
||||||
|
@ -298,6 +298,7 @@ namespace OpenSim.Services.Connectors.Simulation
|
||||||
OSDMap request = new OSDMap();
|
OSDMap request = new OSDMap();
|
||||||
request.Add("viaTeleport", OSD.FromBoolean(viaTeleport));
|
request.Add("viaTeleport", OSD.FromBoolean(viaTeleport));
|
||||||
request.Add("position", OSD.FromString(position.ToString()));
|
request.Add("position", OSD.FromString(position.ToString()));
|
||||||
|
request.Add("my_version", OSD.FromString(myversion));
|
||||||
if (agentHomeURI != null)
|
if (agentHomeURI != null)
|
||||||
request.Add("agent_home_uri", OSD.FromString(agentHomeURI));
|
request.Add("agent_home_uri", OSD.FromString(agentHomeURI));
|
||||||
|
|
||||||
|
|
|
@ -85,10 +85,11 @@ namespace OpenSim.Services.Interfaces
|
||||||
/// <param name="agentHomeURI">The visitor's Home URI. Will be missing (null) in older OpenSims.</param>
|
/// <param name="agentHomeURI">The visitor's Home URI. Will be missing (null) in older OpenSims.</param>
|
||||||
/// <param name="viaTeleport">True: via teleport; False: via cross (walking)</param>
|
/// <param name="viaTeleport">True: via teleport; False: via cross (walking)</param>
|
||||||
/// <param name="position">Position in the region</param>
|
/// <param name="position">Position in the region</param>
|
||||||
/// <param name="version"></param>
|
/// <param name="sversion">version that the requesting simulator is runing</param>
|
||||||
|
/// <param name="version">version that the target simulator is running</param>
|
||||||
/// <param name="reason">[out] Optional error message</param>
|
/// <param name="reason">[out] Optional error message</param>
|
||||||
/// <returns>True: ok; False: not allowed</returns>
|
/// <returns>True: ok; False: not allowed</returns>
|
||||||
bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, out string version, out string reason);
|
bool QueryAccess(GridRegion destination, UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, string sversion, out string version, out string reason);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Message from receiving region to departing region, telling it got contacted by the client.
|
/// Message from receiving region to departing region, telling it got contacted by the client.
|
||||||
|
|
|
@ -34,12 +34,16 @@
|
||||||
; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
|
; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
|
||||||
; It is used to control the teleport handoff process.
|
; It is used to control the teleport handoff process.
|
||||||
; Valid values are
|
; Valid values are
|
||||||
|
; "SIMULATION/0.3"
|
||||||
|
; - This is the default, and it supports teleports to variable-sized regions
|
||||||
|
; - Older versions can teleport to this one, but only if the destination region
|
||||||
|
; is 256x256
|
||||||
; "SIMULATION/0.2"
|
; "SIMULATION/0.2"
|
||||||
; - this is the default. A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
|
; - A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
|
||||||
; - this protocol is more efficient than "SIMULATION/0.1"
|
; - this protocol is more efficient than "SIMULATION/0.1"
|
||||||
; "SIMULATION/0.1"
|
; "SIMULATION/0.1"
|
||||||
; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
|
; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
|
||||||
ConnectorProtocolVersion = "SIMULATION/0.2"
|
ConnectorProtocolVersion = "SIMULATION/0.3"
|
||||||
|
|
||||||
[SimulationDataStore]
|
[SimulationDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
||||||
|
|
|
@ -39,12 +39,16 @@
|
||||||
; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
|
; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
|
||||||
; It is used to control the teleport handoff process.
|
; It is used to control the teleport handoff process.
|
||||||
; Valid values are
|
; Valid values are
|
||||||
|
; "SIMULATION/0.3"
|
||||||
|
; - This is the default, and it supports teleports to variable-sized regions
|
||||||
|
; - Older versions can teleport to this one, but only if the destination region
|
||||||
|
; is 256x256
|
||||||
; "SIMULATION/0.2"
|
; "SIMULATION/0.2"
|
||||||
; - this is the default. A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
|
; - A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
|
||||||
; - this protocol is more efficient than "SIMULATION/0.1"
|
; - this protocol is more efficient than "SIMULATION/0.1"
|
||||||
; "SIMULATION/0.1"
|
; "SIMULATION/0.1"
|
||||||
; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
|
; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
|
||||||
ConnectorProtocolVersion = "SIMULATION/0.2"
|
ConnectorProtocolVersion = "SIMULATION/0.3"
|
||||||
|
|
||||||
[Profile]
|
[Profile]
|
||||||
Module = "BasicProfileModule"
|
Module = "BasicProfileModule"
|
||||||
|
|
|
@ -31,12 +31,16 @@
|
||||||
; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
|
; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
|
||||||
; It is used to control the teleport handoff process.
|
; It is used to control the teleport handoff process.
|
||||||
; Valid values are
|
; Valid values are
|
||||||
|
; "SIMULATION/0.3"
|
||||||
|
; - This is the default, and it supports teleports to variable-sized regions
|
||||||
|
; - Older versions can teleport to this one, but only if the destination region
|
||||||
|
; is 256x256
|
||||||
; "SIMULATION/0.2"
|
; "SIMULATION/0.2"
|
||||||
; - this is the default. A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
|
; - A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
|
||||||
; - this protocol is more efficient than "SIMULATION/0.1"
|
; - this protocol is more efficient than "SIMULATION/0.1"
|
||||||
; "SIMULATION/0.1"
|
; "SIMULATION/0.1"
|
||||||
; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
|
; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
|
||||||
ConnectorProtocolVersion = "SIMULATION/0.2"
|
ConnectorProtocolVersion = "SIMULATION/0.3"
|
||||||
|
|
||||||
[SimulationDataStore]
|
[SimulationDataStore]
|
||||||
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
LocalServiceModule = "OpenSim.Services.Connectors.dll:SimulationDataService"
|
||||||
|
|
|
@ -42,12 +42,16 @@
|
||||||
; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
|
; This is the protocol version which the simulator advertises to the source destination when acting as a target destination for a teleport
|
||||||
; It is used to control the teleport handoff process.
|
; It is used to control the teleport handoff process.
|
||||||
; Valid values are
|
; Valid values are
|
||||||
|
; "SIMULATION/0.3"
|
||||||
|
; - This is the default, and it supports teleports to variable-sized regions
|
||||||
|
; - Older versions can teleport to this one, but only if the destination region
|
||||||
|
; is 256x256
|
||||||
; "SIMULATION/0.2"
|
; "SIMULATION/0.2"
|
||||||
; - this is the default. A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
|
; - A source simulator which only implements "SIMULATION/0.1" can still teleport with that protocol
|
||||||
; - this protocol is more efficient than "SIMULATION/0.1"
|
; - this protocol is more efficient than "SIMULATION/0.1"
|
||||||
; "SIMULATION/0.1"
|
; "SIMULATION/0.1"
|
||||||
; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
|
; - this is an older teleport protocol used in OpenSimulator 0.7.5 and before.
|
||||||
ConnectorProtocolVersion = "SIMULATION/0.2"
|
ConnectorProtocolVersion = "SIMULATION/0.3"
|
||||||
|
|
||||||
[Messaging]
|
[Messaging]
|
||||||
MessageTransferModule = HGMessageTransferModule
|
MessageTransferModule = HGMessageTransferModule
|
||||||
|
|
Loading…
Reference in New Issue