From e88e93a34a3ba8cb2b8d2669b5ca7d2672f9ed2b Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 15 Dec 2022 23:17:59 +0000 Subject: [PATCH] a few changes on attachment module and Xinventory service --- .../Avatar/Attachments/AttachmentsModule.cs | 132 ++++++++++-------- .../InventoryService/XInventoryService.cs | 111 ++++++++++++--- 2 files changed, 162 insertions(+), 81 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index af75ea9c55..ec3b697c45 100755 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -994,81 +994,89 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments /// private void UpdateKnownItem(IScenePresence sp, SceneObjectGroup grp, string scriptedState) { + if (!grp.HasGroupChanged) + { + if (DebugLevel > 0) + { + m_log.DebugFormat( + "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", + grp.UUID, grp.AttachmentPoint); + } + return; + } + grp.HasGroupChanged = false; + + if (m_invAccessModule is null) + return; + if (grp.FromItemID.IsZero()) { // We can't save temp attachments - grp.HasGroupChanged = false; return; } if(sp.IsNPC) return; - if (grp.HasGroupChanged) + m_log.DebugFormat( + "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", + grp.UUID, grp.AttachmentPoint); + + InventoryItemBase item = m_scene.InventoryService.GetItem(sp.UUID, grp.FromItemID); + if (item != null) { - m_log.DebugFormat( - "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}", - grp.UUID, grp.AttachmentPoint); - - string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, scriptedState); - - InventoryItemBase item = m_scene.InventoryService.GetItem(sp.UUID, grp.FromItemID); - - if (item != null) + if (item.Owner.NotEqual(sp.UUID)) { - // attach is rez, need to update permissions - item.Flags &= ~(uint)(InventoryItemFlags.ObjectSlamPerm | InventoryItemFlags.ObjectOverwriteBase | - InventoryItemFlags.ObjectOverwriteOwner | InventoryItemFlags.ObjectOverwriteGroup | - InventoryItemFlags.ObjectOverwriteEveryone | InventoryItemFlags.ObjectOverwriteNextOwner); - - uint permsBase = (uint)(PermissionMask.Copy | PermissionMask.Transfer | - PermissionMask.Modify | PermissionMask.Move | - PermissionMask.Export | PermissionMask.FoldedMask); - - permsBase &= grp.CurrentAndFoldedNextPermissions(); - permsBase |= (uint)PermissionMask.Move; - item.BasePermissions = permsBase; - item.CurrentPermissions = permsBase; - item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask | (uint)PermissionMask.Move; - item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask; - item.GroupPermissions = permsBase & grp.RootPart.GroupMask; - item.CurrentPermissions &= - ((uint)PermissionMask.Copy | - (uint)PermissionMask.Transfer | - (uint)PermissionMask.Modify | - (uint)PermissionMask.Move | - (uint)PermissionMask.Export | - (uint)PermissionMask.FoldedMask); // Preserve folded permissions ?? - - string name = grp.RootPart.Name; - string desc = grp.RootPart.Description; - - AssetBase asset = m_scene.CreateAsset( - name, desc, - (sbyte)AssetType.Object, - Utils.StringToBytes(sceneObjectXml), - sp.UUID); - - item.Name = name; - item.Description = desc; - item.AssetID = asset.FullID; - item.AssetType = (int)AssetType.Object; - item.InvType = (int)InventoryType.Object; - - if (m_invAccessModule != null) - m_invAccessModule.UpdateInventoryItemAsset(sp.UUID, item, asset); - - if (sp.ControllingClient != null) - sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0); + m_log.DebugFormat("[ATTACHMENTS MODULE]: Updating asset for attachment owner mismach: agent {0}, owner {1}", + sp.UUID, item.Owner); + return; } - grp.HasGroupChanged = false; // Prevent it being saved over and over - } - else if (DebugLevel > 0) - { - m_log.DebugFormat( - "[ATTACHMENTS MODULE]: Don't need to update asset for unchanged attachment {0}, attachpoint {1}", - grp.UUID, grp.AttachmentPoint); + string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, scriptedState); + // attach is rez, need to update permissions + item.Flags &= ~(uint)(InventoryItemFlags.ObjectSlamPerm | InventoryItemFlags.ObjectOverwriteBase | + InventoryItemFlags.ObjectOverwriteOwner | InventoryItemFlags.ObjectOverwriteGroup | + InventoryItemFlags.ObjectOverwriteEveryone | InventoryItemFlags.ObjectOverwriteNextOwner); + + uint permsBase = (uint)(PermissionMask.Copy | PermissionMask.Transfer | + PermissionMask.Modify | PermissionMask.Move | + PermissionMask.Export | PermissionMask.FoldedMask); + + permsBase &= grp.CurrentAndFoldedNextPermissions(); + permsBase |= (uint)PermissionMask.Move; + item.BasePermissions = permsBase; + item.CurrentPermissions = permsBase; + item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask | (uint)PermissionMask.Move; + item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask; + item.GroupPermissions = permsBase & grp.RootPart.GroupMask; + item.CurrentPermissions &= + ((uint)PermissionMask.Copy | + (uint)PermissionMask.Transfer | + (uint)PermissionMask.Modify | + (uint)PermissionMask.Move | + (uint)PermissionMask.Export | + (uint)PermissionMask.FoldedMask); // Preserve folded permissions ?? + + string name = grp.RootPart.Name; + string desc = grp.RootPart.Description; + + AssetBase asset = m_scene.CreateAsset( + name, desc, + (sbyte)AssetType.Object, + Utils.StringToBytes(sceneObjectXml), + sp.UUID); + + item.Name = name; + item.Description = desc; + item.AssetID = asset.FullID; + item.AssetType = (int)AssetType.Object; + item.InvType = (int)InventoryType.Object; + + if (!m_invAccessModule.UpdateInventoryItemAsset(sp.UUID, item, asset)) + return; + + if (sp.ControllingClient != null) + sp.ControllingClient.SendInventoryItemCreateUpdate(item, 0); } } diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index 402dba40ae..6bcd6b3c75 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs @@ -297,6 +297,10 @@ namespace OpenSim.Services.InventoryService inventory.Folders = new List(); inventory.Items = new List(); + InventoryFolderBase f = GetFolder(principalID, folderID); + if (f == null) + return inventory; + XInventoryFolder[] folders = m_Database.GetFolders( new string[] { "parentFolderID"}, new string[] { folderID.ToString() }); @@ -317,12 +321,8 @@ namespace OpenSim.Services.InventoryService inventory.Items.Add(ConvertToOpenSim(i)); } - InventoryFolderBase f = GetFolder(principalID, folderID); - if (f != null) - { - inventory.Version = f.Version; - inventory.OwnerID = f.Owner; - } + inventory.Version = f.Version; + inventory.OwnerID = f.Owner; inventory.FolderID = folderID; return inventory; @@ -562,12 +562,20 @@ namespace OpenSim.Services.InventoryService { // Principal is b0rked. *sigh* // - foreach (InventoryItemBase i in items) + int len = items.Count; + if(len == 0) + return false; + string[] ids = new string[len]; + string[] folders = new string[len]; + int i=0; + foreach (InventoryItemBase it in items) { - m_Database.MoveItem(i.ID.ToString(), i.Folder.ToString()); + ids[i] = it.ID.ToString(); + folders[i++] = it.Folder.ToString(); + } - return true; + return m_Database.MoveItems(ids, folders); } public virtual bool DeleteItems(UUID principalID, List itemIDs) @@ -594,18 +602,39 @@ namespace OpenSim.Services.InventoryService { // Just use the ID... *facepalms* // - foreach (UUID id in itemIDs) - m_Database.DeleteItems("inventoryID", id.ToString()); + if(principalID.IsZero()) + { + foreach (UUID id in itemIDs) + m_Database.DeleteItems("inventoryID", id.ToString()); + } + else + { + string u = principalID.ToString(); + string[] fields = new string[] { "agentID", "inventoryID" }; + foreach (UUID id in itemIDs) + m_Database.DeleteItems( + fields, + new string[] { u, id.ToString()}); + } } - return true; } public virtual InventoryItemBase GetItem(UUID principalID, UUID itemID) { - XInventoryItem[] items = m_Database.GetItems( + XInventoryItem[] items; + if (principalID.IsZero()) + { + items = m_Database.GetItems( new string[] { "inventoryID" }, new string[] { itemID.ToString() }); + } + else + { + items = m_Database.GetItems( + new string[] { "avatarID", "inventoryID" }, + new string[] { principalID.ToString(), itemID.ToString() }); + } if (items.Length == 0) return null; @@ -615,19 +644,63 @@ namespace OpenSim.Services.InventoryService public virtual InventoryItemBase[] GetMultipleItems(UUID userID, UUID[] ids) { - InventoryItemBase[] items = new InventoryItemBase[ids.Length]; - int i = 0; - foreach (UUID id in ids) - items[i++] = GetItem(userID, id); + int len = ids.Length; + if(len == 0) + return new InventoryItemBase[0]; + string[] sids = new string[len]; + + int i; + for(i = 0; i< len; ++i) + sids[i] = ids[i].ToString(); + + XInventoryItem[] xits = m_Database.GetItems("inventoryID", sids); + sids = null; + + len = xits.Length; + InventoryItemBase[] items = new InventoryItemBase[len]; + i = 0; + + if(userID.IsZero()) + { + for (i = 0; i < len; ++i) + { + if (xits[i] == null) + items[i] = null; + else + items[i] = ConvertToOpenSim(xits[i]); + } + } + else + { + for (i = 0; i < len; ++i) + { + if (xits[i] == null) + items[i] = null; + else if (xits[i].avatarID.Equals(userID)) + items[i] = ConvertToOpenSim(xits[i]); + else + items[i] = null; + } + } return items; } public virtual InventoryFolderBase GetFolder(UUID principalID, UUID folderID) { - XInventoryFolder[] folders = m_Database.GetFolders( - new string[] { "folderID"}, + XInventoryFolder[] folders; + if(principalID.IsZero()) + { + folders = m_Database.GetFolders( + new string[] { "folderID" }, new string[] { folderID.ToString() }); + } + else + { + folders = m_Database.GetFolders( + new string[] { "avatarID", "folderID" }, + new string[] { principalID.ToString(), folderID.ToString() }); + } if (folders.Length == 0) return null;