From 9949ac2f9f448faaa873b98451c6025d687358a2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Mar 2012 00:10:41 +0000 Subject: [PATCH 01/18] refactor: Rename AvatarAnimations -> DefaultAvatarAnimations for code clarity since non-default animations are handled completely separately from this class --- OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs | 4 ++-- .../{AvatarAnimations.cs => DefaultAvatarAnimations.cs} | 4 ++-- .../Framework/Scenes/Animation/ScenePresenceAnimator.cs | 4 ++-- .../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) rename OpenSim/Region/Framework/Scenes/Animation/{AvatarAnimations.cs => DefaultAvatarAnimations.cs} (98%) diff --git a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs index 240a424415..33041e9ac7 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs @@ -138,9 +138,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation // "[ANIMATION SET]: Setting default animation {0}, sequence number {1}, object id {2}", // anim, sequenceNum, objectID); - if (AvatarAnimations.AnimsUUID.ContainsKey(anim)) + if (DefaultAvatarAnimations.AnimsUUID.ContainsKey(anim)) { - return SetDefaultAnimation(AvatarAnimations.AnimsUUID[anim], sequenceNum, objectID); + return SetDefaultAnimation(DefaultAvatarAnimations.AnimsUUID[anim], sequenceNum, objectID); } return false; } diff --git a/OpenSim/Region/Framework/Scenes/Animation/AvatarAnimations.cs b/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs similarity index 98% rename from OpenSim/Region/Framework/Scenes/Animation/AvatarAnimations.cs rename to OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs index ec928f4e97..c2b0468067 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/AvatarAnimations.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/DefaultAvatarAnimations.cs @@ -33,7 +33,7 @@ using OpenMetaverse; namespace OpenSim.Region.Framework.Scenes.Animation { - public class AvatarAnimations + public class DefaultAvatarAnimations { // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -43,7 +43,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation public static Dictionary AnimsNames = new Dictionary(); public static Dictionary AnimStateNames = new Dictionary(); - static AvatarAnimations() + static DefaultAvatarAnimations() { LoadAnimations(DefaultAnimationsPath); } diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 9038ebc590..cded9be47d 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -99,7 +99,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation // XXX: For some reason, we store all animations and use them with upper case names, but in LSL animations // are referenced with lower case names! - UUID animID = AvatarAnimations.GetDefaultAnimation(name.ToUpper()); + UUID animID = DefaultAvatarAnimations.GetDefaultAnimation(name.ToUpper()); if (animID == UUID.Zero) return; @@ -125,7 +125,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation // XXX: For some reason, we store all animations and use them with upper case names, but in LSL animations // are referenced with lower case names! - UUID animID = AvatarAnimations.GetDefaultAnimation(name); + UUID animID = DefaultAvatarAnimations.GetDefaultAnimation(name); if (animID == UUID.Zero) return; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 27f7c03dee..d7a629bf8b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4314,7 +4314,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if (m_host.RegionHandle == presence.RegionHandle) { - Dictionary animationstateNames = AvatarAnimations.AnimStateNames; + Dictionary animationstateNames = DefaultAvatarAnimations.AnimStateNames; if (presence != null) { @@ -5600,7 +5600,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } if (agent.Animator.Animations.DefaultAnimation.AnimID - == AvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) + == DefaultAvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) { flags |= ScriptBaseClass.AGENT_SITTING; } @@ -7714,7 +7714,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api LSL_Vector lower; LSL_Vector upper; if (presence.Animator.Animations.DefaultAnimation.AnimID - == AvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) + == DefaultAvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) { // This is for ground sitting avatars float height = presence.Appearance.AvatarHeight / 2.66666667f; From 6146e7ef258b10888ad7464b72b75cca701e02c9 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 22 Mar 2012 12:57:12 -0700 Subject: [PATCH 02/18] Simple build permissions feature. NOTE: EXPERIMENTAL, DISABLED BY DEFAULT. Turns out that this can't be expressed by cascading Permission modules, so I did it as per this patch. --- OpenSim/Framework/ILandObject.cs | 2 + .../CoreModules/World/Land/LandObject.cs | 41 +++++++++++++++++-- .../World/Permissions/PermissionsModule.cs | 34 ++++++++++++++- .../Framework/Scenes/Scene.Permissions.cs | 17 ++++++++ bin/OpenSim.ini.example | 8 ++++ bin/OpenSimDefaults.ini | 7 ++++ 6 files changed, 103 insertions(+), 6 deletions(-) diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs index dd73b3fe01..33aad9beb4 100644 --- a/OpenSim/Framework/ILandObject.cs +++ b/OpenSim/Framework/ILandObject.cs @@ -63,6 +63,7 @@ namespace OpenSim.Framework bool ContainsPoint(int x, int y); ILandObject Copy(); + ILandObject MemberwiseCopy(); void SendLandUpdateToAvatarsOverMe(); @@ -70,6 +71,7 @@ namespace OpenSim.Framework void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client); bool IsEitherBannedOrRestricted(UUID avatar); bool IsBannedFromLand(UUID avatar); + bool IsAllowedInLand(UUID avatar); bool IsRestrictedFromLand(UUID avatar); void SendLandUpdateToClient(IClientAPI remote_client); void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client); diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index cc42f7f493..640a024c9c 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -169,6 +169,11 @@ namespace OpenSim.Region.CoreModules.World.Land return newLand; } + public ILandObject MemberwiseCopy() + { + return (ILandObject)this.MemberwiseClone(); + } + static overrideParcelMaxPrimCountDelegate overrideParcelMaxPrimCount; static overrideSimulatorMaxPrimCountDelegate overrideSimulatorMaxPrimCount; @@ -242,11 +247,13 @@ namespace OpenSim.Region.CoreModules.World.Land m_lastSeqId = seq_id; } + ILandObject landToSend = this; + m_scene.Permissions.LandObjectForClient(remote_client.AgentId, (ILandObject)this, out landToSend); remote_client.SendLandProperties(seq_id, - snap_selection, request_result, this, - (float)m_scene.RegionInfo.RegionSettings.ObjectBonus, - GetParcelMaxPrimCount(), - GetSimulatorMaxPrimCount(), regionFlags); + snap_selection, request_result, landToSend, + (float)m_scene.RegionInfo.RegionSettings.ObjectBonus, + GetParcelMaxPrimCount(), + GetSimulatorMaxPrimCount(), regionFlags); } public void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client) @@ -475,6 +482,32 @@ namespace OpenSim.Region.CoreModules.World.Land return false; } + public bool IsAllowedInLand(UUID avatar) + { + ExpireAccessList(); + + if (m_scene.Permissions.IsAdministrator(avatar)) + return true; + + if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) + return true; + + if (avatar == LandData.OwnerID) + return true; + + if (LandData.ParcelAccessList.FindIndex( + delegate(LandAccessEntry e) + { + if (e.AgentID == avatar && e.Flags == AccessList.Access) + return true; + return false; + }) != -1) + { + return true; + } + return false; + } + public void SendLandUpdateToClient(IClientAPI remote_client) { SendLandProperties(0, false, 0, remote_client); diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 6018c3926d..f536a0f326 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -94,7 +94,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions private bool m_RegionOwnerIsGod = false; private bool m_RegionManagerIsGod = false; private bool m_ParcelOwnerIsGod = false; - + + private bool m_SimpleBuildPermissions = false; + /// /// The set of users that are allowed to create scripts. This is only active if permissions are not being /// bypassed. This overrides normal permissions. @@ -139,7 +141,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true); m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false); m_ParcelOwnerIsGod = myConfig.GetBoolean("parcel_owner_is_god", true); - + + m_SimpleBuildPermissions = myConfig.GetBoolean("simple_build_permissions", false); + m_allowedScriptCreators = ParseUserSetConfigSetting(myConfig, "allowed_script_creators", m_allowedScriptCreators); m_allowedScriptEditors @@ -206,6 +210,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_scene.Permissions.OnControlPrimMedia += CanControlPrimMedia; m_scene.Permissions.OnInteractWithPrimMedia += CanInteractWithPrimMedia; + if (m_SimpleBuildPermissions) + m_scene.Permissions.OnSendLandProperties += GenerateLandProperties; + m_scene.AddCommand("Users", this, "bypass permissions", "bypass permissions ", "Bypass permission checks", @@ -824,6 +831,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions permission = true; } + if (m_SimpleBuildPermissions && + (parcel.LandData.Flags & (uint)ParcelFlags.UseAccessList) == 0 && parcel.IsAllowedInLand(user)) + permission = true; + return permission; } @@ -1966,5 +1977,24 @@ namespace OpenSim.Region.CoreModules.World.Permissions return false; } + + private void GenerateLandProperties(UUID userID, ILandObject realLand, out ILandObject landToSend) + { + landToSend = realLand; + if (m_bypassPermissions) return; + + if (m_SimpleBuildPermissions && + !m_scene.Permissions.IsAdministrator(userID) && + !realLand.LandData.OwnerID.Equals(userID) && + ((realLand.LandData.Flags & (uint)ParcelFlags.UseAccessList) == 0 && realLand.IsAllowedInLand(userID))) + { + ILandObject clone = realLand.MemberwiseCopy(); + LandData ldata = realLand.LandData.Copy(); + clone.LandData = ldata; + clone.LandData.Flags |= (uint)(ParcelFlags.AllowAPrimitiveEntry | ParcelFlags.AllowFly | ParcelFlags.AllowOtherScripts | ParcelFlags.CreateObjects); + landToSend = clone; + } + } + } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index e1fedf4bd0..a4605c431c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs @@ -90,6 +90,7 @@ namespace OpenSim.Region.Framework.Scenes public delegate bool TeleportHandler(UUID userID, Scene scene); public delegate bool ControlPrimMediaHandler(UUID userID, UUID primID, int face); public delegate bool InteractWithPrimMediaHandler(UUID userID, UUID primID, int face); + public delegate void SendLandPropertiesHandler(UUID userID, ILandObject realLand, out ILandObject landToSend); #endregion public class ScenePermissions @@ -157,6 +158,7 @@ namespace OpenSim.Region.Framework.Scenes public event TeleportHandler OnTeleport; public event ControlPrimMediaHandler OnControlPrimMedia; public event InteractWithPrimMediaHandler OnInteractWithPrimMedia; + public event SendLandPropertiesHandler OnSendLandProperties; #endregion #region Object Permission Checks @@ -1098,5 +1100,20 @@ namespace OpenSim.Region.Framework.Scenes } return true; } + + public void LandObjectForClient(UUID userID, ILandObject realLand, out ILandObject landToSend) + { + landToSend = realLand; + SendLandPropertiesHandler handler = OnSendLandProperties; + if (handler != null) + { + Delegate[] list = handler.GetInvocationList(); + foreach (SendLandPropertiesHandler h in list) + { + h(userID, realLand, out landToSend); + } + } + } + } } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 2c85f9db18..01dc1d6956 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -194,6 +194,14 @@ ; region_manager_is_god = false ; parcel_owner_is_god = true + ;; More control over permissions + ;; This is definitely not SL! + ; Provides a simple control for land owners to give build rights to specific avatars + ; in publicly accessible parcels that disallow object creation in general. + ; Owners specific avatars by adding them to the Access List of the parcel + ; without having to use the Groups feature + ; simple_build_permissions = false + ;; Default script engine to use. Currently, we only have XEngine ; DefaultScriptEngine = "XEngine" diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index fd31131bb5..1a0d801c78 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -260,6 +260,13 @@ ; Default value is all ; allowed_script_editors = all + ; Provides a simple control for land owners to give build rights to + ; publicly accessible parcels that disallow object creation in general. + ; Owners specific avatars by adding them to the Access List of the parcel + ; without having to use the Groups feature + ; Disabled by default + ; simple_build_permissions = False + ; ## ; ## SCRIPT ENGINE ; ## From 45b588cf008c514f461bf43c168dcdc9902b7bb9 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 22 Mar 2012 20:10:38 +0000 Subject: [PATCH 03/18] Revert "Simple build permissions feature. NOTE: EXPERIMENTAL, DISABLED BY DEFAULT. Turns out that this can't be expressed by cascading Permission modules, so I did it as per this patch." This reverts commit 6146e7ef258b10888ad7464b72b75cca701e02c9. --- OpenSim/Framework/ILandObject.cs | 2 - .../CoreModules/World/Land/LandObject.cs | 41 ++----------------- .../World/Permissions/PermissionsModule.cs | 34 +-------------- .../Framework/Scenes/Scene.Permissions.cs | 17 -------- bin/OpenSim.ini.example | 8 ---- bin/OpenSimDefaults.ini | 7 ---- 6 files changed, 6 insertions(+), 103 deletions(-) diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs index 33aad9beb4..dd73b3fe01 100644 --- a/OpenSim/Framework/ILandObject.cs +++ b/OpenSim/Framework/ILandObject.cs @@ -63,7 +63,6 @@ namespace OpenSim.Framework bool ContainsPoint(int x, int y); ILandObject Copy(); - ILandObject MemberwiseCopy(); void SendLandUpdateToAvatarsOverMe(); @@ -71,7 +70,6 @@ namespace OpenSim.Framework void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client); bool IsEitherBannedOrRestricted(UUID avatar); bool IsBannedFromLand(UUID avatar); - bool IsAllowedInLand(UUID avatar); bool IsRestrictedFromLand(UUID avatar); void SendLandUpdateToClient(IClientAPI remote_client); void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client); diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 640a024c9c..cc42f7f493 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -169,11 +169,6 @@ namespace OpenSim.Region.CoreModules.World.Land return newLand; } - public ILandObject MemberwiseCopy() - { - return (ILandObject)this.MemberwiseClone(); - } - static overrideParcelMaxPrimCountDelegate overrideParcelMaxPrimCount; static overrideSimulatorMaxPrimCountDelegate overrideSimulatorMaxPrimCount; @@ -247,13 +242,11 @@ namespace OpenSim.Region.CoreModules.World.Land m_lastSeqId = seq_id; } - ILandObject landToSend = this; - m_scene.Permissions.LandObjectForClient(remote_client.AgentId, (ILandObject)this, out landToSend); remote_client.SendLandProperties(seq_id, - snap_selection, request_result, landToSend, - (float)m_scene.RegionInfo.RegionSettings.ObjectBonus, - GetParcelMaxPrimCount(), - GetSimulatorMaxPrimCount(), regionFlags); + snap_selection, request_result, this, + (float)m_scene.RegionInfo.RegionSettings.ObjectBonus, + GetParcelMaxPrimCount(), + GetSimulatorMaxPrimCount(), regionFlags); } public void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client) @@ -482,32 +475,6 @@ namespace OpenSim.Region.CoreModules.World.Land return false; } - public bool IsAllowedInLand(UUID avatar) - { - ExpireAccessList(); - - if (m_scene.Permissions.IsAdministrator(avatar)) - return true; - - if (m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar)) - return true; - - if (avatar == LandData.OwnerID) - return true; - - if (LandData.ParcelAccessList.FindIndex( - delegate(LandAccessEntry e) - { - if (e.AgentID == avatar && e.Flags == AccessList.Access) - return true; - return false; - }) != -1) - { - return true; - } - return false; - } - public void SendLandUpdateToClient(IClientAPI remote_client) { SendLandProperties(0, false, 0, remote_client); diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index f536a0f326..6018c3926d 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -94,9 +94,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions private bool m_RegionOwnerIsGod = false; private bool m_RegionManagerIsGod = false; private bool m_ParcelOwnerIsGod = false; - - private bool m_SimpleBuildPermissions = false; - + /// /// The set of users that are allowed to create scripts. This is only active if permissions are not being /// bypassed. This overrides normal permissions. @@ -141,9 +139,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true); m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false); m_ParcelOwnerIsGod = myConfig.GetBoolean("parcel_owner_is_god", true); - - m_SimpleBuildPermissions = myConfig.GetBoolean("simple_build_permissions", false); - + m_allowedScriptCreators = ParseUserSetConfigSetting(myConfig, "allowed_script_creators", m_allowedScriptCreators); m_allowedScriptEditors @@ -210,9 +206,6 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_scene.Permissions.OnControlPrimMedia += CanControlPrimMedia; m_scene.Permissions.OnInteractWithPrimMedia += CanInteractWithPrimMedia; - if (m_SimpleBuildPermissions) - m_scene.Permissions.OnSendLandProperties += GenerateLandProperties; - m_scene.AddCommand("Users", this, "bypass permissions", "bypass permissions ", "Bypass permission checks", @@ -831,10 +824,6 @@ namespace OpenSim.Region.CoreModules.World.Permissions permission = true; } - if (m_SimpleBuildPermissions && - (parcel.LandData.Flags & (uint)ParcelFlags.UseAccessList) == 0 && parcel.IsAllowedInLand(user)) - permission = true; - return permission; } @@ -1977,24 +1966,5 @@ namespace OpenSim.Region.CoreModules.World.Permissions return false; } - - private void GenerateLandProperties(UUID userID, ILandObject realLand, out ILandObject landToSend) - { - landToSend = realLand; - if (m_bypassPermissions) return; - - if (m_SimpleBuildPermissions && - !m_scene.Permissions.IsAdministrator(userID) && - !realLand.LandData.OwnerID.Equals(userID) && - ((realLand.LandData.Flags & (uint)ParcelFlags.UseAccessList) == 0 && realLand.IsAllowedInLand(userID))) - { - ILandObject clone = realLand.MemberwiseCopy(); - LandData ldata = realLand.LandData.Copy(); - clone.LandData = ldata; - clone.LandData.Flags |= (uint)(ParcelFlags.AllowAPrimitiveEntry | ParcelFlags.AllowFly | ParcelFlags.AllowOtherScripts | ParcelFlags.CreateObjects); - landToSend = clone; - } - } - } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index a4605c431c..e1fedf4bd0 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs @@ -90,7 +90,6 @@ namespace OpenSim.Region.Framework.Scenes public delegate bool TeleportHandler(UUID userID, Scene scene); public delegate bool ControlPrimMediaHandler(UUID userID, UUID primID, int face); public delegate bool InteractWithPrimMediaHandler(UUID userID, UUID primID, int face); - public delegate void SendLandPropertiesHandler(UUID userID, ILandObject realLand, out ILandObject landToSend); #endregion public class ScenePermissions @@ -158,7 +157,6 @@ namespace OpenSim.Region.Framework.Scenes public event TeleportHandler OnTeleport; public event ControlPrimMediaHandler OnControlPrimMedia; public event InteractWithPrimMediaHandler OnInteractWithPrimMedia; - public event SendLandPropertiesHandler OnSendLandProperties; #endregion #region Object Permission Checks @@ -1100,20 +1098,5 @@ namespace OpenSim.Region.Framework.Scenes } return true; } - - public void LandObjectForClient(UUID userID, ILandObject realLand, out ILandObject landToSend) - { - landToSend = realLand; - SendLandPropertiesHandler handler = OnSendLandProperties; - if (handler != null) - { - Delegate[] list = handler.GetInvocationList(); - foreach (SendLandPropertiesHandler h in list) - { - h(userID, realLand, out landToSend); - } - } - } - } } diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 01dc1d6956..2c85f9db18 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -194,14 +194,6 @@ ; region_manager_is_god = false ; parcel_owner_is_god = true - ;; More control over permissions - ;; This is definitely not SL! - ; Provides a simple control for land owners to give build rights to specific avatars - ; in publicly accessible parcels that disallow object creation in general. - ; Owners specific avatars by adding them to the Access List of the parcel - ; without having to use the Groups feature - ; simple_build_permissions = false - ;; Default script engine to use. Currently, we only have XEngine ; DefaultScriptEngine = "XEngine" diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index 1a0d801c78..fd31131bb5 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -260,13 +260,6 @@ ; Default value is all ; allowed_script_editors = all - ; Provides a simple control for land owners to give build rights to - ; publicly accessible parcels that disallow object creation in general. - ; Owners specific avatars by adding them to the Access List of the parcel - ; without having to use the Groups feature - ; Disabled by default - ; simple_build_permissions = False - ; ## ; ## SCRIPT ENGINE ; ## From b5d0bc24887e177e7b6e982789bfd86f27b84cf0 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 22 Mar 2012 20:25:20 +0000 Subject: [PATCH 04/18] Rework Diva's patch to simplify it --- OpenSim/Framework/ILandObject.cs | 1 + .../CoreModules/World/Land/LandObject.cs | 33 +++++++++++-------- .../World/Permissions/PermissionsModule.cs | 12 +++++-- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs index dd73b3fe01..4f98d7bb30 100644 --- a/OpenSim/Framework/ILandObject.cs +++ b/OpenSim/Framework/ILandObject.cs @@ -71,6 +71,7 @@ namespace OpenSim.Framework bool IsEitherBannedOrRestricted(UUID avatar); bool IsBannedFromLand(UUID avatar); bool IsRestrictedFromLand(UUID avatar); + bool IsInLandAccessList(UUID avatar); void SendLandUpdateToClient(IClientAPI remote_client); void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client); List CreateAccessListArrayByFlag(AccessList flag); diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index cc42f7f493..27f0052572 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -448,8 +448,6 @@ namespace OpenSim.Region.CoreModules.World.Land public bool IsRestrictedFromLand(UUID avatar) { - ExpireAccessList(); - if (m_scene.Permissions.IsAdministrator(avatar)) return false; @@ -459,20 +457,27 @@ namespace OpenSim.Region.CoreModules.World.Land if (avatar == LandData.OwnerID) return false; - if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0) + if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) == 0) + return true; + + return (!IsInLandAccessList(avatar)); + } + + public bool IsInLandAccessList(UUID avatar) + { + ExpireAccessList(); + + if (LandData.ParcelAccessList.FindIndex( + delegate(LandAccessEntry e) + { + if (e.AgentID == avatar && e.Flags == AccessList.Access) + return true; + return false; + }) == -1) { - if (LandData.ParcelAccessList.FindIndex( - delegate(LandAccessEntry e) - { - if (e.AgentID == avatar && e.Flags == AccessList.Access) - return true; - return false; - }) == -1) - { - return true; - } + return false; } - return false; + return true; } public void SendLandUpdateToClient(IClientAPI remote_client) diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 6018c3926d..ac03747620 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -94,7 +94,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions private bool m_RegionOwnerIsGod = false; private bool m_RegionManagerIsGod = false; private bool m_ParcelOwnerIsGod = false; - + + private bool m_SimpleBuildPermissions = false; + /// /// The set of users that are allowed to create scripts. This is only active if permissions are not being /// bypassed. This overrides normal permissions. @@ -139,7 +141,9 @@ namespace OpenSim.Region.CoreModules.World.Permissions m_RegionOwnerIsGod = myConfig.GetBoolean("region_owner_is_god", true); m_RegionManagerIsGod = myConfig.GetBoolean("region_manager_is_god", false); m_ParcelOwnerIsGod = myConfig.GetBoolean("parcel_owner_is_god", true); - + + m_SimpleBuildPermissions = myConfig.GetBoolean("simple_build_permissions", false); + m_allowedScriptCreators = ParseUserSetConfigSetting(myConfig, "allowed_script_creators", m_allowedScriptCreators); m_allowedScriptEditors @@ -824,6 +828,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions permission = true; } + if (m_SimpleBuildPermissions && + (parcel.LandData.Flags & (uint)ParcelFlags.UseAccessList) == 0 && parcel.IsInLandAccessList(user)) + permission = true; + return permission; } From 6bc1ccf234e3c754340c3d589d89a3b73ebba4d8 Mon Sep 17 00:00:00 2001 From: Melanie Date: Thu, 22 Mar 2012 20:39:18 +0000 Subject: [PATCH 05/18] Change a false false to be truly true - or is this statement false? Fixes perms boo-boo --- OpenSim/Region/CoreModules/World/Land/LandObject.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 27f0052572..a0ed5a5274 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -458,7 +458,7 @@ namespace OpenSim.Region.CoreModules.World.Land return false; if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) == 0) - return true; + return false; return (!IsInLandAccessList(avatar)); } From 25e5b6a76c4cc517306d25a692e1c147507238f0 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 22 Mar 2012 14:21:07 -0700 Subject: [PATCH 06/18] Added new simple_build_permissions config to the .ini and .example files. --- bin/OpenSim.ini.example | 9 +++++++++ bin/OpenSimDefaults.ini | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 2c85f9db18..50366a675d 100755 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -194,6 +194,15 @@ ; region_manager_is_god = false ; parcel_owner_is_god = true + ;; More control over permissions + ;; This is definitely not SL! + ; Provides a simple control for land owners to give build rights to specific avatars + ; in publicly accessible parcels that disallow object creation in general. + ; Owners specific avatars by adding them to the Access List of the parcel + ; without having to use the Groups feature + ; simple_build_permissions = false + + ;; Default script engine to use. Currently, we only have XEngine ; DefaultScriptEngine = "XEngine" diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index fd31131bb5..3470b82b07 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -260,6 +260,14 @@ ; Default value is all ; allowed_script_editors = all + ; Provides a simple control for land owners to give build rights to specific avatars + ; in publicly accessible parcels that disallow object creation in general. + ; Owners specific avatars by adding them to the Access List of the parcel + ; without having to use the Groups feature + ; Disabled by default + ; simple_build_permissions = False + + ; ## ; ## SCRIPT ENGINE ; ## From df624c13c98b06d57311c1d93ecbd4790553f3b3 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 22 Mar 2012 15:08:57 -0700 Subject: [PATCH 07/18] HG Friends: don't notify if the server isn't there. --- .../Avatar/Friends/HGStatusNotifier.cs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs index 61c6a30113..1fa4dd6ba0 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGStatusNotifier.cs @@ -48,15 +48,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (Util.ParseUniversalUserIdentifier(ids[0], out friendID, out tmp, out tmp, out tmp, out tmp)) { string friendsServerURI = m_FriendsModule.UserManagementModule.GetUserServerURL(friendID, "FriendsServerURI"); - HGFriendsServicesConnector fConn = new HGFriendsServicesConnector(friendsServerURI); - - List friendsOnline = fConn.StatusNotification(ids, userID, online); - - if (online && friendsOnline.Count > 0) + if (friendsServerURI != string.Empty) { - IClientAPI client = m_FriendsModule.LocateClientObject(userID); - if (client != null) - client.SendAgentOnline(friendsOnline.ToArray()); + HGFriendsServicesConnector fConn = new HGFriendsServicesConnector(friendsServerURI); + + List friendsOnline = fConn.StatusNotification(ids, userID, online); + + if (online && friendsOnline.Count > 0) + { + IClientAPI client = m_FriendsModule.LocateClientObject(userID); + if (client != null) + client.SendAgentOnline(friendsOnline.ToArray()); + } } } } From c4b2d24f337eeaf8c7d8e643c3491d491d584cde Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Mar 2012 22:17:07 +0000 Subject: [PATCH 08/18] Add llGiveInventory() test from object to object where both objects are owned by the same user. --- .../World/Terrain/TerrainModule.cs | 6 + .../Framework/Interfaces/IEntityInventory.cs | 11 +- .../Scenes/SceneObjectPartInventory.cs | 6 +- .../Scenes/Tests/TaskInventoryTests.cs | 6 +- .../Shared/Tests/LSL_ApiInventoryTests.cs | 111 ++++++++++++++++++ .../Server/Handlers/Login/LLLoginHandlers.cs | 12 ++ .../Login/LLLoginServiceInConnector.cs | 1 - 7 files changed, 146 insertions(+), 7 deletions(-) create mode 100644 OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index ef9c95c990..f6ddc66147 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -598,6 +598,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain "[TERRAIN]: Could not save terrain from {0} to {1}. Valid file extensions are {2}", m_scene.RegionInfo.RegionName, filename, m_supportedFileExtensions); } + else + { + m_log.ErrorFormat( + "[TERRAIN]: Could not save terrain from {0} to {1}. {2} {3} {4} {5} {6} {7}", + m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY); + } } /// diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 15060fdd17..1334905f35 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -154,6 +154,15 @@ namespace OpenSim.Region.Framework.Interfaces /// null if the item does not exist TaskInventoryItem GetInventoryItem(UUID itemId); + /// + /// Get all inventory items. + /// + /// + /// + /// If there are no inventory items then an empty list is returned. + /// + List GetInventoryItems(); + /// /// Get inventory items by name. /// @@ -162,7 +171,7 @@ namespace OpenSim.Region.Framework.Interfaces /// A list of inventory items with that name. /// If no inventory item has that name then an empty list is returned. /// - IList GetInventoryItems(string name); + List GetInventoryItems(string name); /// /// Get the scene object referenced by an inventory item. diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index f2d19156f1..71a9084fe7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -590,9 +590,9 @@ namespace OpenSim.Region.Framework.Scenes /// A list of inventory items with that name. /// If no inventory item has that name then an empty list is returned. /// - public IList GetInventoryItems(string name) + public List GetInventoryItems(string name) { - IList items = new List(); + List items = new List(); lock (m_items) { @@ -1100,7 +1100,7 @@ namespace OpenSim.Region.Framework.Scenes public List GetInventoryItems() { - List ret = new List(); + List ret = new List(); lock (m_items) ret = new List(m_items.Values); diff --git a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs index e16903c47c..55c80f5af1 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/TaskInventoryTests.cs @@ -113,7 +113,7 @@ namespace OpenSim.Region.Framework.Tests } /// - /// Test MoveTaskInventoryItem where the item has no parent folder assigned. + /// Test MoveTaskInventoryItem from a part inventory to a user inventory where the item has no parent folder assigned. /// /// /// This should place it in the most suitable user folder. @@ -142,9 +142,11 @@ namespace OpenSim.Region.Framework.Tests } /// - /// Test MoveTaskInventoryItem where the item has no parent folder assigned. + /// Test MoveTaskInventoryItem from a part inventory to a user inventory where the item has no parent folder assigned. /// + /// /// This should place it in the most suitable user folder. + /// [Test] public void TestMoveTaskInventoryItemNoParent() { diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs new file mode 100644 index 0000000000..ca27b278e9 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs @@ -0,0 +1,111 @@ +/* + * 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 System.Text; +using log4net; +using Nini.Config; +using NUnit.Framework; +using OpenMetaverse; +using OpenMetaverse.Assets; +using OpenMetaverse.StructuredData; +using OpenSim.Framework; +using OpenSim.Region.CoreModules.Avatar.AvatarFactory; +using OpenSim.Region.OptionalModules.World.NPC; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Region.ScriptEngine.Shared; +using OpenSim.Region.ScriptEngine.Shared.Api; +using OpenSim.Services.Interfaces; +using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; + +namespace OpenSim.Region.ScriptEngine.Shared.Tests +{ + /// + /// Tests for inventory functions in LSL + /// + [TestFixture] + public class LSL_ApiInventoryTests + { + protected Scene m_scene; + protected XEngine.XEngine m_engine; + + [SetUp] + public void SetUp() + { + IConfigSource initConfigSource = new IniConfigSource(); + IConfig config = initConfigSource.AddConfig("XEngine"); + config.Set("Enabled", "true"); + + m_scene = SceneHelpers.SetupScene(); + SceneHelpers.SetupSceneModules(m_scene, initConfigSource); + + m_engine = new XEngine.XEngine(); + m_engine.Initialise(initConfigSource); + m_engine.AddRegion(m_scene); + } + + /// + /// Test giving inventory from an object to an object where both are owned by the same user. + /// + [Test] + public void TestLlGiveInventorySameOwner() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + UUID userId = TestHelpers.ParseTail(0x1); + string inventoryItemName = "item1"; + + SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, userId, "so1", 0x10); + m_scene.AddSceneObject(so1); + + // Create an object embedded inside the first + UUID itemId = TestHelpers.ParseTail(0x20); + TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); + + LSL_Api api = new LSL_Api(); + api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); + + // Create a second object + SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100); + m_scene.AddSceneObject(so2); + + api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); + + // Item has copy permissions so original should stay intact. + List originalItems = so1.RootPart.Inventory.GetInventoryItems(); + Assert.That(originalItems.Count, Is.EqualTo(1)); + + List copiedItems = so2.RootPart.Inventory.GetInventoryItems(inventoryItemName); + Assert.That(copiedItems.Count, Is.EqualTo(1)); + Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName)); + } + } +} \ No newline at end of file diff --git a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs index 8048f861de..ed62f95f46 100644 --- a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs +++ b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs @@ -73,6 +73,18 @@ namespace OpenSim.Server.Handlers.Login if (requestData != null) { + foreach (string key in requestData.Keys) + { + object value = requestData[key]; + Console.WriteLine("{0}:{1}", key, value); + if (value is ArrayList) + { + ICollection col = value as ICollection; + foreach (object item in col) + Console.WriteLine(" {0}", item); + } + } + if (requestData.ContainsKey("first") && requestData["first"] != null && requestData.ContainsKey("last") && requestData["last"] != null && ( (requestData.ContainsKey("passwd") && requestData["passwd"] != null) || diff --git a/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs b/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs index 16c93c8e2c..9a7ad34e10 100644 --- a/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs +++ b/OpenSim/Server/Handlers/Login/LLLoginServiceInConnector.cs @@ -94,6 +94,5 @@ namespace OpenSim.Server.Handlers.Login server.AddXmlRPCHandler("set_login_level", loginHandlers.HandleXMLRPCSetLoginLevel, false); server.SetDefaultLLSDHandler(loginHandlers.HandleLLSDLogin); } - } } From 760010d6fb6aac313d79ce0a4d0016d3809246a0 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Mar 2012 22:33:37 +0000 Subject: [PATCH 09/18] Fix llGiveInventory() so that it checks the destination part for AllowInventoryDrop, not the source. This allows llAllowInventoryDrop() to work. Regression test added for this case. --- .../Framework/Scenes/Scene.Inventory.cs | 10 ++-- .../Shared/Tests/LSL_ApiInventoryTests.cs | 59 ++++++++++++++++++- 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 6ae4adc227..d10136f0bf 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -1210,9 +1210,9 @@ namespace OpenSim.Region.Framework.Scenes /// /// Copy a task (prim) inventory item to another task (prim) /// - /// - /// - /// + /// ID of destination part + /// Source part + /// Source item id to transfer public void MoveTaskInventoryItem(UUID destId, SceneObjectPart part, UUID itemId) { TaskInventoryItem srcTaskItem = part.Inventory.GetInventoryItem(itemId); @@ -1240,10 +1240,10 @@ namespace OpenSim.Region.Framework.Scenes // Can't transfer this // - if ((part.OwnerID != destPart.OwnerID) && ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)) + if (part.OwnerID != destPart.OwnerID && (srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) return; - if (part.OwnerID != destPart.OwnerID && (part.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) + if (part.OwnerID != destPart.OwnerID && (destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) { // object cannot copy items to an object owned by a different owner // unless llAllowInventoryDrop has been called diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs index ca27b278e9..e2d0db267f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs @@ -75,7 +75,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests /// Test giving inventory from an object to an object where both are owned by the same user. /// [Test] - public void TestLlGiveInventorySameOwner() + public void TestLlGiveInventoryO2OSameOwner() { TestHelpers.InMethod(); // log4net.Config.XmlConfigurator.Configure(); @@ -107,5 +107,62 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests Assert.That(copiedItems.Count, Is.EqualTo(1)); Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName)); } + + /// + /// Test giving inventory from an object to an object where they have different owners + /// + [Test] + public void TestLlGiveInventoryO2ODifferentOwners() + { + TestHelpers.InMethod(); +// log4net.Config.XmlConfigurator.Configure(); + + UUID user1Id = TestHelpers.ParseTail(0x1); + UUID user2Id = TestHelpers.ParseTail(0x2); + string inventoryItemName = "item1"; + + SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10); + m_scene.AddSceneObject(so1); + LSL_Api api = new LSL_Api(); + api.Initialize(m_engine, so1.RootPart, so1.RootPart.LocalId, so1.RootPart.UUID); + + // Create an object embedded inside the first + UUID itemId = TestHelpers.ParseTail(0x20); + TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, user1Id); + + // Create a second object + SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100); + m_scene.AddSceneObject(so2); + LSL_Api api2 = new LSL_Api(); + api2.Initialize(m_engine, so2.RootPart, so2.RootPart.LocalId, so2.RootPart.UUID); + + // *** Firstly, we test where llAllowInventoryDrop() has not been called. *** + api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); + + { + // Item has copy permissions so original should stay intact. + List originalItems = so1.RootPart.Inventory.GetInventoryItems(); + Assert.That(originalItems.Count, Is.EqualTo(1)); + + // Should have not copied + List copiedItems = so2.RootPart.Inventory.GetInventoryItems(inventoryItemName); + Assert.That(copiedItems.Count, Is.EqualTo(0)); + } + + // *** Secondly, we turn on allow inventory drop in the target and retest. *** + api2.llAllowInventoryDrop(1); + api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); + + { + // Item has copy permissions so original should stay intact. + List originalItems = so1.RootPart.Inventory.GetInventoryItems(); + Assert.That(originalItems.Count, Is.EqualTo(1)); + + // Should now have copied. + List copiedItems = so2.RootPart.Inventory.GetInventoryItems(inventoryItemName); + Assert.That(copiedItems.Count, Is.EqualTo(1)); + Assert.That(copiedItems[0].Name, Is.EqualTo(inventoryItemName)); + } + } } } \ No newline at end of file From 5bf45b9b98571f92715ea988ec276b36fa8d193c Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Mar 2012 22:40:38 +0000 Subject: [PATCH 10/18] refactor: simplify code for checks when part.OwnerID != destPart.OwnerID in MoveTaskInventoryItem() --- .../Framework/Scenes/Scene.Inventory.cs | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index d10136f0bf..5abd74ff96 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -1238,24 +1238,21 @@ namespace OpenSim.Region.Framework.Scenes return; } - // Can't transfer this - // - if (part.OwnerID != destPart.OwnerID && (srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) - return; - - if (part.OwnerID != destPart.OwnerID && (destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) + if (part.OwnerID != destPart.OwnerID) { - // object cannot copy items to an object owned by a different owner - // unless llAllowInventoryDrop has been called + // Source must have transfer permissions + if ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) + return; - return; + // Object cannot copy items to an object owned by a different owner + // unless llAllowInventoryDrop has been called on the destination + if ((destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) + return; } // must have both move and modify permission to put an item in an object if ((part.OwnerMask & ((uint)PermissionMask.Move | (uint)PermissionMask.Modify)) == 0) - { return; - } TaskInventoryItem destTaskItem = new TaskInventoryItem(); From c1d064e1ca1e7ddfb9da851654a6a430747b871f Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Mar 2012 23:16:52 +0000 Subject: [PATCH 11/18] Comment out a terrain save-tile debugging message that accidentally crept in with c4b2d24 --- .../CoreModules/World/Terrain/TerrainModule.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index f6ddc66147..9cd8f2beb3 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs @@ -598,12 +598,12 @@ namespace OpenSim.Region.CoreModules.World.Terrain "[TERRAIN]: Could not save terrain from {0} to {1}. Valid file extensions are {2}", m_scene.RegionInfo.RegionName, filename, m_supportedFileExtensions); } - else - { - m_log.ErrorFormat( - "[TERRAIN]: Could not save terrain from {0} to {1}. {2} {3} {4} {5} {6} {7}", - m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY); - } +// else +// { +// m_log.ErrorFormat( +// "[TERRAIN]: Could not save terrain from {0} to {1}. {2} {3} {4} {5} {6} {7}", +// m_scene.RegionInfo.RegionName, filename, fileWidth, fileHeight, fileStartX, fileStartY, offsetX, offsetY); +// } } /// From 15c2499ccdaf3b461a17557ae473e942dd62a26e Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Thu, 22 Mar 2012 23:31:41 +0000 Subject: [PATCH 12/18] Comment out login parameters debug output accidentally included with c4b2d24 --- .../Server/Handlers/Login/LLLoginHandlers.cs | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs index ed62f95f46..f83a23998a 100644 --- a/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs +++ b/OpenSim/Server/Handlers/Login/LLLoginHandlers.cs @@ -73,17 +73,19 @@ namespace OpenSim.Server.Handlers.Login if (requestData != null) { - foreach (string key in requestData.Keys) - { - object value = requestData[key]; - Console.WriteLine("{0}:{1}", key, value); - if (value is ArrayList) - { - ICollection col = value as ICollection; - foreach (object item in col) - Console.WriteLine(" {0}", item); - } - } + // Debug code to show exactly what login parameters the viewer is sending us. + // TODO: Extract into a method that can be generally applied if one doesn't already exist. +// foreach (string key in requestData.Keys) +// { +// object value = requestData[key]; +// Console.WriteLine("{0}:{1}", key, value); +// if (value is ArrayList) +// { +// ICollection col = value as ICollection; +// foreach (object item in col) +// Console.WriteLine(" {0}", item); +// } +// } if (requestData.ContainsKey("first") && requestData["first"] != null && requestData.ContainsKey("last") && requestData["last"] != null && ( From 40b9b519b89f5da08e1e6b6557934bfd39b4f90b Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 23 Mar 2012 00:12:14 +0000 Subject: [PATCH 13/18] Add commented out section on collisions switch in Scene.SetSceneCoreDebug(). This was not implemented before the recent changes but should be at some point. --- OpenSim/Region/Framework/Scenes/Scene.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 76e632e45d..9d882c03e0 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1074,6 +1074,12 @@ namespace OpenSim.Region.Framework.Scenes m_physics_enabled = enablePhysics; } +// if (options.ContainsKey("collisions")) +// { +// // TODO: Implement. If false, should stop objects colliding, though possibly should still allow +// // the avatar themselves to collide with the ground. +// } + if (options.ContainsKey("teleport")) { bool enableTeleportDebugging; From 08b8ebcc7e71038894fa47757db6d6aa5bb66d00 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 23 Mar 2012 00:54:37 +0000 Subject: [PATCH 14/18] Use m_lastFrameTick instead of m_lastUpdate in Scene.GetHealth(). m_lastUpdate is no longer properly updated and is redundant anyway. --- OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 9d882c03e0..16ce1ba2e5 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -4504,8 +4504,8 @@ namespace OpenSim.Region.Framework.Scenes // int health=1; // Start at 1, means we're up - if ((Util.EnvironmentTickCountSubtract(m_lastUpdate)) < 1000) - health+=1; + if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) + health += 1; else return health; From bc2963d42ab998551603b74361b26d5dfd5d0acd Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 23 Mar 2012 01:03:10 +0000 Subject: [PATCH 15/18] Comment out unused scene loop restart code. This has actually been unused since at least 0.7.2 due to earlier changes. --- OpenSim/Region/Framework/Scenes/Scene.cs | 41 +++++++++++++----------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 16ce1ba2e5..d89d94d2f2 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -216,9 +216,7 @@ namespace OpenSim.Region.Framework.Scenes // TODO: Possibly stop other classes being able to manipulate this directly. private SceneGraph m_sceneGraph; private volatile int m_bordersLocked; -// private int m_RestartTimerCounter; private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing -// private int m_incrementsof15seconds; private volatile bool m_backingup; private Dictionary m_returns = new Dictionary(); private Dictionary m_groupsWithTargets = new Dictionary(); @@ -226,12 +224,17 @@ namespace OpenSim.Region.Framework.Scenes private bool m_physics_enabled = true; private bool m_scripts_enabled = true; private string m_defaultScriptEngine; + + /// + /// Tick at which the last login occurred. + /// private int m_LastLogin; + private Thread HeartbeatThread; private volatile bool shuttingdown; - private int m_lastUpdate; - private bool m_firstHeartbeat = true; +// private int m_lastUpdate; +// private bool m_firstHeartbeat = true; private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time; private bool m_reprioritizationEnabled = true; @@ -801,7 +804,7 @@ namespace OpenSim.Region.Framework.Scenes m_permissions = new ScenePermissions(this); - m_lastUpdate = Util.EnvironmentTickCount(); +// m_lastUpdate = Util.EnvironmentTickCount(); } #endregion @@ -1170,7 +1173,7 @@ namespace OpenSim.Region.Framework.Scenes HeartbeatThread.Abort(); HeartbeatThread = null; } - m_lastUpdate = Util.EnvironmentTickCount(); +// m_lastUpdate = Util.EnvironmentTickCount(); HeartbeatThread = Watchdog.StartThread( @@ -1222,8 +1225,8 @@ namespace OpenSim.Region.Framework.Scenes while (!shuttingdown) Update(-1); - m_lastUpdate = Util.EnvironmentTickCount(); - m_firstHeartbeat = false; +// m_lastUpdate = Util.EnvironmentTickCount(); +// m_firstHeartbeat = false; } finally { @@ -2541,7 +2544,7 @@ namespace OpenSim.Region.Framework.Scenes = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; - CheckHeartbeat(); +// CheckHeartbeat(); ScenePresence sp = GetScenePresence(client.AgentId); @@ -3117,7 +3120,7 @@ namespace OpenSim.Region.Framework.Scenes public override void RemoveClient(UUID agentID, bool closeChildAgents) { - CheckHeartbeat(); +// CheckHeartbeat(); bool isChildAgent = false; ScenePresence avatar = GetScenePresence(agentID); if (avatar != null) @@ -4516,7 +4519,7 @@ namespace OpenSim.Region.Framework.Scenes else return health; - CheckHeartbeat(); +// CheckHeartbeat(); return health; } @@ -4704,14 +4707,14 @@ namespace OpenSim.Region.Framework.Scenes return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; } - private void CheckHeartbeat() - { - if (m_firstHeartbeat) - return; - - if (Util.EnvironmentTickCountSubtract(m_lastUpdate) > 2000) - StartTimer(); - } +// private void CheckHeartbeat() +// { +// if (m_firstHeartbeat) +// return; +// +// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000) +// StartTimer(); +// } public override ISceneObject DeserializeObject(string representation) { From a9995ede65d1327413ae5c5e9b2e6f6dcf0f11c2 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 23 Mar 2012 01:08:13 +0000 Subject: [PATCH 16/18] Fix bug in ScenePresenceAnimator.RemoveAnimation() introduced in commit 1a8769e Forgot to uppercase the animation name for default animations, since for some reason we store and use them in upper rather than lowercase. --- .../Framework/Scenes/Animation/ScenePresenceAnimator.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index cded9be47d..f5623bdf69 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs @@ -125,7 +125,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation // XXX: For some reason, we store all animations and use them with upper case names, but in LSL animations // are referenced with lower case names! - UUID animID = DefaultAvatarAnimations.GetDefaultAnimation(name); + UUID animID = DefaultAvatarAnimations.GetDefaultAnimation(name.ToUpper()); if (animID == UUID.Zero) return; diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d89d94d2f2..6fea5ff883 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1159,9 +1159,9 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Start the timer which triggers regular scene updates + /// Start the scene loop /// - public void StartTimer() + public void Start() { // m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName); From 4ee8b3e23edc9ca11cf3d17f24fddfdcbfd8c1cc Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 23 Mar 2012 01:11:43 +0000 Subject: [PATCH 17/18] Fix build break --- OpenSim/Region/Framework/Scenes/Scene.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 6fea5ff883..8a4c6c966c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1161,7 +1161,7 @@ namespace OpenSim.Region.Framework.Scenes /// /// Start the scene loop /// - public void Start() + public void StartTimer() { // m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName); From 18b3f1132eeb28e51d84e028e4fd69048150ccb7 Mon Sep 17 00:00:00 2001 From: "Justin Clark-Casey (justincc)" Date: Fri, 23 Mar 2012 01:21:43 +0000 Subject: [PATCH 18/18] Rename Scene.StartTimer() to Start() - this method no longer uses a timer. Comment out more effectively unused old heartbeat code. --- OpenSim/Region/Application/OpenSimBase.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.cs | 49 ++++++++++++----------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index c6956fc2b9..484159ce15 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -430,7 +430,7 @@ namespace OpenSim mscene = scene; - scene.StartTimer(); + scene.Start(); scene.StartScripts(); diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 8a4c6c966c..d354ef05ad 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -211,7 +211,7 @@ namespace OpenSim.Region.Framework.Scenes /// private bool m_cleaningTemps = false; - private Object m_heartbeatLock = new Object(); +// private Object m_heartbeatLock = new Object(); // TODO: Possibly stop other classes being able to manipulate this directly. private SceneGraph m_sceneGraph; @@ -1159,9 +1159,9 @@ namespace OpenSim.Region.Framework.Scenes } /// - /// Start the scene loop + /// Start the scene /// - public void StartTimer() + public void Start() { // m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName); @@ -1206,33 +1206,34 @@ namespace OpenSim.Region.Framework.Scenes /// private void Heartbeat() { - if (!Monitor.TryEnter(m_heartbeatLock)) - { - Watchdog.RemoveThread(); - return; - } +// if (!Monitor.TryEnter(m_heartbeatLock)) +// { +// Watchdog.RemoveThread(); +// return; +// } - try - { - m_eventManager.TriggerOnRegionStarted(this); +// try +// { - // The first frame can take a very long time due to physics actors being added on startup. Therefore, - // don't turn on the watchdog alarm for this thread until the second frame, in order to prevent false - // alarms for scenes with many objects. - Update(1); - Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true; + m_eventManager.TriggerOnRegionStarted(this); - while (!shuttingdown) - Update(-1); + // The first frame can take a very long time due to physics actors being added on startup. Therefore, + // don't turn on the watchdog alarm for this thread until the second frame, in order to prevent false + // alarms for scenes with many objects. + Update(1); + Watchdog.GetCurrentThreadInfo().AlarmIfTimeout = true; + + while (!shuttingdown) + Update(-1); // m_lastUpdate = Util.EnvironmentTickCount(); // m_firstHeartbeat = false; - } - finally - { - Monitor.Pulse(m_heartbeatLock); - Monitor.Exit(m_heartbeatLock); - } +// } +// finally +// { +// Monitor.Pulse(m_heartbeatLock); +// Monitor.Exit(m_heartbeatLock); +// } Watchdog.RemoveThread(); }