From 4eeab4097a4edb773ac0bc17417943b8032d70e5 Mon Sep 17 00:00:00 2001 From: Teravus Ovares (Dan Olivares) Date: Sun, 16 Aug 2009 12:10:06 -0400 Subject: * minor: comments --- OpenSim/Region/ScriptEngine/XEngine/EventManager.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs index 7142c8c..8195f33 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs @@ -70,6 +70,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine } } + /// + /// When an object gets paid by an avatar and generates the paid event, + /// this will pipe it to the script engine + /// + /// Object ID that got paid + /// Agent Id that did the paying + /// Amount paid private void HandleObjectPaid(UUID objectID, UUID agentID, int amount) { @@ -93,6 +100,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine } } + /// + /// Handles piping the proper stuff to The script engine for touching + /// Including DetectedParams + /// + /// + /// + /// + /// + /// public void touch_start(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) { -- cgit v1.1 From 5e391b9f7c62e0d9328d09135521f65400e31283 Mon Sep 17 00:00:00 2001 From: Teravus Ovares (Dan Olivares) Date: Sun, 16 Aug 2009 12:14:49 -0400 Subject: * ShortVersion, another attempt at fixing the test thread death that randomly occurs. * LongVersion nIni may be causing the test thread death. Pausing OpenSimulator during startup causes a nIni error that makes debugging startup operations difficult for users. It might be because when it's in pause mode, something else reads from the nini config passed? If it is, it might not be fixable.. however, if it's concurrency that causes nini death it would make sense to give each section of the tests a new IConfigSource so that they don't read from the same configsource at the same time. --- OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs | 1 + OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs | 2 +- OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs b/OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs index bd11d97..9fb1041 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/Tests/BasicCircuitTests.cs @@ -34,6 +34,7 @@ using OpenMetaverse; using OpenMetaverse.Packets; using OpenSim.Framework; using OpenSim.Tests.Common; +using OpenSim.Tests.Common.Mock; namespace OpenSim.Region.ClientStack.LindenUDP.Tests { diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs index 88452d2..8ec14c7 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs @@ -72,7 +72,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000, cm); ISharedRegionModule interregionComms = new RESTInterregionComms(); - interregionComms.Initialise(new IniConfigSource()); + interregionComms.Initialise( new IniConfigSource()); interregionComms.PostInitialise(); SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms); SceneSetupHelpers.SetupSceneModules(scene2, new IniConfigSource(), interregionComms); diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs index f290dd7..358ce22 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs @@ -35,6 +35,7 @@ using Nini.Config; using OpenSim.Region.ScriptEngine.Shared.Api; using OpenMetaverse; using System; +using OpenSim.Tests.Common.Mock; namespace OpenSim.Region.ScriptEngine.Shared.Tests { @@ -52,7 +53,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests public void SetUp() { - IniConfigSource initConfigSource = new IniConfigSource(); + IConfigSource initConfigSource = new IniConfigSource(); IConfig config = initConfigSource.AddConfig("XEngine"); config.Set("Enabled", "true"); -- cgit v1.1 From fa921ec147cae620f3126c01b1db94a8f6e90c7e Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Mon, 17 Aug 2009 02:25:00 +1000 Subject: * Implements AppDomain Security for MRM Scripts. * Added permissionLevel attribute to [MRM] section in OpenSim.ini. Default is 'Internet', however may be any of the following (case sensitive), FullTrust, SkipVerification, Execution, Nothing, LocalIntranet, Internet, Everything. For previous functionality, set to FullTrust or Execution. --- .../Scripting/Minimodule/MRMModule.cs | 103 ++++++++++++++++++++- 1 file changed, 101 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs index 6daae29..9042e0d 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/MRMModule.cs @@ -27,9 +27,14 @@ using System; using System.CodeDom.Compiler; +using System.Collections; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Reflection; +using System.Security; +using System.Security.Permissions; +using System.Security.Policy; using System.Text; using log4net; using Microsoft.CSharp; @@ -54,6 +59,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule private readonly MicroScheduler m_microthreads = new MicroScheduler(); + + private IConfig m_config; + public void RegisterExtension(T instance) { m_extensions[typeof (T)] = instance; @@ -63,6 +71,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { if (source.Configs["MRM"] != null) { + m_config = source.Configs["MRM"]; + if (source.Configs["MRM"].GetBoolean("Enabled", false)) { m_log.Info("[MRM] Enabling MRM Module"); @@ -112,6 +122,91 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule return script; } + /// + /// Create an AppDomain that contains policy restricting code to execute + /// with only the permissions granted by a named permission set + /// + /// name of the permission set to restrict to + /// 'friendly' name of the appdomain to be created + /// + /// if is null + /// + /// + /// if is empty + /// + /// AppDomain with a restricted security policy + /// Substantial portions of this function from: http://blogs.msdn.com/shawnfa/archive/2004/10/25/247379.aspx + /// Valid permissionSetName values are: + /// * FullTrust + /// * SkipVerification + /// * Execution + /// * Nothing + /// * LocalIntranet + /// * Internet + /// * Everything + /// + public static AppDomain CreateRestrictedDomain(string permissionSetName, string appDomainName) + { + if (permissionSetName == null) + throw new ArgumentNullException("permissionSetName"); + if (permissionSetName.Length == 0) + throw new ArgumentOutOfRangeException("permissionSetName", permissionSetName, + "Cannot have an empty permission set name"); + + // Default to all code getting nothing + PolicyStatement emptyPolicy = new PolicyStatement(new PermissionSet(PermissionState.None)); + UnionCodeGroup policyRoot = new UnionCodeGroup(new AllMembershipCondition(), emptyPolicy); + + bool foundName = false; + PermissionSet setIntersection = new PermissionSet(PermissionState.Unrestricted); + + // iterate over each policy level + IEnumerator levelEnumerator = SecurityManager.PolicyHierarchy(); + while (levelEnumerator.MoveNext()) + { + PolicyLevel level = levelEnumerator.Current as PolicyLevel; + + // if this level has defined a named permission set with the + // given name, then intersect it with what we've retrieved + // from all the previous levels + if (level != null) + { + PermissionSet levelSet = level.GetNamedPermissionSet(permissionSetName); + if (levelSet != null) + { + foundName = true; + if (setIntersection != null) + setIntersection = setIntersection.Intersect(levelSet); + } + } + } + + // Intersect() can return null for an empty set, so convert that + // to an empty set object. Also return an empty set if we didn't find + // the named permission set we were looking for + if (setIntersection == null || !foundName) + setIntersection = new PermissionSet(PermissionState.None); + else + setIntersection = new NamedPermissionSet(permissionSetName, setIntersection); + + // if no named permission sets were found, return an empty set, + // otherwise return the set that was found + PolicyStatement permissions = new PolicyStatement(setIntersection); + policyRoot.AddChild(new UnionCodeGroup(new AllMembershipCondition(), permissions)); + + // create an AppDomain policy level for the policy tree + PolicyLevel appDomainLevel = PolicyLevel.CreateAppDomainLevel(); + appDomainLevel.RootCodeGroup = policyRoot; + + // create an AppDomain where this policy will be in effect + string domainName = appDomainName; + AppDomain restrictedDomain = AppDomain.CreateDomain(domainName); + restrictedDomain.SetAppDomainPolicy(appDomainLevel); + + return restrictedDomain; + } + + void EventManager_OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource) { if (script.StartsWith("//MRM:C#")) @@ -125,9 +220,13 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule try { - m_log.Info("[MRM] Found C# MRM"); + m_log.Info("[MRM] Found C# MRM - Starting in AppDomain with " + m_config.GetString("permissionLevel", "Internet") + "-level security."); + + string domainName = UUID.Random().ToString(); + AppDomain target = CreateRestrictedDomain(m_config.GetString("permissionLevel", "Internet"), + domainName); - MRMBase mmb = (MRMBase)AppDomain.CurrentDomain.CreateInstanceFromAndUnwrap( + MRMBase mmb = (MRMBase) target.CreateInstanceFromAndUnwrap( CompileFromDotNetText(script, itemID.ToString()), "OpenSim.MiniModule"); -- cgit v1.1 From ad02aefaee803a0a2118eff6bfaa436f3099e121 Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Mon, 17 Aug 2009 01:45:48 +0900 Subject: Fix argument index in log4net call. (fixes #4003) --- .../ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs index 20671e0..bce160a 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs @@ -123,7 +123,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Land public LandData GetLandData(ulong regionHandle, uint x, uint y) { - m_log.DebugFormat("[LAND IN CONNECTOR]: GetLandData for {0}. Count = {2}", + m_log.DebugFormat("[LAND IN CONNECTOR]: GetLandData for {0}. Count = {1}", regionHandle, m_Scenes.Count); foreach (Scene s in m_Scenes) { -- cgit v1.1 From 58d2775ff29c1a4faa26302515c7a6cbd8bdb764 Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Mon, 17 Aug 2009 02:05:12 +0900 Subject: Add copyright header. Formatting cleanup. --- .../Framework/Scenes/Tests/ScenePresenceTests.cs | 2 +- .../Minimodule/Interfaces/IAvatarAttachment.cs | 27 ++++++++++++++++++++++ .../Scripting/Minimodule/SOPObject.cs | 4 ++-- 3 files changed, 30 insertions(+), 3 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs index 8ec14c7..88452d2 100644 --- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs +++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs @@ -72,7 +72,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests scene3 = SceneSetupHelpers.SetupScene("Neighbour x-1", UUID.Random(), 999, 1000, cm); ISharedRegionModule interregionComms = new RESTInterregionComms(); - interregionComms.Initialise( new IniConfigSource()); + interregionComms.Initialise(new IniConfigSource()); interregionComms.PostInitialise(); SceneSetupHelpers.SetupSceneModules(scene, new IniConfigSource(), interregionComms); SceneSetupHelpers.SetupSceneModules(scene2, new IniConfigSource(), interregionComms); diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IAvatarAttachment.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IAvatarAttachment.cs index 22b4605..1993948 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IAvatarAttachment.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IAvatarAttachment.cs @@ -1,3 +1,30 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { public interface IAvatarAttachment diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs index 35b0a0f..292e345 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs @@ -71,7 +71,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule private bool CanEdit() { - if(!m_security.CanEditObject(this)) + if (!m_security.CanEditObject(this)) { throw new SecurityException("Insufficient Permission to edit object with UUID [" + GetSOP().UUID + "]"); } @@ -672,7 +672,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule get { return m_sculptType; } set { - if(!CanEdit()) + if (!CanEdit()) return; m_sculptType = value; -- cgit v1.1 From 82c888fc6c103ec345bf656cd469f4260b678bcb Mon Sep 17 00:00:00 2001 From: Jeff Ames Date: Mon, 17 Aug 2009 10:29:06 +0900 Subject: Add copyright headers. Formatting cleanup. Fix a compiler warning. --- OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | 1 - 1 file changed, 1 deletion(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index 1a7f8f8..4fee4c9 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs @@ -115,7 +115,6 @@ namespace OpenSim.Region.Framework.Scenes /// public void RequestPrim(uint primLocalID, IClientAPI remoteClient) { - PacketType i = PacketType.ObjectUpdate; List EntityList = GetEntities(); foreach (EntityBase ent in EntityList) -- cgit v1.1 From 3d7bb7567c7452d4a1216db5656d0b02957cf950 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 17 Aug 2009 09:21:39 +0100 Subject: Add the ability to use -console=rest to the region server. User and pass are specified the same way as for the ROBUST server --- OpenSim/Region/Application/Application.cs | 3 ++- OpenSim/Region/Application/OpenSim.cs | 26 ++++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs index df80290..2fd26bf 100644 --- a/OpenSim/Region/Application/Application.cs +++ b/OpenSim/Region/Application/Application.cs @@ -120,6 +120,7 @@ namespace OpenSim configSource.AddSwitch("Startup", "gridmode"); configSource.AddSwitch("Startup", "physics"); configSource.AddSwitch("Startup", "gui"); + configSource.AddSwitch("Startup", "console"); configSource.AddConfig("StandAlone"); configSource.AddConfig("Network"); @@ -223,4 +224,4 @@ namespace OpenSim _IsHandlingException = false; } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index 390cfcd..38874f9 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs @@ -52,6 +52,7 @@ namespace OpenSim protected string m_startupCommandsFile; protected string m_shutdownCommandsFile; protected bool m_gui = false; + protected string m_consoleType = "local"; private string m_timedScript = "disabled"; private Timer m_scriptTimer; @@ -71,7 +72,10 @@ namespace OpenSim m_startupCommandsFile = startupConfig.GetString("startup_console_commands_file", "startup_commands.txt"); m_shutdownCommandsFile = startupConfig.GetString("shutdown_console_commands_file", "shutdown_commands.txt"); - m_gui = startupConfig.GetBoolean("gui", false); + if (startupConfig.GetString("console", String.Empty) == String.Empty) + m_gui = startupConfig.GetBoolean("gui", false); + else + m_consoleType= startupConfig.GetString("console", String.Empty); m_timedScript = startupConfig.GetString("timer_Script", "disabled"); if (m_logFileAppender != null) @@ -110,13 +114,31 @@ namespace OpenSim if (m_gui) // Driven by external GUI m_console = new CommandConsole("Region"); else - m_console = new LocalConsole("Region"); + { + switch (m_consoleType) + { + case "basic": + m_console = new CommandConsole("Region"); + break; + case "rest": + m_console = new RemoteConsole("Region"); + ((RemoteConsole)m_console).ReadConfig(m_config.Source); + break; + default: + m_console = new LocalConsole("Region"); + break; + } + } + MainConsole.Instance = m_console; RegisterConsoleCommands(); base.StartupSpecific(); + if (m_console is RemoteConsole) + ((RemoteConsole)m_console).SetServer(m_httpServer); + //Run Startup Commands if (String.IsNullOrEmpty(m_startupCommandsFile)) { -- cgit v1.1 From 644db1e5400504ec70b22c3e928873948f1247c3 Mon Sep 17 00:00:00 2001 From: Melanie Date: Mon, 17 Aug 2009 09:40:38 +0100 Subject: Add System.Xml reference to the console project --- .../Region/ClientStack/LindenUDP/LLClientView.cs | 77 +++++++++++++++------- .../Region/Communications/OGS1/OGS1GridServices.cs | 2 +- .../Region/CoreModules/Avatar/Chat/ChatModule.cs | 13 ++++ .../World/Estate/EstateManagementModule.cs | 3 +- OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | 38 ++++++++--- 5 files changed, 101 insertions(+), 32 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 12c2d86..e1d6f1b 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -1435,6 +1435,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// heightmap public virtual void SendLayerData(float[] map) { + DoSendLayerData((object)map); ThreadPool.QueueUserWorkItem(DoSendLayerData, map); } @@ -1450,16 +1451,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP { for (int y = 0; y < 16; y++) { - // For some terrains, sending more than one terrain patch at once results in a libsecondlife exception - // see http://opensimulator.org/mantis/view.php?id=1662 - //for (int x = 0; x < 16; x += 4) - //{ - // SendLayerPacket(map, y, x); - // Thread.Sleep(150); - //} - for (int x = 0; x < 16; x++) - { - SendLayerData(x, y, LLHeightFieldMoronize(map)); + for (int x = 0; x < 16; x += 4) + { + SendLayerPacket(LLHeightFieldMoronize(map), y, x); Thread.Sleep(35); } } @@ -1476,17 +1470,54 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// heightmap /// X coordinate for patches 0..12 /// Y coordinate for patches 0..15 - // private void SendLayerPacket(float[] map, int y, int x) - // { - // int[] patches = new int[4]; - // patches[0] = x + 0 + y * 16; - // patches[1] = x + 1 + y * 16; - // patches[2] = x + 2 + y * 16; - // patches[3] = x + 3 + y * 16; - - // Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches); - // OutPacket(layerpack, ThrottleOutPacketType.Land); - // } + private void SendLayerPacket(float[] map, int y, int x) + { + int[] patches = new int[4]; + patches[0] = x + 0 + y * 16; + patches[1] = x + 1 + y * 16; + patches[2] = x + 2 + y * 16; + patches[3] = x + 3 + y * 16; + + LayerDataPacket layerpack; + try + { + layerpack = TerrainCompressor.CreateLandPacket(map, patches); + layerpack.Header.Zerocoded = true; + layerpack.Header.Reliable = true; + + if (layerpack.Length > 1000) // Oversize packet was created + { + for (int xa = 0 ; xa < 4 ; xa++) + { + // Send oversize packet in individual patches + // + SendLayerData(x+xa, y, map); + } + } + else + { + OutPacket(layerpack, ThrottleOutPacketType.Land); + } + } + catch (OverflowException e) + { + for (int xa = 0 ; xa < 4 ; xa++) + { + // Send oversize packet in individual patches + // + SendLayerData(x+xa, y, map); + } + } + catch (IndexOutOfRangeException e) + { + for (int xa = 0 ; xa < 4 ; xa++) + { + // Bad terrain, send individual chunks + // + SendLayerData(x+xa, y, map); + } + } + } /// /// Sends a specified patch to a client @@ -1507,6 +1538,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(((map.Length==65536)? map : LLHeightFieldMoronize(map)), patches); layerpack.Header.Zerocoded = true; + layerpack.Header.Reliable = true; OutPacket(layerpack, ThrottleOutPacketType.Land); @@ -1556,7 +1588,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP /// 16x16 array of wind speeds public virtual void SendWindData(Vector2[] windSpeeds) { - ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendWindData), (object)windSpeeds); + DoSendWindData((object)windSpeeds); + // ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendWindData), (object)windSpeeds); } /// diff --git a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs index aef1b94..47c7fe4 100644 --- a/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs +++ b/OpenSim/Region/Communications/OGS1/OGS1GridServices.cs @@ -147,7 +147,7 @@ namespace OpenSim.Region.Communications.OGS1 { // The timeout should always be significantly larger than the timeout for the grid server to request // the initial status of the region before confirming registration. - GridResp = GridReq.Send(serversInfo.GridURL, 90000); + GridResp = GridReq.Send(serversInfo.GridURL, 9999999); } catch (Exception e) { diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs index fcc2673..2426393 100644 --- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs @@ -48,6 +48,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat private int m_saydistance = 30; private int m_shoutdistance = 100; private int m_whisperdistance = 10; + private string m_adminprefix = String.Empty; private List m_scenes = new List(); internal object m_syncy = new object(); @@ -76,6 +77,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat m_whisperdistance = config.Configs["Chat"].GetInt("whisper_distance", m_whisperdistance); m_saydistance = config.Configs["Chat"].GetInt("say_distance", m_saydistance); m_shoutdistance = config.Configs["Chat"].GetInt("shout_distance", m_shoutdistance); + m_adminprefix = config.Configs["Chat"].GetString("admin_prefix", m_adminprefix); } public virtual void AddRegion(Scene scene) @@ -207,6 +209,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat fromPos = avatar.AbsolutePosition; fromName = avatar.Name; fromID = c.Sender.AgentId; + if (avatar.GodLevel > 100) + fromName = m_adminprefix + fromName; break; @@ -255,14 +259,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat string fromName = c.From; UUID fromID = UUID.Zero; + UUID ownerID = UUID.Zero; ChatSourceType sourceType = ChatSourceType.Object; if (null != c.Sender) { ScenePresence avatar = (c.Scene as Scene).GetScenePresence(c.Sender.AgentId); fromID = c.Sender.AgentId; + ownerID = c.Sender.AgentId; fromName = avatar.Name; sourceType = ChatSourceType.Agent; } + if (c.SenderObject != null) + { + SceneObjectPart senderObject = (SceneObjectPart)c.SenderObject; + fromID = senderObject.UUID; + ownerID = senderObject.OwnerID; + fromName = senderObject.Name; + } // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 75b3fe6..61ef20e 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs @@ -214,7 +214,8 @@ namespace OpenSim.Region.CoreModules.World.Estate private void handleEstateRestartSimRequest(IClientAPI remoteClient, int timeInSeconds) { - m_scene.Restart(timeInSeconds); +// m_scene.Restart(timeInSeconds); + remoteClient.SendBlueBoxMessage(UUID.Zero, "System", "Restart is not available"); } private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID) diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index b7030f1..80d7598 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs @@ -156,10 +156,10 @@ namespace OpenSim.Region.Physics.OdePlugin private const uint m_regionWidth = Constants.RegionSize; private const uint m_regionHeight = Constants.RegionSize; - + private bool IsLocked = false; private float ODE_STEPSIZE = 0.020f; private float metersInSpace = 29.9f; - + private List RemoveQueue; public float gravityx = 0f; public float gravityy = 0f; public float gravityz = -9.8f; @@ -376,6 +376,7 @@ namespace OpenSim.Region.Physics.OdePlugin // Initialize the mesh plugin public override void Initialise(IMesher meshmerizer, IConfigSource config) { + RemoveQueue = new List(); mesher = meshmerizer; m_config = config; // Defaults @@ -2047,13 +2048,21 @@ namespace OpenSim.Region.Physics.OdePlugin { if (prim is OdePrim) { - lock (OdeLock) + if (!IsLocked) //Fix a deadlock situation.. have we been locked by Simulate? { - OdePrim p = (OdePrim) prim; + lock (OdeLock) + { + OdePrim p = (OdePrim)prim; - p.setPrimForRemoval(); - AddPhysicsActorTaint(prim); - //RemovePrimThreadLocked(p); + p.setPrimForRemoval(); + AddPhysicsActorTaint(prim); + //RemovePrimThreadLocked(p); + } + } + else + { + //Add the prim to a queue which will be removed when Simulate has finished what it's doing. + RemoveQueue.Add(prim); } } } @@ -2575,7 +2584,7 @@ namespace OpenSim.Region.Physics.OdePlugin DeleteRequestedJoints(); // this must be outside of the lock (OdeLock) to avoid deadlocks CreateRequestedJoints(); // this must be outside of the lock (OdeLock) to avoid deadlocks } - + IsLocked = true; lock (OdeLock) { // Process 10 frames if the sim is running normal.. @@ -2988,6 +2997,19 @@ namespace OpenSim.Region.Physics.OdePlugin d.WorldExportDIF(world, fname, physics_logging_append_existing_logfile, prefix); } } + IsLocked = false; + if (RemoveQueue.Count > 0) + { + do + { + if (RemoveQueue[0] != null) + { + RemovePrimThreadLocked((OdePrim)RemoveQueue[0]); + } + RemoveQueue.RemoveAt(0); + } + while (RemoveQueue.Count > 0); + } return fps; } -- cgit v1.1