BulletSim: add osGetPhysicsEngineType() LSL function and update

the physics engines to return the name that is specified in the INI
file ("physics = XXX") as the type of engine.
This os function is a little different than the others in that it
does not throw an exception of one is not privilaged to use it.
It merely returns an empty string.
user_profiles
Robert Adams 2013-01-10 17:03:19 -08:00
parent 93adc4cb66
commit eacc2561d1
12 changed files with 82 additions and 22 deletions

View File

@ -49,7 +49,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
public PhysicsScene GetScene(string sceneIdentifier) public PhysicsScene GetScene(string sceneIdentifier)
{ {
return new BasicScene(sceneIdentifier); return new BasicScene(GetName(), sceneIdentifier);
} }
public string GetName() public string GetName()

View File

@ -49,8 +49,10 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
//protected internal string sceneIdentifier; //protected internal string sceneIdentifier;
public BasicScene(string _sceneIdentifier) public BasicScene(string engineType, string _sceneIdentifier)
{ {
EngineType = engineType;
Name = EngineType + "/" + _sceneIdentifier;
//sceneIdentifier = _sceneIdentifier; //sceneIdentifier = _sceneIdentifier;
} }

View File

@ -59,7 +59,7 @@ public class BSPlugin : IPhysicsPlugin
{ {
if (_mScene == null) if (_mScene == null)
{ {
_mScene = new BSScene(sceneIdentifier); _mScene = new BSScene(GetName(), sceneIdentifier);
} }
return (_mScene); return (_mScene);
} }

View File

@ -167,11 +167,16 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
public bool VehiclePhysicalLoggingEnabled { get; private set; } public bool VehiclePhysicalLoggingEnabled { get; private set; }
#region Construction and Initialization #region Construction and Initialization
public BSScene(string identifier) public BSScene(string engineType, string identifier)
{ {
m_initialized = false; m_initialized = false;
// we are passed the name of the region we're working for.
// The name of the region we're working for is passed to us. Keep for identification.
RegionName = identifier; RegionName = identifier;
// Set identifying variables in the PhysicsScene interface.
EngineType = engineType;
Name = EngineType + "/" + RegionName;
} }
public override void Initialise(IMesher meshmerizer, IConfigSource config) public override void Initialise(IMesher meshmerizer, IConfigSource config)

View File

@ -62,13 +62,20 @@ namespace OpenSim.Region.Physics.Manager
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary> /// <summary>
/// Name of this scene. Useful in debug messages to distinguish one OdeScene instance from another. /// A unique identifying string for this instance of the physics engine.
/// Useful in debug messages to distinguish one OdeScene instance from another.
/// Usually set to include the region name that the physics engine is acting for.
/// </summary> /// </summary>
public string Name { get; protected set; } public string Name { get; protected set; }
/// <summary>
/// A string identifying the family of this physics engine. Most common values returned
/// are "OpenDynamicsEngine" and "BulletSim" but others are possible.
/// </summary>
public string EngineType { get; protected set; }
// The only thing that should register for this event is the SceneGraph // The only thing that should register for this event is the SceneGraph
// Anything else could cause problems. // Anything else could cause problems.
public event physicsCrash OnPhysicsCrash; public event physicsCrash OnPhysicsCrash;
public static PhysicsScene Null public static PhysicsScene Null

View File

@ -72,7 +72,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// http://opensimulator.org/mantis/view.php?id=2750). // http://opensimulator.org/mantis/view.php?id=2750).
d.InitODE(); d.InitODE();
m_scene = new OdeScene(sceneIdentifier); m_scene = new OdeScene(GetName(), sceneIdentifier);
} }
return m_scene; return m_scene;

View File

@ -526,11 +526,12 @@ namespace OpenSim.Region.Physics.OdePlugin
/// These settings need to be tweaked 'exactly' right or weird stuff happens. /// These settings need to be tweaked 'exactly' right or weird stuff happens.
/// </summary> /// </summary>
/// <param value="name">Name of the scene. Useful in debug messages.</param> /// <param value="name">Name of the scene. Useful in debug messages.</param>
public OdeScene(string name) public OdeScene(string engineType, string name)
{ {
m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.ToString() + "." + name); m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType.ToString() + "." + name);
Name = name; Name = name;
EngineType = engineType;
nearCallback = near; nearCallback = near;
triCallback = TriCallback; triCallback = TriCallback;

View File

@ -49,7 +49,7 @@ namespace OpenSim.Region.Physics.POSPlugin
public PhysicsScene GetScene(string sceneIdentifier) public PhysicsScene GetScene(string sceneIdentifier)
{ {
return new POSScene(sceneIdentifier); return new POSScene(GetName(), sceneIdentifier);
} }
public string GetName() public string GetName()

View File

@ -43,8 +43,10 @@ namespace OpenSim.Region.Physics.POSPlugin
//protected internal string sceneIdentifier; //protected internal string sceneIdentifier;
public POSScene(String _sceneIdentifier) public POSScene(string engineType, String _sceneIdentifier)
{ {
EngineType = engineType;
Name = EngineType + "/" + _sceneIdentifier;
//sceneIdentifier = _sceneIdentifier; //sceneIdentifier = _sceneIdentifier;
} }

