From bb824eadeeb2b35025954d0c97f15123c6fd0cbe Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Wed, 5 Dec 2007 06:44:32 +0000 Subject: * Refactored Permissions into ScenePresence as requested by MW * Un-hackerized generating the client_flags * Now handling the ObjectPermissions Update packet * Warning: Backup your prim before updating. If you fail to do so and something goes wrong then, All Yr prim are belong to us! --- .../Region/Environment/Scenes/SceneObjectPart.cs | 270 +++++++++++++-------- 1 file changed, 172 insertions(+), 98 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectPart.cs') diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 19405fc..238e78a 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -44,8 +44,12 @@ namespace OpenSim.Region.Environment.Scenes { public class SceneObjectPart : IScriptHost { - private const uint FULL_MASK_PERMISSIONS = 2147483647; - + private const LLObject.ObjectFlags OBJFULL_MASK_GENERAL = LLObject.ObjectFlags.ObjectCopy | LLObject.ObjectFlags.ObjectModify | LLObject.ObjectFlags.ObjectTransfer; + private const LLObject.ObjectFlags OBJFULL_MASK_OWNER = LLObject.ObjectFlags.ObjectCopy | LLObject.ObjectFlags.ObjectModify | LLObject.ObjectFlags.ObjectOwnerModify | LLObject.ObjectFlags.ObjectTransfer | LLObject.ObjectFlags.ObjectYouOwner; + private const uint OBJNEXT_OWNER = 2147483647; + + private const uint FULL_MASK_PERMISSIONS_GENERAL = 2147483647; + private const uint FULL_MASK_PERMISSIONS_OWNER = 2147483647; private string m_inventoryFileName = ""; private LLUUID m_folderID = LLUUID.Zero; @@ -64,11 +68,13 @@ namespace OpenSim.Region.Environment.Scenes public Int32 CreationDate; public uint ParentID = 0; - public uint OwnerMask = FULL_MASK_PERMISSIONS; - public uint NextOwnerMask = FULL_MASK_PERMISSIONS; - public uint GroupMask = FULL_MASK_PERMISSIONS; - public uint EveryoneMask = FULL_MASK_PERMISSIONS; - public uint BaseMask = FULL_MASK_PERMISSIONS; + // Main grid has default permissions as follows + // + public uint OwnerMask = FULL_MASK_PERMISSIONS_OWNER; + public uint NextOwnerMask = OBJNEXT_OWNER; + public uint GroupMask = (uint) LLObject.ObjectFlags.None; + public uint EveryoneMask = (uint) LLObject.ObjectFlags.None; + public uint BaseMask = FULL_MASK_PERMISSIONS_OWNER; protected byte[] m_particleSystem = new byte[0]; @@ -463,17 +469,11 @@ namespace OpenSim.Region.Environment.Scenes m_folderID = LLUUID.Random(); m_flags = 0; - m_flags |= LLObject.ObjectFlags.ObjectModify | - LLObject.ObjectFlags.ObjectCopy | - LLObject.ObjectFlags.ObjectYouOwner | - LLObject.ObjectFlags.Touch | - LLObject.ObjectFlags.ObjectMove | - LLObject.ObjectFlags.AllowInventoryDrop | - LLObject.ObjectFlags.ObjectTransfer | - LLObject.ObjectFlags.CreateSelected | - LLObject.ObjectFlags.ObjectOwnerModify; - - ApplyPermissions(); + m_flags |= LLObject.ObjectFlags.Touch | + LLObject.ObjectFlags.AllowInventoryDrop | + LLObject.ObjectFlags.CreateSelected; + + ApplySanePermissions(); ScheduleFullUpdate(); } @@ -511,7 +511,7 @@ namespace OpenSim.Region.Environment.Scenes RotationOffset = rotation; ObjectFlags = flags; - ApplyPermissions(); + ApplySanePermissions(); // ApplyPhysics(); ScheduleFullUpdate(); @@ -552,24 +552,99 @@ namespace OpenSim.Region.Environment.Scenes DoPhysicsPropertyUpdate(usePhysics, true); } + public void ApplyNextOwnerPermissions() + { + BaseMask = NextOwnerMask; + OwnerMask = NextOwnerMask; + } + public void ApplySanePermissions() + { + // These are some flags that The OwnerMask should never have + OwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectGroupOwned; + OwnerMask &= ~(uint)LLObject.ObjectFlags.Physics; + OwnerMask &= ~(uint)LLObject.ObjectFlags.Phantom; + OwnerMask &= ~(uint)LLObject.ObjectFlags.Scripted; + OwnerMask &= ~(uint)LLObject.ObjectFlags.Touch; + OwnerMask &= ~(uint)LLObject.ObjectFlags.Temporary; + OwnerMask &= ~(uint)LLObject.ObjectFlags.TemporaryOnRez; + OwnerMask &= ~(uint)LLObject.ObjectFlags.ZlibCompressed; + OwnerMask &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop; + OwnerMask &= ~(uint)LLObject.ObjectFlags.AnimSource; + OwnerMask &= ~(uint)LLObject.ObjectFlags.Money; + OwnerMask &= ~(uint)LLObject.ObjectFlags.CastShadows; + OwnerMask &= ~(uint)LLObject.ObjectFlags.InventoryEmpty; + OwnerMask &= ~(uint)LLObject.ObjectFlags.CreateSelected; + + + // These are some flags that the next owner mask should never have + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectOwnerModify; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ObjectGroupOwned; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Physics; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Phantom; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Scripted; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Touch; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Temporary; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.TemporaryOnRez; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.ZlibCompressed; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.AnimSource; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.Money; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.CastShadows; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.InventoryEmpty; + NextOwnerMask &= ~(uint)LLObject.ObjectFlags.CreateSelected; + + + // These are some flags that the GroupMask should never have + GroupMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner; + GroupMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer; + GroupMask &= ~(uint)LLObject.ObjectFlags.ObjectOwnerModify; + GroupMask &= ~(uint)LLObject.ObjectFlags.ObjectGroupOwned; + GroupMask &= ~(uint)LLObject.ObjectFlags.Physics; + GroupMask &= ~(uint)LLObject.ObjectFlags.Phantom; + GroupMask &= ~(uint)LLObject.ObjectFlags.Scripted; + GroupMask &= ~(uint)LLObject.ObjectFlags.Touch; + GroupMask &= ~(uint)LLObject.ObjectFlags.Temporary; + GroupMask &= ~(uint)LLObject.ObjectFlags.TemporaryOnRez; + GroupMask &= ~(uint)LLObject.ObjectFlags.ZlibCompressed; + GroupMask &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop; + GroupMask &= ~(uint)LLObject.ObjectFlags.AnimSource; + GroupMask &= ~(uint)LLObject.ObjectFlags.Money; + GroupMask &= ~(uint)LLObject.ObjectFlags.CastShadows; + GroupMask &= ~(uint)LLObject.ObjectFlags.InventoryEmpty; + GroupMask &= ~(uint)LLObject.ObjectFlags.CreateSelected; + + + // These are some flags that EveryoneMask should never have + EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectOwnerModify; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectGroupOwned; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.Physics; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.Phantom; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.Scripted; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.Touch; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.Temporary; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.TemporaryOnRez; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.ZlibCompressed; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.AnimSource; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.Money; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.CastShadows; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.InventoryEmpty; + EveryoneMask &= ~(uint)LLObject.ObjectFlags.CreateSelected; + + + // These are some flags that ObjectFlags (m_flags) should never have + ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner; + ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectTransfer; + ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectOwnerModify; + ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectYouOfficer; + ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectCopy; + ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectModify; + ObjectFlags &= ~(uint)LLObject.ObjectFlags.ObjectMove; - public void ApplyPermissions() - { - if (!ParentGroup.m_scene.PermissionsMngr.BypassPermissions) - { - EveryoneMask = ObjectFlags; - EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner; - EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectTransfer; - EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectCopy; - EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectModify; - EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectMove; - EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectAnyOwner; - EveryoneMask &= ~(uint)LLObject.ObjectFlags.ObjectYouOfficer; - } - else - { - EveryoneMask = ObjectFlags; - } } /// @@ -774,9 +849,7 @@ namespace OpenSim.Region.Environment.Scenes { //Console.WriteLine("Adding flag: " + ((LLObject.ObjectFlags) flag).ToString()); m_flags |= flag; - BaseMask |= (uint)flag; - GroupMask |= (uint)flag; - EveryoneMask |= (uint)flag; + } uint currflag = (uint)m_flags; //System.Console.WriteLine("Aprev: " + prevflag.ToString() + " curr: " + m_flags.ToString()); @@ -790,9 +863,7 @@ namespace OpenSim.Region.Environment.Scenes { //Console.WriteLine("Removing flag: " + ((LLObject.ObjectFlags)flag).ToString()); m_flags &= ~flag; - BaseMask &= ~(uint)flag; - GroupMask &= ~(uint)flag; - EveryoneMask &= ~(uint)flag; + } //System.Console.WriteLine("prev: " + prevflag.ToString() + " curr: " + m_flags.ToString()); //ScheduleFullUpdate(); @@ -1198,6 +1269,51 @@ namespace OpenSim.Region.Environment.Scenes #endregion + public void UpdatePermissions(LLUUID AgentID, byte field, uint localID, uint mask, byte addRemTF) + { + // Are we the owner? + if (AgentID == OwnerID) + { + MainLog.Instance.Verbose("PERMISSIONS", "field: " + field.ToString() + ", mask: " + mask.ToString() + " addRemTF: " + addRemTF.ToString()); + + //Field 8 = EveryoneMask + if (field == (byte)8) + { + MainLog.Instance.Verbose("PERMISSIONS", "Left over: " + (OwnerMask - EveryoneMask)); + if (addRemTF == (byte)0) + { + //EveryoneMask = (uint)0; + EveryoneMask &= ~mask; + //EveryoneMask &= ~(uint)57344; + + + } + else + { + //EveryoneMask = (uint)0; + EveryoneMask |= mask; + //EveryoneMask |= (uint)57344; + + } + ScheduleFullUpdate(); + } + //Field 16 = NextownerMask + if (field == (byte)16) + { + if (addRemTF == (byte)0) + { + NextOwnerMask &= ~mask; + } + else + { + NextOwnerMask |= mask; + } + ScheduleFullUpdate(); + } + + } + } + #region Client Update Methods public void AddFullUpdateToAllAvatars() @@ -1222,7 +1338,8 @@ namespace OpenSim.Region.Environment.Scenes List avatars = m_parentGroup.GetScenePresences(); for (int i = 0; i < avatars.Count; i++) { - m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this); + // Ugly reference :( + m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this, avatars[i].GenerateClientFlags(this.UUID)); } } @@ -1230,20 +1347,20 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void SendFullUpdate(IClientAPI remoteClient) + public void SendFullUpdate(IClientAPI remoteClient, uint clientFlags) { - m_parentGroup.SendPartFullUpdate(remoteClient, this); + m_parentGroup.SendPartFullUpdate(remoteClient, this, clientFlags); } /// /// /// /// - public void SendFullUpdateToClient(IClientAPI remoteClient) + public void SendFullUpdateToClient(IClientAPI remoteClient, uint clientflags) { LLVector3 lPos; lPos = OffsetPosition; - SendFullUpdateToClient(remoteClient, lPos); + SendFullUpdateToClient(remoteClient, lPos, clientflags); } /// @@ -1251,56 +1368,13 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void SendFullUpdateToClient(IClientAPI remoteClient, LLVector3 lPos) + public void SendFullUpdateToClient(IClientAPI remoteClient, LLVector3 lPos, uint clientFlags) { LLQuaternion lRot; lRot = RotationOffset; - uint clientFlags = ObjectFlags & ~(uint)LLObject.ObjectFlags.CreateSelected; - - List avatars = m_parentGroup.GetScenePresences(); - foreach (ScenePresence s in avatars) + if (remoteClient.AgentId == OwnerID) { - if (s.m_uuid == OwnerID) - { - if (s.ControllingClient == remoteClient) - { - clientFlags = ObjectFlags; - m_flags &= ~LLObject.ObjectFlags.CreateSelected; - } - break; - } - } - // If you can't edit it, send the base permissions minus the flag to edit - - - // We're going to be moving this into ScenePresence and the PermissionsManager itself. - if (!ParentGroup.m_scene.PermissionsMngr.BypassPermissions) - { - if (ParentGroup.m_scene.PermissionsMngr.CanEditObject(remoteClient.AgentId, this.ParentGroup.UUID)) - { - // we should be merging the objectflags with the ownermask here. - // TODO: Future refactoring here. - clientFlags = ObjectFlags; - - } - else - { - //clientFlags = ObjectFlags; - clientFlags = EveryoneMask; - if (!ParentGroup.m_scene.PermissionsMngr.AnyoneCanCopyPermission(remoteClient.AgentId, this.ParentGroup.UUID)) - { - clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectCopy; - } - - if (!ParentGroup.m_scene.PermissionsMngr.AnyoneCanMovePermission(remoteClient.AgentId, this.ParentGroup.UUID)) - { - clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectMove; - } - - clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectModify; - clientFlags &= ~(uint)LLObject.ObjectFlags.AllowInventoryDrop; - clientFlags &= ~(uint)LLObject.ObjectFlags.ObjectTransfer; - } + clientFlags &= ~(uint)LLObject.ObjectFlags.CreateSelected; } @@ -1479,11 +1553,11 @@ namespace OpenSim.Region.Environment.Scenes public LLUUID item_id = LLUUID.Zero; public LLUUID parent_id = LLUUID.Zero; //parent folder id - public uint base_mask = FULL_MASK_PERMISSIONS; - public uint owner_mask = FULL_MASK_PERMISSIONS; - public uint group_mask = FULL_MASK_PERMISSIONS; - public uint everyone_mask = FULL_MASK_PERMISSIONS; - public uint next_owner_mask = FULL_MASK_PERMISSIONS; + public uint base_mask = FULL_MASK_PERMISSIONS_GENERAL; + public uint owner_mask = FULL_MASK_PERMISSIONS_GENERAL; + public uint group_mask = FULL_MASK_PERMISSIONS_GENERAL; + public uint everyone_mask = FULL_MASK_PERMISSIONS_GENERAL; + public uint next_owner_mask = FULL_MASK_PERMISSIONS_GENERAL; public LLUUID creator_id = LLUUID.Zero; public LLUUID owner_id = LLUUID.Zero; public LLUUID last_owner_id = LLUUID.Zero; -- cgit v1.1