From 447a66d66005c5ec54a786d1d0a532738729251c Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 2 Feb 2012 23:40:56 +0000 Subject: Replace ParcelAccessEntry with a new struct, LandAccessEntry, which more accurately reflects the data sent by the viewer. Add times bans and the expiration of timed bans. Warning: Contains a Migration (and nuts) --- .../CoreModules/World/Land/LandManagementModule.cs | 4 +- .../Region/CoreModules/World/Land/LandObject.cs | 84 +++++++++++++++------- 2 files changed, 62 insertions(+), 26 deletions(-) (limited to 'OpenSim/Region/CoreModules/World') diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 94bba83..1c503aa 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -550,7 +550,7 @@ namespace OpenSim.Region.CoreModules.World.Land public void ClientOnParcelAccessListUpdateRequest(UUID agentID, uint flags, int landLocalID, UUID transactionID, int sequenceID, - int sections, List entries, + int sections, List entries, IClientAPI remote_client) { // Flags is the list to update, it can mean either the ban or @@ -1712,4 +1712,4 @@ namespace OpenSim.Region.CoreModules.World.Land MainConsole.Instance.Output(report.ToString()); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 79b13c3..3b4336f 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -418,13 +418,21 @@ namespace OpenSim.Region.CoreModules.World.Land public bool IsBannedFromLand(UUID avatar) { - if (m_scene.Permissions.CanEditParcelProperties(avatar, this, 0)) + ExpireAccessList(); + + if (m_scene.Permissions.IsAdministrator(avatar)) + return false; + + if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) + return false; + + if (avatar == LandData.OwnerID) return false; if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0) { if (LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + delegate(LandAccessEntry e) { if (e.AgentID == avatar && e.Flags == AccessList.Ban) return true; @@ -439,13 +447,21 @@ namespace OpenSim.Region.CoreModules.World.Land public bool IsRestrictedFromLand(UUID avatar) { - if (m_scene.Permissions.CanEditParcelProperties(avatar, this, 0)) + ExpireAccessList(); + + if (m_scene.Permissions.IsAdministrator(avatar)) + return false; + + if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) + return false; + + if (avatar == LandData.OwnerID) return false; if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0) { if (LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + delegate(LandAccessEntry e) { if (e.AgentID == avatar && e.Flags == AccessList.Access) return true; @@ -511,19 +527,24 @@ namespace OpenSim.Region.CoreModules.World.Land #region AccessList Functions - public List CreateAccessListArrayByFlag(AccessList flag) + public List CreateAccessListArrayByFlag(AccessList flag) { - List list = new List(); - foreach (ParcelManager.ParcelAccessEntry entry in LandData.ParcelAccessList) + ExpireAccessList(); + + List list = new List(); + foreach (LandAccessEntry entry in LandData.ParcelAccessList) { if (entry.Flags == flag) - { - list.Add(entry.AgentID); - } + list.Add(entry); } if (list.Count == 0) { - list.Add(UUID.Zero); + LandAccessEntry e = new LandAccessEntry(); + e.AgentID = UUID.Zero; + e.Flags = 0; + e.Expires = 0; + + list.Add(e); } return list; @@ -535,20 +556,20 @@ namespace OpenSim.Region.CoreModules.World.Land if (flags == (uint) AccessList.Access || flags == (uint) AccessList.Both) { - List avatars = CreateAccessListArrayByFlag(AccessList.Access); - remote_client.SendLandAccessListData(avatars,(uint) AccessList.Access,LandData.LocalID); + List accessEntries = CreateAccessListArrayByFlag(AccessList.Access); + remote_client.SendLandAccessListData(accessEntries,(uint) AccessList.Access,LandData.LocalID); } if (flags == (uint) AccessList.Ban || flags == (uint) AccessList.Both) { - List avatars = CreateAccessListArrayByFlag(AccessList.Ban); - remote_client.SendLandAccessListData(avatars, (uint)AccessList.Ban, LandData.LocalID); + List accessEntries = CreateAccessListArrayByFlag(AccessList.Ban); + remote_client.SendLandAccessListData(accessEntries, (uint)AccessList.Ban, LandData.LocalID); } } public void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, - List entries, + List entries, IClientAPI remote_client) { LandData newData = LandData.Copy(); @@ -558,16 +579,16 @@ namespace OpenSim.Region.CoreModules.World.Land { m_listTransactions[flags] = transactionID; - List toRemove = - new List(); + List toRemove = + new List(); - foreach (ParcelManager.ParcelAccessEntry entry in newData.ParcelAccessList) + foreach (LandAccessEntry entry in newData.ParcelAccessList) { if (entry.Flags == (AccessList)flags) toRemove.Add(entry); } - foreach (ParcelManager.ParcelAccessEntry entry in toRemove) + foreach (LandAccessEntry entry in toRemove) { newData.ParcelAccessList.Remove(entry); } @@ -582,13 +603,13 @@ namespace OpenSim.Region.CoreModules.World.Land } } - foreach (ParcelManager.ParcelAccessEntry entry in entries) + foreach (LandAccessEntry entry in entries) { - ParcelManager.ParcelAccessEntry temp = - new ParcelManager.ParcelAccessEntry(); + LandAccessEntry temp = + new LandAccessEntry(); temp.AgentID = entry.AgentID; - temp.Time = entry.Time; + temp.Expires = entry.Expires; temp.Flags = (AccessList)flags; newData.ParcelAccessList.Add(temp); @@ -1105,5 +1126,20 @@ namespace OpenSim.Region.CoreModules.World.Land } #endregion + + private void ExpireAccessList() + { + List delete = new List(); + + foreach (LandAccessEntry entry in LandData.ParcelAccessList) + { + if (entry.Expires != 0 && entry.Expires < Util.UnixTimeSinceEpoch()) + delete.Add(entry); + } + foreach (LandAccessEntry entry in delete) + LandData.ParcelAccessList.Remove(entry); + + m_scene.EventManager.TriggerLandObjectUpdated((uint)LandData.LocalID, this); + } } } -- cgit v1.1