From ad03c0dc698ed65678f38ec461f0143bbd82ab2a Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Thu, 2 Aug 2007 12:30:40 +0000 Subject: * Added support for CreateLink to LSL Interpreted API * Added new "PermissionManager" which handles access to protected resources for users. (ie editing other peoples objects, etc) --- OpenSim/Region/Environment/PermissionManager.cs | 108 +++++++++++++++++++++ .../Scenes/scripting/ScriptInterpretedAPI.cs | 4 +- 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 OpenSim/Region/Environment/PermissionManager.cs (limited to 'OpenSim/Region/Environment') diff --git a/OpenSim/Region/Environment/PermissionManager.cs b/OpenSim/Region/Environment/PermissionManager.cs new file mode 100644 index 0000000..ec035f0 --- /dev/null +++ b/OpenSim/Region/Environment/PermissionManager.cs @@ -0,0 +1,108 @@ +using System.Collections.Generic; +using OpenSim.Framework; +using OpenSim.Framework.Types; +using OpenSim.Framework.Communications; +using OpenSim.Framework.Servers; +using OpenSim.Region.Capabilities; +using OpenSim.Region.Environment.Scenes; +using OpenSim.Region.Environment.LandManagement; + +using libsecondlife; + +namespace OpenSim.Region.Environment +{ + public class PermissionManager + { + protected Scene m_scene; + + public PermissionManager(Scene world) + { + m_scene = world; + } + + private virtual bool IsAdministrator(LLUUID user) + { + return m_scene.RegionInfo.MasterAvatarAssignedUUID == user; + } + + private virtual bool IsEstateManager(LLUUID user) + { + return false; + } + + public virtual bool CanRezObject(LLUUID user, LLVector3 position) + { + return true; + } + + /// + /// Permissions check - can user delete an object? + /// + /// User attempting the delete + /// Target object + /// Has permission? + public virtual bool CanDeRezObject(LLUUID user, LLUUID obj) + { + // Default: deny + bool canDeRez = false; + + // If it's not an object, we cant derez it. + if (!(m_scene.Entities[obj] is SceneObject)) + return false; + + SceneObject task = (SceneObject)m_scene.Entities[obj]; + LLUUID taskOwner; // Since we dont have a 'owner' property on task yet + + // Object owners should be able to delete their own content + if (user == taskOwner) + canDeRez = true; + + // Users should be able to delete what is over their land. + if (m_scene.LandManager.getLandObject(task.Pos.X, task.Pos.Y).landData.ownerID == user) + canDeRez = true; + + // Estate users should be able to delete anything in the sim + if (IsEstateManager(user)) + canDeRez = true; + + // Admin objects should not be deletable by the above + if (IsAdministrator(taskOwner)) + canDeRez = false; + + // Admin should be able to delete anything in the sim (including admin objects) + if (IsAdministrator(user)) + canDeRez = true; + + return canDeRez; + } + + public virtual bool CanEditObject(LLUUID user, LLUUID obj) + { + // Permissions for editing fall into the same category as deleting + // May need to add check for "no-mod" items. + return CanDeRezObject(user, obj); + } + + public virtual bool CanEditScript(LLUUID user, LLUUID script) + { + return false; + } + + public virtual bool CanRunScript(LLUUID user, LLUUID script) + { + return false; + } + + public virtual bool CanReturnObject(LLUUID user, LLUUID obj) + { + // Same category as deleting, but eventually will need seperate check + // as sometimes it's better to allow returning only. + return CanDeRezObject(user, obj); + } + + public virtual bool CanTerraform(LLUUID user, LLUUID position) + { + return false; + } + } +} diff --git a/OpenSim/Region/Environment/Scenes/scripting/ScriptInterpretedAPI.cs b/OpenSim/Region/Environment/Scenes/scripting/ScriptInterpretedAPI.cs index f52e9e2..284ae74 100644 --- a/OpenSim/Region/Environment/Scenes/scripting/ScriptInterpretedAPI.cs +++ b/OpenSim/Region/Environment/Scenes/scripting/ScriptInterpretedAPI.cs @@ -226,9 +226,11 @@ namespace OpenSim.Region.Scripting return (float)Math.Cos(theta); } - [Obsolete("Unimplemented")] public void osCreateLink(Key target, int parent) { + if(World.Entities[target] is SceneObject) + Task.AddNewChildPrims((SceneObject)World.Entities[target]); + return; } -- cgit v1.1