Do not allow invariants to change on calls to XInventoryService.UpdateItem()

This is to help track down http://opensimulator.org/mantis/view.php?id=6359 where creator IDs on items and rezzed objects have been reported to sometimes change.
This should never happen - a particular item should never change creators (if an item is given then a new item (with new id) is created).
Invariants are inventory type, asset type, folder (changed only on MoveItems()), CreatorIdentification and Owner.
If caller attempts to change an invariant, warning is logged but other properties are still changed.
If you see this warning, reporting on Mantis 6359 would be very welcome with the exact operation being done at the time.
connector_plugin
Justin Clark-Casey (justincc) 2012-11-17 01:01:14 +00:00
parent e25c51330a
commit 2aa58c5843
2 changed files with 140 additions and 10 deletions

View File

@ -43,8 +43,18 @@ namespace OpenSim.Services.InventoryService.Tests
/// TODO: Fill out more tests.
/// </remarks>
[TestFixture]
public class XInventoryServiceTests
public class XInventoryServiceTests : OpenSimTestCase
{
private IInventoryService CreateXInventoryService()
{
IConfigSource config = new IniConfigSource();
config.AddConfig("InventoryService");
config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll");
return ServerUtils.LoadPlugin<IInventoryService>(
"OpenSim.Services.InventoryService.dll:XInventoryService", new Object[] { config });
}
/// <summary>
/// Tests add item operation.
/// </summary>
@ -54,25 +64,31 @@ namespace OpenSim.Services.InventoryService.Tests
[Test]
public void TestAddItem()
{
TestHelpers.InMethod();
string creatorId = TestHelpers.ParseTail(0x1).ToString();
UUID ownerId = TestHelpers.ParseTail(0x2);
UUID itemId = TestHelpers.ParseTail(0x10);
UUID assetId = TestHelpers.ParseTail(0x20);
UUID folderId = TestHelpers.ParseTail(0x30);
int invType = (int)InventoryType.Animation;
int assetType = (int)AssetType.Animation;
string itemName = "item1";
IConfigSource config = new IniConfigSource();
config.AddConfig("InventoryService");
config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll");
IInventoryService xis
= ServerUtils.LoadPlugin<IInventoryService>(
"OpenSim.Services.InventoryService.dll:XInventoryService", new Object[] { config });
IInventoryService xis = CreateXInventoryService();
InventoryItemBase itemToStore
= new InventoryItemBase(itemId, ownerId)
{ CreatorId = creatorId.ToString(), AssetID = assetId, Name = itemName };
{
CreatorIdentification = creatorId.ToString(),
AssetID = assetId,
Name = itemName,
Folder = folderId,
InvType = invType,
AssetType = assetType
};
xis.AddItem(itemToStore);
Assert.That(xis.AddItem(itemToStore), Is.True);
InventoryItemBase itemRetrieved = new InventoryItemBase(itemId);
itemRetrieved = xis.GetItem(itemRetrieved);
@ -81,7 +97,81 @@ namespace OpenSim.Services.InventoryService.Tests
Assert.That(itemRetrieved.CreatorId, Is.EqualTo(creatorId));
Assert.That(itemRetrieved.Owner, Is.EqualTo(ownerId));
Assert.That(itemRetrieved.AssetID, Is.EqualTo(assetId));
Assert.That(itemRetrieved.Folder, Is.EqualTo(folderId));
Assert.That(itemRetrieved.InvType, Is.EqualTo(invType));
Assert.That(itemRetrieved.AssetType, Is.EqualTo(assetType));
Assert.That(itemRetrieved.Name, Is.EqualTo(itemName));
}
[Test]
public void TestUpdateItem()
{
TestHelpers.InMethod();
// TestHelpers.EnableLogging();
string creatorId = TestHelpers.ParseTail(0x1).ToString();
UUID ownerId = TestHelpers.ParseTail(0x2);
UUID itemId = TestHelpers.ParseTail(0x10);
UUID assetId = TestHelpers.ParseTail(0x20);
UUID folderId = TestHelpers.ParseTail(0x30);
int invType = (int)InventoryType.Animation;
int assetType = (int)AssetType.Animation;
string itemName = "item1";
string itemName2 = "item2";
IInventoryService xis = CreateXInventoryService();
InventoryItemBase itemToStore
= new InventoryItemBase(itemId, ownerId)
{
CreatorIdentification = creatorId.ToString(),
AssetID = assetId,
Name = itemName,
Folder = folderId,
InvType = invType,
AssetType = assetType
};
Assert.That(xis.AddItem(itemToStore), Is.True);
// Normal update
itemToStore.Name = itemName2;
Assert.That(xis.UpdateItem(itemToStore), Is.True);
InventoryItemBase itemRetrieved = new InventoryItemBase(itemId);
itemRetrieved = xis.GetItem(itemRetrieved);
Assert.That(itemRetrieved, Is.Not.Null);
Assert.That(itemRetrieved.Name, Is.EqualTo(itemName2));
// Attempt to update properties that should never change
string creatorId2 = TestHelpers.ParseTail(0x7).ToString();
UUID ownerId2 = TestHelpers.ParseTail(0x8);
UUID folderId2 = TestHelpers.ParseTail(0x70);
int invType2 = (int)InventoryType.CallingCard;
int assetType2 = (int)AssetType.CallingCard;
string itemName3 = "item3";
itemToStore.CreatorIdentification = creatorId2.ToString();
itemToStore.Owner = ownerId2;
itemToStore.Folder = folderId2;
itemToStore.InvType = invType2;
itemToStore.AssetType = assetType2;
itemToStore.Name = itemName3;
Assert.That(xis.UpdateItem(itemToStore), Is.True);
itemRetrieved = xis.GetItem(itemRetrieved);
Assert.That(itemRetrieved, Is.Not.Null);
Assert.That(itemRetrieved.CreatorId, Is.EqualTo(creatorId));
Assert.That(itemRetrieved.Owner, Is.EqualTo(ownerId));
Assert.That(itemRetrieved.AssetID, Is.EqualTo(assetId));
Assert.That(itemRetrieved.Folder, Is.EqualTo(folderId));
Assert.That(itemRetrieved.InvType, Is.EqualTo(invType));
Assert.That(itemRetrieved.AssetType, Is.EqualTo(assetType));
Assert.That(itemRetrieved.Name, Is.EqualTo(itemName3));
}
}
}