View File

@ -245,11 +245,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message); wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message);
} }
// Returns of the function is allowed. Throws a script exception if not allowed.
public void CheckThreatLevel(ThreatLevel level, string function) public void CheckThreatLevel(ThreatLevel level, string function)
{ {
if (!m_OSFunctionsEnabled) if (!m_OSFunctionsEnabled)
OSSLError(String.Format("{0} permission denied. All OS functions are disabled.", function)); // throws OSSLError(String.Format("{0} permission denied. All OS functions are disabled.", function)); // throws
string reasonWhyNot = CheckThreatLevelTest(level, function);
if (!String.IsNullOrEmpty(reasonWhyNot))
{
OSSLError(reasonWhyNot);
}
}
// Check to see if function is allowed. Returns an empty string if function permitted
// or a string explaining why this function can't be used.
private string CheckThreatLevelTest(ThreatLevel level, string function)
{
if (!m_FunctionPerms.ContainsKey(function)) if (!m_FunctionPerms.ContainsKey(function))
{ {
FunctionPerms perms = new FunctionPerms(); FunctionPerms perms = new FunctionPerms();
@ -329,10 +341,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
// Allow / disallow by threat level // Allow / disallow by threat level
if (level > m_MaxThreatLevel) if (level > m_MaxThreatLevel)
OSSLError( return
String.Format( String.Format(
"{0} permission denied. Allowed threat level is {1} but function threat level is {2}.", "{0} permission denied. Allowed threat level is {1} but function threat level is {2}.",
function, m_MaxThreatLevel, level)); function, m_MaxThreatLevel, level);
} }
else else
{ {
@ -342,7 +354,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (m_FunctionPerms[function].AllowedOwners.Contains(m_host.OwnerID)) if (m_FunctionPerms[function].AllowedOwners.Contains(m_host.OwnerID))
{ {
// prim owner is in the list of allowed owners // prim owner is in the list of allowed owners
return; return String.Empty;
} }
UUID ownerID = m_item.OwnerID; UUID ownerID = m_item.OwnerID;
@ -354,7 +366,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero) if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero)
{ {
return; return String.Empty;
} }
} }
@ -365,7 +377,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (land.LandData.OwnerID == ownerID) if (land.LandData.OwnerID == ownerID)
{ {
return; return String.Empty;
} }
} }
@ -375,7 +387,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
//Only Estate Managers may use the function //Only Estate Managers may use the function
if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID)
{ {
return; return String.Empty;
} }
} }
@ -384,25 +396,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
if (World.RegionInfo.EstateSettings.EstateOwner == ownerID) if (World.RegionInfo.EstateSettings.EstateOwner == ownerID)
{ {
return; return String.Empty;
} }
} }
if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID)) if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID))
OSSLError( return(
String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.",
function)); function));
if (m_item.CreatorID != ownerID) if (m_item.CreatorID != ownerID)
{ {
if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0) if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0)
OSSLError( return String.Format("{0} permission denied. Script permissions error.", function);
String.Format("{0} permission denied. Script permissions error.",
function));
} }
} }
} }
return String.Empty;
} }
internal void OSSLDeprecated(string function, string replacement) internal void OSSLDeprecated(string function, string replacement)
@ -1558,6 +1569,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
} }
public string osGetPhysicsEngineType()
{
// High because it can be used to target attacks to known weaknesses
// This would allow a new class of griefer scripts that don't even
// require their user to know what they are doing (see script
// kiddie)
// Because it would be nice if scripts didn't blow up if the information
// about the physics engine, this function returns an empty string if
// the user does not have permission to see it. This as opposed to
// throwing an exception.
m_host.AddScriptLPS(1);
string ret = String.Empty;
if (String.IsNullOrEmpty(CheckThreatLevelTest(ThreatLevel.High, "osGetPhysicsEngineType")))
{
if (m_ScriptEngine.World.PhysicsScene != null)
{
ret = m_ScriptEngine.World.PhysicsScene.EngineType;
// An old physics engine might have an uninitialized engine type
if (ret == null)
ret = "unknown";
}
}
return ret;
}
public string osGetSimulatorVersion() public string osGetSimulatorVersion()
{ {
// High because it can be used to target attacks to known weaknesses // High because it can be used to target attacks to known weaknesses

View File

@ -259,6 +259,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
string osGetScriptEngineName(); string osGetScriptEngineName();
string osGetSimulatorVersion(); string osGetSimulatorVersion();
string osGetPhysicsEngineType();
Object osParseJSONNew(string JSON); Object osParseJSONNew(string JSON);
Hashtable osParseJSON(string JSON); Hashtable osParseJSON(string JSON);

View File

@ -420,6 +420,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
return m_OSSL_Functions.osGetScriptEngineName(); return m_OSSL_Functions.osGetScriptEngineName();
} }
public string osGetPhysicsEngineType()
{
return m_OSSL_Functions.osGetPhysicsEngineType();
}
public string osGetSimulatorVersion() public string osGetSimulatorVersion()
{ {
return m_OSSL_Functions.osGetSimulatorVersion(); return m_OSSL_Functions.osGetSimulatorVersion();