From 2ac00b7f96b01cf9494d2a5fef9a84443301a04c Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 26 Apr 2010 14:52:22 -0700 Subject: * Commenting SQLiteNG out of prebuild.xml, because it's making compile fail in Windows. Justin: you forgot to add Mono.Sqlite.dll, and I can't figure out where to grab it from! * IRegionModule.cs wants to be committed too -- EOF. --- OpenSim/Region/Framework/Interfaces/IRegionModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Interfaces/IRegionModule.cs b/OpenSim/Region/Framework/Interfaces/IRegionModule.cs index 8365fe3..e25a6e8 100644 --- a/OpenSim/Region/Framework/Interfaces/IRegionModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IRegionModule.cs @@ -30,8 +30,8 @@ using OpenSim.Region.Framework.Scenes; namespace OpenSim.Region.Framework.Interfaces { - /// - /// DEPRECATED! Use INonSharedRegionModule or ISharedRegionModule instead + /// + /// DEPRECATED! Use INonSharedRegionModule or ISharedRegionModule instead /// public interface IRegionModule { -- cgit v1.1 From 6928ec024060bb7181553206c9ee6a125e7c9a2d Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 27 Apr 2010 00:25:29 +0100 Subject: Add a parameter to prim inventory update to prevent event firing --- .../Framework/Interfaces/IEntityInventory.cs | 1 + .../Framework/Scenes/SceneObjectPartInventory.cs | 43 +++++++++++++--------- 2 files changed, 26 insertions(+), 18 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs index 2b90960..fd43923 100644 --- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs +++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs @@ -161,6 +161,7 @@ namespace OpenSim.Region.Framework.Interfaces /// in this prim's inventory. /// false if the item did not exist, true if the update occurred successfully bool UpdateInventoryItem(TaskInventoryItem item); + bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents); /// /// Remove an item from this entity's inventory diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 3b1b567..44c49c5 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -609,30 +609,37 @@ namespace OpenSim.Region.Framework.Scenes /// false if the item did not exist, true if the update occurred successfully public bool UpdateInventoryItem(TaskInventoryItem item) { - lock (m_items) + return UpdateInventoryItem(item, true); + } + + public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents) + { + lock(m_items) { if (m_items.ContainsKey(item.ItemID)) { - item.ParentID = m_part.UUID; - item.ParentPartID = m_part.UUID; - item.Flags = m_items[item.ItemID].Flags; - - // If group permissions have been set on, check that the groupID is up to date in case it has - // changed since permissions were last set. - if (item.GroupPermissions != (uint)PermissionMask.None) - item.GroupID = m_part.GroupID; - - if (item.AssetID == UUID.Zero) + if (m_items.ContainsKey(item.ItemID)) { - item.AssetID = m_items[item.ItemID].AssetID; - } - + item.ParentID = m_part.UUID; + item.ParentPartID = m_part.UUID; + item.Flags = m_items[item.ItemID].Flags; + + // If group permissions have been set on, check that the groupID is up to date in case it has + // changed since permissions were last set. + if (item.GroupPermissions != (uint)PermissionMask.None) + item.GroupID = m_part.GroupID; + + if (item.AssetID == UUID.Zero) + { + item.AssetID = m_items[item.ItemID].AssetID; + } m_items[item.ItemID] = item; m_inventorySerial++; - m_part.TriggerScriptChangedEvent(Changed.INVENTORY); + if (fireScriptEvents) + m_part.TriggerScriptChangedEvent(Changed.INVENTORY); HasInventoryChanged = true; m_part.ParentGroup.HasGroupChanged = true; - + m_items.LockItemsForWrite(false); return true; } else @@ -643,9 +650,9 @@ namespace OpenSim.Region.Framework.Scenes item.ItemID, m_part.Name, m_part.UUID, m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); } - } - return false; + return false; + } } /// -- cgit v1.1 From edde0be0a0902a5f9cf51df7ceb3325d50c95c6e Mon Sep 17 00:00:00 2001 From: Melanie Date: Tue, 27 Apr 2010 01:11:14 +0100 Subject: Fix build break. --- .../Framework/Scenes/SceneObjectPartInventory.cs | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 44c49c5..4da63c0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -633,24 +633,24 @@ namespace OpenSim.Region.Framework.Scenes { item.AssetID = m_items[item.ItemID].AssetID; } - m_items[item.ItemID] = item; - m_inventorySerial++; - if (fireScriptEvents) - m_part.TriggerScriptChangedEvent(Changed.INVENTORY); - HasInventoryChanged = true; - m_part.ParentGroup.HasGroupChanged = true; - m_items.LockItemsForWrite(false); - return true; - } - else - { - m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", - item.ItemID, m_part.Name, m_part.UUID, - m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); - } + m_items[item.ItemID] = item; + m_inventorySerial++; + if (fireScriptEvents) + m_part.TriggerScriptChangedEvent(Changed.INVENTORY); + HasInventoryChanged = true; + m_part.ParentGroup.HasGroupChanged = true; + return true; + } + else + { + m_log.ErrorFormat( + "[PRIM INVENTORY]: " + + "Tried to retrieve item ID {0} from prim {1}, {2} at {3} in {4} but the item does not exist in this inventory", + item.ItemID, m_part.Name, m_part.UUID, + m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName); + } + } return false; } } -- cgit v1.1 From 76e87181b2cfd7a9dd7a73367fd4fe5c26ccd6ce Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Mon, 26 Apr 2010 20:28:37 -0700 Subject: RemoteXInventoryServiceConnector, the plugin region module. Not active in default configs yet. --- .../Inventory/RemoteXInventoryServiceConnector.cs | 324 +++++++++++++++++++++ 1 file changed, 324 insertions(+) create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs new file mode 100644 index 0000000..fb353c2 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs @@ -0,0 +1,324 @@ +/* + * 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. + */ + +using log4net; +using System; +using System.Collections.Generic; +using System.Reflection; +using Nini.Config; +using OpenSim.Framework; +using OpenSim.Framework.Statistics; + +using OpenSim.Services.Connectors; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Services.Interfaces; +using OpenMetaverse; + +namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory +{ + public class RemoteXInventoryServicesConnector : BaseInventoryConnector, ISharedRegionModule, IInventoryService + { + private static readonly ILog m_log = + LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private bool m_Enabled = false; + private bool m_Initialized = false; + private Scene m_Scene; + private XInventoryServicesConnector m_RemoteConnector; + + public Type ReplaceableInterface + { + get { return null; } + } + + public string Name + { + get { return "RemoteXInventoryServicesConnector"; } + } + + public RemoteXInventoryServicesConnector() + { + } + + public RemoteXInventoryServicesConnector(IConfigSource source) + { + Init(source); + } + + protected override void Init(IConfigSource source) + { + m_RemoteConnector = new XInventoryServicesConnector(source); + base.Init(source); + } + + + #region ISharedRegionModule + + public void Initialise(IConfigSource source) + { + IConfig moduleConfig = source.Configs["Modules"]; + if (moduleConfig != null) + { + string name = moduleConfig.GetString("InventoryServices", ""); + if (name == Name) + { + Init(source); + m_Enabled = true; + + m_log.Info("[XINVENTORY CONNECTOR]: Remote XInventory enabled"); + } + } + } + + public void PostInitialise() + { + } + + public void Close() + { + } + + public void AddRegion(Scene scene) + { + m_Scene = scene; + //m_log.Debug("[XXXX] Adding scene " + m_Scene.RegionInfo.RegionName); + + if (!m_Enabled) + return; + + if (!m_Initialized) + { + m_Initialized = true; + } + + scene.RegisterModuleInterface(this); + m_cache.AddRegion(scene); + } + + public void RemoveRegion(Scene scene) + { + if (!m_Enabled) + return; + + m_cache.RemoveRegion(scene); + } + + public void RegionLoaded(Scene scene) + { + if (!m_Enabled) + return; + + m_log.InfoFormat("[XINVENTORY CONNECTOR]: Enabled remote XInventory for region {0}", scene.RegionInfo.RegionName); + + } + + #endregion ISharedRegionModule + + #region IInventoryService + + public override bool CreateUserInventory(UUID user) + { + return false; + } + + public override List GetInventorySkeleton(UUID userId) + { + return new List(); + } + + public override InventoryCollection GetUserInventory(UUID userID) + { + return null; + } + + public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) + { + try + { + m_RemoteConnector.GetUserInventory(userID, callback); + } + catch (Exception e) + { + if (StatsManager.SimExtraStats != null) + StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure(); + + m_log.ErrorFormat("[XINVENTORY CONNECTOR]: Request inventory operation failed, {0} {1}", + e.Source, e.Message); + } + + } + + // inherited. See base class + // public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + + public override Dictionary GetSystemFolders(UUID userID) + { + return m_RemoteConnector.GetSystemFolders(userID); + } + + public override InventoryCollection GetFolderContent(UUID userID, UUID folderID) + { + try + { + return m_RemoteConnector.GetFolderContent(userID, folderID); + } + catch (Exception e) + { + m_log.ErrorFormat("[XINVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1}", + e.Source, e.Message); + } + InventoryCollection nullCollection = new InventoryCollection(); + nullCollection.Folders = new List(); + nullCollection.Items = new List(); + nullCollection.UserID = userID; + return nullCollection; + } + + public override List GetFolderItems(UUID userID, UUID folderID) + { + return m_RemoteConnector.GetFolderItems(userID, folderID); + } + + public override bool AddFolder(InventoryFolderBase folder) + { + if (folder == null) + return false; + + return m_RemoteConnector.AddFolder(folder); + } + + public override bool UpdateFolder(InventoryFolderBase folder) + { + if (folder == null) + return false; + + return m_RemoteConnector.UpdateFolder(folder); + } + + public override bool MoveFolder(InventoryFolderBase folder) + { + if (folder == null) + return false; + + return m_RemoteConnector.MoveFolder(folder); + } + + public override bool DeleteFolders(UUID ownerID, List folderIDs) + { + if (folderIDs == null) + return false; + if (folderIDs.Count == 0) + return false; + + return m_RemoteConnector.DeleteFolders(ownerID, folderIDs); + } + + + public override bool PurgeFolder(InventoryFolderBase folder) + { + if (folder == null) + return false; + + return m_RemoteConnector.PurgeFolder(folder); + } + + // public bool AddItem(InventoryItemBase item) inherited + // Uses AddItemPlain + + protected override bool AddItemPlain(InventoryItemBase item) + { + if (item == null) + return false; + + return m_RemoteConnector.AddItem(item); + } + + public override bool UpdateItem(InventoryItemBase item) + { + if (item == null) + return false; + + return m_RemoteConnector.UpdateItem(item); + } + + public override bool MoveItems(UUID ownerID, List items) + { + if (items == null) + return false; + + return m_RemoteConnector.MoveItems(ownerID, items); + } + + + public override bool DeleteItems(UUID ownerID, List itemIDs) + { + if (itemIDs == null) + return false; + if (itemIDs.Count == 0) + return true; + + return m_RemoteConnector.DeleteItems(ownerID, itemIDs); + } + + public override InventoryItemBase GetItem(InventoryItemBase item) + { + if (item == null) + return null; + + return m_RemoteConnector.GetItem(item); + } + + public override InventoryFolderBase GetFolder(InventoryFolderBase folder) + { + if (folder == null) + return null; + + return m_RemoteConnector.GetFolder(folder); + } + + public override bool HasInventoryForUser(UUID userID) + { + return false; + } + + public override List GetActiveGestures(UUID userId) + { + return new List(); + } + + public override int GetAssetPermissions(UUID userID, UUID assetID) + { + return m_RemoteConnector.GetAssetPermissions(userID, assetID); + } + + + #endregion + + + } +} -- cgit v1.1 From 3f9d38538e4d7f238eb901aced60de7e6673a92e Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Tue, 27 Apr 2010 11:01:56 -0700 Subject: XInventory connector/handler showing signs of life. Tested, but needs more testing. --- OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml | 1 + .../ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs | 2 ++ 2 files changed, 3 insertions(+) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml index aaa318c..0a5ff3f 100644 --- a/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml +++ b/OpenSim/Region/CoreModules/Resources/CoreModulePlugin.addin.xml @@ -45,6 +45,7 @@ + diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs index fb353c2..8504b67 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs @@ -183,6 +183,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public override InventoryCollection GetFolderContent(UUID userID, UUID folderID) { + m_log.DebugFormat("[XINVENTORY CONNECTOR]: GetFolderContent {0}", folderID); try { return m_RemoteConnector.GetFolderContent(userID, folderID); @@ -295,6 +296,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory public override InventoryFolderBase GetFolder(InventoryFolderBase folder) { + m_log.DebugFormat("[XINVENTORY CONNECTOR]: GetFolder {0}", folder.ID); if (folder == null) return null; -- cgit v1.1 From fb7458be3185802c4511306c0cda7648d702de59 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 25 Apr 2010 10:13:13 +0300 Subject: Minor spelling corrections in MiniModule: "RetreiveAsset" changed to "RetrieveAsset" and 'm_rootSceene' to m_rootScene'. --- .../Scripting/Minimodule/Interfaces/IInventoryItem.cs | 2 +- .../Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs index 5fac189..16cd7e4 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/Interfaces/IInventoryItem.cs @@ -39,6 +39,6 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule { int Type { get; } UUID AssetID { get; } - T RetreiveAsset() where T : Asset, new(); + T RetrieveAsset() where T : Asset, new(); } } diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs index 5bf29d7..bf85cbc 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/InventoryItem.cs @@ -39,11 +39,11 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule public class InventoryItem : IInventoryItem { TaskInventoryItem m_privateItem; - Scene m_rootSceene; + Scene m_rootScene; public InventoryItem(Scene rootScene, TaskInventoryItem internalItem) { - m_rootSceene = rootScene; + m_rootScene = rootScene; m_privateItem = internalItem; } @@ -82,9 +82,9 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule public UUID AssetID { get { return m_privateItem.AssetID; } } // This method exposes OpenSim/OpenMetaverse internals and needs to be replaced with a IAsset specific to MRM. - public T RetreiveAsset() where T : OpenMetaverse.Assets.Asset, new() + public T RetrieveAsset() where T : OpenMetaverse.Assets.Asset, new() { - AssetBase a = m_rootSceene.AssetService.Get(AssetID.ToString()); + AssetBase a = m_rootScene.AssetService.Get(AssetID.ToString()); T result = new T(); if ((sbyte)result.AssetType != a.Type) -- cgit v1.1 From 806a2555f557e7a05002f67731b1e3105c9aab8b Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 25 Apr 2010 17:21:05 +0300 Subject: Spelling in FriendsModule.cs: "filed to load" -> "failed to load" --- OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs index 312db38..23d5b3c 100644 --- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs @@ -149,7 +149,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends if (m_FriendsService == null) { - m_log.Error("[FRIENDS]: No Connector defined in section Friends, or filed to load, cannot continue"); + m_log.Error("[FRIENDS]: No Connector defined in section Friends, or failed to load, cannot continue"); throw new Exception("Connector load error"); } -- cgit v1.1 From aa56953411e04c260fe1938f5f184c775fea72b6 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 24 Apr 2010 18:52:23 +0300 Subject: Compiler.cs contained method GetCompilerOutput which, apparently, was not used, but exactly the same path was calculated inline. This patch does some minor refactoring by replacing inline path calculation with GetCompilerOutput. This doesn't actually affect anything, just minor prettifying of the code --- OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs index d8c0ba5..f719683 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs @@ -261,13 +261,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools // } //} - public object GetCompilerOutput(UUID assetID) + public string GetCompilerOutput(string assetID) { return Path.Combine(ScriptEnginesPath, Path.Combine( m_scriptEngine.World.RegionInfo.RegionID.ToString(), FilePrefix + "_compiled_" + assetID + ".dll")); } + public string GetCompilerOutput(UUID assetID) + { + return GetCompilerOutput(assetID.ToString()); + } + /// /// Converts script from LSL to CS and calls CompileFromCSText /// @@ -279,9 +284,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools linemap = null; m_warnings.Clear(); - assembly = Path.Combine(ScriptEnginesPath, Path.Combine( - m_scriptEngine.World.RegionInfo.RegionID.ToString(), - FilePrefix + "_compiled_" + asset + ".dll")); + assembly = GetCompilerOutput(asset); if (!Directory.Exists(ScriptEnginesPath)) { -- cgit v1.1 From 6a4fae123ade98d53e7342309dfb52e254d4b5f2 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 29 Apr 2010 11:39:13 -0700 Subject: Started redoing HGInventoryBroker for XInventory and with multi-protocol in mind. Unfinished. --- .../Inventory/HGInventoryBroker2.cs | 589 +++++++++++++++++++++ .../Inventory/InventoryCache.cs | 51 ++ .../Inventory/RemoteXInventoryServiceConnector.cs | 5 + 3 files changed, 645 insertions(+) create mode 100644 OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs new file mode 100644 index 0000000..22aac02 --- /dev/null +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs @@ -0,0 +1,589 @@ +/* + * 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. + */ + +using log4net; +using Nini.Config; +using System; +using System.Collections.Generic; +using System.Reflection; +using OpenSim.Framework; + +using OpenSim.Server.Base; +using OpenSim.Region.Framework.Interfaces; +using OpenSim.Region.Framework.Scenes; +using OpenSim.Services.Interfaces; +using OpenSim.Services.Connectors; +using OpenMetaverse; + +namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory +{ + public class HGInventoryBroker2 : BaseInventoryConnector, INonSharedRegionModule, IInventoryService + { + private static readonly ILog m_log = + LogManager.GetLogger( + MethodBase.GetCurrentMethod().DeclaringType); + + private static bool m_Initialized = false; + private static bool m_Enabled = false; + + private static IInventoryService m_LocalGridInventoryService; + private static ISessionAuthInventoryService m_HGService; // obsolete + private Dictionary m_connectors = new Dictionary(); + + + private Scene m_Scene; + private IUserAccountService m_UserAccountService; + + public Type ReplaceableInterface + { + get { return null; } + } + + public string Name + { + get { return "HGInventoryBroker2"; } + } + + public void Initialise(IConfigSource source) + { + if (!m_Initialized) + { + IConfig moduleConfig = source.Configs["Modules"]; + if (moduleConfig != null) + { + string name = moduleConfig.GetString("InventoryServices", ""); + if (name == Name) + { + IConfig inventoryConfig = source.Configs["InventoryService"]; + if (inventoryConfig == null) + { + m_log.Error("[HG INVENTORY CONNECTOR]: InventoryService missing from OpenSim.ini"); + return; + } + + string localDll = inventoryConfig.GetString("LocalGridInventoryService", + String.Empty); + string HGDll = inventoryConfig.GetString("HypergridInventoryService", + String.Empty); + + if (localDll == String.Empty) + { + m_log.Error("[HG INVENTORY CONNECTOR]: No LocalGridInventoryService named in section InventoryService"); + //return; + throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); + } + + if (HGDll == String.Empty) + { + m_log.Error("[HG INVENTORY CONNECTOR]: No HypergridInventoryService named in section InventoryService"); + //return; + throw new Exception("Unable to proceed. Please make sure your ini files in config-include are updated according to .example's"); + } + + Object[] args = new Object[] { source }; + m_LocalGridInventoryService = + ServerUtils.LoadPlugin(localDll, + args); + + m_HGService = + ServerUtils.LoadPlugin(HGDll, + args); + + if (m_LocalGridInventoryService == null) + { + m_log.Error("[HG INVENTORY CONNECTOR]: Can't load local inventory service"); + return; + } + if (m_HGService == null) + { + m_log.Error("[HG INVENTORY CONNECTOR]: Can't load hypergrid inventory service"); + return; + } + + Init(source); + + m_Enabled = true; + m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled"); + } + } + m_Initialized = true; + } + } + + public void PostInitialise() + { + } + + public void Close() + { + } + + public void AddRegion(Scene scene) + { + if (!m_Enabled) + return; + + m_Scene = scene; + m_UserAccountService = m_Scene.UserAccountService; + + scene.RegisterModuleInterface(this); + m_cache.AddRegion(scene); + } + + public void RemoveRegion(Scene scene) + { + if (!m_Enabled) + return; + + m_cache.RemoveRegion(scene); + } + + public void RegionLoaded(Scene scene) + { + if (!m_Enabled) + return; + + m_log.InfoFormat("[HG INVENTORY CONNECTOR]: Enabled HG inventory for region {0}", scene.RegionInfo.RegionName); + + } + + + #region IInventoryService + + public override bool CreateUserInventory(UUID userID) + { + return m_LocalGridInventoryService.CreateUserInventory(userID); + } + + public override List GetInventorySkeleton(UUID userId) + { + return m_LocalGridInventoryService.GetInventorySkeleton(userId); + } + + public override InventoryCollection GetUserInventory(UUID userID) + { + return null; + } + + public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) + { + } + + // Inherited. See base + //public override InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + //{ + // if (IsLocalGridUser(userID)) + // return m_GridService.GetFolderForType(userID, type); + // else + // { + // UUID sessionID = GetSessionID(userID); + // string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); + // // !!!!!! + // return null; + // //return m_HGService.GetFolderForType(uri, sessionID, type); + // } + //} + + public override InventoryCollection GetFolderContent(UUID userID, UUID folderID) + { + m_log.Debug("[HGInventory]: GetFolderContent " + folderID); + string url = string.Empty; + + string invURL = m_cache.GetInventoryServiceURL(userID); + + if (invURL == null) // not there, forward to local inventory connector to resolve + return m_LocalGridInventoryService.GetFolderContent(userID, folderID); + + IInventoryService connector = GetConnector(url); + return connector.GetFolderContent(userID, folderID); + + //if (StringToUrlAndUserID(id, out url, out userID)) + //{ + // ISessionAuthInventoryService connector = GetConnector(url); + // return connector.GetFolderContent(userID, folderID, sessionID); + //} + + //return null; + + ////////// + + //string uri = string.Empty; + //if (!IsForeignUser(userID, out uri)) + // return m_GridService.GetFolderContent(userID, folderID); + //else + //{ + // UUID sessionID = GetSessionID(userID); + // uri = uri + "/" + userID.ToString(); + // return m_HGService.GetFolderContent(uri, folderID, sessionID); + //} + } + + public override Dictionary GetSystemFolders(UUID userID) + { + string uri = string.Empty; + if (!IsForeignUser(userID, out uri)) + { + // This is not pretty, but it will have to do for now + if (m_LocalGridInventoryService is BaseInventoryConnector) + { + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to RemoteInventoryServiceConnector module"); + return ((BaseInventoryConnector)m_LocalGridInventoryService).GetSystemFolders(userID); + } + else + { + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to GetSystemFoldersLocal"); + return GetSystemFoldersLocal(userID); + } + } + else + { + UUID sessionID = GetSessionID(userID); + uri = uri + "/" + userID.ToString(); + return m_HGService.GetSystemFolders(uri, sessionID); + } + } + + private Dictionary GetSystemFoldersLocal(UUID userID) + { + InventoryFolderBase root = m_LocalGridInventoryService.GetRootFolder(userID); + if (root != null) + { + InventoryCollection content = m_LocalGridInventoryService.GetFolderContent(userID, root.ID); + if (content != null) + { + Dictionary folders = new Dictionary(); + foreach (InventoryFolderBase folder in content.Folders) + { + //m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scanning folder type {0}", (AssetType)folder.Type); + if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown)) + folders[(AssetType)folder.Type] = folder; + } + // Put the root folder there, as type Folder + folders[AssetType.Folder] = root; + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count); + return folders; + } + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID); + + } + + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder not found for {0}", userID); + + return new Dictionary(); + } + + public override List GetFolderItems(UUID userID, UUID folderID) + { + string uri = string.Empty; + if (!IsForeignUser(userID, out uri)) + return m_LocalGridInventoryService.GetFolderItems(userID, folderID); + else + { + UUID sessionID = GetSessionID(userID); + uri = uri + "/" + userID.ToString(); + return m_HGService.GetFolderItems(uri, folderID, sessionID); + } + } + + public override bool AddFolder(InventoryFolderBase folder) + { + if (folder == null) + return false; + + string uri = string.Empty; + if (!IsForeignUser(folder.Owner, out uri)) + return m_LocalGridInventoryService.AddFolder(folder); + else + { + UUID sessionID = GetSessionID(folder.Owner); + uri = uri + "/" + folder.Owner.ToString(); + return m_HGService.AddFolder(uri, folder, sessionID); + } + } + + public override bool UpdateFolder(InventoryFolderBase folder) + { + if (folder == null) + return false; + + string uri = string.Empty; + if (!IsForeignUser(folder.Owner, out uri)) + return m_LocalGridInventoryService.UpdateFolder(folder); + else + { + UUID sessionID = GetSessionID(folder.Owner); + uri = uri + "/" + folder.Owner.ToString(); + return m_HGService.UpdateFolder(uri, folder, sessionID); + } + } + + public override bool DeleteFolders(UUID ownerID, List folderIDs) + { + if (folderIDs == null) + return false; + if (folderIDs.Count == 0) + return false; + + string uri = string.Empty; + if (!IsForeignUser(ownerID, out uri)) + return m_LocalGridInventoryService.DeleteFolders(ownerID, folderIDs); + else + { + UUID sessionID = GetSessionID(ownerID); + uri = uri + "/" + ownerID.ToString(); + return m_HGService.DeleteFolders(uri, folderIDs, sessionID); + } + } + + public override bool MoveFolder(InventoryFolderBase folder) + { + if (folder == null) + return false; + + string uri = string.Empty; + if (!IsForeignUser(folder.Owner, out uri)) + return m_LocalGridInventoryService.MoveFolder(folder); + else + { + UUID sessionID = GetSessionID(folder.Owner); + uri = uri + "/" + folder.Owner.ToString(); + return m_HGService.MoveFolder(uri, folder, sessionID); + } + } + + public override bool PurgeFolder(InventoryFolderBase folder) + { + if (folder == null) + return false; + + string uri = string.Empty; + if (!IsForeignUser(folder.Owner, out uri)) + return m_LocalGridInventoryService.PurgeFolder(folder); + else + { + UUID sessionID = GetSessionID(folder.Owner); + uri = uri + "/" + folder.Owner.ToString(); + return m_HGService.PurgeFolder(uri, folder, sessionID); + } + } + + // public bool AddItem(InventoryItemBase item) inherited + // Uses AddItemPlain + + protected override bool AddItemPlain(InventoryItemBase item) + { + if (item == null) + return false; + + string uri = string.Empty; + if (!IsForeignUser(item.Owner, out uri)) + { + return m_LocalGridInventoryService.AddItem(item); + } + else + { + UUID sessionID = GetSessionID(item.Owner); + uri = uri + "/" + item.Owner.ToString(); + return m_HGService.AddItem(uri, item, sessionID); + } + } + + public override bool UpdateItem(InventoryItemBase item) + { + if (item == null) + return false; + + string uri = string.Empty; + if (!IsForeignUser(item.Owner, out uri)) + return m_LocalGridInventoryService.UpdateItem(item); + else + { + UUID sessionID = GetSessionID(item.Owner); + uri = uri + "/" + item.Owner.ToString(); + return m_HGService.UpdateItem(uri, item, sessionID); + } + } + + public override bool MoveItems(UUID ownerID, List items) + { + if (items == null) + return false; + if (items.Count == 0) + return true; + + string uri = string.Empty; + if (!IsForeignUser(ownerID, out uri)) + return m_LocalGridInventoryService.MoveItems(ownerID, items); + else + { + UUID sessionID = GetSessionID(ownerID); + uri = uri + "/" + ownerID.ToString(); + return m_HGService.MoveItems(uri, items, sessionID); + } + } + + public override bool DeleteItems(UUID ownerID, List itemIDs) + { + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID); + + if (itemIDs == null) + return false; + if (itemIDs.Count == 0) + return true; + + string uri = string.Empty; + if (!IsForeignUser(ownerID, out uri)) + return m_LocalGridInventoryService.DeleteItems(ownerID, itemIDs); + else + { + UUID sessionID = GetSessionID(ownerID); + uri = uri + "/" + ownerID.ToString(); + return m_HGService.DeleteItems(uri, itemIDs, sessionID); + } + } + + public override InventoryItemBase GetItem(InventoryItemBase item) + { + if (item == null) + return null; + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetItem {0} for user {1}", item.ID, item.Owner); + string uri = string.Empty; + if (!IsForeignUser(item.Owner, out uri)) + return m_LocalGridInventoryService.GetItem(item); + else + { + UUID sessionID = GetSessionID(item.Owner); + uri = uri + "/" + item.Owner.ToString(); + return m_HGService.QueryItem(uri, item, sessionID); + } + } + + public override InventoryFolderBase GetFolder(InventoryFolderBase folder) + { + if (folder == null) + return null; + + string uri = string.Empty; + if (!IsForeignUser(folder.Owner, out uri)) + return m_LocalGridInventoryService.GetFolder(folder); + else + { + UUID sessionID = GetSessionID(folder.Owner); + uri = uri + "/" + folder.Owner.ToString(); + return m_HGService.QueryFolder(uri, folder, sessionID); + } + } + + public override bool HasInventoryForUser(UUID userID) + { + return false; + } + + public override List GetActiveGestures(UUID userId) + { + return new List(); + } + + public override int GetAssetPermissions(UUID userID, UUID assetID) + { + string uri = string.Empty; + if (!IsForeignUser(userID, out uri)) + return m_LocalGridInventoryService.GetAssetPermissions(userID, assetID); + else + { + UUID sessionID = GetSessionID(userID); + uri = uri + "/" + userID.ToString(); + return m_HGService.GetAssetPermissions(uri, assetID, sessionID); + } + } + + #endregion + + private IInventoryService GetConnector(string url) + { + IInventoryService connector = null; + lock (m_connectors) + { + if (m_connectors.ContainsKey(url)) + { + connector = m_connectors[url]; + } + else + { + // We're instantiating this class explicitly, but this won't + // work in general, because the remote grid may be running + // an inventory server that has a different protocol. + // Eventually we will want a piece of protocol asking + // the remote server about its kind. Definitely cool thing to do! + connector = new RemoteXInventoryServicesConnector(url); + m_connectors.Add(url, connector); + } + } + return connector; + } + + + private UUID GetSessionID(UUID userID) + { + ScenePresence sp = null; + if (m_Scene.TryGetScenePresence(userID, out sp)) + { + return sp.ControllingClient.SessionId; + } + + m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scene presence for {0} not found", userID); + return UUID.Zero; + } + + private bool IsForeignUser(UUID userID, out string inventoryURL) + { + inventoryURL = string.Empty; + UserAccount account = null; + if (m_Scene.UserAccountService != null) + account = m_Scene.UserAccountService.GetUserAccount(m_Scene.RegionInfo.ScopeID, userID); + + if (account == null) // foreign user + { + ScenePresence sp = null; + m_Scene.TryGetScenePresence(userID, out sp); + if (sp != null) + { + AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); + if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI")) + { + inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString(); + inventoryURL = inventoryURL.Trim(new char[] { '/' }); + return true; + } + } + } + return false; + } + + + } +} diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs index 5e06580..9c6e1cd 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/InventoryCache.cs @@ -51,6 +51,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory // The cache proper protected Dictionary> m_InventoryCache; + // A cache of userIDs --> ServiceURLs, for HGBroker only + protected Dictionary m_InventoryURLs; + public virtual void Init(IConfigSource source, BaseInventoryConnector connector) { m_Scenes = new List(); @@ -89,8 +92,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory // If not, go get them and place them in the cache Dictionary folders = CacheSystemFolders(presence.UUID); + CacheInventoryServiceURL(presence.Scene, presence.UUID); + m_log.DebugFormat("[INVENTORY CACHE]: OnMakeRootAgent in {0}, fetched system folders for {1} {2}: count {3}", presence.Scene.RegionInfo.RegionName, presence.Firstname, presence.Lastname, folders.Count); + } void OnClientClosed(UUID clientID, Scene scene) @@ -113,6 +119,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory "[INVENTORY CACHE]: OnClientClosed in {0}, user {1} out of sim. Dropping system folders", scene.RegionInfo.RegionName, clientID); DropCachedSystemFolders(clientID); + DropInventoryServiceURL(clientID); } } @@ -174,5 +181,49 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return null; } + + /// + /// Gets the user's inventory URL from its serviceURLs, if the user is foreign, + /// and sticks it in the cache + /// + /// + private void CacheInventoryServiceURL(Scene scene, UUID userID) + { + if (scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, userID) == null) + { + // The user does not have a local account; let's cache its service URL + string inventoryURL = string.Empty; + ScenePresence sp = null; + scene.TryGetScenePresence(userID, out sp); + if (sp != null) + { + AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); + if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI")) + { + inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString(); + if (inventoryURL != null && inventoryURL != string.Empty) + { + inventoryURL = inventoryURL.Trim(new char[] { '/' }); + m_InventoryURLs.Add(userID, inventoryURL); + } + } + } + } + } + + private void DropInventoryServiceURL(UUID userID) + { + lock (m_InventoryURLs) + if (m_InventoryURLs.ContainsKey(userID)) + m_InventoryURLs.Remove(userID); + } + + public string GetInventoryServiceURL(UUID userID) + { + if (m_InventoryURLs.ContainsKey(userID)) + return m_InventoryURLs[userID]; + + return null; + } } } diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs index 8504b67..96d0c1c 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs @@ -65,6 +65,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { } + public RemoteXInventoryServicesConnector(string url) + { + m_RemoteConnector = new XInventoryServicesConnector(url); + } + public RemoteXInventoryServicesConnector(IConfigSource source) { Init(source); -- cgit v1.1 From 638dc8d3c25f68e6782d4cdbb202ad2c433bd676 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 29 Apr 2010 20:09:11 -0700 Subject: Simplified RemoteXInventoryServiceConnector and HGBroker (2) by a lot. --- .../Inventory/HGInventoryBroker2.cs | 471 +++++++++++---------- .../Inventory/RemoteXInventoryServiceConnector.cs | 90 ++-- 2 files changed, 282 insertions(+), 279 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs index 22aac02..3509161 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/HGInventoryBroker2.cs @@ -41,7 +41,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { - public class HGInventoryBroker2 : BaseInventoryConnector, INonSharedRegionModule, IInventoryService + public class HGInventoryBroker2 : INonSharedRegionModule, IInventoryService { private static readonly ILog m_log = LogManager.GetLogger( @@ -54,8 +54,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory private static ISessionAuthInventoryService m_HGService; // obsolete private Dictionary m_connectors = new Dictionary(); + // A cache of userIDs --> ServiceURLs, for HGBroker only + protected Dictionary m_InventoryURLs; private Scene m_Scene; + private List m_Scenes = new List(); + private IUserAccountService m_UserAccountService; public Type ReplaceableInterface @@ -124,8 +128,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return; } - Init(source); - m_Enabled = true; m_log.Info("[HG INVENTORY CONNECTOR]: HG inventory broker enabled"); } @@ -148,18 +150,22 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return; m_Scene = scene; + m_Scenes.Add(scene); m_UserAccountService = m_Scene.UserAccountService; scene.RegisterModuleInterface(this); - m_cache.AddRegion(scene); + + scene.EventManager.OnMakeRootAgent += OnMakeRootAgent; + scene.EventManager.OnClientClosed += OnClientClosed; + } public void RemoveRegion(Scene scene) { if (!m_Enabled) return; - - m_cache.RemoveRegion(scene); + + m_Scenes.Remove(scene); } public void RegionLoaded(Scene scene) @@ -171,282 +177,302 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } + #region Cache + + void OnMakeRootAgent(ScenePresence presence) + { + if (!m_InventoryURLs.ContainsKey(presence.UUID)) + CacheInventoryServiceURL(presence.Scene, presence.UUID); + } + + void OnClientClosed(UUID clientID, Scene scene) + { + if (m_InventoryURLs.ContainsKey(clientID)) // if it's in cache + { + ScenePresence sp = null; + foreach (Scene s in m_Scenes) + { + s.TryGetScenePresence(clientID, out sp); + if ((sp != null) && !sp.IsChildAgent && (s != scene)) + { + m_log.DebugFormat("[INVENTORY CACHE]: OnClientClosed in {0}, but user {1} still in sim. Keeping inventoryURL in cache", + scene.RegionInfo.RegionName, clientID); + return; + } + } + + m_log.DebugFormat( + "[INVENTORY CACHE]: OnClientClosed in {0}, user {1} out of sim. Dropping inventory URL", + scene.RegionInfo.RegionName, clientID); + DropInventoryServiceURL(clientID); + } + } + + /// + /// Gets the user's inventory URL from its serviceURLs, if the user is foreign, + /// and sticks it in the cache + /// + /// + private void CacheInventoryServiceURL(Scene scene, UUID userID) + { + if (scene.UserAccountService.GetUserAccount(scene.RegionInfo.ScopeID, userID) == null) + { + // The user does not have a local account; let's cache its service URL + string inventoryURL = string.Empty; + ScenePresence sp = null; + scene.TryGetScenePresence(userID, out sp); + if (sp != null) + { + AgentCircuitData aCircuit = scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); + if (aCircuit.ServiceURLs.ContainsKey("InventoryServerURI")) + { + inventoryURL = aCircuit.ServiceURLs["InventoryServerURI"].ToString(); + if (inventoryURL != null && inventoryURL != string.Empty) + { + inventoryURL = inventoryURL.Trim(new char[] { '/' }); + m_InventoryURLs.Add(userID, inventoryURL); + } + } + } + } + } + + private void DropInventoryServiceURL(UUID userID) + { + lock (m_InventoryURLs) + if (m_InventoryURLs.ContainsKey(userID)) + m_InventoryURLs.Remove(userID); + } + + public string GetInventoryServiceURL(UUID userID) + { + if (m_InventoryURLs.ContainsKey(userID)) + return m_InventoryURLs[userID]; + + return null; + } + #endregion #region IInventoryService - public override bool CreateUserInventory(UUID userID) + public bool CreateUserInventory(UUID userID) { return m_LocalGridInventoryService.CreateUserInventory(userID); } - public override List GetInventorySkeleton(UUID userId) + public List GetInventorySkeleton(UUID userId) { return m_LocalGridInventoryService.GetInventorySkeleton(userId); } - public override InventoryCollection GetUserInventory(UUID userID) + public InventoryCollection GetUserInventory(UUID userID) { return null; } - public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) + public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { } - // Inherited. See base - //public override InventoryFolderBase GetFolderForType(UUID userID, AssetType type) - //{ - // if (IsLocalGridUser(userID)) - // return m_GridService.GetFolderForType(userID, type); - // else - // { - // UUID sessionID = GetSessionID(userID); - // string uri = GetUserInventoryURI(userID) + "/" + userID.ToString(); - // // !!!!!! - // return null; - // //return m_HGService.GetFolderForType(uri, sessionID, type); - // } - //} - - public override InventoryCollection GetFolderContent(UUID userID, UUID folderID) + public InventoryFolderBase GetRootFolder(UUID userID) { - m_log.Debug("[HGInventory]: GetFolderContent " + folderID); - string url = string.Empty; + m_log.DebugFormat("[HGInventory]: GetRootFolder for {0}", userID); - string invURL = m_cache.GetInventoryServiceURL(userID); + string invURL = GetInventoryServiceURL(userID); if (invURL == null) // not there, forward to local inventory connector to resolve - return m_LocalGridInventoryService.GetFolderContent(userID, folderID); - - IInventoryService connector = GetConnector(url); - return connector.GetFolderContent(userID, folderID); - - //if (StringToUrlAndUserID(id, out url, out userID)) - //{ - // ISessionAuthInventoryService connector = GetConnector(url); - // return connector.GetFolderContent(userID, folderID, sessionID); - //} + return m_LocalGridInventoryService.GetRootFolder(userID); - //return null; - - ////////// + IInventoryService connector = GetConnector(invURL); - //string uri = string.Empty; - //if (!IsForeignUser(userID, out uri)) - // return m_GridService.GetFolderContent(userID, folderID); - //else - //{ - // UUID sessionID = GetSessionID(userID); - // uri = uri + "/" + userID.ToString(); - // return m_HGService.GetFolderContent(uri, folderID, sessionID); - //} + return connector.GetRootFolder(userID); } - public override Dictionary GetSystemFolders(UUID userID) + public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) { - string uri = string.Empty; - if (!IsForeignUser(userID, out uri)) - { - // This is not pretty, but it will have to do for now - if (m_LocalGridInventoryService is BaseInventoryConnector) - { - m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to RemoteInventoryServiceConnector module"); - return ((BaseInventoryConnector)m_LocalGridInventoryService).GetSystemFolders(userID); - } - else - { - m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetSystemsFolders redirected to GetSystemFoldersLocal"); - return GetSystemFoldersLocal(userID); - } - } - else - { - UUID sessionID = GetSessionID(userID); - uri = uri + "/" + userID.ToString(); - return m_HGService.GetSystemFolders(uri, sessionID); - } + m_log.DebugFormat("[HGInventory]: GetFolderForType {0} type {1}", userID, type); + + string invURL = GetInventoryServiceURL(userID); + + if (invURL == null) // not there, forward to local inventory connector to resolve + return m_LocalGridInventoryService.GetFolderForType(userID, type); + + IInventoryService connector = GetConnector(invURL); + + return connector.GetFolderForType(userID, type); } - private Dictionary GetSystemFoldersLocal(UUID userID) + public InventoryCollection GetFolderContent(UUID userID, UUID folderID) { - InventoryFolderBase root = m_LocalGridInventoryService.GetRootFolder(userID); - if (root != null) - { - InventoryCollection content = m_LocalGridInventoryService.GetFolderContent(userID, root.ID); - if (content != null) - { - Dictionary folders = new Dictionary(); - foreach (InventoryFolderBase folder in content.Folders) - { - //m_log.DebugFormat("[HG INVENTORY CONNECTOR]: scanning folder type {0}", (AssetType)folder.Type); - if ((folder.Type != (short)AssetType.Folder) && (folder.Type != (short)AssetType.Unknown)) - folders[(AssetType)folder.Type] = folder; - } - // Put the root folder there, as type Folder - folders[AssetType.Folder] = root; - m_log.DebugFormat("[HG INVENTORY CONNECTOR]: System folders count for {0}: {1}", userID, folders.Count); - return folders; - } - m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder content not found for {0}", userID); + m_log.Debug("[HGInventory]: GetFolderContent " + folderID); - } + string invURL = GetInventoryServiceURL(userID); - m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Root folder not found for {0}", userID); + if (invURL == null) // not there, forward to local inventory connector to resolve + return m_LocalGridInventoryService.GetFolderContent(userID, folderID); + + IInventoryService connector = GetConnector(invURL); + + return connector.GetFolderContent(userID, folderID); - return new Dictionary(); } - public override List GetFolderItems(UUID userID, UUID folderID) + public List GetFolderItems(UUID userID, UUID folderID) { - string uri = string.Empty; - if (!IsForeignUser(userID, out uri)) + m_log.Debug("[HGInventory]: GetFolderItems " + folderID); + + string invURL = GetInventoryServiceURL(userID); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.GetFolderItems(userID, folderID); - else - { - UUID sessionID = GetSessionID(userID); - uri = uri + "/" + userID.ToString(); - return m_HGService.GetFolderItems(uri, folderID, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.GetFolderItems(userID, folderID); + } - public override bool AddFolder(InventoryFolderBase folder) + public bool AddFolder(InventoryFolderBase folder) { if (folder == null) return false; - string uri = string.Empty; - if (!IsForeignUser(folder.Owner, out uri)) + m_log.Debug("[HGInventory]: AddFolder " + folder.ID); + + string invURL = GetInventoryServiceURL(folder.Owner); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.AddFolder(folder); - else - { - UUID sessionID = GetSessionID(folder.Owner); - uri = uri + "/" + folder.Owner.ToString(); - return m_HGService.AddFolder(uri, folder, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.AddFolder(folder); } - public override bool UpdateFolder(InventoryFolderBase folder) + public bool UpdateFolder(InventoryFolderBase folder) { if (folder == null) return false; - string uri = string.Empty; - if (!IsForeignUser(folder.Owner, out uri)) + m_log.Debug("[HGInventory]: UpdateFolder " + folder.ID); + + string invURL = GetInventoryServiceURL(folder.Owner); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.UpdateFolder(folder); - else - { - UUID sessionID = GetSessionID(folder.Owner); - uri = uri + "/" + folder.Owner.ToString(); - return m_HGService.UpdateFolder(uri, folder, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.UpdateFolder(folder); } - public override bool DeleteFolders(UUID ownerID, List folderIDs) + public bool DeleteFolders(UUID ownerID, List folderIDs) { if (folderIDs == null) return false; if (folderIDs.Count == 0) return false; - string uri = string.Empty; - if (!IsForeignUser(ownerID, out uri)) + m_log.Debug("[HGInventory]: DeleteFolders for " + ownerID); + + string invURL = GetInventoryServiceURL(ownerID); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.DeleteFolders(ownerID, folderIDs); - else - { - UUID sessionID = GetSessionID(ownerID); - uri = uri + "/" + ownerID.ToString(); - return m_HGService.DeleteFolders(uri, folderIDs, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.DeleteFolders(ownerID, folderIDs); } - public override bool MoveFolder(InventoryFolderBase folder) + public bool MoveFolder(InventoryFolderBase folder) { if (folder == null) return false; - string uri = string.Empty; - if (!IsForeignUser(folder.Owner, out uri)) + m_log.Debug("[HGInventory]: MoveFolder for " + folder.Owner); + + string invURL = GetInventoryServiceURL(folder.Owner); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.MoveFolder(folder); - else - { - UUID sessionID = GetSessionID(folder.Owner); - uri = uri + "/" + folder.Owner.ToString(); - return m_HGService.MoveFolder(uri, folder, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.MoveFolder(folder); } - public override bool PurgeFolder(InventoryFolderBase folder) + public bool PurgeFolder(InventoryFolderBase folder) { if (folder == null) return false; - string uri = string.Empty; - if (!IsForeignUser(folder.Owner, out uri)) + m_log.Debug("[HGInventory]: PurgeFolder for " + folder.Owner); + + string invURL = GetInventoryServiceURL(folder.Owner); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.PurgeFolder(folder); - else - { - UUID sessionID = GetSessionID(folder.Owner); - uri = uri + "/" + folder.Owner.ToString(); - return m_HGService.PurgeFolder(uri, folder, sessionID); - } - } - // public bool AddItem(InventoryItemBase item) inherited - // Uses AddItemPlain + IInventoryService connector = GetConnector(invURL); - protected override bool AddItemPlain(InventoryItemBase item) + return connector.PurgeFolder(folder); + } + + public bool AddItem(InventoryItemBase item) { if (item == null) return false; - string uri = string.Empty; - if (!IsForeignUser(item.Owner, out uri)) - { + m_log.Debug("[HGInventory]: AddItem " + item.ID); + + string invURL = GetInventoryServiceURL(item.Owner); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.AddItem(item); - } - else - { - UUID sessionID = GetSessionID(item.Owner); - uri = uri + "/" + item.Owner.ToString(); - return m_HGService.AddItem(uri, item, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.AddItem(item); } - public override bool UpdateItem(InventoryItemBase item) + public bool UpdateItem(InventoryItemBase item) { if (item == null) return false; - string uri = string.Empty; - if (!IsForeignUser(item.Owner, out uri)) + m_log.Debug("[HGInventory]: UpdateItem " + item.ID); + + string invURL = GetInventoryServiceURL(item.Owner); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.UpdateItem(item); - else - { - UUID sessionID = GetSessionID(item.Owner); - uri = uri + "/" + item.Owner.ToString(); - return m_HGService.UpdateItem(uri, item, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.UpdateItem(item); } - public override bool MoveItems(UUID ownerID, List items) + public bool MoveItems(UUID ownerID, List items) { if (items == null) return false; if (items.Count == 0) return true; - string uri = string.Empty; - if (!IsForeignUser(ownerID, out uri)) + m_log.Debug("[HGInventory]: MoveItems for " + ownerID); + + string invURL = GetInventoryServiceURL(ownerID); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.MoveItems(ownerID, items); - else - { - UUID sessionID = GetSessionID(ownerID); - uri = uri + "/" + ownerID.ToString(); - return m_HGService.MoveItems(uri, items, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.MoveItems(ownerID, items); } - public override bool DeleteItems(UUID ownerID, List itemIDs) + public bool DeleteItems(UUID ownerID, List itemIDs) { m_log.DebugFormat("[HG INVENTORY CONNECTOR]: Delete {0} items for user {1}", itemIDs.Count, ownerID); @@ -455,70 +481,73 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory if (itemIDs.Count == 0) return true; - string uri = string.Empty; - if (!IsForeignUser(ownerID, out uri)) + m_log.Debug("[HGInventory]: DeleteItems for " + ownerID); + + string invURL = GetInventoryServiceURL(ownerID); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.DeleteItems(ownerID, itemIDs); - else - { - UUID sessionID = GetSessionID(ownerID); - uri = uri + "/" + ownerID.ToString(); - return m_HGService.DeleteItems(uri, itemIDs, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.DeleteItems(ownerID, itemIDs); } - public override InventoryItemBase GetItem(InventoryItemBase item) + public InventoryItemBase GetItem(InventoryItemBase item) { if (item == null) return null; - m_log.DebugFormat("[HG INVENTORY CONNECTOR]: GetItem {0} for user {1}", item.ID, item.Owner); - string uri = string.Empty; - if (!IsForeignUser(item.Owner, out uri)) + m_log.Debug("[HGInventory]: GetItem " + item.ID); + + string invURL = GetInventoryServiceURL(item.Owner); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.GetItem(item); - else - { - UUID sessionID = GetSessionID(item.Owner); - uri = uri + "/" + item.Owner.ToString(); - return m_HGService.QueryItem(uri, item, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.GetItem(item); } - public override InventoryFolderBase GetFolder(InventoryFolderBase folder) + public InventoryFolderBase GetFolder(InventoryFolderBase folder) { if (folder == null) return null; - string uri = string.Empty; - if (!IsForeignUser(folder.Owner, out uri)) + m_log.Debug("[HGInventory]: GetFolder " + folder.ID); + + string invURL = GetInventoryServiceURL(folder.Owner); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.GetFolder(folder); - else - { - UUID sessionID = GetSessionID(folder.Owner); - uri = uri + "/" + folder.Owner.ToString(); - return m_HGService.QueryFolder(uri, folder, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.GetFolder(folder); } - public override bool HasInventoryForUser(UUID userID) + public bool HasInventoryForUser(UUID userID) { return false; } - public override List GetActiveGestures(UUID userId) + public List GetActiveGestures(UUID userId) { return new List(); } - public override int GetAssetPermissions(UUID userID, UUID assetID) + public int GetAssetPermissions(UUID userID, UUID assetID) { - string uri = string.Empty; - if (!IsForeignUser(userID, out uri)) + m_log.Debug("[HGInventory]: GetAssetPermissions " + assetID); + + string invURL = GetInventoryServiceURL(userID); + + if (invURL == null) // not there, forward to local inventory connector to resolve return m_LocalGridInventoryService.GetAssetPermissions(userID, assetID); - else - { - UUID sessionID = GetSessionID(userID); - uri = uri + "/" + userID.ToString(); - return m_HGService.GetAssetPermissions(uri, assetID, sessionID); - } + + IInventoryService connector = GetConnector(invURL); + + return connector.GetAssetPermissions(userID, assetID); } #endregion diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs index 96d0c1c..ac9e792 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Inventory/RemoteXInventoryServiceConnector.cs @@ -41,7 +41,7 @@ using OpenMetaverse; namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory { - public class RemoteXInventoryServicesConnector : BaseInventoryConnector, ISharedRegionModule, IInventoryService + public class RemoteXInventoryServicesConnector : ISharedRegionModule, IInventoryService { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -75,10 +75,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory Init(source); } - protected override void Init(IConfigSource source) + protected void Init(IConfigSource source) { m_RemoteConnector = new XInventoryServicesConnector(source); - base.Init(source); } @@ -122,7 +121,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } scene.RegisterModuleInterface(this); - m_cache.AddRegion(scene); } public void RemoveRegion(Scene scene) @@ -130,7 +128,6 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory if (!m_Enabled) return; - m_cache.RemoveRegion(scene); } public void RegionLoaded(Scene scene) @@ -146,71 +143,51 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory #region IInventoryService - public override bool CreateUserInventory(UUID user) + public bool CreateUserInventory(UUID user) { return false; } - public override List GetInventorySkeleton(UUID userId) + public List GetInventorySkeleton(UUID userId) { return new List(); } - public override InventoryCollection GetUserInventory(UUID userID) + public InventoryCollection GetUserInventory(UUID userID) { return null; } - public override void GetUserInventory(UUID userID, InventoryReceiptCallback callback) + public void GetUserInventory(UUID userID, InventoryReceiptCallback callback) { - try - { - m_RemoteConnector.GetUserInventory(userID, callback); - } - catch (Exception e) - { - if (StatsManager.SimExtraStats != null) - StatsManager.SimExtraStats.AddInventoryServiceRetrievalFailure(); - - m_log.ErrorFormat("[XINVENTORY CONNECTOR]: Request inventory operation failed, {0} {1}", - e.Source, e.Message); - } + } + public InventoryFolderBase GetRootFolder(UUID userID) + { + return m_RemoteConnector.GetRootFolder(userID); } - // inherited. See base class - // public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + public InventoryFolderBase GetFolderForType(UUID userID, AssetType type) + { + return m_RemoteConnector.GetFolderForType(userID, type); + } - public override Dictionary GetSystemFolders(UUID userID) + public Dictionary GetSystemFolders(UUID userID) { return m_RemoteConnector.GetSystemFolders(userID); } - public override InventoryCollection GetFolderContent(UUID userID, UUID folderID) + public InventoryCollection GetFolderContent(UUID userID, UUID folderID) { - m_log.DebugFormat("[XINVENTORY CONNECTOR]: GetFolderContent {0}", folderID); - try - { - return m_RemoteConnector.GetFolderContent(userID, folderID); - } - catch (Exception e) - { - m_log.ErrorFormat("[XINVENTORY CONNECTOR]: GetFolderContent operation failed, {0} {1}", - e.Source, e.Message); - } - InventoryCollection nullCollection = new InventoryCollection(); - nullCollection.Folders = new List(); - nullCollection.Items = new List(); - nullCollection.UserID = userID; - return nullCollection; + return m_RemoteConnector.GetFolderContent(userID, folderID); } - public override List GetFolderItems(UUID userID, UUID folderID) + public List GetFolderItems(UUID userID, UUID folderID) { return m_RemoteConnector.GetFolderItems(userID, folderID); } - public override bool AddFolder(InventoryFolderBase folder) + public bool AddFolder(InventoryFolderBase folder) { if (folder == null) return false; @@ -218,7 +195,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.AddFolder(folder); } - public override bool UpdateFolder(InventoryFolderBase folder) + public bool UpdateFolder(InventoryFolderBase folder) { if (folder == null) return false; @@ -226,7 +203,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.UpdateFolder(folder); } - public override bool MoveFolder(InventoryFolderBase folder) + public bool MoveFolder(InventoryFolderBase folder) { if (folder == null) return false; @@ -234,7 +211,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.MoveFolder(folder); } - public override bool DeleteFolders(UUID ownerID, List folderIDs) + public bool DeleteFolders(UUID ownerID, List folderIDs) { if (folderIDs == null) return false; @@ -245,7 +222,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } - public override bool PurgeFolder(InventoryFolderBase folder) + public bool PurgeFolder(InventoryFolderBase folder) { if (folder == null) return false; @@ -253,10 +230,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.PurgeFolder(folder); } - // public bool AddItem(InventoryItemBase item) inherited - // Uses AddItemPlain - - protected override bool AddItemPlain(InventoryItemBase item) + public bool AddItem(InventoryItemBase item) { if (item == null) return false; @@ -264,7 +238,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.AddItem(item); } - public override bool UpdateItem(InventoryItemBase item) + public bool UpdateItem(InventoryItemBase item) { if (item == null) return false; @@ -272,7 +246,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.UpdateItem(item); } - public override bool MoveItems(UUID ownerID, List items) + public bool MoveItems(UUID ownerID, List items) { if (items == null) return false; @@ -281,7 +255,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory } - public override bool DeleteItems(UUID ownerID, List itemIDs) + public bool DeleteItems(UUID ownerID, List itemIDs) { if (itemIDs == null) return false; @@ -291,7 +265,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.DeleteItems(ownerID, itemIDs); } - public override InventoryItemBase GetItem(InventoryItemBase item) + public InventoryItemBase GetItem(InventoryItemBase item) { if (item == null) return null; @@ -299,7 +273,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.GetItem(item); } - public override InventoryFolderBase GetFolder(InventoryFolderBase folder) + public InventoryFolderBase GetFolder(InventoryFolderBase folder) { m_log.DebugFormat("[XINVENTORY CONNECTOR]: GetFolder {0}", folder.ID); if (folder == null) @@ -308,17 +282,17 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Inventory return m_RemoteConnector.GetFolder(folder); } - public override bool HasInventoryForUser(UUID userID) + public bool HasInventoryForUser(UUID userID) { return false; } - public override List GetActiveGestures(UUID userId) + public List GetActiveGestures(UUID userId) { return new List(); } - public override int GetAssetPermissions(UUID userID, UUID assetID) + public int GetAssetPermissions(UUID userID, UUID assetID) { return m_RemoteConnector.GetAssetPermissions(userID, assetID); } -- cgit v1.1 From 22b32171130b557dd83df218a38629589c7cc570 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 30 Apr 2010 11:46:50 +0100 Subject: Fix link security issue --- .../Region/ClientStack/LindenUDP/LLClientView.cs | 4 +- .../World/Permissions/PermissionsModule.cs | 6 +-- OpenSim/Region/DataSnapshot/ObjectSnapshot.cs | 2 +- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 50 ++++++++++++++++++++++ OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++-- OpenSim/Region/Framework/Scenes/SceneGraph.cs | 41 ++++-------------- 6 files changed, 69 insertions(+), 42 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index d7120a5..1f3582c 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -6151,7 +6151,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP DelinkObjects handlerDelinkObjects = OnDelinkObjects; if (handlerDelinkObjects != null) { - handlerDelinkObjects(prims); + handlerDelinkObjects(prims, this); } return true; @@ -11820,4 +11820,4 @@ namespace OpenSim.Region.ClientStack.LindenUDP OutPacket(dialog, ThrottleOutPacketType.Task); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index 01359f0..f6bb3fe 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -1721,7 +1721,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); if (m_bypassPermissions) return m_bypassPermissionsValue; - return true; + return GenericObjectPermission(editorID, objectID, false); } private bool CanDelinkObject(UUID userID, UUID objectID) @@ -1729,7 +1729,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); if (m_bypassPermissions) return m_bypassPermissionsValue; - return true; + return GenericObjectPermission(editorID, objectID, false); } private bool CanBuyLand(UUID userID, ILandObject parcel, Scene scene) @@ -1894,4 +1894,4 @@ namespace OpenSim.Region.CoreModules.World.Permissions return(false); } } -} \ No newline at end of file +} diff --git a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs index f441aa9..6e69902 100644 --- a/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs +++ b/OpenSim/Region/DataSnapshot/ObjectSnapshot.cs @@ -69,7 +69,7 @@ namespace OpenSim.Region.DataSnapshot.Providers byte RayEndIsIntersection) { this.Stale = true; }; client.OnLinkObjects += delegate (IClientAPI remoteClient, uint parent, List children) { this.Stale = true; }; - client.OnDelinkObjects += delegate(List primIds) { this.Stale = true; }; + client.OnDelinkObjects += delegate(List primIds, IClientAPI clientApi) { this.Stale = true; }; client.OnGrabUpdate += delegate(UUID objectID, Vector3 offset, Vector3 grapPos, IClientAPI remoteClient, List surfaceArgs) { this.Stale = true; }; client.OnObjectAttach += delegate(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 15b5230..6ebfd31 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -1941,5 +1941,55 @@ namespace OpenSim.Region.Framework.Scenes part.GetProperties(remoteClient); } } + + public void DelinkObjects(List primIds, IClientAPI client) + { + List parts = new List(); + + foreach (uint localID in primIds) + { + SceneObjectPart part = GetSceneObjectPart(localID); + + if (part == null) + continue; + + if (Permissions.CanDelinkObject(client.AgentId, part.ParentGroup.RootPart.UUID)) + parts.Add(part); + } + + m_sceneGraph.DelinkObjects(parts); + } + + public void LinkObjects(IClientAPI client, uint parentPrimId, List childPrimIds) + { + List owners = new List(); + + List children = new List(); + SceneObjectPart root = GetSceneObjectPart(parentPrimId); + + if (Permissions.CanLinkObject(client.AgentId, root.ParentGroup.RootPart.UUID)) + return; + + foreach (uint localID in childPrimIds) + { + SceneObjectPart part = GetSceneObjectPart(localID); + + if (part == null) + continue; + + if (!owners.Contains(part.OwnerID)) + owners.Add(part.OwnerID); + + if (Permissions.CanLinkObject(client.AgentId, part.ParentGroup.RootPart.UUID)) + children.Add(part); + } + + // Must be all one owner + // + if (owners.Count > 1) + return; + + m_sceneGraph.LinkObjects(root, children); + } } } diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 57587be..61a2956 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2721,8 +2721,8 @@ namespace OpenSim.Region.Framework.Scenes client.OnObjectName += m_sceneGraph.PrimName; client.OnObjectClickAction += m_sceneGraph.PrimClickAction; client.OnObjectMaterial += m_sceneGraph.PrimMaterial; - client.OnLinkObjects += m_sceneGraph.LinkObjects; - client.OnDelinkObjects += m_sceneGraph.DelinkObjects; + client.OnLinkObjects += LinkObjects; + client.OnDelinkObjects += DelinkObjects; client.OnObjectDuplicate += m_sceneGraph.DuplicateObject; client.OnObjectDuplicateOnRay += doObjectDuplicateOnRay; client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags; @@ -2878,8 +2878,8 @@ namespace OpenSim.Region.Framework.Scenes client.OnObjectName -= m_sceneGraph.PrimName; client.OnObjectClickAction -= m_sceneGraph.PrimClickAction; client.OnObjectMaterial -= m_sceneGraph.PrimMaterial; - client.OnLinkObjects -= m_sceneGraph.LinkObjects; - client.OnDelinkObjects -= m_sceneGraph.DelinkObjects; + client.OnLinkObjects -= LinkObjects; + client.OnDelinkObjects -= DelinkObjects; client.OnObjectDuplicate -= m_sceneGraph.DuplicateObject; client.OnObjectDuplicateOnRay -= doObjectDuplicateOnRay; client.OnUpdatePrimFlags -= m_sceneGraph.UpdatePrimFlags; diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 1421d0e..ce11267 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -1463,20 +1463,21 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// - protected internal void LinkObjects(IClientAPI client, uint parentPrimId, List childPrimIds) + protected internal void LinkObjects(SceneObjectPart root, List children) { Monitor.Enter(m_updateLock); try { - SceneObjectGroup parentGroup = GetGroupByPrim(parentPrimId); + SceneObjectGroup parentGroup = root.ParentGroup; List childGroups = new List(); if (parentGroup != null) { // We do this in reverse to get the link order of the prims correct - for (int i = childPrimIds.Count - 1; i >= 0; i--) + for (int i = children.Count - 1; i >= 0; i--) { - SceneObjectGroup child = GetGroupByPrim(childPrimIds[i]); + SceneObjectGroup child = children[i].ParentGroup; + if (child != null) { // Make sure no child prim is set for sale @@ -1509,17 +1510,6 @@ namespace OpenSim.Region.Framework.Scenes parentGroup.HasGroupChanged = true; parentGroup.ScheduleGroupForFullUpdate(); -// if (client != null) -// { -// parentGroup.GetProperties(client); -// } -// else -// { -// foreach (ScenePresence p in GetScenePresences()) -// { -// parentGroup.GetProperties(p.ControllingClient); -// } -// } } finally { @@ -1531,12 +1521,7 @@ namespace OpenSim.Region.Framework.Scenes /// Delink a linkset /// /// - protected internal void DelinkObjects(List primIds) - { - DelinkObjects(primIds, true); - } - - protected internal void DelinkObjects(List primIds, bool sendEvents) + protected internal void DelinkObjects(List prims) { Monitor.Enter(m_updateLock); try @@ -1546,9 +1531,8 @@ namespace OpenSim.Region.Framework.Scenes List affectedGroups = new List(); // Look them all up in one go, since that is comparatively expensive // - foreach (uint primID in primIds) + foreach (SceneObjectPart part in prims) { - SceneObjectPart part = m_parentScene.GetSceneObjectPart(primID); if (part != null) { if (part.ParentGroup.Children.Count != 1) // Skip single @@ -1563,17 +1547,13 @@ namespace OpenSim.Region.Framework.Scenes affectedGroups.Add(group); } } - else - { - m_log.ErrorFormat("Viewer requested unlink of nonexistent part {0}", primID); - } } foreach (SceneObjectPart child in childParts) { // Unlink all child parts from their groups // - child.ParentGroup.DelinkFromGroup(child, sendEvents); + child.ParentGroup.DelinkFromGroup(child, true); } foreach (SceneObjectPart root in rootParts) @@ -1628,12 +1608,9 @@ namespace OpenSim.Region.Framework.Scenes List linkIDs = new List(); foreach (SceneObjectPart newChild in newSet) - { newChild.UpdateFlag = 0; - linkIDs.Add(newChild.LocalId); - } - LinkObjects(null, newRoot.LocalId, linkIDs); + LinkObjects(newRoot, newSet); if (!affectedGroups.Contains(newRoot.ParentGroup)) affectedGroups.Add(newRoot.ParentGroup); } -- cgit v1.1 From 0ea908291d63125c4c436ec1056af767aac716e6 Mon Sep 17 00:00:00 2001 From: Melanie Date: Fri, 30 Apr 2010 12:06:58 +0100 Subject: Fix some symbol errors --- OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs index f6bb3fe..69b247c 100644 --- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs @@ -1721,7 +1721,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); if (m_bypassPermissions) return m_bypassPermissionsValue; - return GenericObjectPermission(editorID, objectID, false); + return GenericObjectPermission(userID, objectID, false); } private bool CanDelinkObject(UUID userID, UUID objectID) @@ -1729,7 +1729,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); if (m_bypassPermissions) return m_bypassPermissionsValue; - return GenericObjectPermission(editorID, objectID, false); + return GenericObjectPermission(userID, objectID, false); } private bool CanBuyLand(UUID userID, ILandObject parcel, Scene scene) -- cgit v1.1