From 152b64179bb13c4f9e178cef718db37d25cb9e50 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 21 Feb 2024 15:20:53 +0000 Subject: [PATCH] a few changes to last PR, let getlink select root; add getkeys permissions checks (don't remember why we have those) plus cosmetics --- .../Shared/Api/Implementation/OSSL_Api.cs | 80 +++++++------------ 1 file changed, 27 insertions(+), 53 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index a36ecd7683..5a8414a49e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -5468,11 +5468,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Key osGetInventoryLastOwner(LSL_String itemNameorid) { - TaskInventoryItem item; - if (UUID.TryParse(itemNameorid, out UUID itemID)) - item = m_host.Inventory.GetInventoryItem(itemID); - else - item = m_host.Inventory.GetInventoryItem(itemNameorid); + TaskInventoryItem item = UUID.TryParse(itemNameorid, out UUID itemID) ? + m_host.Inventory.GetInventoryItem(itemID) : + m_host.Inventory.GetInventoryItem(itemNameorid); if (item is null) return LSL_String.NullKey; @@ -5509,54 +5507,42 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osGetLinkInventoryName(LSL_Integer linkNumber, LSL_Key itemId) { - if(linkNumber <= 1) - return LSL_String.Empty; - TaskInventoryItem item = null; - SceneObjectPart part = GetSingleLinkPart(linkNumber); - if(part == null) - return LSL_String.Empty; - if (UUID.TryParse(itemId, out UUID itemID)) - item = part.Inventory.GetInventoryItem(itemID); + { + SceneObjectPart part = GetSingleLinkPart(linkNumber); + if(part == null) + return LSL_String.Empty; + item = part.Inventory.GetInventoryItem(itemID); + } return (item is null) ? LSL_String.Empty : item.Name; } public LSL_String osGetInventoryDesc(LSL_String itemNameorid) { - TaskInventoryItem item; - if (UUID.TryParse(itemNameorid, out UUID itemID)) - item = m_host.Inventory.GetInventoryItem(itemID); - else - item = m_host.Inventory.GetInventoryItem(itemNameorid); + TaskInventoryItem item = UUID.TryParse(itemNameorid, out UUID itemID) ? + m_host.Inventory.GetInventoryItem(itemID) : + m_host.Inventory.GetInventoryItem(itemNameorid); return (item == null) ? LSL_String.Empty : item.Description; } public LSL_String osGetLinkInventoryDesc(LSL_Integer linkNumber, LSL_String itemNameorid) { - if(linkNumber <= 1) - return LSL_String.Empty; - - TaskInventoryItem item; SceneObjectPart part = GetSingleLinkPart(linkNumber); if(part == null) return LSL_String.Empty; - if (UUID.TryParse(itemNameorid, out UUID itemID)) - item = part.Inventory.GetInventoryItem(itemID); - else - item = part.Inventory.GetInventoryItem(itemNameorid); + TaskInventoryItem item = UUID.TryParse(itemNameorid, out UUID itemID) ? + part.Inventory.GetInventoryItem(itemID) : + part.Inventory.GetInventoryItem(itemNameorid); return (item == null) ? LSL_String.Empty : item.Description; } public LSL_Key osGetLinkInventoryKey(LSL_Integer linkNumber, LSL_String name) { - if(linkNumber <= 1) - return LSL_String.NullKey; - SceneObjectPart part = GetSingleLinkPart(linkNumber); if(part == null) return LSL_String.NullKey; @@ -5582,7 +5568,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api m_host.TaskInventory.LockItemsForRead(true); foreach (KeyValuePair inv in m_host.TaskInventory) { - if (inv.Value.Type == type || type == -1) + if ((inv.Value.Type == type || type == -1) && + (inv.Value.CurrentPermissions + & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) + == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) ret.Add(inv.Value.ItemID.ToString()); } @@ -5593,8 +5582,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_List osGetLinkInventoryKeys(LSL_Integer linkNumber, LSL_Integer type) { LSL_List ret = new(); - if(linkNumber <= 1) - return ret; SceneObjectPart part = GetSingleLinkPart(linkNumber); if(part == null) @@ -5603,7 +5590,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api part.TaskInventory.LockItemsForRead(true); foreach (KeyValuePair inv in part.TaskInventory) { - if (inv.Value.Type == type || type == -1) + if (inv.Value.Type == type || type == -1 && + (inv.Value.CurrentPermissions + & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) + == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) ret.Add(inv.Value.ItemID.ToString()); } @@ -5629,8 +5619,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_List osGetLinkInventoryNames(LSL_Integer linkNumber, LSL_Integer type) { LSL_List ret = new(); - if(linkNumber <= 1) - return ret; SceneObjectPart part = GetSingleLinkPart(linkNumber); if(part == null) @@ -5656,9 +5644,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api ///The name of the item to give. public void osGiveLinkInventory(LSL_Integer linkNumber, LSL_Key destination, LSL_String inventory) { - if(linkNumber <= 1) - return; - if (!UUID.TryParse(destination, out UUID destId) || destId.IsZero()) return; @@ -5666,29 +5651,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if(part == null) return; - UUID inventoryID = ScriptUtils.GetAssetIdFromKeyOrItemName(part, inventory); - if (inventoryID.IsZero()) - return; - TaskInventoryItem item = part.Inventory.GetInventoryItem(inventory); - if (item == null) + if (item == null || item.AssetID.IsZero()) return; - UUID objId = item.ItemID; - // check if destination is an object if (World.GetSceneObjectPart(destId) != null) { // destination is an object - World.MoveTaskInventoryItem(destId, part, objId); + World.MoveTaskInventoryItem(destId, part, item.ItemID); } else { - ScenePresence presence = World.GetScenePresence(destId); - - if (presence == null) + if(!World.TryGetScenePresence(destId, out ScenePresence _)) { - UserAccount account = World.UserAccountService.GetUserAccount(World.RegionInfo.ScopeID, destId); if (account == null) @@ -5696,13 +5672,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api GridUserInfo info = World.GridUserService.GetGridUserInfo(destId.ToString()); if(info == null || info.Online == false) return; - } } // destination is an avatar - InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, part, objId, out string message); - + InventoryItemBase agentItem = World.MoveTaskInventoryItem(destId, UUID.Zero, part, item.ItemID, out string message); if (agentItem == null) { m_LSL_Api.llSay(0, message);