View File

@ -476,6 +476,46 @@ namespace OpenSim.Services.InventoryService
// m_log.InfoFormat(
// "[XINVENTORY SERVICE]: Updating item {0} {1} in folder {2}", item.Name, item.ID, item.Folder);
InventoryItemBase retrievedItem = GetItem(item);
if (retrievedItem == null)
{
m_log.WarnFormat(
"[XINVENTORY SERVICE]: Tried to update item {0} {1}, owner {2} but no existing item found.",
item.Name, item.ID, item.Owner);
return false;
}
// Do not allow invariants to change. Changes to folder ID occur in MoveItems()
if (retrievedItem.InvType != item.InvType
|| retrievedItem.AssetType != item.AssetType
|| retrievedItem.Folder != item.Folder
|| retrievedItem.CreatorIdentification != item.CreatorIdentification
|| retrievedItem.Owner != item.Owner)
{
m_log.WarnFormat(
"[XINVENTORY SERVICE]: Caller to UpdateItem() for {0} {1} tried to alter property(s) that should be invariant, (InvType, AssetType, Folder, CreatorIdentification, Owner), existing ({2}, {3}, {4}, {5}, {6}), update ({7}, {8}, {9}, {10}, {11})",
retrievedItem.Name,
retrievedItem.ID,
retrievedItem.InvType,
retrievedItem.AssetType,
retrievedItem.Folder,
retrievedItem.CreatorIdentification,
retrievedItem.Owner,
item.InvType,
item.AssetType,
item.Folder,
item.CreatorIdentification,
item.Owner);
item.InvType = retrievedItem.InvType;
item.AssetType = retrievedItem.AssetType;
item.Folder = retrievedItem.Folder;
item.CreatorIdentification = retrievedItem.CreatorIdentification;
item.Owner = retrievedItem.Owner;
}
return m_Database.StoreItem(ConvertFromOpenSim(item));
}