From c927928245fcd2c0b028029587d91b34ff145d91 Mon Sep 17 00:00:00 2001 From: lbsa71 Date: Mon, 11 Feb 2008 13:26:55 +0000 Subject: * some refactoring on permissions * temporary re-introduced the weird 'flip-back' behaviour, but debugging it; will remove it if I don't find anything. --- OpenSim/Region/Environment/PermissionManager.cs | 104 ++++++++++----------- .../Region/Environment/Scenes/Scene.Inventory.cs | 6 +- .../Environment/Scenes/Scene.PacketHandlers.cs | 2 +- .../Region/Environment/Scenes/SceneObjectGroup.cs | 2 +- .../Region/Environment/Scenes/SceneObjectPart.cs | 78 ++++++---------- 5 files changed, 84 insertions(+), 108 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Environment/PermissionManager.cs b/OpenSim/Region/Environment/PermissionManager.cs index 47e29a3..7805c78 100644 --- a/OpenSim/Region/Environment/PermissionManager.cs +++ b/OpenSim/Region/Environment/PermissionManager.cs @@ -37,12 +37,12 @@ namespace OpenSim.Region.Environment protected Scene m_scene; // These are here for testing. They will be taken out - private uint PERM_ALL = (uint) 2147483647; - private uint PERM_COPY = (uint) 32768; - private uint PERM_MODIFY = (uint) 16384; - private uint PERM_MOVE = (uint) 524288; - private uint PERM_TRANS = (uint) 8192; - private uint PERM_LOCKED = (uint) 540672; + private uint PERM_ALL = (uint)2147483647; + private uint PERM_COPY = (uint)32768; + private uint PERM_MODIFY = (uint)16384; + private uint PERM_MOVE = (uint)524288; + private uint PERM_TRANS = (uint)8192; + private uint PERM_LOCKED = (uint)540672; // Bypasses the permissions engine (always returns OK) // disable in any production environment // TODO: Change this to false when permissions are a desired default @@ -108,7 +108,7 @@ namespace OpenSim.Region.Environment // The below is commented out because logically it happens anyway. It's left in for readability //else //{ - //return false; + //return false; //} return false; @@ -133,8 +133,8 @@ namespace OpenSim.Region.Environment Land land = m_scene.LandManager.getLandObject(position.X, position.Y); if (land == null) return false; - if ((land.landData.landFlags & ((int) Parcel.ParcelFlags.CreateObjects)) == - (int) Parcel.ParcelFlags.CreateObjects) + if ((land.landData.landFlags & ((int)Parcel.ParcelFlags.CreateObjects)) == + (int)Parcel.ParcelFlags.CreateObjects) permission = true; //TODO: check for group rights @@ -190,25 +190,23 @@ namespace OpenSim.Region.Environment return 0; } - SceneObjectGroup task = (SceneObjectGroup) m_scene.Entities[objID]; - LLUUID taskOwner = null; - // Added this because at this point in time it wouldn't be wise for - // the administrator object permissions to take effect. + SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[objID]; LLUUID objectOwner = task.OwnerID; uint objflags = task.RootPart.ObjectFlags; - + // Remove any of the objectFlags that are temporary. These will get added back if appropriate // in the next bit of code - objflags &= ~(uint)LLObject.ObjectFlags.ObjectCopy; // Tells client you can copy the object - objflags &= ~(uint)LLObject.ObjectFlags.ObjectModify; // tells client you can modify the object - objflags &= ~(uint)LLObject.ObjectFlags.ObjectMove; // tells client that you can move the object (only, no mod) - objflags &= ~(uint)LLObject.ObjectFlags.ObjectTransfer; // tells the client that you can /take/ the object if you don't own it - objflags &= ~(uint)LLObject.ObjectFlags.ObjectYouOwner; // Tells client that you're the owner of the object - objflags &= ~(uint)LLObject.ObjectFlags.ObjectYouOfficer; // Tells client that you've got group object editing permission. Used when ObjectGroupOwned is set - + objflags &= (uint) + ~(LLObject.ObjectFlags.ObjectCopy | // Tells client you can copy the object + LLObject.ObjectFlags.ObjectModify | // tells client you can modify the object + LLObject.ObjectFlags.ObjectMove | // tells client that you can move the object (only, no mod) + LLObject.ObjectFlags.ObjectTransfer | // tells the client that you can /take/ the object if you don't own it + LLObject.ObjectFlags.ObjectYouOwner | // Tells client that you're the owner of the object + LLObject.ObjectFlags.ObjectYouOfficer // Tells client that you've got group object editing permission. Used when ObjectGroupOwned is set + ); // Creating the three ObjectFlags options for this method to choose from. // Customize the OwnerMask @@ -217,10 +215,10 @@ namespace OpenSim.Region.Environment // Customize the GroupMask uint objectGroupMask = ApplyObjectModifyMasks(task.RootPart.GroupMask, objflags); - + // Customize the EveryoneMask uint objectEveryoneMask = ApplyObjectModifyMasks(task.RootPart.EveryoneMask, objflags); - + // Hack to allow collaboration until Groups and Group Permissions are implemented if ((objectEveryoneMask & (uint)LLObject.ObjectFlags.ObjectMove) != 0) @@ -239,16 +237,16 @@ namespace OpenSim.Region.Environment Land parcel = m_scene.LandManager.getLandObject(task.AbsolutePosition.X, task.AbsolutePosition.Y); if (parcel != null && parcel.landData.ownerID == user) return objectOwnerMask; - + // Admin objects should not be editable by the above if (IsAdministrator(objectOwner)) return objectEveryoneMask; - + // Estate users should be able to edit anything in the sim if (IsEstateManager(user)) return objectOwnerMask; - + // Admin should be able to edit anything in the sim (including admin objects) if (IsAdministrator(user)) @@ -257,37 +255,37 @@ namespace OpenSim.Region.Environment return objectEveryoneMask; } - + private uint ApplyObjectModifyMasks(uint setPermissionMask, uint objectFlagsMask) { // We are adding the temporary objectflags to the object's objectflags based on the // permission flag given. These change the F flags on the client. - - if ((setPermissionMask & (uint)PermissionMask.Copy) != 0) - { - objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectCopy; - } - if ((setPermissionMask & (uint)PermissionMask.Move) != 0) - { - objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectMove; - } + if ((setPermissionMask & (uint)PermissionMask.Copy) != 0) + { + objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectCopy; + } - if ((setPermissionMask & (uint)PermissionMask.Modify) != 0) - { - objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectModify; - } + if ((setPermissionMask & (uint)PermissionMask.Move) != 0) + { + objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectMove; + } + + if ((setPermissionMask & (uint)PermissionMask.Modify) != 0) + { + objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectModify; + } + + if ((setPermissionMask & (uint)PermissionMask.Transfer) != 0) + { + objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectTransfer; + } - if ((setPermissionMask & (uint)PermissionMask.Transfer) != 0) - { - objectFlagsMask |= (uint)LLObject.ObjectFlags.ObjectTransfer; - } - return objectFlagsMask; } - + protected virtual bool GenericObjectPermission(LLUUID currentUser, LLUUID objId) { // Default: deny @@ -307,10 +305,10 @@ namespace OpenSim.Region.Environment SceneObjectGroup group = (SceneObjectGroup)m_scene.Entities[objId]; - + LLUUID objectOwner = group.OwnerID; locked = ((group.RootPart.OwnerMask & PERM_LOCKED) == 0); - + // People shouldn't be able to do anything with locked objects, except the Administrator // The 'set permissions' runs through a different permission check, so when an object owner // sets an object locked, the only thing that they can do is unlock it. @@ -331,7 +329,7 @@ namespace OpenSim.Region.Environment // Users should be able to edit what is over their land. Land parcel = m_scene.LandManager.getLandObject(group.AbsolutePosition.X, group.AbsolutePosition.Y); - if ((parcel != null) && ( parcel.landData.ownerID == currentUser)) + if ((parcel != null) && (parcel.landData.ownerID == currentUser)) { permission = true; } @@ -386,7 +384,7 @@ namespace OpenSim.Region.Environment // The client // may request to edit linked parts, and therefore, it needs // to also check for SceneObjectPart - + // If it's not an object, we cant edit it. if ((!(m_scene.Entities[obj] is SceneObjectGroup))) { @@ -395,13 +393,13 @@ namespace OpenSim.Region.Environment SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[obj]; - + LLUUID taskOwner = null; // Added this because at this point in time it wouldn't be wise for // the administrator object permissions to take effect. LLUUID objectOwner = task.OwnerID; - + // Anyone can move if ((task.RootPart.EveryoneMask & PERM_MOVE) != 0) permission = true; @@ -430,7 +428,7 @@ namespace OpenSim.Region.Environment return false; } - SceneObjectGroup task = (SceneObjectGroup) m_scene.Entities[obj]; + SceneObjectGroup task = (SceneObjectGroup)m_scene.Entities[obj]; LLUUID taskOwner = null; // Added this because at this point in time it wouldn't be wise for // the administrator object permissions to take effect. diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index fee1e66..16f15a2 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -199,7 +199,7 @@ namespace OpenSim.Region.Environment.Scenes // Update item with new asset item.AssetID = asset.FullID; group.UpdateInventoryItem(item); - group.GetProperites(remoteClient); + group.GetProperties(remoteClient); // Trigger rerunning of script (use TriggerRezScript event, see RezScript) if (isScriptRunning) @@ -520,7 +520,7 @@ namespace OpenSim.Region.Environment.Scenes if (group != null) { int type = group.RemoveInventoryItem(localID, itemID); - group.GetProperites(remoteClient); + group.GetProperties(remoteClient); if (type == 10) { EventManager.TriggerRemoveScript(localID, itemID); @@ -599,7 +599,7 @@ namespace OpenSim.Region.Environment.Scenes { group.AddInventoryItem(remoteClient, localID, item, copyID); group.StartScript(localID, copyID); - group.GetProperites(remoteClient); + group.GetProperties(remoteClient); // m_log.Info( // String.Format("[PRIMINVENTORY]: " + diff --git a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs index 86f10d7..5071f9b 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.PacketHandlers.cs @@ -106,7 +106,7 @@ namespace OpenSim.Region.Environment.Scenes { if (((SceneObjectGroup) ent).LocalId == primLocalID) { - ((SceneObjectGroup) ent).GetProperites(remoteClient); + ((SceneObjectGroup) ent).GetProperties(remoteClient); ((SceneObjectGroup) ent).IsSelected = true; LandManager.setPrimsTainted(); break; diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 83f0c27..78e7868 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -1078,7 +1078,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void GetProperites(IClientAPI client) + public void GetProperties(IClientAPI client) { ObjectPropertiesPacket proper = (ObjectPropertiesPacket) PacketPool.Instance.GetPacket(PacketType.ObjectProperties); // TODO: don't create new blocks if recycling an old packet diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index 06c0472..180ed51 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -1577,65 +1577,43 @@ namespace OpenSim.Region.Environment.Scenes public void UpdatePermissions(LLUUID AgentID, byte field, uint localID, uint mask, byte addRemTF) { + bool set = addRemTF == 1; + // Are we the owner? if (AgentID == OwnerID) { - m_log.Info("[PERMISSIONS]: field: " + field.ToString() + ", mask: " + mask.ToString() + " addRemTF: " + - addRemTF.ToString()); - - //Field 8 = EveryoneMask - if (field == (byte) 8) - { - m_log.Info("[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(); - SendFullUpdateToAllClientsExcept(AgentID); - } - //Field 16 = NextownerMask - if (field == (byte) 16) + switch (field) { - if (addRemTF == (byte) 0) - { - NextOwnerMask &= ~mask; - } - else - { - NextOwnerMask |= mask; - } - SendFullUpdateToAllClientsExcept(AgentID); + case 2: + OwnerMask = ApplyMask(OwnerMask, set, mask); + break; + case 4: + GroupMask = ApplyMask(GroupMask, set, mask); + break; + case 8: + EveryoneMask = ApplyMask(EveryoneMask, set, mask); + break; + case 16: + NextOwnerMask = ApplyMask(NextOwnerMask, set, mask); + break; } - if (field == (byte)2) - { - if (addRemTF == (byte)0) - { - //m_parentGroup.SetLocked(true); - //PermissionMask. - OwnerMask &= ~mask; - } - else - { - //m_parentGroup.SetLocked(false); - OwnerMask |= mask; - } - SendFullUpdateToAllClients(); - - } + ScheduleFullUpdate(); + } + } + private uint ApplyMask(uint val, bool set, uint mask) + { + if (set) + { + return val |= mask; + } + else + { + return val &= ~mask; } } - + #region Client Update Methods public void AddFullUpdateToAllAvatars() -- cgit v1.1