Merge branch 'master' into careminster-presence-refactor

avinationmerge
Melanie 2010-11-23 14:05:09 +00:00
commit 6557d5f359
11 changed files with 252 additions and 82 deletions

View File

@ -697,6 +697,7 @@ namespace OpenSim.Data.SQLite
DataRow landRow = land.Rows.Find(globalID.ToString()); DataRow landRow = land.Rows.Find(globalID.ToString());
if (landRow != null) if (landRow != null)
{ {
landRow.Delete();
land.Rows.Remove(landRow); land.Rows.Remove(landRow);
} }
List<DataRow> rowsToDelete = new List<DataRow>(); List<DataRow> rowsToDelete = new List<DataRow>();
@ -707,6 +708,7 @@ namespace OpenSim.Data.SQLite
} }
for (int iter = 0; iter < rowsToDelete.Count; iter++) for (int iter = 0; iter < rowsToDelete.Count; iter++)
{ {
rowsToDelete[iter].Delete();
landaccesslist.Rows.Remove(rowsToDelete[iter]); landaccesslist.Rows.Remove(rowsToDelete[iter]);
} }
} }
@ -755,6 +757,7 @@ namespace OpenSim.Data.SQLite
} }
for (int iter = 0; iter < rowsToDelete.Count; iter++) for (int iter = 0; iter < rowsToDelete.Count; iter++)
{ {
rowsToDelete[iter].Delete();
landaccesslist.Rows.Remove(rowsToDelete[iter]); landaccesslist.Rows.Remove(rowsToDelete[iter]);
} }
rowsToDelete.Clear(); rowsToDelete.Clear();

View File

@ -657,6 +657,7 @@ namespace OpenSim.Data.SQLiteLegacy
DataRow landRow = land.Rows.Find(globalID.ToString()); DataRow landRow = land.Rows.Find(globalID.ToString());
if (landRow != null) if (landRow != null)
{ {
landRow.Delete();
land.Rows.Remove(landRow); land.Rows.Remove(landRow);
} }
List<DataRow> rowsToDelete = new List<DataRow>(); List<DataRow> rowsToDelete = new List<DataRow>();
@ -667,6 +668,7 @@ namespace OpenSim.Data.SQLiteLegacy
} }
for (int iter = 0; iter < rowsToDelete.Count; iter++) for (int iter = 0; iter < rowsToDelete.Count; iter++)
{ {
rowsToDelete[iter].Delete();
landaccesslist.Rows.Remove(rowsToDelete[iter]); landaccesslist.Rows.Remove(rowsToDelete[iter]);
} }
@ -717,6 +719,7 @@ namespace OpenSim.Data.SQLiteLegacy
} }
for (int iter = 0; iter < rowsToDelete.Count; iter++) for (int iter = 0; iter < rowsToDelete.Count; iter++)
{ {
rowsToDelete[iter].Delete();
landaccesslist.Rows.Remove(rowsToDelete[iter]); landaccesslist.Rows.Remove(rowsToDelete[iter]);
} }
rowsToDelete.Clear(); rowsToDelete.Clear();

View File

