diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 395d5553ff..1eab16b399 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -4528,7 +4528,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP handlerObjectPermissions = OnObjectPermissions; if (handlerObjectPermissions != null) - OnObjectPermissions(this, AgentID, SessionID, field, localID, mask, set); + handlerObjectPermissions(this, AgentID, SessionID, field, localID, mask, set); } } diff --git a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs index 7cf2427e06..d31a2501b1 100644 --- a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs @@ -143,6 +143,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions //Register functions with Scene External Checks! m_scene.ExternalChecks.addBypassPermissions(BypassPermissions); //FULLY IMPLEMENTED m_scene.ExternalChecks.addSetBypassPermissions(SetBypassPermissions); //FULLY IMPLEMENTED + m_scene.ExternalChecks.addPropagatePermissions(PropagatePermissions); //FULLY IMPLEMENTED m_scene.ExternalChecks.addCheckAbandonParcel(CanAbandonParcel); //FULLY IMPLEMENTED m_scene.ExternalChecks.addGenerateClientFlags(GenerateClientFlags); //NOT YET FULLY IMPLEMENTED m_scene.ExternalChecks.addCheckBeGodLike(CanBeGodLike); //FULLY IMPLEMENTED @@ -251,6 +252,11 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions } #endregion + public bool PropagatePermissions() + { + return false; + } + public bool BypassPermissions() { return m_bypassPermissions; @@ -813,7 +819,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions if (m_bypassPermissions) return m_bypassPermissionsValue; bool permission = GenericObjectPermission(userID, objectID,false); - if (permission) + if (!permission) { if (!m_scene.Entities.ContainsKey(objectID)) { diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index 6d00f71fc6..aa22740828 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs @@ -1339,11 +1339,11 @@ namespace OpenSim.Region.Environment.Scenes if (IncludeInSearch && m_parentScene.ExternalChecks.ExternalChecksCanEditObject(objid, user)) { - obj.AddFlag(LLObject.ObjectFlags.JointWheel); + obj.ParentGroup.RootPart.AddFlag(LLObject.ObjectFlags.JointWheel); } else if (!IncludeInSearch && m_parentScene.ExternalChecks.ExternalChecksCanMoveObject(objid,user)) { - obj.RemFlag(LLObject.ObjectFlags.JointWheel); + obj.ParentGroup.RootPart.RemFlag(LLObject.ObjectFlags.JointWheel); } } diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index 62ad2cd15e..fb142f5ecf 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -284,6 +284,7 @@ namespace OpenSim.Region.Environment.Scenes item.Name = itemUpd.Name; item.Description = itemUpd.Description; item.NextPermissions = itemUpd.NextPermissions; + item.CurrentPermissions |= 8; // Slam! item.EveryOnePermissions = itemUpd.EveryOnePermissions; // TODO: Requires sanity checks @@ -347,7 +348,13 @@ namespace OpenSim.Region.Environment.Scenes InventoryItemBase item = senderUserInfo.RootFolder.FindItem(itemId); if (item != null) - { + { + if (!ExternalChecks.ExternalChecksBypassPermissions()) + { + if((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) + return; + } + // TODO get recipient's root folder CachedUserInfo recipientUserInfo = CommsManager.UserProfileCacheService.GetUserDetails(recipientClient.AgentId); @@ -365,12 +372,37 @@ namespace OpenSim.Region.Environment.Scenes itemCopy.AssetType = item.AssetType; itemCopy.InvType = item.InvType; itemCopy.Folder = recipientUserInfo.RootFolder.ID; - itemCopy.CurrentPermissions = 2147483647; - itemCopy.NextPermissions = 2147483647; - itemCopy.EveryOnePermissions = item.EveryOnePermissions; - itemCopy.BasePermissions = item.BasePermissions; - itemCopy.CurrentPermissions = item.CurrentPermissions; + if (ExternalChecks.ExternalChecksPropagatePermissions()) + { + if(item.InvType == 6) + { + itemCopy.BasePermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); + itemCopy.BasePermissions |= (item.CurrentPermissions & 7) << 13; + } + else + { + Console.WriteLine("Non-Prim item ==>"); + itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions; + } + itemCopy.CurrentPermissions = itemCopy.BasePermissions; + if((item.CurrentPermissions & 8) != 0) // Propagate slam bit + { + itemCopy.CurrentPermissions = item.NextPermissions; + itemCopy.BasePermissions=itemCopy.CurrentPermissions; + itemCopy.CurrentPermissions |= 8; + } + + itemCopy.NextPermissions = item.NextPermissions; + itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions; + } + else + { + itemCopy.CurrentPermissions = item.CurrentPermissions; + itemCopy.NextPermissions = item.NextPermissions; + itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions; + itemCopy.BasePermissions = item.BasePermissions; + } itemCopy.GroupID = item.GroupID; itemCopy.GroupOwned = item.GroupOwned; itemCopy.Flags = item.Flags; @@ -379,6 +411,12 @@ namespace OpenSim.Region.Environment.Scenes recipientUserInfo.AddItem(itemCopy); + if (!ExternalChecks.ExternalChecksBypassPermissions()) + { + if((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) + senderUserInfo.DeleteItem(itemId); + } + // Let the recipient client know about this new item recipientClient.SendBulkUpdateInventory(itemCopy); } @@ -446,9 +484,16 @@ namespace OpenSim.Region.Environment.Scenes if (asset != null) { - // TODO: preserve current permissions? - CreateNewInventoryItem( - remoteClient, newFolderID, callbackID, asset, item.NextPermissions); + if(remoteClient.AgentId == oldAgentID) + { + CreateNewInventoryItem( + remoteClient, newFolderID, callbackID, asset, item.BasePermissions, item.CurrentPermissions, item.EveryOnePermissions, item.NextPermissions); + } + else + { + CreateNewInventoryItem( + remoteClient, newFolderID, callbackID, asset, item.NextPermissions, item.NextPermissions, item.EveryOnePermissions & item.NextPermissions, item.NextPermissions); + } } else { @@ -507,7 +552,6 @@ namespace OpenSim.Region.Environment.Scenes userInfo.DeleteItem(item.ID); - // TODO: preserve current permissions? AddInventoryItem(remoteClient, item); } else @@ -525,6 +569,12 @@ namespace OpenSim.Region.Environment.Scenes } } + private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, uint callbackID, + AssetBase asset, uint nextOwnerMask) + { + CreateNewInventoryItem(remoteClient, folderID, callbackID, asset, nextOwnerMask, nextOwnerMask, 0, nextOwnerMask); + } + /// /// Create a new inventory item. /// @@ -534,7 +584,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, uint callbackID, - AssetBase asset, uint nextOwnerMask) + AssetBase asset, uint baseMask, uint currentMask, uint everyoneMask, uint nextOwnerMask) { CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); @@ -551,8 +601,10 @@ namespace OpenSim.Region.Environment.Scenes item.AssetType = asset.Type; item.InvType = asset.InvType; item.Folder = folderID; - item.CurrentPermissions = 2147483647; + item.CurrentPermissions = currentMask; item.NextPermissions = nextOwnerMask; + item.EveryOnePermissions = everyoneMask; + item.BasePermissions = baseMask; userInfo.AddItem(item); remoteClient.SendInventoryItemCreateUpdate(item); @@ -766,9 +818,9 @@ namespace OpenSim.Region.Environment.Scenes /// public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, uint primLocalId, LLUUID itemId) { - SceneObjectGroup group = GetGroupByPrim(primLocalId); + SceneObjectPart part = GetSceneObjectPart(primLocalId); - if (null == group) + if (null == part) { m_log.WarnFormat( "[PRIM INVENTORY]: " + @@ -778,7 +830,7 @@ namespace OpenSim.Region.Environment.Scenes return; } - TaskInventoryItem taskItem = group.GetInventoryItem(primLocalId, itemId); + TaskInventoryItem taskItem = part.GetInventoryItem(itemId); if (null == taskItem) { @@ -786,19 +838,9 @@ namespace OpenSim.Region.Environment.Scenes return; } -// bool permission; -// permission = Permissions.CanCopyObject(remoteClient.AgentId, -// ((SceneObjectGroup) selectedEnt).UUID); - - // Pending resolving upstream problems with permissions, we just won't allow anybody who is not the owner - // to copy + // Only owner can copy if (remoteClient.AgentId != taskItem.OwnerID) { - m_log.InfoFormat( - "[PRIM INVENTORY]: Attempt made by {0} {1} to copy inventory item {2} {3} in prim {4} {5}," - + " but temporarily not allowed pending upstream bugfixes/feature implementation", - remoteClient.Name, remoteClient.AgentId, taskItem.Name, taskItem.ItemID, group.Name, group.UUID); - return; } @@ -813,22 +855,29 @@ namespace OpenSim.Region.Environment.Scenes agentItem.AssetType = taskItem.Type; agentItem.InvType = taskItem.InvType; agentItem.Folder = folderId; - agentItem.EveryOnePermissions = taskItem.EveryoneMask; - if (remoteClient.AgentId != taskItem.OwnerID) + if ((remoteClient.AgentId != taskItem.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) { agentItem.BasePermissions = taskItem.NextOwnerMask; agentItem.CurrentPermissions = taskItem.NextOwnerMask; agentItem.NextPermissions = taskItem.NextOwnerMask; + agentItem.EveryOnePermissions = taskItem.EveryoneMask & taskItem.NextOwnerMask; } else { agentItem.BasePermissions = taskItem.BaseMask; agentItem.CurrentPermissions = taskItem.OwnerMask; - agentItem.NextPermissions = taskItem.NextOwnerMask; + agentItem.NextPermissions = taskItem.NextOwnerMask; + agentItem.EveryOnePermissions = taskItem.EveryoneMask; } AddInventoryItem(remoteClient, agentItem); + if (!ExternalChecks.ExternalChecksBypassPermissions()) + { + if((taskItem.OwnerMask & (uint)PermissionMask.Copy) == 0) + part.RemoveInventoryItem(itemId); + } + } /// @@ -842,9 +891,9 @@ namespace OpenSim.Region.Environment.Scenes public void UpdateTaskInventory(IClientAPI remoteClient, LLUUID itemID, LLUUID folderID, uint primLocalID) { - SceneObjectGroup group = GetGroupByPrim(primLocalID); + SceneObjectPart part = GetSceneObjectPart(primLocalID); - if (group != null) + if (part != null) { LLUUID copyID = LLUUID.Random(); if (itemID != LLUUID.Zero) @@ -864,11 +913,16 @@ namespace OpenSim.Region.Environment.Scenes if (item != null) { - group.AddInventoryItem(remoteClient, primLocalID, item, copyID); + part.ParentGroup.AddInventoryItem(remoteClient, primLocalID, item, copyID); m_log.InfoFormat( "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}", item.Name, primLocalID, remoteClient.Name); - group.GetProperties(remoteClient); + part.ParentGroup.GetProperties(remoteClient); + if (!ExternalChecks.ExternalChecksBypassPermissions()) + { + if((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) + RemoveInventoryItem(remoteClient, itemID); + } } else { @@ -915,12 +969,12 @@ namespace OpenSim.Region.Environment.Scenes if (item != null) { - SceneObjectGroup group = GetGroupByPrim(localID); - if (group != null) + SceneObjectPart part = GetSceneObjectPart(localID); + if (part != null) { - group.AddInventoryItem(remoteClient, localID, item, copyID); - group.StartScript(localID, copyID); - group.GetProperties(remoteClient); + part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); + part.ParentGroup.StartScript(localID, copyID); + part.ParentGroup.GetProperties(remoteClient); // m_log.InfoFormat("[PRIMINVENTORY]: " + // "Rezzed script {0} into prim local ID {1} for user {2}", @@ -959,7 +1013,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// public virtual void DeRezObject(Packet packet, IClientAPI remoteClient) - { + { DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet; if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero) @@ -1038,18 +1092,21 @@ namespace OpenSim.Region.Environment.Scenes item.AssetType = asset.Type; item.InvType = asset.InvType; item.Folder = DeRezPacket.AgentBlock.DestinationID; - item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; - if (remoteClient.AgentId != objectGroup.RootPart.OwnerID) + if ((remoteClient.AgentId != objectGroup.RootPart.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) { - item.BasePermissions = objectGroup.RootPart.NextOwnerMask; - item.CurrentPermissions = objectGroup.RootPart.NextOwnerMask; - item.NextPermissions = objectGroup.RootPart.NextOwnerMask; + objectGroup.ApplyNextOwnerPermissions(); + + item.BasePermissions = objectGroup.GetEffectivePermissions() & objectGroup.RootPart.NextOwnerMask; + item.CurrentPermissions = objectGroup.GetEffectivePermissions() & objectGroup.RootPart.NextOwnerMask; + item.NextPermissions = objectGroup.GetEffectivePermissions() & objectGroup.RootPart.NextOwnerMask; + item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; } else { - item.BasePermissions = objectGroup.RootPart.BaseMask; - item.CurrentPermissions = objectGroup.RootPart.OwnerMask; + item.BasePermissions = objectGroup.GetEffectivePermissions(); + item.CurrentPermissions = objectGroup.GetEffectivePermissions(); item.NextPermissions = objectGroup.RootPart.NextOwnerMask; + item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; } // TODO: add the new fields (Flags, Sale info, etc) @@ -1068,6 +1125,7 @@ namespace OpenSim.Region.Environment.Scenes } } } + public void updateKnownAsset(IClientAPI remoteClient, SceneObjectGroup grp, LLUUID assetID, LLUUID agentID) { SceneObjectGroup objectGroup = grp; @@ -1130,19 +1188,20 @@ namespace OpenSim.Region.Environment.Scenes // Sticking it in root folder for now.. objects folder later? item.Folder = foundFolder;// DeRezPacket.AgentBlock.DestinationID; - item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; - if (agentID != objectGroup.RootPart.OwnerID) + if ((agentID != objectGroup.RootPart.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) { item.BasePermissions = objectGroup.RootPart.NextOwnerMask; item.CurrentPermissions = objectGroup.RootPart.NextOwnerMask; item.NextPermissions = objectGroup.RootPart.NextOwnerMask; + item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; } - else - { - item.BasePermissions = objectGroup.RootPart.BaseMask; - item.CurrentPermissions = objectGroup.RootPart.OwnerMask; + else + { + item.BasePermissions = objectGroup.GetEffectivePermissions(); + item.CurrentPermissions = objectGroup.GetEffectivePermissions(); item.NextPermissions = objectGroup.RootPart.NextOwnerMask; - } + item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; + } userInfo.AddItem(item); @@ -1187,18 +1246,19 @@ namespace OpenSim.Region.Environment.Scenes // Sticking it in root folder for now.. objects folder later? item.Folder = userInfo.RootFolder.ID;// DeRezPacket.AgentBlock.DestinationID; - item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; - if (remoteClient.AgentId != objectGroup.RootPart.OwnerID) + if ((remoteClient.AgentId != objectGroup.RootPart.OwnerID) && ExternalChecks.ExternalChecksPropagatePermissions()) { item.BasePermissions = objectGroup.RootPart.NextOwnerMask; item.CurrentPermissions = objectGroup.RootPart.NextOwnerMask; item.NextPermissions = objectGroup.RootPart.NextOwnerMask; + item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; } else { item.BasePermissions = objectGroup.RootPart.BaseMask; item.CurrentPermissions = objectGroup.RootPart.OwnerMask; item.NextPermissions = objectGroup.RootPart.NextOwnerMask; + item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; } userInfo.AddItem(item); @@ -1344,18 +1404,33 @@ namespace OpenSim.Region.Environment.Scenes rootPart.Description = item.Description; List partList = new List(group.Children.Values); + + if(rootPart.OwnerID != item.Owner) + { + if((item.CurrentPermissions & 8) != 0) + { + foreach (SceneObjectPart part in partList) + { + part.EveryoneMask = item.EveryOnePermissions; + part.NextOwnerMask = item.NextPermissions; + } + } + group.ApplyNextOwnerPermissions(); + } + foreach (SceneObjectPart part in partList) { if (part.OwnerID != item.Owner) { part.LastOwnerID = part.OwnerID; part.OwnerID = item.Owner; - part.EveryoneMask = item.EveryOnePermissions; - part.BaseMask = item.BasePermissions; - part.OwnerMask = item.CurrentPermissions; - part.NextOwnerMask = item.NextPermissions; part.ChangeInventoryOwner(item.Owner); } + else if(((item.CurrentPermissions & 8) != 0) && (!attachment)) // Slam! + { + part.EveryoneMask = item.EveryOnePermissions; + part.NextOwnerMask = item.NextPermissions; + } } rootPart.TrimPermissions(); @@ -1421,18 +1496,33 @@ namespace OpenSim.Region.Environment.Scenes rootPart.Description = item.Description; List partList = new List(group.Children.Values); + + if(rootPart.OwnerID != item.OwnerID) + { + if((item.OwnerMask & 8) != 0) + { + foreach (SceneObjectPart part in partList) + { + part.EveryoneMask = item.EveryoneMask; + part.NextOwnerMask = item.NextOwnerMask; + } + } + group.ApplyNextOwnerPermissions(); + } + foreach (SceneObjectPart part in partList) { if (part.OwnerID != item.OwnerID) { part.LastOwnerID = part.OwnerID; part.OwnerID = item.OwnerID; - part.EveryoneMask = item.EveryoneMask; - part.BaseMask = item.BaseMask; - part.OwnerMask = item.OwnerMask; - part.NextOwnerMask = item.NextOwnerMask; part.ChangeInventoryOwner(item.OwnerID); } + else if((item.OwnerMask & 8) != 0) // Slam! + { + part.EveryoneMask = item.EveryoneMask; + part.NextOwnerMask = item.NextOwnerMask; + } } rootPart.TrimPermissions(); if (group.RootPart.Shape.PCode == (byte)PCode.Prim) diff --git a/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs b/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs index fcc6c758f7..645c302f1f 100644 --- a/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs +++ b/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs @@ -61,7 +61,16 @@ namespace OpenSim.Region.Environment.Scenes public uint ExternalChecksGenerateClientFlags(LLUUID userID, LLUUID objectID) { - uint perms=(uint)2147483647; + SceneObjectPart part=m_scene.GetSceneObjectPart(objectID); + + uint perms=part.GetEffectiveObjectFlags() | + (uint)LLObject.ObjectFlags.ObjectModify | + (uint)LLObject.ObjectFlags.ObjectCopy | + (uint)LLObject.ObjectFlags.ObjectMove | + (uint)LLObject.ObjectFlags.ObjectTransfer | + (uint)LLObject.ObjectFlags.ObjectYouOwner | + (uint)LLObject.ObjectFlags.ObjectYouOfficer; + foreach (GenerateClientFlags check in GenerateClientFlagsCheckFunctions) { perms &= check(userID, objectID); @@ -117,6 +126,32 @@ namespace OpenSim.Region.Environment.Scenes return true; } + public delegate bool PropagatePermissions(); + private List PropagatePermissionsCheckFunctions = new List(); + + public void addPropagatePermissions(PropagatePermissions delegateFunc) + { + if (!PropagatePermissionsCheckFunctions.Contains(delegateFunc)) + PropagatePermissionsCheckFunctions.Add(delegateFunc); + } + public void removePropagatePermissions(PropagatePermissions delegateFunc) + { + if (PropagatePermissionsCheckFunctions.Contains(delegateFunc)) + PropagatePermissionsCheckFunctions.Remove(delegateFunc); + } + + public bool ExternalChecksPropagatePermissions() + { + foreach (PropagatePermissions check in PropagatePermissionsCheckFunctions) + { + if (check() == false) + { + return false; + } + } + return true; + } + #region REZ OBJECT public delegate bool CanRezObject(int objectCount, LLUUID owner, LLVector3 objectPosition, Scene scene); private List CanRezObjectCheckFunctions = new List(); diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs index 721680f91b..8a7096f8c5 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs @@ -25,6 +25,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +using System; using System.Reflection; using libsecondlife; using log4net; @@ -282,5 +283,38 @@ namespace OpenSim.Region.Environment.Scenes return -1; } + + public uint GetEffectivePermissions() + { + uint perms=(uint)(PermissionMask.Modify | + PermissionMask.Copy | + PermissionMask.Move | + PermissionMask.Transfer) | 7; + + foreach (SceneObjectPart part in m_parts.Values) + perms &= part.MaskEffectivePermissions(); + + if((RootPart.OwnerMask & (uint)PermissionMask.Modify) == 0) + perms &= ~(uint)PermissionMask.Modify; + if((RootPart.OwnerMask & (uint)PermissionMask.Copy) == 0) + perms &= ~(uint)PermissionMask.Copy; + if((RootPart.OwnerMask & (uint)PermissionMask.Transfer) == 0) + perms &= ~(uint)PermissionMask.Transfer; + + if((RootPart.OwnerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Modify) == 0) + perms &= ~((uint)PermissionMask.Modify >> 13); + if((RootPart.OwnerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Copy) == 0) + perms &= ~((uint)PermissionMask.Copy >> 13); + if((RootPart.OwnerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Transfer) == 0) + perms &= ~((uint)PermissionMask.Transfer >> 13); + + return perms; + } + + public void ApplyNextOwnerPermissions() + { + foreach (SceneObjectPart part in m_parts.Values) + part.ApplyNextOwnerPermissions(); + } } } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 3ec6ed82a2..14bfde0859 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -1352,7 +1352,7 @@ namespace OpenSim.Region.Environment.Scenes { // Apply Next Owner Permissions if we're not bypassing permissions if (!m_scene.ExternalChecks.ExternalChecksBypassPermissions()) - m_rootPart.ApplyNextOwnerPermissions(); + ApplyNextOwnerPermissions(); } part.ScheduleFullUpdate(); diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs index 9a9314c87d..e1be8ff6ca 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs @@ -43,19 +43,14 @@ namespace OpenSim.Region.Environment.Scenes private string m_inventoryFileName = String.Empty; - /// - /// The inventory folder for this prim - /// - private LLUUID m_folderID = LLUUID.Zero; - /// /// Exposing this is not particularly good, but it's one of the least evils at the moment to see /// folder id from prim inventory item data, since it's not (yet) actually stored with the prim. /// public LLUUID FolderID { - get { return m_folderID; } - set { m_folderID = value; } + get { return UUID; } + set { } // Don't allow assignment, or legacy prims wil b0rk } /// @@ -133,8 +128,6 @@ namespace OpenSim.Region.Environment.Scenes { item.LastOwnerID = item.OwnerID; item.OwnerID = ownerId; - item.BaseMask = item.NextOwnerMask & (uint)PermissionMask.All; - item.OwnerMask = item.NextOwnerMask & (uint)PermissionMask.All; } } } @@ -291,7 +284,7 @@ namespace OpenSim.Region.Environment.Scenes /// public void AddInventoryItem(TaskInventoryItem item) { - item.ParentID = m_folderID; + item.ParentID = UUID; item.CreationDate = 1000; item.ParentPartID = UUID; @@ -486,7 +479,7 @@ namespace OpenSim.Region.Environment.Scenes // Confusingly, the folder item has to be the object id, while the 'parent id' has to be zero. This matches // what appears to happen in the Second Life protocol. If this isn't the case. then various functionality // isn't available (such as drag from prim inventory to agent inventory) - InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, LLUUID.Zero); + InventoryStringBuilder invString = new InventoryStringBuilder(UUID, LLUUID.Zero); lock (m_taskInventory) { @@ -494,26 +487,15 @@ namespace OpenSim.Region.Environment.Scenes { invString.AddItemStart(); invString.AddNameValueLine("item_id", item.ItemID.ToString()); - invString.AddNameValueLine("parent_id", m_folderID.ToString()); + invString.AddNameValueLine("parent_id", UUID.ToString()); invString.AddPermissionsStart(); - // FIXME: Temporary until permissions are properly sorted. - invString.AddNameValueLine("base_mask", "7fffffff"); - invString.AddNameValueLine("owner_mask", "7fffffff"); - invString.AddNameValueLine("group_mask", "7fffffff"); - invString.AddNameValueLine("everyone_mask", "7fffffff"); - invString.AddNameValueLine("next_owner_mask", "7fffffff"); - -// invString.AddNameValueLine("group_mask", "00000000"); -// invString.AddNameValueLine("everyone_mask", "00000000"); -// invString.AddNameValueLine("next_owner_mask", "00086000"); - -// invString.AddNameValueLine("base_mask", Helpers.UIntToHexString(item.BaseMask)); -// invString.AddNameValueLine("owner_mask", Helpers.UIntToHexString(item.OwnerMask)); -// invString.AddNameValueLine("group_mask", Helpers.UIntToHexString(item.GroupMask)); -// invString.AddNameValueLine("everyone_mask", Helpers.UIntToHexString(item.EveryoneMask)); -// invString.AddNameValueLine("next_owner_mask", Helpers.UIntToHexString(item.NextOwnerMask)); + invString.AddNameValueLine("base_mask", Helpers.UIntToHexString(item.BaseMask)); + invString.AddNameValueLine("owner_mask", Helpers.UIntToHexString(item.OwnerMask)); + invString.AddNameValueLine("group_mask", "00000000"); + invString.AddNameValueLine("everyone_mask", "00000000"); + invString.AddNameValueLine("next_owner_mask", Helpers.UIntToHexString(item.NextOwnerMask)); invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); invString.AddNameValueLine("owner_id", item.OwnerID.ToString()); @@ -538,8 +520,6 @@ namespace OpenSim.Region.Environment.Scenes invString.AddNameValueLine("desc", item.Description + "|"); invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); -// invString.AddNameValueLine("creation_date", "1209151453"); - invString.AddSectionEnd(); } } @@ -629,5 +609,65 @@ namespace OpenSim.Region.Environment.Scenes { } } + + public uint MaskEffectivePermissions() + { + uint mask=0x7fffffff; + + foreach (TaskInventoryItem item in m_taskInventory.Values) + { + if(item.InvType != 6) + { + if((item.OwnerMask & item.NextOwnerMask & (uint)PermissionMask.Copy) == 0) + mask &= ~((uint)PermissionMask.Copy >> 13); + if((item.OwnerMask & item.NextOwnerMask & (uint)PermissionMask.Transfer) == 0) + mask &= ~((uint)PermissionMask.Transfer >> 13); + if((item.OwnerMask & item.NextOwnerMask & (uint)PermissionMask.Modify) == 0) + mask &= ~((uint)PermissionMask.Modify >> 13); + } + else + { + if((item.OwnerMask & ((uint)PermissionMask.Copy >> 13)) == 0) + mask &= ~((uint)PermissionMask.Copy >> 13); + if((item.OwnerMask & ((uint)PermissionMask.Transfer >> 13)) == 0) + mask &= ~((uint)PermissionMask.Transfer >> 13); + if((item.OwnerMask & ((uint)PermissionMask.Modify >> 13)) == 0) + mask &= ~((uint)PermissionMask.Modify >> 13); + } + + if((item.OwnerMask & (uint)PermissionMask.Copy) == 0) + mask &= ~(uint)PermissionMask.Copy; + if((item.OwnerMask & (uint)PermissionMask.Transfer) == 0) + mask &= ~(uint)PermissionMask.Transfer; + if((item.OwnerMask & (uint)PermissionMask.Modify) == 0) + mask &= ~(uint)PermissionMask.Modify; + } + return mask; + } + + public void ApplyNextOwnerPermissions() + { + BaseMask &= NextOwnerMask; + OwnerMask &= NextOwnerMask; + EveryoneMask &= NextOwnerMask; + + foreach (TaskInventoryItem item in m_taskInventory.Values) + { + if(item.InvType == 6) + { + if((item.OwnerMask & ((uint)PermissionMask.Copy >> 13)) == 0) + item.OwnerMask &= ~(uint)PermissionMask.Copy; + if((item.OwnerMask & ((uint)PermissionMask.Transfer >> 13)) == 0) + item.OwnerMask &= ~(uint)PermissionMask.Transfer; + if((item.OwnerMask & ((uint)PermissionMask.Modify >> 13)) == 0) + item.OwnerMask &= ~(uint)PermissionMask.Modify; + } + item.OwnerMask &= item.NextOwnerMask; + item.BaseMask &= item.NextOwnerMask; + item.EveryoneMask &= item.NextOwnerMask; + } + + TriggerScriptChangedEvent(Changed.OWNER); + } } } diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index c171e7874f..0196b9105b 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -813,11 +813,9 @@ namespace OpenSim.Region.Environment.Scenes // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol, // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from // the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log - m_folderID = UUID; Flags = 0; - Flags |= LLObject.ObjectFlags.AllowInventoryDrop | - LLObject.ObjectFlags.CreateSelected; + Flags |= LLObject.ObjectFlags.CreateSelected; TrimPermissions(); //m_undo = new UndoStack(ParentGroup.GetSceneMaxUndo()); @@ -877,9 +875,10 @@ namespace OpenSim.Region.Environment.Scenes /// public static SceneObjectPart FromXml(XmlReader xmlReader) { + // It's not necessary to persist this + XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart)); SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader); - return newobject; } @@ -913,15 +912,6 @@ namespace OpenSim.Region.Environment.Scenes } } - public void ApplyNextOwnerPermissions() - { - BaseMask = NextOwnerMask; - OwnerMask = NextOwnerMask; - - TriggerScriptChangedEvent(Changed.OWNER); - - } - public void TrimPermissions() { @@ -2541,7 +2531,7 @@ namespace OpenSim.Region.Environment.Scenes } info.AddValue("m_inventoryFileName", m_inventoryFileName); - info.AddValue("m_folderID", m_folderID.UUID); + info.AddValue("m_folderID", UUID); info.AddValue("PhysActor", PhysActor); Dictionary TaskInventory_work = new Dictionary();