Anonymous | Login | Signup for a new account | 2021-01-15 07:42 PST | ![]() |
Main | My View | View Issues | Change Log | Roadmap | Summary | My Account |
View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | |||||||||
ID | Project | Category | View Status | Date Submitted | Last Update | |||||
0008418 | opensim | [REGION] Script Functions | public | 2018-12-09 03:38 | 2018-12-11 14:39 | |||||
Reporter | unregi | |||||||||
Assigned To | ||||||||||
Priority | normal | Severity | tweak | Reproducibility | always | |||||
Status | patch included | Resolution | open | |||||||
Platform | Operating System | Operating System Version | ||||||||
Product Version | 0.9.0.1 | |||||||||
Target Version | Fixed in Version | |||||||||
Summary | 0008418: Implement ossl funtion to test Threat Level | |||||||||
Description | It would be a big improvement if we would be able to check if ossl functions area allowed or not, so that we can implement some fallback or have just limited functionality if they are not allowed, instead of having the script just die with an Error message. Attached is a patch for a Implementation of osCheckThreatLevel that returns OS_THREAT_ENABLED, OS_THREAT_DISABLED or OS_THREAD_NA (function doesn't exist or doesn't do any threat level checks)- | |||||||||
Tags | No tags attached. | |||||||||
Git Revision or version number | ||||||||||
Run Mode | Grid (1 Region per Sim) | |||||||||
Physics Engine | BulletSim | |||||||||
Script Engine | ||||||||||
Environment | Mono / Linux64 | |||||||||
Mono Version | 5.x | |||||||||
Viewer | ||||||||||
Attached Files | ![]() From dded4159840ae4b6546a17f028c59fe480feda7e Mon Sep 17 00:00:00 2001 From: uriesk <uriesk@posteo.de> Date: Sun, 9 Dec 2018 10:56:08 +0100 Subject: [PATCH] Add osCheckThreatLevel --- .../Shared/Api/Implementation/LSL_Api.cs | 4 +- .../Shared/Api/Implementation/OSSL_Api.cs | 581 +++++++++++++----- .../Shared/Api/Interface/IOSSL_Api.cs | 4 +- .../Shared/Api/Runtime/LSL_Constants.cs | 5 + .../Shared/Api/Runtime/OSSL_Stub.cs | 5 + 5 files changed, 455 insertions(+), 144 deletions(-) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index c790b76e4a..8bc58b48c2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -12910,7 +12910,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api break; case ScriptBaseClass.DATA_SIM_RELEASE: if (ossl != null) - ossl.CheckThreatLevel(ThreatLevel.High, "llRequestSimulatorData"); + ossl.CheckThreatLevel("llRequestSimulatorData"); reply = "OpenSim"; break; default: @@ -14885,7 +14885,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL"); if (ossl != null) { - ossl.CheckThreatLevel(ThreatLevel.High, "print"); + ossl.CheckThreatLevel("print"); m_log.Info("LSL print():" + str); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 4c06a4f3d1..b17e29f3e2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -259,6 +259,284 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message); } + // Returns ThreatLevel of function + private ThreatLevel GetFunctionThreatLevel(string function) + { + switch (function) + { + case "osSetTerrainHeight": + return ThreatLevel.High; + case "osTerrainSetHeight": + return ThreatLevel.High; + case "osTerrainFlush": + return ThreatLevel.VeryLow; + case "osRegionRestart": + return ThreatLevel.High; + case "osRegionNotice": + return ThreatLevel.High; + case "osSetRot": + return ThreatLevel.VeryHigh; + case "osSetDynamicTextureURL": + return ThreatLevel.VeryLow; + case "osSetDynamicTextureURLBlend": + return ThreatLevel.VeryLow; + case "osSetDynamicTextureURLBlendFace": + return ThreatLevel.VeryLow; + case "osSetDynamicTextureData": + return ThreatLevel.VeryLow; + case "osSetDynamicTextureDataBlend": + return ThreatLevel.VeryLow; + case "osSetDynamicTextureDataBlendFace": + return ThreatLevel.VeryLow; + case "osConsoleCommand": + return ThreatLevel.Severe; + case "osSetPrimFloatOnWater": + return ThreatLevel.VeryLow; + case "osTeleportAgent": + return ThreatLevel.Severe; + case "osTeleportOwner": + return ThreatLevel.None; + case "osForceOtherSit": + return ThreatLevel.VeryHigh; + case "osGetAgents": + return ThreatLevel.None; + case "osGetAgentIP": + return ThreatLevel.Severe; + case "osAvatarPlayAnimation": + return ThreatLevel.VeryHigh; + case "osAvatarStopAnimation": + return ThreatLevel.VeryHigh; + case "osDrawText": + return ThreatLevel.None; + case "osSetStateEvents": + return ThreatLevel.High; + case "osSetRegionWaterHeight": + return ThreatLevel.High; + case "osSetRegionSunSettings": + return ThreatLevel.High; + case "osSetEstateSunSettings": + return ThreatLevel.High; + case "osSunGetParam": + return ThreatLevel.None; + case "osSunSetParam": + return ThreatLevel.None; + case "osSetSunParam": + return ThreatLevel.None; + case "osWindActiveModelPluginName": + return ThreatLevel.None; + case "osSetWindParam": + return ThreatLevel.VeryLow; + case "osGetWindParam": + return ThreatLevel.VeryLow; + case "osParcelJoin": + return ThreatLevel.High; + case "osParcelSubdivide": + return ThreatLevel.High; + case "osParcelSetDetails": + return ThreatLevel.High; + case "osSetParcelDetails": + return ThreatLevel.High; + case "osSetParcelMediaURL": + return ThreatLevel.VeryLow; + case "osSetParcelSIPAddress": + return ThreatLevel.VeryLow; + case "osGetScriptEngineName": + return ThreatLevel.High; + case "osGetSimulatorVersion": + return ThreatLevel.High; + case "osMessageObject": + return ThreatLevel.Low; + case "osMoveToTarget": + return ThreatLevel.Low; + case "osDie": + return ThreatLevel.Low; + case "osMakeNotecard": + return ThreatLevel.High; + case "osGetNotecardLine": + return ThreatLevel.VeryHigh; + case "osGetNotecard": + return ThreatLevel.VeryHigh; + case "osGetNumberOfNotecardLines": + return ThreatLevel.VeryHigh; + case "osAvatarName2Key": + return ThreatLevel.Low; + case "osKey2Name": + return ThreatLevel.Low; + case "osGetGridNick": + return ThreatLevel.Moderate; + case "osGetGridName": + return ThreatLevel.Moderate; + case "osGetGridLoginURI": + return ThreatLevel.Moderate; + case "osGetGridHomeURI": + return ThreatLevel.Moderate; + case "osGetGridGatekeeperURI": + return ThreatLevel.Moderate; + case "osGetGridCustom": + return ThreatLevel.Moderate; + case "osGetAvatarHomeURI": + return ThreatLevel.Low; + case "osFormatString": + return ThreatLevel.VeryLow; + case "osMatchString": + return ThreatLevel.VeryLow; + case "osReplaceString": + return ThreatLevel.VeryLow; + case "osLoadedCreationDate": + return ThreatLevel.Low; + case "osLoadedCreationTime": + return ThreatLevel.Low; + case "osLoadedCreationID": + return ThreatLevel.Low; + case "osGetLinkPrimitiveParams": + return ThreatLevel.High; + case "osForceCreateLink": + return ThreatLevel.VeryLow; + case "osForceBreakLink": + return ThreatLevel.VeryLow; + case "osForceBreakAllLinks": + return ThreatLevel.VeryLow; + case "osNpcCreate": + return ThreatLevel.High; + case "osNpcSaveAppearance": + return ThreatLevel.High; + case "osNpcLoadAppearance": + return ThreatLevel.High; + case "osNpcGetOwner": + return ThreatLevel.None; + case "osNpcGetPos": + return ThreatLevel.High; + case "osNpcMoveTo": + return ThreatLevel.High; + case "osNpcMoveToTarget": + return ThreatLevel.High; + case "osNpcGetRot": + return ThreatLevel.High; + case "osNpcSetRot": + return ThreatLevel.High; + case "osNpcStopMoveToTarget": + return ThreatLevel.High; + case "osNpcSetProfileAbout": + return ThreatLevel.Low; + case "osNpcSetProfileImage": + return ThreatLevel.Low; + case "osNpcSay": + return ThreatLevel.High; + case "osNpcShout": + return ThreatLevel.High; + case "osNpcSit": + return ThreatLevel.High; + case "osNpcStand": + return ThreatLevel.High; + case "osNpcRemove": + return ThreatLevel.High; + case "osNpcPlayAnimation": + return ThreatLevel.High; + case "osNpcStopAnimation": + return ThreatLevel.High; + case "osNpcWhisper": + return ThreatLevel.High; + case "osNpcTouch": + return ThreatLevel.High; + case "osOwnerSaveAppearance": + return ThreatLevel.High; + case "osAgentSaveAppearance": + return ThreatLevel.VeryHigh; + case "osGetGender": + return ThreatLevel.None; + case "osGetRegionMapTexture": + return ThreatLevel.High; + case "osGetRegionStats": + return ThreatLevel.Moderate; + case "osGetSimulatorMemory": + return ThreatLevel.Moderate; + case "osGetSimulatorMemoryKB": + return ThreatLevel.Moderate; + case "osSetSpeed": + return ThreatLevel.Moderate; + case "osSetOwnerSpeed": + return ThreatLevel.Moderate; + case "osKickAvatar": + return ThreatLevel.Severe; + case "osGetHealth": + return ThreatLevel.None; + case "osCauseDamage": + return ThreatLevel.High; + case "osCauseHealing": + return ThreatLevel.High; + case "osSetHealth": + return ThreatLevel.High; + case "osSetHealRate": + return ThreatLevel.High; + case "osGetHealRate": + return ThreatLevel.None; + case "osGetPrimitiveParams": + return ThreatLevel.High; + case "osSetPrimitiveParams": + return ThreatLevel.High; + case "osSetProjectionParams": + return ThreatLevel.High; + case "osGetAvatarList": + return ThreatLevel.None; + case "osGetNPCList": + return ThreatLevel.None; + case "osUnixTimeToTimestamp": + return ThreatLevel.VeryLow; + case "osInviteToGroup": + return ThreatLevel.VeryLow; + case "osEjectFromGroup": + return ThreatLevel.VeryLow; + case "osSetTerrainTexture": + return ThreatLevel.High; + case "osSetTerrainTextureHeight": + return ThreatLevel.High; + case "osForceAttachToAvatar": + return ThreatLevel.High; + case "osForceAttachToAvatarFromInventory": + return ThreatLevel.High; + case "osForceAttachToOtherAvatarFromInventory": + return ThreatLevel.VeryHigh; + case "osForceDetachFromAvatar": + return ThreatLevel.High; + case "osGetNumberOfAttachments": + return ThreatLevel.Moderate; + case "osMessageAttachments": + return ThreatLevel.Moderate; + case "osGetRezzingObject": + return ThreatLevel.None; + case "osSetContentType": + return ThreatLevel.High; + case "osDropAttachment": + return ThreatLevel.Moderate; + case "osForceDropAttachment": + return ThreatLevel.High; + case "osDropAttachmentAt": + return ThreatLevel.Moderate; + case "osForceDropAttachmentAt": + return ThreatLevel.High; + case "osListenRegex": + return ThreatLevel.Low; + case "osRegexIsMatch": + return ThreatLevel.Low; + case "osRequestURL": + return ThreatLevel.Moderate; + case "osRequestSecureURL": + return ThreatLevel.Moderate; + case "osTeleportObject": + return ThreatLevel.Severe; + case "osDetectedCountry": + return ThreatLevel.Moderate; + case "osGetAgentCountry": + return ThreatLevel.Moderate; + case "llRequestSimulatorData": + return ThreatLevel.High; + case "print": + return ThreatLevel.High; + default: + return ThreatLevel.NoAccess; + } + } + // Returns if OSSL is enabled. Throws a script exception if OSSL is not allowed.. // for safe funtions always active public void CheckThreatLevel() @@ -269,9 +547,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api } // Returns if the function is allowed. Throws a script exception if not allowed. - public void CheckThreatLevel(ThreatLevel level, string function) + public void CheckThreatLevel(string function) { m_host.AddScriptLPS(1); + ThreatLevel level = GetFunctionThreatLevel(function); if (!m_OSFunctionsEnabled) OSSLError(String.Format("{0} permission denied. All OS functions are disabled.", function)); // throws @@ -485,16 +764,36 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api Thread.Sleep(delay); } + public LSL_Integer osCheckThreatLevel(string function) + { + CheckThreatLevel(); + + ThreatLevel level = GetFunctionThreatLevel(function); + if (level == ThreatLevel.NoAccess) + { + return ScriptBaseClass.OS_THREAT_NA; + } + string reasonWhyNot = CheckThreatLevelTest(level, function); + if (!String.IsNullOrEmpty(reasonWhyNot)) + { + return ScriptBaseClass.OS_THREAT_DISABLED; + } + else + { + return ScriptBaseClass.OS_THREAT_ENABLED; + } + } + public LSL_Integer osSetTerrainHeight(int x, int y, double val) { - CheckThreatLevel(ThreatLevel.High, "osSetTerrainHeight"); + CheckThreatLevel("osSetTerrainHeight"); return SetTerrainHeight(x, y, val); } public LSL_Integer osTerrainSetHeight(int x, int y, double val) { - CheckThreatLevel(ThreatLevel.High, "osTerrainSetHeight"); + CheckThreatLevel("osTerrainSetHeight"); OSSLDeprecated("osTerrainSetHeight", "osSetTerrainHeight"); return SetTerrainHeight(x, y, val); @@ -539,7 +838,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osTerrainFlush() { - CheckThreatLevel(ThreatLevel.VeryLow, "osTerrainFlush"); + CheckThreatLevel("osTerrainFlush"); ITerrainModule terrainModule = World.RequestModuleInterface<ITerrainModule>(); if (terrainModule != null) terrainModule.TaintTerrain(); @@ -553,7 +852,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // The underlying functionality is fixed, since the security // as such is sound // - CheckThreatLevel(ThreatLevel.High, "osRegionRestart"); + CheckThreatLevel("osRegionRestart"); IRestartModule restartModule = World.RequestModuleInterface<IRestartModule>(); if (World.Permissions.CanIssueEstateCommand(m_host.OwnerID, false) && (restartModule != null)) @@ -575,7 +874,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public int osRegionRestart(double seconds, string msg) { - CheckThreatLevel(ThreatLevel.High, "osRegionRestart"); + CheckThreatLevel("osRegionRestart"); IRestartModule restartModule = World.RequestModuleInterface<IRestartModule>(); if (World.Permissions.CanIssueEstateCommand(m_host.OwnerID, false) && (restartModule != null)) @@ -622,7 +921,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osRegionNotice(string msg) { - CheckThreatLevel(ThreatLevel.High, "osRegionNotice"); + CheckThreatLevel("osRegionNotice"); IDialogModule dm = World.RequestModuleInterface<IDialogModule>(); if (dm == null) @@ -636,7 +935,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osRegionNotice(LSL_Key agentID, string msg) { - CheckThreatLevel(ThreatLevel.High, "osRegionNotice"); + CheckThreatLevel("osRegionNotice"); if (!World.Permissions.CanIssueEstateCommand(m_host.OwnerID, false)) return; @@ -664,7 +963,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // This function has no security. It can be used to destroy // arbitrary builds the user would normally have no rights to // - CheckThreatLevel(ThreatLevel.VeryHigh, "osSetRot"); + CheckThreatLevel("osSetRot"); if (World.Entities.ContainsKey(target)) { @@ -689,7 +988,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // This may be upgraded depending on the griefing or DOS // potential, or guarded with a delay // - CheckThreatLevel(ThreatLevel.VeryLow, "osSetDynamicTextureURL"); + CheckThreatLevel("osSetDynamicTextureURL"); if (dynamicID == String.Empty) { @@ -710,7 +1009,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osSetDynamicTextureURLBlend(string dynamicID, string contentType, string url, string extraParams, int timer, int alpha) { - CheckThreatLevel(ThreatLevel.VeryLow, "osSetDynamicTextureURLBlend"); + CheckThreatLevel("osSetDynamicTextureURLBlend"); if (dynamicID == String.Empty) { @@ -731,7 +1030,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osSetDynamicTextureURLBlendFace(string dynamicID, string contentType, string url, string extraParams, bool blend, int disp, int timer, int alpha, int face) { - CheckThreatLevel(ThreatLevel.VeryLow, "osSetDynamicTextureURLBlendFace"); + CheckThreatLevel("osSetDynamicTextureURLBlendFace"); if (dynamicID == String.Empty) { @@ -758,7 +1057,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osSetDynamicTextureDataFace(string dynamicID, string contentType, string data, string extraParams, int timer, int face) { - CheckThreatLevel(ThreatLevel.VeryLow, "osSetDynamicTextureData"); + CheckThreatLevel("osSetDynamicTextureData"); if (dynamicID == String.Empty) { @@ -787,7 +1086,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osSetDynamicTextureDataBlend(string dynamicID, string contentType, string data, string extraParams, int timer, int alpha) { - CheckThreatLevel(ThreatLevel.VeryLow, "osSetDynamicTextureDataBlend"); + CheckThreatLevel("osSetDynamicTextureDataBlend"); if (dynamicID == String.Empty) { @@ -815,7 +1114,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osSetDynamicTextureDataBlendFace(string dynamicID, string contentType, string data, string extraParams, bool blend, int disp, int timer, int alpha, int face) { - CheckThreatLevel(ThreatLevel.VeryLow , "osSetDynamicTextureDataBlendFace"); + CheckThreatLevel("osSetDynamicTextureDataBlendFace"); if (dynamicID == String.Empty) { @@ -842,7 +1141,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public bool osConsoleCommand(string command) { - CheckThreatLevel(ThreatLevel.Severe, "osConsoleCommand"); + CheckThreatLevel("osConsoleCommand"); // For safety, we add another permission check here, and don't rely only on the standard OSSL permissions if (World.Permissions.CanRunConsoleCommand(m_host.OwnerID)) @@ -856,7 +1155,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSetPrimFloatOnWater(int floatYN) { - CheckThreatLevel(ThreatLevel.VeryLow, "osSetPrimFloatOnWater"); + CheckThreatLevel("osSetPrimFloatOnWater"); m_host.ParentGroup.RootPart.SetFloatOnWater(floatYN); } @@ -907,7 +1206,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { // High because there is no security check. High griefer potential // - CheckThreatLevel(ThreatLevel.Severe, "osTeleportAgent"); + CheckThreatLevel("osTeleportAgent"); TeleportAgent(agent, regionName, position, lookat); } @@ -957,7 +1256,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { // High because there is no security check. High griefer potential // - CheckThreatLevel(ThreatLevel.Severe, "osTeleportAgent"); + CheckThreatLevel("osTeleportAgent"); TeleportAgent(agent, regionGridX, regionGridY, position, lookat); } @@ -1016,21 +1315,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osTeleportOwner(string regionName, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat) { // Threat level None because this is what can already be done with the World Map in the viewer - CheckThreatLevel(ThreatLevel.None, "osTeleportOwner"); + CheckThreatLevel("osTeleportOwner"); TeleportAgent(m_host.OwnerID.ToString(), regionName, position, lookat); } public void osTeleportOwner(int regionGridX, int regionGridY, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat) { - CheckThreatLevel(ThreatLevel.None, "osTeleportOwner"); + CheckThreatLevel("osTeleportOwner"); TeleportAgent(m_host.OwnerID.ToString(), regionGridX, regionGridY, position, lookat); } public void osTeleportOwner(LSL_Types.Vector3 position, LSL_Types.Vector3 lookat) { - CheckThreatLevel(ThreatLevel.None, "osTeleportOwner"); + CheckThreatLevel("osTeleportOwner"); osTeleportAgent(m_host.OwnerID.ToString(), position, lookat); } @@ -1044,7 +1343,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <param name="avatar"></param> public void osForceOtherSit(string avatar) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osForceOtherSit"); + CheckThreatLevel("osForceOtherSit"); ForceSit(avatar, m_host.UUID); } @@ -1057,7 +1356,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <param name="target"></param> public void osForceOtherSit(string avatar, string target) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osForceOtherSit"); + CheckThreatLevel("osForceOtherSit"); UUID targetID = new UUID(target); @@ -1089,7 +1388,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { // threat level is None as we could get this information with an // in-world script as well, just not as efficient - CheckThreatLevel(ThreatLevel.None, "osGetAgents"); + CheckThreatLevel("osGetAgents"); LSL_List result = new LSL_List(); World.ForEachRootScenePresence(delegate(ScenePresence sp) @@ -1101,7 +1400,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osGetAgentIP(string agent) { - CheckThreatLevel(ThreatLevel.Severe, "osGetAgentIP"); + CheckThreatLevel("osGetAgentIP"); if(!(World.Permissions.IsGod(m_host.OwnerID))) // user god always needed return ""; @@ -1120,7 +1419,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Adam's super super custom animation functions public void osAvatarPlayAnimation(LSL_Key avatar, string animation) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osAvatarPlayAnimation"); + CheckThreatLevel("osAvatarPlayAnimation"); UUID avatarID; if(!UUID.TryParse(avatar, out avatarID)) @@ -1153,7 +1452,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osAvatarStopAnimation(LSL_Key avatar, string animation) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osAvatarStopAnimation"); + CheckThreatLevel("osAvatarStopAnimation"); UUID avatarID; if(!UUID.TryParse(avatar, out avatarID)) @@ -1239,7 +1538,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osDrawText(string drawList, string text) { - CheckThreatLevel(ThreatLevel.None, "osDrawText"); + CheckThreatLevel("osDrawText"); drawList += "Text " + text + "; "; return drawList; @@ -1393,14 +1692,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // It was probably added as a crutch or debugging aid, and // should be removed // - CheckThreatLevel(ThreatLevel.High, "osSetStateEvents"); + CheckThreatLevel("osSetStateEvents"); m_host.SetScriptEvents(m_item.ItemID, events); } public void osSetRegionWaterHeight(double height) { - CheckThreatLevel(ThreatLevel.High, "osSetRegionWaterHeight"); + CheckThreatLevel("osSetRegionWaterHeight"); World.EventManager.TriggerRequestChangeWaterHeight((float)height); } @@ -1413,7 +1712,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> public void osSetRegionSunSettings(bool useEstateSun, bool sunFixed, double sunHour) { - CheckThreatLevel(ThreatLevel.High, "osSetRegionSunSettings"); + CheckThreatLevel("osSetRegionSunSettings"); while (sunHour > 24.0) sunHour -= 24.0; @@ -1436,7 +1735,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <param name="sunHour">The "Sun Hour" that is desired, 0...24, with 0 just after SunRise</param> public void osSetEstateSunSettings(bool sunFixed, double sunHour) { - CheckThreatLevel(ThreatLevel.High, "osSetEstateSunSettings"); + CheckThreatLevel("osSetEstateSunSettings"); while (sunHour > 24.0) sunHour -= 24.0; @@ -1475,7 +1774,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public double osSunGetParam(string param) { - CheckThreatLevel(ThreatLevel.None, "osSunGetParam"); + CheckThreatLevel("osSunGetParam"); OSSLDeprecated("osSunGetParam", "osGetSunParam"); return GetSunParam(param); } @@ -1501,14 +1800,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSunSetParam(string param, double value) { - CheckThreatLevel(ThreatLevel.None, "osSunSetParam"); + CheckThreatLevel("osSunSetParam"); OSSLDeprecated("osSunSetParam", "osSetSunParam"); SetSunParam(param, value); } public void osSetSunParam(string param, double value) { - CheckThreatLevel(ThreatLevel.None, "osSetSunParam"); + CheckThreatLevel("osSetSunParam"); SetSunParam(param, value); } @@ -1523,7 +1822,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osWindActiveModelPluginName() { - CheckThreatLevel(ThreatLevel.None, "osWindActiveModelPluginName"); + CheckThreatLevel("osWindActiveModelPluginName"); IWindModule module = World.RequestModuleInterface<IWindModule>(); if (module != null) @@ -1536,7 +1835,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSetWindParam(string plugin, string param, LSL_Float value) { - CheckThreatLevel(ThreatLevel.VeryLow, "osSetWindParam"); + CheckThreatLevel("osSetWindParam"); IWindModule module = World.RequestModuleInterface<IWindModule>(); if (module != null) @@ -1551,7 +1850,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Float osGetWindParam(string plugin, string param) { - CheckThreatLevel(ThreatLevel.VeryLow, "osGetWindParam"); + CheckThreatLevel("osGetWindParam"); IWindModule module = World.RequestModuleInterface<IWindModule>(); if (module != null) @@ -1565,7 +1864,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // Routines for creating and managing parcels programmatically public void osParcelJoin(LSL_Vector pos1, LSL_Vector pos2) { - CheckThreatLevel(ThreatLevel.High, "osParcelJoin"); + CheckThreatLevel("osParcelJoin"); int startx = (int)(pos1.x < pos2.x ? pos1.x : pos2.x); int starty = (int)(pos1.y < pos2.y ? pos1.y : pos2.y); @@ -1577,7 +1876,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osParcelSubdivide(LSL_Vector pos1, LSL_Vector pos2) { - CheckThreatLevel(ThreatLevel.High, "osParcelSubdivide"); + CheckThreatLevel("osParcelSubdivide"); int startx = (int)(pos1.x < pos2.x ? pos1.x : pos2.x); int starty = (int)(pos1.y < pos2.y ? pos1.y : pos2.y); @@ -1590,7 +1889,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osParcelSetDetails(LSL_Vector pos, LSL_List rules) { const string functionName = "osParcelSetDetails"; - CheckThreatLevel(ThreatLevel.High, functionName); + CheckThreatLevel(functionName); OSSLDeprecated(functionName, "osSetParcelDetails"); SetParcelDetails(pos, rules, functionName); } @@ -1598,7 +1897,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSetParcelDetails(LSL_Vector pos, LSL_List rules) { const string functionName = "osSetParcelDetails"; - CheckThreatLevel(ThreatLevel.High, functionName); + CheckThreatLevel(functionName); SetParcelDetails(pos, rules, functionName); } @@ -1789,7 +2088,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { // What actually is the difference to the LL function? // - CheckThreatLevel(ThreatLevel.VeryLow, "osSetParcelMediaURL"); + CheckThreatLevel("osSetParcelMediaURL"); ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition); @@ -1803,7 +2102,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api { // What actually is the difference to the LL function? // - CheckThreatLevel(ThreatLevel.VeryLow, "osSetParcelSIPAddress"); + CheckThreatLevel("osSetParcelSIPAddress"); ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition); @@ -1829,7 +2128,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // that trigger engine-specific failures. // Besides, public grid users aren't supposed to know. // - CheckThreatLevel(ThreatLevel.High, "osGetScriptEngineName"); + CheckThreatLevel("osGetScriptEngineName"); int scriptEngineNameIndex = 0; @@ -1918,7 +2217,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api // require their user to know what they are doing (see script // kiddie) // - CheckThreatLevel(ThreatLevel.High,"osGetSimulatorVersion"); + CheckThreatLevel("osGetSimulatorVersion"); return m_ScriptEngine.World.GetSimulatorVersion(); } @@ -1934,7 +2233,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <param name="message"></param> public void osMessageObject(LSL_Key objectUUID, string message) { - CheckThreatLevel(ThreatLevel.Low, "osMessageObject"); + CheckThreatLevel("osMessageObject"); UUID objUUID; if (!UUID.TryParse(objectUUID, out objUUID)) // prior to patching, a thrown exception regarding invalid GUID format would be shouted instead. @@ -1973,7 +2272,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osMoveToTarget(LSL_Vector target, double tau, int options) { - CheckThreatLevel(ThreatLevel.Low, "osMoveToTarget"); + CheckThreatLevel("osMoveToTarget"); m_host.AddScriptLPS(1); m_host.MoveToTarget( @@ -1991,10 +2290,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osDie(LSL_Key objectUUID) { -// CheckThreatLevel(ThreatLevel.VeryHigh, "osDie"); +// CheckThreatLevel("osDie"); // if this is restricted to objects rezzed by this host level can be reduced - CheckThreatLevel(ThreatLevel.Low, "osDie"); + CheckThreatLevel("osDie"); UUID objUUID; if (!UUID.TryParse(objectUUID, out objUUID)) @@ -2047,7 +2346,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <param name="contents">The contents of the notecard.</param> public void osMakeNotecard(string notecardName, LSL_Types.list contents) { - CheckThreatLevel(ThreatLevel.High, "osMakeNotecard"); + CheckThreatLevel("osMakeNotecard"); StringBuilder notecardData = new StringBuilder(); @@ -2232,7 +2531,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns>Notecard line</returns> public string osGetNotecardLine(string name, int line) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osGetNotecardLine"); + CheckThreatLevel("osGetNotecardLine"); UUID assetID = CacheNotecard(name); @@ -2259,7 +2558,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns>Notecard text</returns> public string osGetNotecard(string name) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osGetNotecard"); + CheckThreatLevel("osGetNotecard"); string text = LoadNotecard(name); @@ -2288,7 +2587,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public int osGetNumberOfNotecardLines(string name) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osGetNumberOfNotecardLines"); + CheckThreatLevel("osGetNumberOfNotecardLines"); UUID assetID = CacheNotecard(name); @@ -2303,7 +2602,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osAvatarName2Key(string firstname, string lastname) { - CheckThreatLevel(ThreatLevel.Low, "osAvatarName2Key"); + CheckThreatLevel("osAvatarName2Key"); IUserManagement userManager = World.RequestModuleInterface<IUserManagement>(); if (userManager == null) @@ -2348,7 +2647,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osKey2Name(string id) { - CheckThreatLevel(ThreatLevel.Low, "osKey2Name"); + CheckThreatLevel("osKey2Name"); UUID key = new UUID(); @@ -2457,7 +2756,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public string osGetGridNick() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetGridNick"); + CheckThreatLevel("osGetGridNick"); string nick = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; @@ -2473,7 +2772,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osGetGridName() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetGridName"); + CheckThreatLevel("osGetGridName"); string name = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; @@ -2489,7 +2788,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osGetGridLoginURI() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetGridLoginURI"); + CheckThreatLevel("osGetGridLoginURI"); string loginURI = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; @@ -2505,7 +2804,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osGetGridHomeURI() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetGridHomeURI"); + CheckThreatLevel("osGetGridHomeURI"); IConfigSource config = m_ScriptEngine.ConfigSource; string HomeURI = Util.GetConfigVarFromSections<string>(config, "HomeURI", @@ -2526,7 +2825,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osGetGridGatekeeperURI() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetGridGatekeeperURI"); + CheckThreatLevel("osGetGridGatekeeperURI"); IConfigSource config = m_ScriptEngine.ConfigSource; string gatekeeperURI = Util.GetConfigVarFromSections<string>(config, "GatekeeperURI", @@ -2544,7 +2843,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osGetGridCustom(string key) { - CheckThreatLevel(ThreatLevel.Moderate, "osGetGridCustom"); + CheckThreatLevel("osGetGridCustom"); string retval = String.Empty; IConfigSource config = m_ScriptEngine.ConfigSource; @@ -2560,7 +2859,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osGetAvatarHomeURI(string uuid) { - CheckThreatLevel(ThreatLevel.Low, "osGetAvatarHomeURI"); + CheckThreatLevel("osGetAvatarHomeURI"); IUserManagement userManager = m_ScriptEngine.World.RequestModuleInterface<IUserManagement>(); string returnValue = ""; @@ -2592,14 +2891,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osFormatString(string str, LSL_List strings) { - CheckThreatLevel(ThreatLevel.VeryLow, "osFormatString"); + CheckThreatLevel("osFormatString"); return String.Format(str, strings.Data); } public LSL_List osMatchString(string src, string pattern, int start) { - CheckThreatLevel(ThreatLevel.VeryLow, "osMatchString"); + CheckThreatLevel("osMatchString"); LSL_List result = new LSL_List(); @@ -2640,7 +2939,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osReplaceString(string src, string pattern, string replace, int count, int start) { - CheckThreatLevel(ThreatLevel.VeryLow, "osReplaceString"); + CheckThreatLevel("osReplaceString"); // Normalize indices (if negative). // After normlaization they may still be @@ -2664,21 +2963,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public string osLoadedCreationDate() { - CheckThreatLevel(ThreatLevel.Low, "osLoadedCreationDate"); + CheckThreatLevel("osLoadedCreationDate"); return World.RegionInfo.RegionSettings.LoadedCreationDate; } public string osLoadedCreationTime() { - CheckThreatLevel(ThreatLevel.Low, "osLoadedCreationTime"); + CheckThreatLevel("osLoadedCreationTime"); return World.RegionInfo.RegionSettings.LoadedCreationTime; } public string osLoadedCreationID() { - CheckThreatLevel(ThreatLevel.Low, "osLoadedCreationID"); + CheckThreatLevel("osLoadedCreationID"); return World.RegionInfo.RegionSettings.LoadedCreationID; } @@ -2698,7 +2997,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public LSL_List osGetLinkPrimitiveParams(int linknumber, LSL_List rules) { - CheckThreatLevel(ThreatLevel.High, "osGetLinkPrimitiveParams"); + CheckThreatLevel("osGetLinkPrimitiveParams"); InitLSL(); // One needs to cast m_LSL_Api because we're using functions not @@ -2725,7 +3024,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osForceCreateLink(string target, int parent) { - CheckThreatLevel(ThreatLevel.VeryLow, "osForceCreateLink"); + CheckThreatLevel("osForceCreateLink"); InitLSL(); m_LSL_Api.CreateLink(target, parent); @@ -2733,7 +3032,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osForceBreakLink(int linknum) { - CheckThreatLevel(ThreatLevel.VeryLow, "osForceBreakLink"); + CheckThreatLevel("osForceBreakLink"); InitLSL(); m_LSL_Api.BreakLink(linknum); @@ -2741,7 +3040,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osForceBreakAllLinks() { - CheckThreatLevel(ThreatLevel.VeryLow, "osForceBreakAllLinks"); + CheckThreatLevel("osForceBreakAllLinks"); InitLSL(); m_LSL_Api.BreakAllLinks(); @@ -2765,7 +3064,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard) { - CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); + CheckThreatLevel("osNpcCreate"); // have to get the npc module also here to set the default Not Owned INPCModule module = World.RequestModuleInterface<INPCModule>(); @@ -2779,7 +3078,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Key osNpcCreate(string firstname, string lastname, LSL_Vector position, string notecard, int options) { - CheckThreatLevel(ThreatLevel.High, "osNpcCreate"); + CheckThreatLevel("osNpcCreate"); return NpcCreate( firstname, lastname, position, notecard, @@ -2922,7 +3221,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns>The asset ID of the notecard saved.</returns> public LSL_Key osNpcSaveAppearance(LSL_Key npc, string notecard) { - CheckThreatLevel(ThreatLevel.High, "osNpcSaveAppearance"); + CheckThreatLevel("osNpcSaveAppearance"); INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); @@ -2943,7 +3242,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcLoadAppearance(LSL_Key npc, string notecard) { - CheckThreatLevel(ThreatLevel.High, "osNpcLoadAppearance"); + CheckThreatLevel("osNpcLoadAppearance"); INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); @@ -2974,7 +3273,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Key osNpcGetOwner(LSL_Key npc) { - CheckThreatLevel(ThreatLevel.None, "osNpcGetOwner"); + CheckThreatLevel("osNpcGetOwner"); INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); if (npcModule != null) @@ -2995,7 +3294,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Vector osNpcGetPos(LSL_Key npc) { - CheckThreatLevel(ThreatLevel.High, "osNpcGetPos"); + CheckThreatLevel("osNpcGetPos"); INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); if (npcModule != null) @@ -3018,7 +3317,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcMoveTo(LSL_Key npc, LSL_Vector pos) { - CheckThreatLevel(ThreatLevel.High, "osNpcMoveTo"); + CheckThreatLevel("osNpcMoveTo"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3036,7 +3335,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcMoveToTarget(LSL_Key npc, LSL_Vector target, int options) { - CheckThreatLevel(ThreatLevel.High, "osNpcMoveToTarget"); + CheckThreatLevel("osNpcMoveToTarget"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3060,7 +3359,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Rotation osNpcGetRot(LSL_Key npc) { - CheckThreatLevel(ThreatLevel.High, "osNpcGetRot"); + CheckThreatLevel("osNpcGetRot"); INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); if (npcModule != null) @@ -3083,7 +3382,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcSetRot(LSL_Key npc, LSL_Rotation rotation) { - CheckThreatLevel(ThreatLevel.High, "osNpcSetRot"); + CheckThreatLevel("osNpcSetRot"); INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); if (npcModule != null) @@ -3104,7 +3403,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcStopMoveToTarget(LSL_Key npc) { - CheckThreatLevel(ThreatLevel.High, "osNpcStopMoveToTarget"); + CheckThreatLevel("osNpcStopMoveToTarget"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3120,7 +3419,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcSetProfileAbout(LSL_Key npc, string about) { - CheckThreatLevel(ThreatLevel.Low, "osNpcSetProfileAbout"); + CheckThreatLevel("osNpcSetProfileAbout"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3138,7 +3437,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcSetProfileImage(LSL_Key npc, string image) { - CheckThreatLevel(ThreatLevel.Low, "osNpcSetProfileImage"); + CheckThreatLevel("osNpcSetProfileImage"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3171,7 +3470,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcSay(LSL_Key npc, int channel, string message) { - CheckThreatLevel(ThreatLevel.High, "osNpcSay"); + CheckThreatLevel("osNpcSay"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3187,7 +3486,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcShout(LSL_Key npc, int channel, string message) { - CheckThreatLevel(ThreatLevel.High, "osNpcShout"); + CheckThreatLevel("osNpcShout"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3203,7 +3502,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcSit(LSL_Key npc, LSL_Key target, int options) { - CheckThreatLevel(ThreatLevel.High, "osNpcSit"); + CheckThreatLevel("osNpcSit"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3219,7 +3518,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcStand(LSL_Key npc) { - CheckThreatLevel(ThreatLevel.High, "osNpcStand"); + CheckThreatLevel("osNpcStand"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3235,7 +3534,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcRemove(LSL_Key npc) { - CheckThreatLevel(ThreatLevel.High, "osNpcRemove"); + CheckThreatLevel("osNpcRemove"); try { @@ -3255,7 +3554,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcPlayAnimation(LSL_Key npc, string animation) { - CheckThreatLevel(ThreatLevel.High, "osNpcPlayAnimation"); + CheckThreatLevel("osNpcPlayAnimation"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module == null) @@ -3295,7 +3594,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcStopAnimation(LSL_Key npc, string animation) { - CheckThreatLevel(ThreatLevel.High, "osNpcStopAnimation"); + CheckThreatLevel("osNpcStopAnimation"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module == null) @@ -3330,7 +3629,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcWhisper(LSL_Key npc, int channel, string message) { - CheckThreatLevel(ThreatLevel.High, "osNpcWhisper"); + CheckThreatLevel("osNpcWhisper"); INPCModule module = World.RequestModuleInterface<INPCModule>(); if (module != null) @@ -3346,7 +3645,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osNpcTouch(LSL_Key npcLSL_Key, LSL_Key object_key, LSL_Integer link_num) { - CheckThreatLevel(ThreatLevel.High, "osNpcTouch"); + CheckThreatLevel("osNpcTouch"); INPCModule module = World.RequestModuleInterface<INPCModule>(); int linkNum = link_num.value; @@ -3390,14 +3689,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns>The asset ID of the notecard saved.</returns> public LSL_Key osOwnerSaveAppearance(string notecard) { - CheckThreatLevel(ThreatLevel.High, "osOwnerSaveAppearance"); + CheckThreatLevel("osOwnerSaveAppearance"); return SaveAppearanceToNotecard(m_host.OwnerID, notecard); } public LSL_Key osAgentSaveAppearance(LSL_Key avatarId, string notecard) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osAgentSaveAppearance"); + CheckThreatLevel("osAgentSaveAppearance"); return SaveAppearanceToNotecard(avatarId, notecard); } @@ -3449,7 +3748,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns>"male" or "female" or "unknown"</returns> public LSL_String osGetGender(LSL_Key rawAvatarId) { - CheckThreatLevel(ThreatLevel.None, "osGetGender"); + CheckThreatLevel("osGetGender"); UUID avatarId; if (!UUID.TryParse(rawAvatarId, out avatarId)) @@ -3504,7 +3803,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public LSL_Key osGetRegionMapTexture(string regionName) { - CheckThreatLevel(ThreatLevel.High, "osGetRegionMapTexture"); + CheckThreatLevel("osGetRegionMapTexture"); Scene scene = m_ScriptEngine.World; UUID key = UUID.Zero; @@ -3534,7 +3833,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns>List of floats</returns> public LSL_List osGetRegionStats() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetRegionStats"); + CheckThreatLevel("osGetRegionStats"); LSL_List ret = new LSL_List(); float[] stats = World.StatsReporter.LastReportedSimStats; @@ -3559,7 +3858,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public int osGetSimulatorMemory() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetSimulatorMemory"); + CheckThreatLevel("osGetSimulatorMemory"); long pws = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64; @@ -3573,7 +3872,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public int osGetSimulatorMemoryKB() { - CheckThreatLevel(ThreatLevel.Moderate, "osGetSimulatorMemoryKB"); + CheckThreatLevel("osGetSimulatorMemoryKB"); long pws = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64; @@ -3589,7 +3888,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSetSpeed(string ID, LSL_Float SpeedModifier) { - CheckThreatLevel(ThreatLevel.Moderate, "osSetSpeed"); + CheckThreatLevel("osSetSpeed"); UUID avid; if(!UUID.TryParse(ID, out avid)) @@ -3602,7 +3901,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSetOwnerSpeed(LSL_Float SpeedModifier) { - CheckThreatLevel(ThreatLevel.Moderate, "osSetOwnerSpeed"); + CheckThreatLevel("osSetOwnerSpeed"); if(SpeedModifier > 4) SpeedModifier = 4; @@ -3614,7 +3913,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osKickAvatar(string FirstName, string SurName, string alert) { - CheckThreatLevel(ThreatLevel.Severe, "osKickAvatar"); + CheckThreatLevel("osKickAvatar"); World.ForEachRootScenePresence(delegate(ScenePresence sp) { @@ -3632,7 +3931,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Float osGetHealth(string avatar) { - CheckThreatLevel(ThreatLevel.None, "osGetHealth"); + CheckThreatLevel("osGetHealth"); LSL_Float health = new LSL_Float(-1); ScenePresence presence = World.GetScenePresence(new UUID(avatar)); @@ -3643,7 +3942,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osCauseDamage(string avatar, double damage) { - CheckThreatLevel(ThreatLevel.High, "osCauseDamage"); + CheckThreatLevel("osCauseDamage"); UUID avatarId; if (!UUID.TryParse(avatar, out avatarId)) @@ -3672,7 +3971,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osCauseHealing(string avatar, double healing) { - CheckThreatLevel(ThreatLevel.High, "osCauseHealing"); + CheckThreatLevel("osCauseHealing"); UUID avatarId; if (!UUID.TryParse(avatar, out avatarId)) @@ -3693,7 +3992,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSetHealth(string avatar, double health) { - CheckThreatLevel(ThreatLevel.High, "osSetHealth"); + CheckThreatLevel("osSetHealth"); UUID avatarId = new UUID(avatar); ScenePresence presence = World.GetScenePresence(avatarId); @@ -3711,7 +4010,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSetHealRate(string avatar, double healrate) { - CheckThreatLevel(ThreatLevel.High, "osSetHealRate"); + CheckThreatLevel("osSetHealRate"); UUID avatarId; if (!UUID.TryParse(avatar, out avatarId)) @@ -3726,7 +4025,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Float osGetHealRate(string avatar) { - CheckThreatLevel(ThreatLevel.None, "osGetHealRate"); + CheckThreatLevel("osGetHealRate"); LSL_Float rate = new LSL_Float(0); @@ -3742,7 +4041,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_List osGetPrimitiveParams(LSL_Key prim, LSL_List rules) { - CheckThreatLevel(ThreatLevel.High, "osGetPrimitiveParams"); + CheckThreatLevel("osGetPrimitiveParams"); InitLSL(); return m_LSL_Api.GetPrimitiveParamsEx(prim, rules); @@ -3750,7 +4049,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osSetPrimitiveParams(LSL_Key prim, LSL_List rules) { - CheckThreatLevel(ThreatLevel.High, "osSetPrimitiveParams"); + CheckThreatLevel("osSetPrimitiveParams"); InitLSL(); m_LSL_Api.SetPrimitiveParamsEx(prim, rules, "osSetPrimitiveParams"); @@ -3769,7 +4068,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// </summary> public void osSetProjectionParams(LSL_Key prim, bool projection, LSL_Key texture, double fov, double focus, double amb) { - CheckThreatLevel(ThreatLevel.High, "osSetProjectionParams"); + CheckThreatLevel("osSetProjectionParams"); SceneObjectPart obj = null; if (prim == UUID.Zero.ToString()) @@ -3799,7 +4098,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns>Strided list of the UUID, position and name of each avatar in the region</returns> public LSL_List osGetAvatarList() { - CheckThreatLevel(ThreatLevel.None, "osGetAvatarList"); + CheckThreatLevel("osGetAvatarList"); LSL_List result = new LSL_List(); World.ForEachRootScenePresence(delegate (ScenePresence avatar) @@ -3817,7 +4116,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_List osGetNPCList() { - CheckThreatLevel(ThreatLevel.None, "osGetNPCList"); + CheckThreatLevel("osGetNPCList"); LSL_List result = new LSL_List(); World.ForEachRootScenePresence(delegate (ScenePresence avatar) @@ -3841,7 +4140,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public LSL_String osUnixTimeToTimestamp(LSL_Integer time) { - CheckThreatLevel(ThreatLevel.VeryLow, "osUnixTimeToTimestamp"); + CheckThreatLevel("osUnixTimeToTimestamp"); long baseTicks = 621355968000000000; long tickResolution = 10000000; @@ -3881,7 +4180,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public LSL_Integer osInviteToGroup(LSL_Key agentId) { - CheckThreatLevel(ThreatLevel.VeryLow, "osInviteToGroup"); + CheckThreatLevel("osInviteToGroup"); UUID agent = new UUID(agentId); @@ -3915,7 +4214,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public LSL_Integer osEjectFromGroup(LSL_Key agentId) { - CheckThreatLevel(ThreatLevel.VeryLow, "osEjectFromGroup"); + CheckThreatLevel("osEjectFromGroup"); UUID agent = new UUID(agentId); @@ -3949,7 +4248,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public void osSetTerrainTexture(int level, LSL_Key texture) { - CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture"); + CheckThreatLevel("osSetTerrainTexture"); //Check to make sure that the script's owner is the estate manager/master //World.Permissions.GenericEstatePermission( @@ -3978,7 +4277,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public void osSetTerrainTextureHeight(int corner, double low, double high) { - CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight"); + CheckThreatLevel("osSetTerrainTextureHeight"); //Check to make sure that the script's owner is the estate manager/master //World.Permissions.GenericEstatePermission( @@ -3998,7 +4297,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osForceAttachToAvatar(int attachmentPoint) { - CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatar"); + CheckThreatLevel("osForceAttachToAvatar"); InitLSL(); m_LSL_Api.AttachToAvatar(attachmentPoint); @@ -4006,14 +4305,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osForceAttachToAvatarFromInventory(string itemName, int attachmentPoint) { - CheckThreatLevel(ThreatLevel.High, "osForceAttachToAvatarFromInventory"); + CheckThreatLevel("osForceAttachToAvatarFromInventory"); ForceAttachToAvatarFromInventory(m_host.OwnerID, itemName, attachmentPoint); } public void osForceAttachToOtherAvatarFromInventory(string rawAvatarId, string itemName, int attachmentPoint) { - CheckThreatLevel(ThreatLevel.VeryHigh, "osForceAttachToOtherAvatarFromInventory"); + CheckThreatLevel("osForceAttachToOtherAvatarFromInventory"); UUID avatarId; @@ -4072,7 +4371,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osForceDetachFromAvatar() { - CheckThreatLevel(ThreatLevel.High, "osForceDetachFromAvatar"); + CheckThreatLevel("osForceDetachFromAvatar"); InitLSL(); m_LSL_Api.DetachFromAvatar(); @@ -4080,7 +4379,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_List osGetNumberOfAttachments(LSL_Key avatar, LSL_List attachmentPoints) { - CheckThreatLevel(ThreatLevel.Moderate, "osGetNumberOfAttachments"); + CheckThreatLevel("osGetNumberOfAttachments"); UUID targetUUID; ScenePresence target; @@ -4114,7 +4413,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osMessageAttachments(LSL_Key avatar, string message, LSL_List attachmentPoints, int options) { - CheckThreatLevel(ThreatLevel.Moderate, "osMessageAttachments"); + CheckThreatLevel("osMessageAttachments"); UUID targetUUID; if(!UUID.TryParse(avatar.ToString(), out targetUUID)) @@ -4257,7 +4556,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Key osGetRezzingObject() { - CheckThreatLevel(ThreatLevel.None, "osGetRezzingObject"); + CheckThreatLevel("osGetRezzingObject"); UUID rezID = m_host.ParentGroup.RezzerID; if(rezID == UUID.Zero || m_host.ParentGroup.Scene.GetScenePresence(rezID) != null) @@ -4271,7 +4570,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// <returns></returns> public void osSetContentType(LSL_Key id, string type) { - CheckThreatLevel(ThreatLevel.High, "osSetContentType"); + CheckThreatLevel("osSetContentType"); if (m_UrlModule != null) m_UrlModule.HttpContentType(new UUID(id),type); @@ -4332,35 +4631,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void osDropAttachment() { - CheckThreatLevel(ThreatLevel.Moderate, "osDropAttachment"); + CheckThreatLevel("osDropAttachment"); DropAttachment(true); } public void osForceDropAttachment() { - CheckThreatLevel(ThreatLevel.High, "osForceDropAttachment"); + CheckThreatLevel("osForceDropAttachment"); DropAttachment(false); } public void osDropAttachmentAt(LSL_Vector pos, LSL_Rotation rot) { - CheckThreatLevel(ThreatLevel.Moderate, "osDropAttachmentAt"); + CheckThreatLevel("osDropAttachmentAt"); DropAttachmentAt(true, pos, rot); } public void osForceDropAttachmentAt(LSL_Vector pos, LSL_Rotation rot) { - CheckThreatLevel(ThreatLevel.High, "osForceDropAttachmentAt"); + CheckThreatLevel("osForceDropAttachmentAt"); DropAttachmentAt(false, pos, rot); } public LSL_Integer osListenRegex(int channelID, string name, string ID, string msg, int regexBitfield) { - CheckThreatLevel(ThreatLevel.Low, "osListenRegex"); + CheckThreatLevel("osListenRegex"); UUID keyID; UUID.TryParse(ID, out keyID); @@ -4408,7 +4707,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Integer osRegexIsMatch(string input, string pattern) { - CheckThreatLevel(ThreatLevel.Low, "osRegexIsMatch"); + CheckThreatLevel("osRegexIsMatch"); try { @@ -4423,7 +4722,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osRequestURL(LSL_List options) { - CheckThreatLevel(ThreatLevel.Moderate, "osRequestSecureURL"); + CheckThreatLevel("osRequestURL"); Hashtable opts = new Hashtable(); for (int i = 0 ; i < options.Length ; i++) @@ -4440,7 +4739,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osRequestSecureURL(LSL_List options) { - CheckThreatLevel(ThreatLevel.Moderate, "osRequestSecureURL"); + CheckThreatLevel("osRequestSecureURL"); Hashtable opts = new Hashtable(); for (int i = 0 ; i < options.Length ; i++) @@ -4772,7 +5071,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api /// </remarks> public LSL_Integer osTeleportObject(LSL_Key objectUUID, LSL_Vector targetPos, LSL_Rotation rotation, LSL_Integer flags) { - CheckThreatLevel(ThreatLevel.Severe, "osTeleportObject"); + CheckThreatLevel("osTeleportObject"); UUID objUUID; if (!UUID.TryParse(objectUUID, out objUUID)) @@ -5056,7 +5355,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osDetectedCountry(LSL_Integer number) { m_host.AddScriptLPS(1); - CheckThreatLevel(ThreatLevel.Moderate, "osDetectedCountry"); + CheckThreatLevel("osDetectedCountry"); if (World.UserAccountService == null) return String.Empty; @@ -5073,7 +5372,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_String osGetAgentCountry(LSL_Key id) { m_host.AddScriptLPS(1); - CheckThreatLevel(ThreatLevel.Moderate, "osGetAgentCountry"); + CheckThreatLevel("osGetAgentCountry"); if (World.UserAccountService == null) return String.Empty; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index 3399ffd124..d048753b77 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -114,7 +114,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces public interface IOSSL_Api { - void CheckThreatLevel(ThreatLevel level, string function); + void CheckThreatLevel(string function); + + LSL_Integer osCheckThreatLevel(string function); //OpenSim functions string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, int timer); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs index 8a51dce19a..2634186466 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs @@ -817,6 +817,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase public const int STATS_ACTIVE_SCRIPTS = 19; public const int STATS_SCRIPT_LPS = 20; + // Constants for osCheckThreatLevel + public const int OS_THREAT_NA = -1; + public const int OS_THREAT_DISABLED = 0; + public const int OS_THREAT_ENABLED = 1; + // Constants for osMoveToTarget public const int OS_FLY = 0; public const int OS_NO_FLY = 1; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 9a5ae7d40d..03265ad1df 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -61,6 +61,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase Prim = new OSSLPrim(this); } + public LSL_Integer osCheckThreatLevel(string function) + { + return m_OSSL_Functions.osCheckThreatLevel(function); + } + public void osSetRegionWaterHeight(double height) { m_OSSL_Functions.osSetRegionWaterHeight(height); -- 2.19.2 ![]() | |||||||||
![]() |
|
(0033612) UbitUmarov (administrator) 2018-12-11 11:02 |
thanks but patch on ice, for now. |
(0033613) melanie (administrator) 2018-12-11 11:45 |
That test would allow scripts to test which malicious behaviour they can get away with :( |
(0033614) unregi (reporter) 2018-12-11 12:13 |
There is a script out there that does already test which functions are available, someone posted it on IRC. It's throwing errors for every function that fails, but its still getting a list of all allowed functions back. |
(0033615) BillBlight (developer) 2018-12-11 12:15 |
the difference is that script takes some work to log what works and doesn't , you have to do it manually .. this one could just IM you or store it in a note. |
(0033616) unregi (reporter) 2018-12-11 13:09 |
Will link one just for reference: https://forum.hypergrid.org/opensim-scripting/script-ossl-function-check-threat-level-moderate-t2941.html [^] This will check a whole list of function and give you a nice list of available functions back and you can do whatever you want with it :) Also attaching a script that's making a basic dependency check if required functions are available before running it. I am not much a fan of security through obscurity. But i get your legit concerns. |
(0033617) BillBlight (developer) 2018-12-11 13:20 |
That script will also throw an error to the debug window letting owner know someone tried to do it, and not silently like this function would. |
(0033618) melanie (administrator) 2018-12-11 13:54 |
That is because someone changed away from my original design. My original design was to hard stop the script. Make it so the user had to reset it, with all attendant loss of data gathered. Someone then later designed to make script error failures soft rather than hard. Since then, it has become exploitable. |
(0033619) unregi (reporter) 2018-12-11 14:14 edited on: 2018-12-11 14:15 |
@bill Yes, a function for it wouldn't make much sense otherwise, if it wouldn't make it more userfriendly ;) The Debug window message makes the check very inconvenient for everybody who wants to use it for good stuff, because even if he prints a long message explaining why this doesn't work on Nearby Chat, the user, scared from that red written message, will ask for help and complain that the script doesn't work. At the same time, a griefer won't care about those Debug messages, he wants to destroy things anyway. Lets just get some esample, a griefer joins your sim with a script: Check if osNpcRemove is available -> if yes, remove all NPCs Check if osSetTerreinTexture is available -> if yes, everything rainbow colors Then do some basic particle and rezzer spaming and whatever griefers usually do in SL If you have a misconfiguration and he is allowed to set Terrain Texture, how will the Debug message, that you got 0.1s ago when the script checked if its allowed to mess with NPCs, save you from getting your sim changed to rainbow land? |
(0033620) BillBlight (developer) 2018-12-11 14:16 |
My statement about the debug window was it alerts the sim owner and everyone on the sim that someone is snooping your region for what functions are enabled. This function would conceal that. |
(0033621) unregi (reporter) 2018-12-11 14:36 |
What advantage does this give you against griefers? |
(0033622) BillBlight (developer) 2018-12-11 14:39 |
well, you then know who was on the region when it happened. |
![]() |
|||
Date Modified | Username | Field | Change |
2018-12-09 03:38 | unregi | New Issue | |
2018-12-09 03:38 | unregi | File Added: 0001-Add-osCheckThreatLevel.patch | |
2018-12-09 03:40 | unregi | Status | new => patch included |
2018-12-11 11:02 | UbitUmarov | Note Added: 0033612 | |
2018-12-11 11:45 | melanie | Note Added: 0033613 | |
2018-12-11 12:13 | unregi | Note Added: 0033614 | |
2018-12-11 12:15 | BillBlight | Note Added: 0033615 | |
2018-12-11 13:09 | unregi | Note Added: 0033616 | |
2018-12-11 13:10 | unregi | File Added: dependency-test.lsl | |
2018-12-11 13:20 | BillBlight | Note Added: 0033617 | |
2018-12-11 13:54 | melanie | Note Added: 0033618 | |
2018-12-11 14:14 | unregi | Note Added: 0033619 | |
2018-12-11 14:15 | unregi | Note Edited: 0033619 | View Revisions |
2018-12-11 14:16 | BillBlight | Note Added: 0033620 | |
2018-12-11 14:36 | unregi | Note Added: 0033621 | |
2018-12-11 14:39 | BillBlight | Note Added: 0033622 |
Copyright © 2000 - 2012 MantisBT Group |