@ -117,7 +117,7 @@ namespace OpenSim.Framework
} }
protected UUID m_creatorIdAsUuid = UUID.Zero; protected UUID m_creatorIdAsUuid = UUID.Zero;
protected string m_creatorData; protected string m_creatorData = string.Empty;
public string CreatorData // = <profile url>;<name> public string CreatorData // = <profile url>;<name>
{ {
get { return m_creatorData; } get { return m_creatorData; }

View File

@ -112,7 +112,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
return; return;
if (!m_scene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId)) if (!m_scene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId))
{
remoteClient.SendAgentAlertMessage(
"You don't have sufficient permissions to attach this object", false);
return; return;
}
// TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
// be removed when that functionality is implemented in opensim // be removed when that functionality is implemented in opensim
@ -142,76 +147,66 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
{ {
Vector3 attachPos = group.AbsolutePosition; Vector3 attachPos = group.AbsolutePosition;
if (m_scene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId)) // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
// be removed when that functionality is implemented in opensim
AttachmentPt &= 0x7f;
// If the attachment point isn't the same as the one previously used
// set it's offset position = 0 so that it appears on the attachment point
// and not in a weird location somewhere unknown.
if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint())
{ {
// TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should attachPos = Vector3.Zero;
// be removed when that functionality is implemented in opensim }
AttachmentPt &= 0x7f;
// If the attachment point isn't the same as the one previously used // AttachmentPt 0 means the client chose to 'wear' the attachment.
// set it's offset position = 0 so that it appears on the attachment point if (AttachmentPt == 0)
// and not in a weird location somewhere unknown. {
if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint()) // Check object for stored attachment point
AttachmentPt = (uint)group.GetAttachmentPoint();
}
// if we still didn't find a suitable attachment point.......
if (AttachmentPt == 0)
{
// Stick it on left hand with Zero Offset from the attachment point.
AttachmentPt = (uint)AttachmentPoint.LeftHand;
attachPos = Vector3.Zero;
}
group.SetAttachmentPoint((byte)AttachmentPt);
group.AbsolutePosition = attachPos;
// Remove any previous attachments
ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
UUID itemID = UUID.Zero;
if (sp != null)
{
foreach (SceneObjectGroup grp in sp.Attachments)
{ {
attachPos = Vector3.Zero; if (grp.GetAttachmentPoint() == (byte)AttachmentPt)
}
// AttachmentPt 0 means the client chose to 'wear' the attachment.
if (AttachmentPt == 0)
{
// Check object for stored attachment point
AttachmentPt = (uint)group.GetAttachmentPoint();
}
// if we still didn't find a suitable attachment point.......
if (AttachmentPt == 0)
{
// Stick it on left hand with Zero Offset from the attachment point.
AttachmentPt = (uint)AttachmentPoint.LeftHand;
attachPos = Vector3.Zero;
}
group.SetAttachmentPoint((byte)AttachmentPt);
group.AbsolutePosition = attachPos;
// Remove any previous attachments
ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
UUID itemID = UUID.Zero;
if (sp != null)
{
foreach (SceneObjectGroup grp in sp.Attachments)
{ {
if (grp.GetAttachmentPoint() == (byte)AttachmentPt) itemID = grp.GetFromItemID();
{ break;
itemID = grp.GetFromItemID();
break;
}
} }
if (itemID != UUID.Zero)
DetachSingleAttachmentToInv(itemID, remoteClient);
} }
if (itemID != UUID.Zero)
DetachSingleAttachmentToInv(itemID, remoteClient);
}
if (group.GetFromItemID() == UUID.Zero) if (group.GetFromItemID() == UUID.Zero)
{ {
m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemID); m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemID);
}
else
{
itemID = group.GetFromItemID();
}
ShowAttachInUserInventory(remoteClient, AttachmentPt, itemID, group);
AttachToAgent(sp, group, AttachmentPt, attachPos, silent);
} }
else else
{ {
remoteClient.SendAgentAlertMessage( itemID = group.GetFromItemID();
"You don't have sufficient permissions to attach this object", false);
return false;
} }
ShowAttachInUserInventory(remoteClient, AttachmentPt, itemID, group);
AttachToAgent(sp, group, AttachmentPt, attachPos, silent);
return true; return true;
} }

View File

@ -130,7 +130,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver
List<string> mainParams = ops.Parse(cmdparams); List<string> mainParams = ops.Parse(cmdparams);
if (cmdparams.Length > 2) if (mainParams.Count > 2)
{ {
ArchiveRegion(mainParams[2], options); ArchiveRegion(mainParams[2], options);
} }

View File

@ -1738,7 +1738,12 @@ namespace OpenSim.Region.Framework.Scenes
// Autoreturn has a null client. Nothing else does. So // Autoreturn has a null client. Nothing else does. So
// allow only returns // allow only returns
if (action != DeRezAction.Return) if (action != DeRezAction.Return)
{
m_log.WarnFormat(
"[AGENT INVENTORY]: Ignoring attempt to {0} {1} {2} without a client",
action, grp.Name, grp.UUID);
return; return;
}
permissionToTakeCopy = false; permissionToTakeCopy = false;
} }

View File

