Switched TransferRequest (UDP packet handler) to sync. The permissions checks may block, so they get a FireAndForget. Everything else is non-blocking.
parent
9173130fde
commit
3b48b6a792
|
@ -5374,7 +5374,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
AddLocalPacketHandler(PacketType.ObjectClickAction, HandleObjectClickAction, false);
|
AddLocalPacketHandler(PacketType.ObjectClickAction, HandleObjectClickAction, false);
|
||||||
AddLocalPacketHandler(PacketType.ObjectMaterial, HandleObjectMaterial, false);
|
AddLocalPacketHandler(PacketType.ObjectMaterial, HandleObjectMaterial, false);
|
||||||
AddLocalPacketHandler(PacketType.RequestImage, HandleRequestImage, false);
|
AddLocalPacketHandler(PacketType.RequestImage, HandleRequestImage, false);
|
||||||
AddLocalPacketHandler(PacketType.TransferRequest, HandleTransferRequest);
|
AddLocalPacketHandler(PacketType.TransferRequest, HandleTransferRequest, false);
|
||||||
AddLocalPacketHandler(PacketType.AssetUploadRequest, HandleAssetUploadRequest);
|
AddLocalPacketHandler(PacketType.AssetUploadRequest, HandleAssetUploadRequest);
|
||||||
AddLocalPacketHandler(PacketType.RequestXfer, HandleRequestXfer);
|
AddLocalPacketHandler(PacketType.RequestXfer, HandleRequestXfer);
|
||||||
AddLocalPacketHandler(PacketType.SendXferPacket, HandleSendXferPacket);
|
AddLocalPacketHandler(PacketType.SendXferPacket, HandleSendXferPacket);
|
||||||
|
@ -7751,129 +7751,145 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
//m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
|
//m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
|
||||||
|
|
||||||
TransferRequestPacket transfer = (TransferRequestPacket)Pack;
|
TransferRequestPacket transfer = (TransferRequestPacket)Pack;
|
||||||
//m_log.Debug("Transfer Request: " + transfer.ToString());
|
|
||||||
// Validate inventory transfers
|
|
||||||
// Has to be done here, because AssetCache can't do it
|
|
||||||
//
|
|
||||||
UUID taskID = UUID.Zero;
|
UUID taskID = UUID.Zero;
|
||||||
if (transfer.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
|
if (transfer.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
|
||||||
{
|
{
|
||||||
taskID = new UUID(transfer.TransferInfo.Params, 48);
|
|
||||||
UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
|
|
||||||
UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
|
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
|
||||||
// "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}",
|
|
||||||
// requestID, itemID, taskID, Name);
|
|
||||||
|
|
||||||
if (!(((Scene)m_scene).Permissions.BypassPermissions()))
|
if (!(((Scene)m_scene).Permissions.BypassPermissions()))
|
||||||
{
|
{
|
||||||
if (taskID != UUID.Zero) // Prim
|
// We're spawning a thread because the permissions check can block this thread
|
||||||
|
Util.FireAndForget(delegate
|
||||||
{
|
{
|
||||||
SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
|
// This requests the asset if needed
|
||||||
|
HandleSimInventoryTransferRequestWithPermsCheck(sender, transfer);
|
||||||
if (part == null)
|
});
|
||||||
{
|
return true;
|
||||||
m_log.WarnFormat(
|
|
||||||
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist",
|
|
||||||
Name, requestID, itemID, taskID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID);
|
|
||||||
if (tii == null)
|
|
||||||
{
|
|
||||||
m_log.WarnFormat(
|
|
||||||
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist",
|
|
||||||
Name, requestID, itemID, taskID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tii.Type == (int)AssetType.LSLText)
|
|
||||||
{
|
|
||||||
if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else if (tii.Type == (int)AssetType.Notecard)
|
|
||||||
{
|
|
||||||
if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// TODO: Change this code to allow items other than notecards and scripts to be successfully
|
|
||||||
// shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule
|
|
||||||
if (part.OwnerID != AgentId)
|
|
||||||
{
|
|
||||||
m_log.WarnFormat(
|
|
||||||
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}",
|
|
||||||
Name, requestID, itemID, taskID, part.OwnerID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
|
||||||
{
|
|
||||||
m_log.WarnFormat(
|
|
||||||
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set",
|
|
||||||
Name, requestID, itemID, taskID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tii.OwnerID != AgentId)
|
|
||||||
{
|
|
||||||
m_log.WarnFormat(
|
|
||||||
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}",
|
|
||||||
Name, requestID, itemID, taskID, tii.OwnerID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((
|
|
||||||
tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
|
|
||||||
!= ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
|
|
||||||
{
|
|
||||||
m_log.WarnFormat(
|
|
||||||
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer",
|
|
||||||
Name, requestID, itemID, taskID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tii.AssetID != requestID)
|
|
||||||
{
|
|
||||||
m_log.WarnFormat(
|
|
||||||
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}",
|
|
||||||
Name, requestID, itemID, taskID, tii.AssetID);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // Agent
|
|
||||||
{
|
|
||||||
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
|
|
||||||
if (invAccess != null)
|
|
||||||
{
|
|
||||||
if (!invAccess.CanGetAgentInventoryItem(this, itemID, requestID))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if (transfer.TransferInfo.SourceType == (int)SourceType.SimEstate)
|
||||||
if (transfer.TransferInfo.SourceType == (int)SourceType.SimEstate)
|
{
|
||||||
{
|
//TransferRequestPacket does not include covenant uuid?
|
||||||
//TransferRequestPacket does not include covenant uuid?
|
//get scene covenant uuid
|
||||||
//get scene covenant uuid
|
taskID = m_scene.RegionInfo.RegionSettings.Covenant;
|
||||||
taskID = m_scene.RegionInfo.RegionSettings.Covenant;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
// This is non-blocking
|
||||||
MakeAssetRequest(transfer, taskID);
|
MakeAssetRequest(transfer, taskID);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void HandleSimInventoryTransferRequestWithPermsCheck(IClientAPI sender, TransferRequestPacket transfer)
|
||||||
|
{
|
||||||
|
UUID taskID = new UUID(transfer.TransferInfo.Params, 48);
|
||||||
|
UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
|
||||||
|
UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
|
||||||
|
|
||||||
|
//m_log.DebugFormat(
|
||||||
|
// "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}",
|
||||||
|
// requestID, itemID, taskID, Name);
|
||||||
|
|
||||||
|
//m_log.Debug("Transfer Request: " + transfer.ToString());
|
||||||
|
// Validate inventory transfers
|
||||||
|
// Has to be done here, because AssetCache can't do it
|
||||||
|
//
|
||||||
|
if (taskID != UUID.Zero) // Prim
|
||||||
|
{
|
||||||
|
SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
|
||||||
|
|
||||||
|
if (part == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist",
|
||||||
|
Name, requestID, itemID, taskID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID);
|
||||||
|
if (tii == null)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist",
|
||||||
|
Name, requestID, itemID, taskID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tii.Type == (int)AssetType.LSLText)
|
||||||
|
{
|
||||||
|
if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (tii.Type == (int)AssetType.Notecard)
|
||||||
|
{
|
||||||
|
if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: Change this code to allow items other than notecards and scripts to be successfully
|
||||||
|
// shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule
|
||||||
|
if (part.OwnerID != AgentId)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}",
|
||||||
|
Name, requestID, itemID, taskID, part.OwnerID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set",
|
||||||
|
Name, requestID, itemID, taskID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tii.OwnerID != AgentId)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}",
|
||||||
|
Name, requestID, itemID, taskID, tii.OwnerID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((
|
||||||
|
tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
|
||||||
|
!= ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer",
|
||||||
|
Name, requestID, itemID, taskID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tii.AssetID != requestID)
|
||||||
|
{
|
||||||
|
m_log.WarnFormat(
|
||||||
|
"[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}",
|
||||||
|
Name, requestID, itemID, taskID, tii.AssetID);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // Agent
|
||||||
|
{
|
||||||
|
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
|
||||||
|
if (invAccess != null)
|
||||||
|
{
|
||||||
|
if (!invAccess.CanGetAgentInventoryItem(this, itemID, requestID))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Permissions out of the way, let's request the asset
|
||||||
|
MakeAssetRequest(transfer, taskID);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private bool HandleAssetUploadRequest(IClientAPI sender, Packet Pack)
|
private bool HandleAssetUploadRequest(IClientAPI sender, Packet Pack)
|
||||||
{
|
{
|
||||||
AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
|
AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
|
||||||
|
|
Loading…
Reference in New Issue