Fix up QueryAccess to also check parcels

avinationmerge
Melanie 2011-01-28 03:07:25 +01:00
parent 566eff17de
commit 657c14c5db
7 changed files with 47 additions and 20 deletions

View File

@ -285,7 +285,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return;
}
if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId))
if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero))
{
sp.ControllingClient.SendTeleportFailed("The destination region has refused access");
return;
@ -797,8 +797,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y);
if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId))
if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos))
{
agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel");
if (r == null)
{
r = new ExpiringCache<ulong, DateTime>();

View File

@ -257,7 +257,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
return false;
}
public bool QueryAccess(GridRegion destination, UUID id)
public bool QueryAccess(GridRegion destination, UUID id, Vector3 position)
{
if (destination == null)
return false;
@ -265,7 +265,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
foreach (Scene s in m_sceneList)
{
if (s.RegionInfo.RegionID == destination.RegionID)
return s.QueryAccess(id);
return s.QueryAccess(id, position);
}
return false;
}

View File

@ -239,18 +239,18 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
}
public bool QueryAccess(GridRegion destination, UUID id)
public bool QueryAccess(GridRegion destination, UUID id, Vector3 position)
{
if (destination == null)
return false;
// Try local first
if (m_localBackend.QueryAccess(destination, id))
if (m_localBackend.QueryAccess(destination, id, position))
return true;
// else do the remote thing
if (!m_localBackend.IsLocalRegion(destination.RegionHandle))
return m_remoteConnector.QueryAccess(destination, id);
return m_remoteConnector.QueryAccess(destination, id, position);
return false;

View File

@ -5141,23 +5141,38 @@ namespace OpenSim.Region.Framework.Scenes
// from logging into the region, teleporting into the region
// or corssing the broder walking, but will NOT prevent
// child agent creation, thereby emulating the SL behavior.
public bool QueryAccess(UUID agentID)
public bool QueryAccess(UUID agentID, Vector3 position)
{
string reason;
if (!AuthorizeUser(agentID, out reason))
{
m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
// m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
return false;
}
float posX = 128.0f;
float posY = 128.0f;
if (!TestLandRestrictions(agentID, out reason, ref posX, ref posY))
if (position == Vector3.Zero) // Teleport
{
m_log.DebugFormat("[SCENE]: Denying {0} because they are banned on all parcels", agentID);
return false;
float posX = 128.0f;
float posY = 128.0f;
if (!TestLandRestrictions(agentID, out reason, ref posX, ref posY))
{
// m_log.DebugFormat("[SCENE]: Denying {0} because they are banned on all parcels", agentID);
return false;
}
}
else // Walking
{
ILandObject land = LandChannel.GetLandObject(position.X, position.Y);
if (land == null)
return false;
bool banned = land.IsBannedFromLand(agentID);
bool restricted = land.IsRestrictedFromLand(agentID);
if (banned || restricted)
return false;
}
return true;
}

View File

@ -331,10 +331,17 @@ namespace OpenSim.Server.Handlers.Simulation
return;
}
// m_log.DebugFormat("[AGENT HANDLER]: Received QUERYACCESS with {0}", (string)request["body"]);
OSDMap args = Utils.GetOSDMap((string)request["body"]);
Vector3 position = Vector3.Zero;
if (args.ContainsKey("position"))
position = Vector3.Parse(args["position"].AsString());
GridRegion destination = new GridRegion();
destination.RegionID = regionID;
bool result = m_SimulationService.QueryAccess(destination, id);
bool result = m_SimulationService.QueryAccess(destination, id, position);
responsedata["int_response_code"] = HttpStatusCode.OK;
responsedata["str_response_string"] = result.ToString();

View File

@ -31,6 +31,7 @@ using System.IO;
using System.Net;
using System.Reflection;
using System.Text;
using System.Collections;
using OpenSim.Framework;
using OpenSim.Services.Interfaces;
@ -206,9 +207,9 @@ namespace OpenSim.Services.Connectors.Simulation
/// <summary>
/// </summary>
public bool QueryAccess(GridRegion destination, UUID id)
public bool QueryAccess(GridRegion destination, UUID id, Vector3 position)
{
// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start");
// m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position);
IPEndPoint ext = destination.ExternalEndPoint;
if (ext == null) return false;
@ -216,9 +217,12 @@ namespace OpenSim.Services.Connectors.Simulation
// Eventually, we want to use a caps url instead of the agentID
string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
OSDMap request = new OSDMap();
request.Add("position", OSD.FromString(position.ToString()));
try
{
OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"QUERYACCESS",10000);
OSDMap result = WebUtil.ServiceOSDRequest(uri, request, "QUERYACCESS", 10000);
return result["Success"].AsBoolean();
}
catch (Exception e)

View File

@ -60,7 +60,7 @@ namespace OpenSim.Services.Interfaces
bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent);
bool QueryAccess(GridRegion destination, UUID id);
bool QueryAccess(GridRegion destination, UUID id, Vector3 position);
/// <summary>
/// Message from receiving region to departing region, telling it got contacted by the client.