@ -27,7 +27,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection;
using System.Text; using System.Text;
using log4net;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Interfaces;
@ -88,6 +90,8 @@ namespace OpenSim.Region.Framework.Scenes
public class ScenePermissions public class ScenePermissions
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private Scene m_scene; private Scene m_scene;
public ScenePermissions(Scene scene) public ScenePermissions(Scene scene)
@ -242,6 +246,8 @@ namespace OpenSim.Region.Framework.Scenes
#region DELETE OBJECT #region DELETE OBJECT
public bool CanDeleteObject(UUID objectID, UUID deleter) public bool CanDeleteObject(UUID objectID, UUID deleter)
{ {
bool result = true;
DeleteObjectHandler handler = OnDeleteObject; DeleteObjectHandler handler = OnDeleteObject;
if (handler != null) if (handler != null)
{ {
@ -249,10 +255,18 @@ namespace OpenSim.Region.Framework.Scenes
foreach (DeleteObjectHandler h in list) foreach (DeleteObjectHandler h in list)
{ {
if (h(objectID, deleter, m_scene) == false) if (h(objectID, deleter, m_scene) == false)
return false; {
result = false;
break;
}
} }
} }
return true;
// m_log.DebugFormat(
// "[SCENE PERMISSIONS]: CanDeleteObject() fired for object {0}, deleter {1}, result {2}",
// objectID, deleter, result);
return result;
} }
#endregion #endregion
@ -260,6 +274,8 @@ namespace OpenSim.Region.Framework.Scenes
#region TAKE OBJECT #region TAKE OBJECT
public bool CanTakeObject(UUID objectID, UUID AvatarTakingUUID) public bool CanTakeObject(UUID objectID, UUID AvatarTakingUUID)
{ {
bool result = true;
TakeObjectHandler handler = OnTakeObject; TakeObjectHandler handler = OnTakeObject;
if (handler != null) if (handler != null)
{ {
@ -267,10 +283,18 @@ namespace OpenSim.Region.Framework.Scenes
foreach (TakeObjectHandler h in list) foreach (TakeObjectHandler h in list)
{ {
if (h(objectID, AvatarTakingUUID, m_scene) == false) if (h(objectID, AvatarTakingUUID, m_scene) == false)
return false; {
result = false;
break;
}
} }
} }
return true;
// m_log.DebugFormat(
// "[SCENE PERMISSIONS]: CanTakeObject() fired for object {0}, taker {1}, result {2}",
// objectID, AvatarTakingUUID, result);
return result;
} }
#endregion #endregion
@ -278,6 +302,8 @@ namespace OpenSim.Region.Framework.Scenes
#region TAKE COPY OBJECT #region TAKE COPY OBJECT
public bool CanTakeCopyObject(UUID objectID, UUID userID) public bool CanTakeCopyObject(UUID objectID, UUID userID)
{ {
bool result = true;
TakeCopyObjectHandler handler = OnTakeCopyObject; TakeCopyObjectHandler handler = OnTakeCopyObject;
if (handler != null) if (handler != null)
{ {
@ -285,10 +311,18 @@ namespace OpenSim.Region.Framework.Scenes
foreach (TakeCopyObjectHandler h in list) foreach (TakeCopyObjectHandler h in list)
{ {
if (h(objectID, userID, m_scene) == false) if (h(objectID, userID, m_scene) == false)
return false; {
result = false;
break;
}
} }
} }
return true;
// m_log.DebugFormat(
// "[SCENE PERMISSIONS]: CanTakeCopyObject() fired for object {0}, user {1}, result {2}",
// objectID, userID, result);
return result;
} }
#endregion #endregion
@ -383,6 +417,8 @@ namespace OpenSim.Region.Framework.Scenes
#region RETURN OBJECT #region RETURN OBJECT
public bool CanReturnObjects(ILandObject land, UUID user, List<SceneObjectGroup> objects) public bool CanReturnObjects(ILandObject land, UUID user, List<SceneObjectGroup> objects)
{ {
bool result = true;
ReturnObjectsHandler handler = OnReturnObjects; ReturnObjectsHandler handler = OnReturnObjects;
if (handler != null) if (handler != null)
{ {
@ -390,10 +426,18 @@ namespace OpenSim.Region.Framework.Scenes
foreach (ReturnObjectsHandler h in list) foreach (ReturnObjectsHandler h in list)
{ {
if (h(land, user, objects, m_scene) == false) if (h(land, user, objects, m_scene) == false)
return false; {
result = false;
break;
}
} }
} }
return true;
// m_log.DebugFormat(
// "[SCENE PERMISSIONS]: CanReturnObjects() fired for user {0} for {1} objects on {2}, result {3}",
// user, objects.Count, land.LandData.Name, result);
return result;
} }
#endregion #endregion

View File

@ -2950,6 +2950,7 @@ namespace OpenSim.Region.Framework.Scenes
part.Resize(scale); part.Resize(scale);
HasGroupChanged = true; HasGroupChanged = true;
part.TriggerScriptChangedEvent(Changed.SCALE);
ScheduleGroupForFullUpdate(); ScheduleGroupForFullUpdate();
//if (part.UUID == m_rootPart.UUID) //if (part.UUID == m_rootPart.UUID)
@ -3110,6 +3111,7 @@ namespace OpenSim.Region.Framework.Scenes
part.IgnoreUndoUpdate = false; part.IgnoreUndoUpdate = false;
HasGroupChanged = true; HasGroupChanged = true;
m_rootPart.TriggerScriptChangedEvent(Changed.SCALE);
ScheduleGroupForTerseUpdate(); ScheduleGroupForTerseUpdate();
} }
} }

View File

