diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index 132897aae4..ca03e4f25f 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -96,8 +96,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
m_RestrictInventoryAccessAbroad = thisModuleConfig.GetBoolean("RestrictInventoryAccessAbroad", true);
m_CheckSeparateAssets = thisModuleConfig.GetBoolean("CheckSeparateAssets", false);
m_LocalAssetsURL = thisModuleConfig.GetString("RegionHGAssetServerURI", string.Empty);
- m_LocalAssetsURL = m_LocalAssetsURL.Trim(new char[] { '/' });
-
+ m_LocalAssetsURL = m_LocalAssetsURL.Trim('/');
}
else
m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found");
@@ -318,6 +317,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
if (item is null || item.AssetID.IsZero())
return null;
+ if(item.AssetType == (int)AssetType.Link || item.AssetType == (int)AssetType.LinkFolder)
+ {
+ m_log.Error("[HGScene]: request to rez a asset inventory link");
+ return null;
+ }
+
if (attachment && (item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) != 0)
{
if (remoteClient is not null && remoteClient.IsActive)
@@ -325,8 +330,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
return null;
}
- string userAssetServer;
- if (IsForeignUser(remoteClient.AgentId, out userAssetServer))
+ if (IsForeignUser(remoteClient.AgentId, out string userAssetServer))
{
m_assMapper.Get(item.AssetID, remoteClient.AgentId, userAssetServer);
}
@@ -339,6 +343,20 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
}
+ public override void FetchRemoteHGItemAssets(UUID OwnerID, InventoryItemBase item)
+ {
+ if(item is null || item.AssetID.IsZero())
+ return;
+ if(item.AssetType == (int)AssetType.Link || item.AssetType == (int)AssetType.LinkFolder)
+ {
+ m_log.Error("[HGScene]: request to fetch a asset inventory link");
+ return;
+ }
+
+ if (IsForeignUser(OwnerID, out string userAssetServer))
+ m_assMapper.Get(item.AssetID, OwnerID, userAssetServer);
+ }
+
public override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver)
{
string senderAssetServer;
@@ -355,7 +373,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// If both users have the same asset server, no need to transfer the asset
if (senderAssetServer.Equals(receiverAssetServer))
{
- m_log.DebugFormat("[HGScene]: Asset transfer between foreign users, but they have the same server. No transfer.");
+ m_log.Debug("[HGScene]: Asset transfer between foreign users, but they have the same server. No transfer.");
return;
}
@@ -376,19 +394,16 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
{
if (!UserManagementModule.IsLocalGridUser(userID))
{ // foreign
- if (m_Scene.TryGetScenePresence(userID, out ScenePresence sp))
- {
- AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
- if (aCircuit != null && aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI"))
- {
- assetServerURL = aCircuit.ServiceURLs["AssetServerURI"].ToString();
- assetServerURL = assetServerURL.Trim(new char[] { '/' });
- }
- }
- else
+ AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(userID);
+ if (aCircuit != null && aCircuit.ServiceURLs != null &&
+ aCircuit.ServiceURLs.TryGetValue("AssetServerURI", out object oassetServerURL) &&
+ oassetServerURL is string stmp)
+ assetServerURL = stmp.Trim('/');
+
+ if(assetServerURL.Length == 0)
{
assetServerURL = UserManagementModule.GetUserServerURL(userID, "AssetServerURI");
- assetServerURL = assetServerURL.Trim(new char[] { '/' });
+ assetServerURL = assetServerURL.Trim('/');
}
return true;
}
@@ -397,7 +412,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
{
if (IsLocalInventoryAssetsUser(userID, out assetServerURL))
{
- m_log.DebugFormat("[HGScene]: user {0} has local assets {1}", userID, assetServerURL);
+ m_log.Debug($"[HGScene]: user {userID} has local assets {assetServerURL}");
return false;
}
else
@@ -416,10 +431,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
if (assetsURL.Length == 0)
{
AgentCircuitData agent = m_Scene.AuthenticateHandler.GetAgentCircuitData(uuid);
- if (agent != null)
+ if (agent != null && agent.ServiceURLs != null &&
+ agent.ServiceURLs.TryGetValue("AssetServerURI", out object oassetServerURL) &&
+ oassetServerURL is string stmp)
{
- assetsURL = agent.ServiceURLs["AssetServerURI"].ToString();
- assetsURL = assetsURL.Trim(new char[] { '/' });
+ assetsURL = stmp.Trim('/');
}
}
return m_LocalAssetsURL.Equals(assetsURL);
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 12c4a9996a..50adee656a 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -1131,6 +1131,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
return group;
}
+ public virtual void FetchRemoteHGItemAssets(UUID OwnerID, InventoryItemBase item)
+ {
+ }
+
///
/// Do pre-rez processing when the object comes from an item.
///
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
index 292b0d6959..f115044f79 100644
--- a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs
@@ -127,6 +127,8 @@ namespace OpenSim.Region.Framework.Interfaces
UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment);
+ void FetchRemoteHGItemAssets(UUID OwnerID, InventoryItemBase item);
+
void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver);
///
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 7eda657cb2..27767198c3 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1768,9 +1768,7 @@ namespace OpenSim.Region.Framework.Scenes
UUID itemID = itemInfo.ItemID;
if (itemID.IsZero())
{
- m_log.ErrorFormat(
- "[PRIM INVENTORY]: UpdateTaskInventory called with item ID Zero on update for {1}!",
- remoteClient.Name);
+ m_log.Error($"[PRIM INVENTORY]: UpdateTaskInventory called with item ID Zero on update for {remoteClient.Name}");
return;
}
@@ -1778,11 +1776,9 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = GetSceneObjectPart(primLocalID);
if(part is null)
{
- m_log.WarnFormat(
- "[PRIM INVENTORY]: " +
- "Update with item {0} requested of prim {1} for {2} but this prim does not exist",
- itemID, primLocalID, remoteClient.Name);
- return;
+ m_log.Warn(
+ $"[PRIM INVENTORY]: Update prim {primLocalID} with item {itemID} by {remoteClient.Name} but prim not found");
+ return;
}
TaskInventoryItem currentItem = part.Inventory.GetInventoryItem(itemID);
@@ -1797,29 +1793,27 @@ namespace OpenSim.Region.Framework.Scenes
if(item is null)
{
- m_log.ErrorFormat(
- "[PRIM INVENTORY]: Could not find inventory item {0} to update for {1}!",
- itemID, remoteClient.Name);
+ m_log.Error(
+ $"[PRIM INVENTORY]: Could not find inventory item {itemID} to update for {remoteClient.Name}");
return;
}
if (!Permissions.CanDropInObjectInv(item, remoteClient, part))
return;
- UUID copyID = UUID.Random();
bool modrights = Permissions.CanEditObject(part.ParentGroup, remoteClient);
- part.ParentGroup.AddInventoryItem(remoteClient.AgentId, primLocalID, item, copyID, modrights);
- m_log.InfoFormat(
- "[PRIM INVENTORY]: Update with item {0} requested of prim {1} for {2}",
- item.Name, primLocalID, remoteClient.Name);
+ part.ParentGroup.AddInventoryItem(remoteClient.AgentId, primLocalID, item, UUID.Random(), modrights);
+ m_log.Info(
+ $"[PRIM INVENTORY]: Update prim {primLocalID} with item {item.Name} requested by {remoteClient.Name}");
+
+ IInventoryAccessModule invAccess = RequestModuleInterface();
+ invAccess?.FetchRemoteHGItemAssets(remoteClient.AgentId, item);
+
part.SendPropertiesToClient(remoteClient);
if (!Permissions.BypassPermissions())
{
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
- {
- List uuids = new() { itemID };
- RemoveInventoryItem(remoteClient, uuids);
- }
+ RemoveInventoryItem(remoteClient, [itemID]);
}
}
else // Updating existing item with new perms etc