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) --- .../Region/ClientStack/Linden/UDP/LLClientView.cs | 14 +-- .../CoreModules/World/Land/LandManagementModule.cs | 4 +- .../Region/CoreModules/World/Land/LandObject.cs | 84 ++++++++++++------ .../Server/IRCClientView.cs | 2 +- .../Region/OptionalModules/World/NPC/NPCAvatar.cs | 2 +- .../Shared/Api/Implementation/LSL_Api.cs | 99 +++++++++++++++------- 6 files changed, 139 insertions(+), 66 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index a7bf06d..cdd4957 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4623,7 +4623,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP } } - public void SendLandAccessListData(List avatars, uint accessFlag, int localLandID) + public void SendLandAccessListData(List accessList, uint accessFlag, int localLandID) { ParcelAccessListReplyPacket replyPacket = (ParcelAccessListReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply); replyPacket.Data.AgentID = AgentId; @@ -4632,12 +4632,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP replyPacket.Data.SequenceID = 0; List list = new List(); - foreach (UUID avatar in avatars) + foreach (LandAccessEntry entry in accessList) { ParcelAccessListReplyPacket.ListBlock block = new ParcelAccessListReplyPacket.ListBlock(); block.Flags = accessFlag; - block.ID = avatar; - block.Time = 0; + block.ID = entry.AgentID; + block.Time = entry.Expires; list.Add(block); } @@ -8577,13 +8577,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP } #endregion - List entries = new List(); + List entries = new List(); foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List) { - ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); + LandAccessEntry entry = new LandAccessEntry(); entry.AgentID = block.ID; entry.Flags = (AccessList)block.Flags; - entry.Time = Util.ToDateTime(block.Time); + entry.Expires = block.Time; entries.Add(entry); } 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); + } } } diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index bbf3729..11f927c 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs @@ -1253,7 +1253,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server } - public void SendLandAccessListData(List avatars, uint accessFlag, int localLandID) + public void SendLandAccessListData(List accessList, uint accessFlag, int localLandID) { } diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 6d40a92..81bf9ed 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs @@ -940,7 +940,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, ILandObject lo, float simObjectBonusFactor,int parcelObjectCapacity, int simObjectCapacity, uint regionFlags) { } - public void SendLandAccessListData(List avatars, uint accessFlag, int localLandID) + public void SendLandAccessListData(List accessList, uint accessFlag, int localLandID) { } public void SendForceClientSelectObjects(List objectIDs) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 67dee02..0bdd84a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -5714,16 +5714,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llEjectFromLand(string pest) { m_host.AddScriptLPS(1); - UUID agentId = new UUID(); - if (UUID.TryParse(pest, out agentId)) + UUID agentID = new UUID(); + if (UUID.TryParse(pest, out agentID)) { - ScenePresence presence = World.GetScenePresence(agentId); + ScenePresence presence = World.GetScenePresence(agentID); if (presence != null) { // agent must be over the owners land - if (m_host.OwnerID == World.LandChannel.GetLandObject( - presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID) - World.TeleportClientHome(agentId, presence.ControllingClient); + ILandObject land = World.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); + if (land == null) + return; + + if (m_host.OwnerID == land.LandData.OwnerID) + { + World.TeleportClientHome(agentID, presence.ControllingClient); + } } } ScriptSleep(5000); @@ -6408,24 +6413,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.AddScriptLPS(1); UUID key; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); - if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed)) + if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned)) { - ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); + int expires = 0; + if (hours != 0) + expires = Util.UnixTimeSinceEpoch() + (int)(3600.0 * hours); + if (UUID.TryParse(avatar, out key)) { - if (land.LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + int idx = land.LandData.ParcelAccessList.FindIndex( + delegate(LandAccessEntry e) { if (e.AgentID == key && e.Flags == AccessList.Access) return true; return false; - }) == -1) - { - entry.AgentID = key; - entry.Flags = AccessList.Access; - entry.Time = DateTime.Now.AddHours(hours); - land.LandData.ParcelAccessList.Add(entry); - } + }); + + if (idx != -1 && (land.LandData.ParcelAccessList[idx].Expires == 0 || (expires != 0 && expires < land.LandData.ParcelAccessList[idx].Expires))) + return; + + if (idx != -1) + land.LandData.ParcelAccessList.RemoveAt(idx); + + LandAccessEntry entry = new LandAccessEntry(); + + entry.AgentID = key; + entry.Flags = AccessList.Access; + entry.Expires = expires; + + land.LandData.ParcelAccessList.Add(entry); + + World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); } } ScriptSleep(100); @@ -9679,22 +9697,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned)) { - ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); + int expires = 0; + if (hours != 0) + expires = Util.UnixTimeSinceEpoch() + (int)(3600.0 * hours); + if (UUID.TryParse(avatar, out key)) { - if (land.LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + int idx = land.LandData.ParcelAccessList.FindIndex( + delegate(LandAccessEntry e) { if (e.AgentID == key && e.Flags == AccessList.Ban) return true; return false; - }) == -1) - { - entry.AgentID = key; - entry.Flags = AccessList.Ban; - entry.Time = DateTime.Now.AddHours(hours); - land.LandData.ParcelAccessList.Add(entry); - } + }); + + if (idx != -1 && (land.LandData.ParcelAccessList[idx].Expires == 0 || (expires != 0 && expires < land.LandData.ParcelAccessList[idx].Expires))) + return; + + if (idx != -1) + land.LandData.ParcelAccessList.RemoveAt(idx); + + LandAccessEntry entry = new LandAccessEntry(); + + entry.AgentID = key; + entry.Flags = AccessList.Ban; + entry.Expires = expires; + + land.LandData.ParcelAccessList.Add(entry); + + World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); } } ScriptSleep(100); @@ -9710,7 +9741,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (UUID.TryParse(avatar, out key)) { int idx = land.LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + delegate(LandAccessEntry e) { if (e.AgentID == key && e.Flags == AccessList.Access) return true; @@ -9718,7 +9749,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api }); if (idx != -1) + { land.LandData.ParcelAccessList.RemoveAt(idx); + World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + } } } ScriptSleep(100); @@ -9734,7 +9768,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (UUID.TryParse(avatar, out key)) { int idx = land.LandData.ParcelAccessList.FindIndex( - delegate(ParcelManager.ParcelAccessEntry e) + delegate(LandAccessEntry e) { if (e.AgentID == key && e.Flags == AccessList.Ban) return true; @@ -9742,7 +9776,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api }); if (idx != -1) + { land.LandData.ParcelAccessList.RemoveAt(idx); + World.EventManager.TriggerLandObjectUpdated((uint)land.LandData.LocalID, land); + } } } ScriptSleep(100); @@ -9997,7 +10034,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; if (land.OwnerID == m_host.OwnerID) { - foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList) + foreach (LandAccessEntry entry in land.ParcelAccessList) { if (entry.Flags == AccessList.Ban) { @@ -10014,7 +10051,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; if (land.OwnerID == m_host.OwnerID) { - foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList) + foreach (LandAccessEntry entry in land.ParcelAccessList) { if (entry.Flags == AccessList.Access) { -- cgit v1.1