From a94510500357848f2dee26e599abad5256d2f5eb Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 7 Jun 2012 00:24:33 +0200 Subject: [PATCH] Make timed bans / timed passes work as expected. Prevent transmission of media URLs to banned clients. --- .../World/Land/LandManagementModule.cs | 7 +++-- .../CoreModules/World/Land/LandObject.cs | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 02ac091d21..add1551ab4 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -1101,8 +1101,11 @@ namespace OpenSim.Region.CoreModules.World.Land { if (!temp.Contains(currentParcel)) { - currentParcel.ForceUpdateLandInfo(); - temp.Add(currentParcel); + if (!currentParcel.IsEitherBannedOrRestricted(remote_client.AgentId)) + { + currentParcel.ForceUpdateLandInfo(); + temp.Add(currentParcel); + } } } } diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 509c4d7e3f..42844440c1 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -50,6 +50,7 @@ namespace OpenSim.Region.CoreModules.World.Land private bool[,] m_landBitmap = new bool[landArrayMax,landArrayMax]; private int m_lastSeqId = 0; + private int m_expiryCounter = 0; protected LandData m_landData = new LandData(); protected Scene m_scene; @@ -135,6 +136,8 @@ namespace OpenSim.Region.CoreModules.World.Land else LandData.GroupID = UUID.Zero; LandData.IsGroupOwned = is_group_owned; + + m_scene.EventManager.OnFrame += OnFrame; } #endregion @@ -1196,6 +1199,17 @@ namespace OpenSim.Region.CoreModules.World.Land #endregion + private void OnFrame() + { + m_expiryCounter++; + + if (m_expiryCounter >= 50) + { + ExpireAccessList(); + m_expiryCounter = 0; + } + } + private void ExpireAccessList() { List delete = new List(); @@ -1206,7 +1220,22 @@ namespace OpenSim.Region.CoreModules.World.Land delete.Add(entry); } foreach (LandAccessEntry entry in delete) + { LandData.ParcelAccessList.Remove(entry); + ScenePresence presence; + + if (m_scene.TryGetScenePresence(entry.AgentID, out presence) && (!presence.IsChildAgent)) + { + ILandObject land = m_scene.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); + if (land.LandData.LocalID == LandData.LocalID) + { + Vector3 pos = m_scene.GetNearestAllowedPosition(presence, land); + presence.TeleportWithMomentum(pos); + presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); + } + } + m_log.DebugFormat("[LAND]: Removing entry {0} because it has expired", entry.AgentID); + } if (delete.Count > 0) m_scene.EventManager.TriggerLandObjectUpdated((uint)LandData.LocalID, this);