change update of agent or object inventory items assets. This may need better check
parent
dee822208a
commit
b6a02269f7
|
@ -65,7 +65,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
|
int cost, UUID texturesFolder, int nreqtextures, int nreqmeshs, int nreqinstances,
|
||||||
bool IsAtestUpload, ref string error, ref int nextOwnerMask, ref int groupMask, ref int everyoneMask, int[] meshesSides);
|
bool IsAtestUpload, ref string error, ref int nextOwnerMask, ref int groupMask, ref int everyoneMask, int[] meshesSides);
|
||||||
|
|
||||||
public delegate UUID UpdateItem(UUID itemID, byte[] data);
|
public delegate UUID UpdateItem(UUID itemID, UUID objectID, byte[] data);
|
||||||
|
|
||||||
public delegate void UpdateTaskScript(UUID itemID, UUID primID, bool isScriptRunning, byte[] data, ref ArrayList errors);
|
public delegate void UpdateTaskScript(UUID itemID, UUID primID, bool isScriptRunning, byte[] data, ref ArrayList errors);
|
||||||
|
|
||||||
|
@ -73,14 +73,11 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
|
|
||||||
public delegate void NewAsset(AssetBase asset);
|
public delegate void NewAsset(AssetBase asset);
|
||||||
|
|
||||||
public delegate UUID ItemUpdatedCallback(UUID userID, UUID itemID, byte[] data);
|
public delegate UUID ItemUpdatedCallback(UUID userID, UUID itemID, UUID objectID, byte[] data);
|
||||||
|
|
||||||
public delegate ArrayList TaskScriptUpdatedCallback(UUID userID, UUID itemID, UUID primID,
|
public delegate ArrayList TaskScriptUpdatedCallback(UUID userID, UUID itemID, UUID primID,
|
||||||
bool isScriptRunning, byte[] data);
|
bool isScriptRunning, byte[] data);
|
||||||
|
|
||||||
public delegate InventoryCollection FetchInventoryDescendentsCAPS(UUID agentID, UUID folderID, UUID ownerID,
|
|
||||||
bool fetchFolders, bool fetchItems, int sortOrder, out int version);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// XXX Probably not a particularly nice way of allow us to get the scene presence from the scene (chiefly so that
|
/// XXX Probably not a particularly nice way of allow us to get the scene presence from the scene (chiefly so that
|
||||||
/// we can popup a message on the user's client if the inventory service has permanently failed). But I didn't want
|
/// we can popup a message on the user's client if the inventory service has permanently failed). But I didn't want
|
||||||
|
@ -107,7 +104,6 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
public NewAsset AddNewAsset = null;
|
public NewAsset AddNewAsset = null;
|
||||||
public ItemUpdatedCallback ItemUpdatedCall = null;
|
public ItemUpdatedCallback ItemUpdatedCall = null;
|
||||||
public TaskScriptUpdatedCallback TaskScriptUpdatedCall = null;
|
public TaskScriptUpdatedCallback TaskScriptUpdatedCall = null;
|
||||||
public FetchInventoryDescendentsCAPS CAPSFetchInventoryDescendents = null;
|
|
||||||
public GetClientDelegate GetClient = null;
|
public GetClientDelegate GetClient = null;
|
||||||
|
|
||||||
private bool m_persistBakedTextures = false;
|
private bool m_persistBakedTextures = false;
|
||||||
|
@ -227,7 +223,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
RegisterHandlers();
|
RegisterHandlers();
|
||||||
|
|
||||||
AddNewInventoryItem = m_Scene.AddUploadedInventoryItem;
|
AddNewInventoryItem = m_Scene.AddUploadedInventoryItem;
|
||||||
ItemUpdatedCall = m_Scene.CapsUpdateInventoryItemAsset;
|
ItemUpdatedCall = m_Scene.CapsUpdateItemAsset;
|
||||||
TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset;
|
TaskScriptUpdatedCall = m_Scene.CapsUpdateTaskInventoryScriptAsset;
|
||||||
GetClient = m_Scene.SceneGraph.GetControllingClient;
|
GetClient = m_Scene.SceneGraph.GetControllingClient;
|
||||||
|
|
||||||
|
@ -313,11 +309,17 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
"POST", GetNewCapPath(), NewAgentInventoryRequest, "NewFileAgentInventory", null));
|
"POST", GetNewCapPath(), NewAgentInventoryRequest, "NewFileAgentInventory", null));
|
||||||
|
|
||||||
IRequestHandler req = new RestStreamHandler(
|
IRequestHandler req = new RestStreamHandler(
|
||||||
"POST", GetNewCapPath(), NoteCardAgentInventory, "Update*", null);
|
"POST", GetNewCapPath(), UpdateInventoryItemAsset, "Update*", null);
|
||||||
|
|
||||||
m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req);
|
m_HostCapsObj.RegisterHandler("UpdateNotecardAgentInventory", req);
|
||||||
|
m_HostCapsObj.RegisterHandler("UpdateNotecardTaskInventory", req); // a object inv
|
||||||
m_HostCapsObj.RegisterHandler("UpdateAnimSetAgentInventory", req);
|
m_HostCapsObj.RegisterHandler("UpdateAnimSetAgentInventory", req);
|
||||||
m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req);
|
m_HostCapsObj.RegisterHandler("UpdateScriptAgentInventory", req);
|
||||||
m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
|
m_HostCapsObj.RegisterHandler("UpdateScriptAgent", req);
|
||||||
|
m_HostCapsObj.RegisterHandler("UpdateSettingsAgentInventory", req);
|
||||||
|
m_HostCapsObj.RegisterHandler("UpdateSettingsTaskInventory", req); // a object inv
|
||||||
|
m_HostCapsObj.RegisterHandler("UpdateGestureAgentInventory", req);
|
||||||
|
m_HostCapsObj.RegisterHandler("UpdateGestureTaskInventory", req);
|
||||||
|
|
||||||
m_HostCapsObj.RegisterSimpleHandler("UpdateAgentInformation",
|
m_HostCapsObj.RegisterSimpleHandler("UpdateAgentInformation",
|
||||||
new SimpleStreamHandler(GetNewCapPath(), UpdateAgentInformation));
|
new SimpleStreamHandler(GetNewCapPath(), UpdateAgentInformation));
|
||||||
|
@ -499,11 +501,11 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
/// <param name="itemID">Item to update</param>
|
/// <param name="itemID">Item to update</param>
|
||||||
/// <param name="data">New asset data</param>
|
/// <param name="data">New asset data</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public UUID ItemUpdated(UUID itemID, byte[] data)
|
public UUID ItemUpdated(UUID itemID, UUID objectID, byte[] data)
|
||||||
{
|
{
|
||||||
if (ItemUpdatedCall != null)
|
if (ItemUpdatedCall != null)
|
||||||
{
|
{
|
||||||
return ItemUpdatedCall(m_HostCapsObj.AgentID, itemID, data);
|
return ItemUpdatedCall(m_HostCapsObj.AgentID, itemID, objectID, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return UUID.Zero;
|
return UUID.Zero;
|
||||||
|
@ -1364,31 +1366,66 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
/// <param name="path"></param>
|
/// <param name="path"></param>
|
||||||
/// <param name="param"></param>
|
/// <param name="param"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public string NoteCardAgentInventory(string request, string path, string param,
|
public string UpdateInventoryItemAsset(string request, string path, string param,
|
||||||
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
|
||||||
{
|
{
|
||||||
//m_log.Debug("[CAPS]: NoteCardAgentInventory Request in region: " + m_regionName + "\n" + request);
|
m_log.Debug("[CAPS]: UpdateInventoryItemAsset Request in region: " + m_regionName + "\n" + request);
|
||||||
//m_log.Debug("[CAPS]: NoteCardAgentInventory Request is: " + request);
|
|
||||||
|
|
||||||
//OpenMetaverse.StructuredData.OSDMap hash = (OpenMetaverse.StructuredData.OSDMap)OpenMetaverse.StructuredData.LLSDParser.DeserializeBinary(Utils.StringToBytes(request));
|
UUID itemID = UUID.Zero;
|
||||||
Hashtable hash = (Hashtable)LLSD.LLSDDeserialize(Utils.StringToBytes(request));
|
UUID objectID = UUID.Zero;
|
||||||
LLSDItemUpdate llsdRequest = new LLSDItemUpdate();
|
|
||||||
LLSDHelpers.DeserialiseOSDMap(hash, llsdRequest);
|
try
|
||||||
|
{
|
||||||
|
OSD oreq = OSDParser.DeserializeLLSDXml(request);
|
||||||
|
if(oreq is OSDMap)
|
||||||
|
{
|
||||||
|
OSDMap map = oreq as OSDMap;
|
||||||
|
if (map.TryGetValue("item_id", out OSD itmp))
|
||||||
|
itemID = itmp;
|
||||||
|
if (map.TryGetValue("task_id", out OSD tmp))
|
||||||
|
objectID = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
|
||||||
|
if(itemID == UUID.Zero)
|
||||||
|
{
|
||||||
|
LLSDAssetUploadError error = new LLSDAssetUploadError();
|
||||||
|
error.message = "failed to recode request";
|
||||||
|
error.identifier = UUID.Zero;
|
||||||
|
return LLSDHelpers.SerialiseLLSDReply(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (objectID != UUID.Zero)
|
||||||
|
{
|
||||||
|
SceneObjectPart sop = m_Scene.GetSceneObjectPart(objectID);
|
||||||
|
if (sop == null)
|
||||||
|
{
|
||||||
|
LLSDAssetUploadError error = new LLSDAssetUploadError();
|
||||||
|
error.message = "object not found";
|
||||||
|
error.identifier = UUID.Zero;
|
||||||
|
return LLSDHelpers.SerialiseLLSDReply(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!m_Scene.Permissions.CanEditObjectInventory(objectID, m_AgentID))
|
||||||
|
{
|
||||||
|
LLSDAssetUploadError error = new LLSDAssetUploadError();
|
||||||
|
error.message = "No permissions to edit objec";
|
||||||
|
error.identifier = UUID.Zero;
|
||||||
|
return LLSDHelpers.SerialiseLLSDReply(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
string uploaderPath = GetNewCapPath();
|
string uploaderPath = GetNewCapPath();
|
||||||
|
|
||||||
ItemUpdater uploader =
|
ItemUpdater uploader = new ItemUpdater(itemID, objectID, uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile);
|
||||||
new ItemUpdater(llsdRequest.item_id, uploaderPath, m_HostCapsObj.HttpListener, m_dumpAssetsToFile);
|
|
||||||
uploader.OnUpLoad += ItemUpdated;
|
uploader.OnUpLoad += ItemUpdated;
|
||||||
|
|
||||||
m_HostCapsObj.HttpListener.AddStreamHandler(
|
m_HostCapsObj.HttpListener.AddStreamHandler(
|
||||||
new BinaryStreamHandler(
|
new BinaryStreamHandler(
|
||||||
"POST", uploaderPath, uploader.uploaderCaps, "NoteCardAgentInventory", null));
|
"POST", uploaderPath, uploader.uploaderCaps, "UpdateInventoryItemAsset", null));
|
||||||
|
|
||||||
string protocol = "http://";
|
string protocol = m_HostCapsObj.SSLCaps ? "https://" : "http://";
|
||||||
|
|
||||||
if (m_HostCapsObj.SSLCaps)
|
|
||||||
protocol = "https://";
|
|
||||||
|
|
||||||
string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + uploaderPath;
|
string uploaderURL = protocol + m_HostCapsObj.HostName + ":" + m_HostCapsObj.Port.ToString() + uploaderPath;
|
||||||
|
|
||||||
|
@ -1396,8 +1433,7 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
uploadResponse.uploader = uploaderURL;
|
uploadResponse.uploader = uploaderURL;
|
||||||
uploadResponse.state = "upload";
|
uploadResponse.state = "upload";
|
||||||
|
|
||||||
// m_log.InfoFormat("[CAPS]: " +
|
// m_log.InfoFormat("[CAPS]: UpdateAgentInventoryAsset response: {0}",
|
||||||
// "NoteCardAgentInventory response: {0}",
|
|
||||||
// LLSDHelpers.SerialiseLLSDReply(uploadResponse)));
|
// LLSDHelpers.SerialiseLLSDReply(uploadResponse)));
|
||||||
|
|
||||||
return LLSDHelpers.SerialiseLLSDReply(uploadResponse);
|
return LLSDHelpers.SerialiseLLSDReply(uploadResponse);
|
||||||
|
@ -2349,14 +2385,16 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
|
|
||||||
private string uploaderPath = String.Empty;
|
private string uploaderPath = String.Empty;
|
||||||
private UUID inventoryItemID;
|
private UUID inventoryItemID;
|
||||||
|
private UUID objectID;
|
||||||
private IHttpServer httpListener;
|
private IHttpServer httpListener;
|
||||||
private bool m_dumpAssetToFile;
|
private bool m_dumpAssetToFile;
|
||||||
|
|
||||||
public ItemUpdater(UUID inventoryItem, string path, IHttpServer httpServer, bool dumpAssetToFile)
|
public ItemUpdater(UUID inventoryItem, UUID objectid, string path, IHttpServer httpServer, bool dumpAssetToFile)
|
||||||
{
|
{
|
||||||
m_dumpAssetToFile = dumpAssetToFile;
|
m_dumpAssetToFile = dumpAssetToFile;
|
||||||
|
|
||||||
inventoryItemID = inventoryItem;
|
inventoryItemID = inventoryItem;
|
||||||
|
objectID = objectid;
|
||||||
uploaderPath = path;
|
uploaderPath = path;
|
||||||
httpListener = httpServer;
|
httpListener = httpServer;
|
||||||
}
|
}
|
||||||
|
@ -2370,23 +2408,31 @@ namespace OpenSim.Region.ClientStack.Linden
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public string uploaderCaps(byte[] data, string path, string param)
|
public string uploaderCaps(byte[] data, string path, string param)
|
||||||
{
|
{
|
||||||
|
httpListener.RemoveStreamHandler("POST", uploaderPath);
|
||||||
|
|
||||||
UUID inv = inventoryItemID;
|
UUID inv = inventoryItemID;
|
||||||
string res = String.Empty;
|
string res = String.Empty;
|
||||||
LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
|
|
||||||
UUID assetID = UUID.Zero;
|
UUID assetID = UUID.Zero;
|
||||||
handlerUpdateItem = OnUpLoad;
|
handlerUpdateItem = OnUpLoad;
|
||||||
if (handlerUpdateItem != null)
|
if (handlerUpdateItem != null)
|
||||||
|
assetID = handlerUpdateItem(inv, objectID, data);
|
||||||
|
|
||||||
|
if(assetID == UUID.Zero)
|
||||||
{
|
{
|
||||||
assetID = handlerUpdateItem(inv, data);
|
LLSDAssetUploadError uperror = new LLSDAssetUploadError();
|
||||||
|
uperror.message ="Failed to update inventory item asset";
|
||||||
|
uperror.identifier = inv;
|
||||||
|
res = LLSDHelpers.SerialiseLLSDReply(uperror);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LLSDAssetUploadComplete uploadComplete = new LLSDAssetUploadComplete();
|
||||||
|
uploadComplete.new_asset = assetID.ToString();
|
||||||
|
uploadComplete.new_inventory_item = inv;
|
||||||
|
uploadComplete.state = "complete";
|
||||||
|
res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
|
||||||
}
|
}
|
||||||
|
|
||||||
uploadComplete.new_asset = assetID.ToString();
|
|
||||||
uploadComplete.new_inventory_item = inv;
|
|
||||||
uploadComplete.state = "complete";
|
|
||||||
|
|
||||||
res = LLSDHelpers.SerialiseLLSDReply(uploadComplete);
|
|
||||||
|
|
||||||
httpListener.RemoveStreamHandler("POST", uploaderPath);
|
|
||||||
|
|
||||||
if (m_dumpAssetToFile)
|
if (m_dumpAssetToFile)
|
||||||
{
|
{
|
||||||
|
|
|
@ -171,11 +171,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
/// <param name="name"></param>
|
/// <param name="name"></param>
|
||||||
/// <param name="invType"></param>
|
/// <param name="invType"></param>
|
||||||
/// <param name="type"></param>
|
/// <param name="type"></param>
|
||||||
/// <param name="wearableType"></param>
|
/// <param name="subType"></param>
|
||||||
/// <param name="nextOwnerMask"></param>
|
/// <param name="nextOwnerMask"></param>
|
||||||
public void CreateNewInventoryItem(IClientAPI remoteClient, UUID transactionID, UUID folderID,
|
public void CreateNewInventoryItem(IClientAPI remoteClient, UUID transactionID, UUID folderID,
|
||||||
uint callbackID, string description, string name, sbyte invType,
|
uint callbackID, string description, string name, sbyte invType,
|
||||||
sbyte assetType, byte wearableType,
|
sbyte assetType, byte subType,
|
||||||
uint nextOwnerMask, int creationDate)
|
uint nextOwnerMask, int creationDate)
|
||||||
{
|
{
|
||||||
m_log.DebugFormat("[INVENTORY ACCESS MODULE]: Received request to create inventory item {0} in folder {1}, transactionID {2}", name,
|
m_log.DebugFormat("[INVENTORY ACCESS MODULE]: Received request to create inventory item {0} in folder {1}, transactionID {2}", name,
|
||||||
|
@ -203,7 +203,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
{
|
{
|
||||||
if (agentTransactions.HandleItemCreationFromTransaction(
|
if (agentTransactions.HandleItemCreationFromTransaction(
|
||||||
remoteClient, transactionID, folderID, callbackID, description,
|
remoteClient, transactionID, folderID, callbackID, description,
|
||||||
name, invType, assetType, wearableType, nextOwnerMask))
|
name, invType, assetType, subType, nextOwnerMask))
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,6 +214,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
byte[] data = null;
|
byte[] data = null;
|
||||||
uint everyonemask = 0;
|
uint everyonemask = 0;
|
||||||
uint groupmask = 0;
|
uint groupmask = 0;
|
||||||
|
uint flags = 0;
|
||||||
|
|
||||||
if (invType == (sbyte)InventoryType.Landmark && presence != null)
|
if (invType == (sbyte)InventoryType.Landmark && presence != null)
|
||||||
{
|
{
|
||||||
|
@ -225,12 +226,35 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
groupmask = (uint)PermissionMask.AllAndExport;
|
groupmask = (uint)PermissionMask.AllAndExport;
|
||||||
everyonemask = (uint)(PermissionMask.AllAndExport & ~PermissionMask.Modify);
|
everyonemask = (uint)(PermissionMask.AllAndExport & ~PermissionMask.Modify);
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
if(assetType == (byte)AssetType.Settings)
|
||||||
|
{
|
||||||
|
if(data == null)
|
||||||
|
{
|
||||||
|
IEnvironmentModule envModule = m_Scene.RequestModuleInterface<IEnvironmentModule>();
|
||||||
|
if(envModule == null)
|
||||||
|
return;
|
||||||
|
data = envModule.GetDefaultAssetData(name);
|
||||||
|
if(data == null)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat(
|
||||||
|
"[INVENTORY ACCESS MODULE CreateNewInventoryItem]: failed to create default enviroment setting asset {0} for agent {1}", name, remoteClient.AgentId);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flags = subType;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*/
|
||||||
|
if( assetType == (byte)AssetType.Clothing ||
|
||||||
|
assetType == (byte)AssetType.Bodypart)
|
||||||
|
flags = subType;
|
||||||
|
|
||||||
AssetBase asset = m_Scene.CreateAsset(name, description, assetType, data, remoteClient.AgentId);
|
AssetBase asset = m_Scene.CreateAsset(name, description, assetType, data, remoteClient.AgentId);
|
||||||
m_Scene.AssetService.Store(asset);
|
m_Scene.AssetService.Store(asset);
|
||||||
m_Scene.CreateNewInventoryItem(
|
m_Scene.CreateNewInventoryItem(
|
||||||
remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID,
|
remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID,
|
||||||
name, description, 0, callbackID, asset.FullID, asset.Type, invType,
|
name, description, flags, callbackID, asset.FullID, asset.Type, invType,
|
||||||
(uint)PermissionMask.AllAndExport, // Base
|
(uint)PermissionMask.AllAndExport, // Base
|
||||||
(uint)PermissionMask.AllAndExport, // Current
|
(uint)PermissionMask.AllAndExport, // Current
|
||||||
everyonemask,
|
everyonemask,
|
||||||
|
@ -276,30 +300,35 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
if (item.Owner != remoteClient.AgentId)
|
if (item.Owner != remoteClient.AgentId)
|
||||||
return UUID.Zero;
|
return UUID.Zero;
|
||||||
|
|
||||||
if ((InventoryType)item.InvType == InventoryType.Notecard)
|
InventoryType itemType = (InventoryType)item.InvType;
|
||||||
|
switch (itemType)
|
||||||
{
|
{
|
||||||
if (!m_Scene.Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId))
|
case InventoryType.Notecard:
|
||||||
{
|
{
|
||||||
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false);
|
if (!m_Scene.Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId))
|
||||||
return UUID.Zero;
|
{
|
||||||
}
|
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
remoteClient.SendAlertMessage("Notecard saved");
|
remoteClient.SendAlertMessage("Notecard updated");
|
||||||
}
|
break;
|
||||||
else if ((InventoryType)item.InvType == InventoryType.LSL)
|
}
|
||||||
{
|
case InventoryType.LSL:
|
||||||
if (!m_Scene.Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId))
|
|
||||||
{
|
{
|
||||||
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false);
|
if (!m_Scene.Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId))
|
||||||
return UUID.Zero;
|
{
|
||||||
}
|
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
remoteClient.SendAlertMessage("Script saved");
|
remoteClient.SendAlertMessage("Script updated");
|
||||||
}
|
break;
|
||||||
else if ((CustomInventoryType)item.InvType == CustomInventoryType.AnimationSet)
|
}
|
||||||
{
|
case (InventoryType)CustomInventoryType.AnimationSet:
|
||||||
AnimationSet animSet = new AnimationSet(data);
|
{
|
||||||
uint res = animSet.Validate(x => {
|
AnimationSet animSet = new AnimationSet(data);
|
||||||
|
uint res = animSet.Validate(x => {
|
||||||
const int required = (int)(PermissionMask.Transfer | PermissionMask.Copy);
|
const int required = (int)(PermissionMask.Transfer | PermissionMask.Copy);
|
||||||
int perms = m_Scene.InventoryService.GetAssetPermissions(remoteClient.AgentId, x);
|
int perms = m_Scene.InventoryService.GetAssetPermissions(remoteClient.AgentId, x);
|
||||||
// enforce previus perm rule
|
// enforce previus perm rule
|
||||||
|
@ -307,10 +336,34 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
return 0;
|
return 0;
|
||||||
return (uint) perms;
|
return (uint) perms;
|
||||||
});
|
});
|
||||||
if(res == 0)
|
if(res == 0)
|
||||||
|
{
|
||||||
|
remoteClient.SendAgentAlertMessage("Not enought permissions on asset(s) referenced by animation set '{0}', update failed", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case InventoryType.Gesture:
|
||||||
{
|
{
|
||||||
remoteClient.SendAgentAlertMessage("Not enought permissions on asset(s) referenced by animation set '{0}', update failed", false);
|
if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
|
||||||
return UUID.Zero;
|
{
|
||||||
|
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit gesture", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
remoteClient.SendAlertMessage("gesture updated");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case InventoryType.Settings:
|
||||||
|
{
|
||||||
|
if((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
|
||||||
|
{
|
||||||
|
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit setting", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
remoteClient.SendAlertMessage("Setting updated");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,8 +674,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
||||||
(uint)PermissionMask.Move |
|
(uint)PermissionMask.Move |
|
||||||
(uint)PermissionMask.Export |
|
(uint)PermissionMask.Export |
|
||||||
(uint)PermissionMask.FoldedMask); // Preserve folded permissions ??
|
(uint)PermissionMask.FoldedMask); // Preserve folded permissions ??
|
||||||
}
|
}
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -225,8 +225,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap
|
||||||
public void OnRegisterCaps(UUID agentID, Caps caps)
|
public void OnRegisterCaps(UUID agentID, Caps caps)
|
||||||
{
|
{
|
||||||
//m_log.DebugFormat("[WORLD MAP]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps);
|
//m_log.DebugFormat("[WORLD MAP]: OnRegisterCaps: agentID {0} caps {1}", agentID, caps);
|
||||||
string capspath = "/CAPS/" + UUID.Random();
|
caps.RegisterSimpleHandler("MapLayer", new SimpleStreamHandler("/" + UUID.Random(), MapLayerRequest));
|
||||||
caps.RegisterSimpleHandler("MapLayer", new SimpleStreamHandler("/CAPS/" + UUID.Random(), MapLayerRequest));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -265,25 +265,104 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <see>CapsUpdatedInventoryItemAsset(IClientAPI, UUID, byte[])</see>
|
/// <see>CapsUpdatedInventoryItemAsset(IClientAPI, UUID, byte[])</see>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public UUID CapsUpdateInventoryItemAsset(UUID avatarId, UUID itemID, byte[] data)
|
public UUID CapsUpdateItemAsset(UUID avatarId, UUID itemID, UUID objectID, byte[] data)
|
||||||
{
|
{
|
||||||
ScenePresence avatar;
|
if (!TryGetScenePresence(avatarId, out ScenePresence avatar))
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[CapsUpdateItemAsset]: Avatar {0} cannot be found to update item asset", avatarId);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
if (TryGetScenePresence(avatarId, out avatar))
|
if (objectID == UUID.Zero)
|
||||||
{
|
{
|
||||||
IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>();
|
IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>();
|
||||||
if (invAccess != null)
|
if (invAccess != null)
|
||||||
return invAccess.CapsUpdateInventoryItemAsset(avatar.ControllingClient, itemID, data);
|
return invAccess.CapsUpdateInventoryItemAsset(avatar.ControllingClient, itemID, data);
|
||||||
}
|
else
|
||||||
else
|
return UUID.Zero;
|
||||||
{
|
|
||||||
m_log.ErrorFormat(
|
|
||||||
"[AGENT INVENTORY]: " +
|
|
||||||
"Avatar {0} cannot be found to update its inventory item asset",
|
|
||||||
avatarId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return UUID.Zero;
|
SceneObjectPart sop = GetSceneObjectPart(objectID);
|
||||||
|
if(sop == null || sop.ParentGroup.IsDeleted)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[CapsUpdateItemAsset]: Object {0} cannot be found to update item asset", objectID);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
TaskInventoryItem item = sop.Inventory.GetInventoryItem(itemID);
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
m_log.ErrorFormat("[CapsUpdateItemAsset]: Could not find item {0} for asset update", itemID);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.OwnerID != avatarId)
|
||||||
|
return UUID.Zero;
|
||||||
|
|
||||||
|
InventoryType itemType = (InventoryType)item.InvType;
|
||||||
|
switch (itemType)
|
||||||
|
{
|
||||||
|
case InventoryType.Notecard:
|
||||||
|
{
|
||||||
|
if (!Permissions.CanEditNotecard(itemID, objectID, avatarId))
|
||||||
|
{
|
||||||
|
avatar.ControllingClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
avatar.ControllingClient.SendAlertMessage("Notecard updated");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case (InventoryType)CustomInventoryType.AnimationSet:
|
||||||
|
{
|
||||||
|
AnimationSet animSet = new AnimationSet(data);
|
||||||
|
uint res = animSet.Validate(x => {
|
||||||
|
const int required = (int)(PermissionMask.Transfer | PermissionMask.Copy);
|
||||||
|
int perms = InventoryService.GetAssetPermissions(avatarId, x);
|
||||||
|
// enforce previus perm rule
|
||||||
|
if ((perms & required) != required)
|
||||||
|
return 0;
|
||||||
|
return (uint)perms;
|
||||||
|
});
|
||||||
|
if (res == 0)
|
||||||
|
{
|
||||||
|
avatar.ControllingClient.SendAgentAlertMessage("Not enought permissions on asset(s) referenced by animation set '{0}', update failed", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case InventoryType.Gesture:
|
||||||
|
{
|
||||||
|
if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
|
||||||
|
{
|
||||||
|
avatar.ControllingClient.SendAgentAlertMessage("Insufficient permissions to edit gesture", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
avatar.ControllingClient.SendAlertMessage("gesture updated");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case InventoryType.Settings:
|
||||||
|
{
|
||||||
|
if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
|
||||||
|
{
|
||||||
|
avatar.ControllingClient.SendAgentAlertMessage("Insufficient permissions to edit setting", false);
|
||||||
|
return UUID.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
avatar.ControllingClient.SendAlertMessage("getting updated");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)item.Type, data, avatarId);
|
||||||
|
item.AssetID = asset.FullID;
|
||||||
|
AssetService.Store(asset);
|
||||||
|
|
||||||
|
sop.Inventory.UpdateInventoryItem(item);
|
||||||
|
|
||||||
|
// remoteClient.SendInventoryItemCreateUpdate(item);
|
||||||
|
return asset.FullID;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
Loading…
Reference in New Issue