diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 21d47aa15a..018e8371fd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -170,6 +170,9 @@ namespace OpenSim.Region.Framework.Scenes } private bool m_scripts_enabled; + // Dynamic ossl function permissions + private Dictionary> m_DynaPerms = new Dictionary>(); + public SynchronizeSceneHandler SynchronizeScene; /// @@ -5893,5 +5896,63 @@ namespace OpenSim.Region.Framework.Scenes m_eventManager.TriggerExtraSettingChanged(this, name, String.Empty); } + + public bool AddOsslPerm (UUID key, string function) + { + StackTrace calls = new StackTrace (); + string caller = calls.GetFrame (1).GetMethod ().Name; + if (caller != "osGrantScriptPermissions") + { + m_log.ErrorFormat("[SCENE]: {0} cannot adjust script perms!",caller); + return false; + } + + if (string.IsNullOrEmpty(function)) + return false; + + if (!m_DynaPerms.ContainsKey(function)) + { + List keys = new List (); + keys.Add (key); + m_DynaPerms[function] = keys; + return true; + } + + if (!m_DynaPerms[function].Contains(key)) + m_DynaPerms[function].Add(key); + + return true; + } + + public bool GetOsslPerms(UUID avatar, string function) + { + if (m_DynaPerms.ContainsKey(function)) + if(m_DynaPerms[function].Contains(avatar)) + return true; + + return false; + } + + public bool RemoveOsslPerm(UUID key, string function) + { + StackTrace calls = new StackTrace (); + string caller = calls.GetFrame (1).GetMethod ().Name; + if (caller != "osRevokeScriptPermissions") + { + m_log.ErrorFormat("[SCENE]: {0} cannot adjust script perms!",caller); + return false; + } + + if (m_DynaPerms.ContainsKey (function)) + { + if (m_DynaPerms [function].Contains (key)) + { + m_DynaPerms [function].Remove (key); + if (m_DynaPerms [function].Count == 0) + m_DynaPerms.Remove (function); + } + } + return true; + } } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 10ddf14089..f4bc45fbf5 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -264,6 +264,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // or a string explaining why this function can't be used. private string CheckThreatLevelTest(ThreatLevel level, string function) { + if(GetDynaPerms(m_item.CreatorID, m_item.OwnerID, m_item.GroupID, function)) + return string.Empty; + if (!m_FunctionPerms.ContainsKey(function)) { FunctionPerms perms = new FunctionPerms(); @@ -431,6 +434,47 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api System.Threading.Thread.Sleep(delay); } + private bool GetDynaPerms(UUID owner, UUID creator, UUID group, string function) + { + if (World.GetOsslPerms(owner, function)) + return true; + if (World.GetOsslPerms(creator, function)) + return true; + if (World.GetOsslPerms(creator, function)) + return true; + + return false; + + } + + public void osGrantScriptPermissions(LSL_Key avatar, LSL_List osfunctions) + { + CheckThreatLevel(ThreatLevel.Severe, "osGrantScriptPermissions"); + m_host.AddScriptLPS(1); + UUID key; + UUID.TryParse(avatar.m_string, out key); + + for (int item = 0; item <= osfunctions.Length - 1; item++) + { + string function = osfunctions.GetLSLStringItem(item); + World.AddOsslPerm(key, function); + } + } + + public void osRevokeScriptPermissions (LSL_Key avatar, LSL_List osfunctions) + { + CheckThreatLevel(ThreatLevel.Severe, "osRevokeScriptPermissions"); + m_host.AddScriptLPS(1); + UUID key; + UUID.TryParse(avatar.m_string, out key); + + for (int item = 0; item <= osfunctions.Length - 1; item++) + { + string function = osfunctions.GetLSLStringItem(item); + World.RemoveOsslPerm(key, function); + } + } + public LSL_Integer osSetTerrainHeight(int x, int y, double val) { CheckThreatLevel(ThreatLevel.High, "osSetTerrainHeight"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 38d4574be2..2cbaf5a50a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -116,6 +116,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces { void CheckThreatLevel(ThreatLevel level, string function); + // Scripted Script Permissions + void osGrantScriptPermissions(LSL_Key avatar, LSL_List functions); + void osRevokeScriptPermissions(LSL_Key avatar, LSL_List functions); + //OpenSim functions string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, int timer); string osSetDynamicTextureURLBlend(string dynamicID, string contentType, string url, string extraParams, diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 352a35da6f..a98f6ac5d4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -61,6 +61,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase Prim = new OSSLPrim(this); } + public void osGrantScriptPermissions (LSL_Key avatar, LSL_List osfunctions) + { + m_OSSL_Functions.osGrantScriptPermissions(avatar, osfunctions); + } + + public void osRevokeScriptPermissions (LSL_Key avatar, LSL_List osfunctions) + { + m_OSSL_Functions.osRevokeScriptPermissions(avatar, osfunctions); + } + public void osSetRegionWaterHeight(double height) { m_OSSL_Functions.osSetRegionWaterHeight(height);