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')
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