diff options
7 files changed, 42 insertions, 16 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index e8f18e7..51897d7 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -285,9 +285,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
285 | return; | 285 | return; |
286 | } | 286 | } |
287 | 287 | ||
288 | if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero)) | 288 | string reason; |
289 | if (!m_aScene.SimulationService.QueryAccess(finalDestination, sp.ControllingClient.AgentId, Vector3.Zero, out reason)) | ||
289 | { | 290 | { |
290 | sp.ControllingClient.SendTeleportFailed("The destination region has refused access"); | 291 | sp.ControllingClient.SendTeleportFailed("Teleport failed: " + reason); |
291 | return; | 292 | return; |
292 | } | 293 | } |
293 | 294 | ||
@@ -324,8 +325,6 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
324 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); | 325 | agentCircuit.CapsPath = CapsUtil.GetRandomCapsObjectPath(); |
325 | } | 326 | } |
326 | 327 | ||
327 | string reason = String.Empty; | ||
328 | |||
329 | // Let's create an agent there if one doesn't exist yet. | 328 | // Let's create an agent there if one doesn't exist yet. |
330 | bool logout = false; | 329 | bool logout = false; |
331 | if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) | 330 | if (!CreateAgent(sp, reg, finalDestination, agentCircuit, teleportFlags, out reason, out logout)) |
@@ -797,7 +796,8 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
797 | 796 | ||
798 | GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); | 797 | GridRegion neighbourRegion = scene.GridService.GetRegionByPosition(scene.RegionInfo.ScopeID, (int)x, (int)y); |
799 | 798 | ||
800 | if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos)) | 799 | string reason; |
800 | if (!scene.SimulationService.QueryAccess(neighbourRegion, agent.ControllingClient.AgentId, newpos, out reason)) | ||
801 | { | 801 | { |
802 | agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel"); | 802 | agent.ControllingClient.SendAlertMessage("Cannot region cross into banned parcel"); |
803 | if (r == null) | 803 | if (r == null) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs index 9363714..41dbffb 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs | |||
@@ -257,15 +257,16 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
257 | return false; | 257 | return false; |
258 | } | 258 | } |
259 | 259 | ||
260 | public bool QueryAccess(GridRegion destination, UUID id, Vector3 position) | 260 | public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) |
261 | { | 261 | { |
262 | reason = "Communications failure"; | ||
262 | if (destination == null) | 263 | if (destination == null) |
263 | return false; | 264 | return false; |
264 | 265 | ||
265 | foreach (Scene s in m_sceneList) | 266 | foreach (Scene s in m_sceneList) |
266 | { | 267 | { |
267 | if (s.RegionInfo.RegionID == destination.RegionID) | 268 | if (s.RegionInfo.RegionID == destination.RegionID) |
268 | return s.QueryAccess(id, position); | 269 | return s.QueryAccess(id, position, out reason); |
269 | } | 270 | } |
270 | return false; | 271 | return false; |
271 | } | 272 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs index e8a6629..e1eee3b 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs | |||
@@ -239,18 +239,19 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation | |||
239 | 239 | ||
240 | } | 240 | } |
241 | 241 | ||
242 | public bool QueryAccess(GridRegion destination, UUID id, Vector3 position) | 242 | public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) |
243 | { | 243 | { |
244 | reason = "Communications failure"; | ||
244 | if (destination == null) | 245 | if (destination == null) |
245 | return false; | 246 | return false; |
246 | 247 | ||
247 | // Try local first | 248 | // Try local first |
248 | if (m_localBackend.QueryAccess(destination, id, position)) | 249 | if (m_localBackend.QueryAccess(destination, id, position, out reason)) |
249 | return true; | 250 | return true; |
250 | 251 | ||
251 | // else do the remote thing | 252 | // else do the remote thing |
252 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) | 253 | if (!m_localBackend.IsLocalRegion(destination.RegionHandle)) |
253 | return m_remoteConnector.QueryAccess(destination, id, position); | 254 | return m_remoteConnector.QueryAccess(destination, id, position, out reason); |
254 | 255 | ||
255 | return false; | 256 | return false; |
256 | 257 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 171d637..f38a6fc 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -5145,9 +5145,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
5145 | // from logging into the region, teleporting into the region | 5145 | // from logging into the region, teleporting into the region |
5146 | // or corssing the broder walking, but will NOT prevent | 5146 | // or corssing the broder walking, but will NOT prevent |
5147 | // child agent creation, thereby emulating the SL behavior. | 5147 | // child agent creation, thereby emulating the SL behavior. |
5148 | public bool QueryAccess(UUID agentID, Vector3 position) | 5148 | public bool QueryAccess(UUID agentID, Vector3 position, out string reason) |
5149 | { | 5149 | { |
5150 | string reason; | 5150 | reason = "You are banned from the region"; |
5151 | 5151 | ||
5152 | if (!AuthorizeUser(agentID, out reason)) | 5152 | if (!AuthorizeUser(agentID, out reason)) |
5153 | { | 5153 | { |
@@ -5178,6 +5178,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
5178 | if (banned || restricted) | 5178 | if (banned || restricted) |
5179 | return false; | 5179 | return false; |
5180 | } | 5180 | } |
5181 | |||
5182 | reason = String.Empty; | ||
5181 | return true; | 5183 | return true; |
5182 | } | 5184 | } |
5183 | } | 5185 | } |
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 448e321..616aef3 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | |||
@@ -346,10 +346,17 @@ namespace OpenSim.Server.Handlers.Simulation | |||
346 | GridRegion destination = new GridRegion(); | 346 | GridRegion destination = new GridRegion(); |
347 | destination.RegionID = regionID; | 347 | destination.RegionID = regionID; |
348 | 348 | ||
349 | bool result = m_SimulationService.QueryAccess(destination, id, position); | 349 | string reason; |
350 | bool result = m_SimulationService.QueryAccess(destination, id, position, out reason); | ||
350 | 351 | ||
351 | responsedata["int_response_code"] = HttpStatusCode.OK; | 352 | responsedata["int_response_code"] = HttpStatusCode.OK; |
352 | responsedata["str_response_string"] = result.ToString(); | 353 | |
354 | OSDMap resp = new OSDMap(2); | ||
355 | |||
356 | resp["success"] = OSD.FromBoolean(result); | ||
357 | resp["reason"] = OSD.FromString(reason); | ||
358 | |||
359 | responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); | ||
353 | } | 360 | } |
354 | 361 | ||
355 | protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) | 362 | protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) |
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index 46ad9dd..98f72f0 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs | |||
@@ -256,8 +256,10 @@ namespace OpenSim.Services.Connectors.Simulation | |||
256 | 256 | ||
257 | /// <summary> | 257 | /// <summary> |
258 | /// </summary> | 258 | /// </summary> |
259 | public bool QueryAccess(GridRegion destination, UUID id, Vector3 position) | 259 | public bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason) |
260 | { | 260 | { |
261 | reason = "Failed to contact destination"; | ||
262 | |||
261 | // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position); | 263 | // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start, position={0}", position); |
262 | 264 | ||
263 | IPEndPoint ext = destination.ExternalEndPoint; | 265 | IPEndPoint ext = destination.ExternalEndPoint; |
@@ -283,8 +285,21 @@ namespace OpenSim.Services.Connectors.Simulation | |||
283 | m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); | 285 | m_log.Info("[REMOTE SIMULATION CONNECTOR]: The above web util error was caused by a TP to a sim that doesn't support QUERYACCESS and can be ignored"); |
284 | return true; | 286 | return true; |
285 | } | 287 | } |
288 | |||
289 | reason = result["Message"]; | ||
290 | } | ||
291 | else | ||
292 | { | ||
293 | reason = "Communications failure"; | ||
286 | } | 294 | } |
295 | |||
296 | return false; | ||
287 | } | 297 | } |
298 | |||
299 | OSDMap resp = (OSDMap)result["_Result"]; | ||
300 | success = resp["success"].AsBoolean(); | ||
301 | reason = resp["reason"].AsString(); | ||
302 | |||
288 | return success; | 303 | return success; |
289 | } | 304 | } |
290 | catch (Exception e) | 305 | catch (Exception e) |
diff --git a/OpenSim/Services/Interfaces/ISimulationService.cs b/OpenSim/Services/Interfaces/ISimulationService.cs index f08e1c0..5bb24c5 100644 --- a/OpenSim/Services/Interfaces/ISimulationService.cs +++ b/OpenSim/Services/Interfaces/ISimulationService.cs | |||
@@ -60,7 +60,7 @@ namespace OpenSim.Services.Interfaces | |||
60 | 60 | ||
61 | bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent); | 61 | bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent); |
62 | 62 | ||
63 | bool QueryAccess(GridRegion destination, UUID id, Vector3 position); | 63 | bool QueryAccess(GridRegion destination, UUID id, Vector3 position, out string reason); |
64 | 64 | ||
65 | /// <summary> | 65 | /// <summary> |
66 | /// Message from receiving region to departing region, telling it got contacted by the client. | 66 | /// Message from receiving region to departing region, telling it got contacted by the client. |