@ -1026,21 +1026,7 @@ namespace OpenSim.Region.Framework.Scenes
public PrimitiveBaseShape Shape public PrimitiveBaseShape Shape
{ {
get { return m_shape; } get { return m_shape; }
set set { m_shape = value; }
{
bool shape_changed = false;
// TODO: this should really be restricted to the right
// set of attributes on shape change. For instance,
// changing the lighting on a shape shouldn't cause
// this.
if (m_shape != null)
shape_changed = true;
m_shape = value;
if (shape_changed)
TriggerScriptChangedEvent(Changed.SHAPE);
}
} }
public Vector3 Scale public Vector3 Scale
@ -4592,6 +4578,7 @@ namespace OpenSim.Region.Framework.Scenes
ParentGroup.RootPart.Rezzed = DateTime.UtcNow; ParentGroup.RootPart.Rezzed = DateTime.UtcNow;
ParentGroup.HasGroupChanged = true; ParentGroup.HasGroupChanged = true;
TriggerScriptChangedEvent(Changed.SHAPE);
ScheduleFullUpdate(); ScheduleFullUpdate();
} }

View File

@ -0,0 +1,129 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Reflection;
using Nini.Config;
using NUnit.Framework;
using NUnit.Framework.SyntaxHelpers;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Framework.Communications;
using OpenSim.Region.CoreModules.World.Permissions;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Tests.Common;
using OpenSim.Tests.Common.Mock;
using OpenSim.Tests.Common.Setup;
namespace OpenSim.Region.Framework.Scenes.Tests
{
/// <summary>
/// Tests manipulation of scene objects by users.
/// </summary>
///
/// This is at a level above the SceneObjectBasicTests, which act on the scene directly.
/// FIXME: These tests are very incomplete - they only test for a few conditions.
[TestFixture]
public class SceneObjectUserTests
{
/// <summary>
/// Test deleting an object from a scene.
/// </summary>
[Test]
public void TestDeRezSceneObject()
{
TestHelper.InMethod();
// log4net.Config.XmlConfigurator.Configure();
UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001");
TestScene scene = SceneSetupHelpers.SetupScene();
IConfigSource configSource = new IniConfigSource();
IConfig config = configSource.AddConfig("Startup");
config.Set("serverside_object_permissions", true);
SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId);
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
sogd.Enabled = false;
SceneObjectPart part
= new SceneObjectPart(userId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero);
part.Name = "obj1";
scene.AddNewSceneObject(new SceneObjectGroup(part), false);
List<uint> localIds = new List<uint>();
localIds.Add(part.LocalId);
scene.DeRezObjects(client, localIds, UUID.Zero, DeRezAction.Delete, UUID.Zero);
sogd.InventoryDeQueueAndDelete();
SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId);
Assert.That(retrievedPart, Is.Null);
}
/// <summary>
/// Test deleting an object from a scene where the deleter is not the owner
/// </summary>
///
/// This test assumes that the deleter is not a god.
[Test]
public void TestDeRezSceneObjectNotOwner()
{
TestHelper.InMethod();
// log4net.Config.XmlConfigurator.Configure();
UUID userId = UUID.Parse("10000000-0000-0000-0000-000000000001");
UUID objectOwnerId = UUID.Parse("20000000-0000-0000-0000-000000000001");
TestScene scene = SceneSetupHelpers.SetupScene();
IConfigSource configSource = new IniConfigSource();
IConfig config = configSource.AddConfig("Startup");
config.Set("serverside_object_permissions", true);
SceneSetupHelpers.SetupSceneModules(scene, configSource, new object[] { new PermissionsModule() });
TestClient client = SceneSetupHelpers.AddRootAgent(scene, userId);
// Turn off the timer on the async sog deleter - we'll crank it by hand for this test.
AsyncSceneObjectGroupDeleter sogd = scene.SceneObjectGroupDeleter;
sogd.Enabled = false;
SceneObjectPart part
= new SceneObjectPart(objectOwnerId, PrimitiveBaseShape.Default, Vector3.Zero, Quaternion.Identity, Vector3.Zero);
part.Name = "obj1";
scene.AddNewSceneObject(new SceneObjectGroup(part), false);
List<uint> localIds = new List<uint>();
localIds.Add(part.LocalId);
scene.DeRezObjects(client, localIds, UUID.Zero, DeRezAction.Delete, UUID.Zero);
sogd.InventoryDeQueueAndDelete();
SceneObjectPart retrievedPart = scene.GetSceneObjectPart(part.LocalId);
Assert.That(retrievedPart.UUID, Is.EqualTo(part.UUID));
}
}
}

View File

@ -65,6 +65,8 @@ namespace OpenSim.Region.Framework.Scenes.Tests
[TestFixtureSetUp] [TestFixtureSetUp]
public void Init() public void Init()
{ {
TestHelper.InMethod();
scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000); scene = SceneSetupHelpers.SetupScene("Neighbour x", UUID.Random(), 1000, 1000);
scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000); scene2 = SceneSetupHelpers.SetupScene("Neighbour x+1", UUID.Random(), 1001, 1000);
scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000); scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000);