aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs100
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs15
-rw-r--r--bin/config-include/GridCommon.ini.example12
3 files changed, 103 insertions, 24 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index ce7ed26..283a0cf 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -64,6 +64,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
64 64
65 private bool m_bypassPermissions = true; 65 private bool m_bypassPermissions = true;
66 66
67 // This simple check makes it possible to support grids in which all the simulators
68 // share all central services of the Robust server EXCEPT assets. In other words,
69 // grids where the simulators' assets are kept in one DB and the users' inventory assets
70 // are kept on another. When users rez items from inventory or take objects from world,
71 // an HG-like asset copy takes place between the 2 servers, the world asset server and
72 // the user's asset server.
73 private bool m_CheckSeparateAssets = false;
74 private string m_LocalAssetsURL = string.Empty;
75
67// private bool m_Initialized = false; 76// private bool m_Initialized = false;
68 77
69 #region INonSharedRegionModule 78 #region INonSharedRegionModule
@@ -99,6 +108,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
99 108
100 m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true); 109 m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true);
101 m_RestrictInventoryAccessAbroad = thisModuleConfig.GetBoolean("RestrictInventoryAccessAbroad", true); 110 m_RestrictInventoryAccessAbroad = thisModuleConfig.GetBoolean("RestrictInventoryAccessAbroad", true);
111 m_CheckSeparateAssets = thisModuleConfig.GetBoolean("CheckSeparateAssets", false);
112 m_LocalAssetsURL = thisModuleConfig.GetString("RegionHGAssetServerURI", string.Empty);
113 m_LocalAssetsURL = m_LocalAssetsURL.Trim(new char[] { '/' });
114
102 } 115 }
103 else 116 else
104 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!"); 117 m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!");
@@ -293,41 +306,92 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
293 306
294 public override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) 307 public override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver)
295 { 308 {
296 string userAssetServer = string.Empty; 309 string senderAssetServer = string.Empty;
297 if (IsForeignUser(sender, out userAssetServer) && userAssetServer != string.Empty) 310 string receiverAssetServer = string.Empty;
298 m_assMapper.Get(item.AssetID, sender, userAssetServer); 311 bool isForeignSender, isForeignReceiver;
312 isForeignSender = IsForeignUser(sender, out senderAssetServer);
313 isForeignReceiver = IsForeignUser(receiver, out receiverAssetServer);
314
315 // They're both local. Nothing to do.
316 if (!isForeignSender && !isForeignReceiver)
317 return;
318
319 // At least one of them is foreign.
320 // If both users have the same asset server, no need to transfer the asset
321 if (senderAssetServer.Equals(receiverAssetServer))
322 {
323 m_log.DebugFormat("[HGScene]: Asset transfer between foreign users, but they have the same server. No transfer.");
324 return;
325 }
299 326
300 if (IsForeignUser(receiver, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission) 327 if (isForeignSender && senderAssetServer != string.Empty)
301 m_assMapper.Post(item.AssetID, receiver, userAssetServer); 328 m_assMapper.Get(item.AssetID, sender, senderAssetServer);
329
330 if (isForeignReceiver && receiverAssetServer != string.Empty && m_OutboundPermission)
331 m_assMapper.Post(item.AssetID, receiver, receiverAssetServer);
302 } 332 }
303 333
304 public override bool IsForeignUser(UUID userID, out string assetServerURL) 334 public override bool IsForeignUser(UUID userID, out string assetServerURL)
305 { 335 {
306 assetServerURL = string.Empty; 336 assetServerURL = string.Empty;
307 337
308 if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID)) 338 if (UserManagementModule != null)
309 { // foreign 339 {
310 ScenePresence sp = null; 340 if (!m_CheckSeparateAssets)
311 if (m_Scene.TryGetScenePresence(userID, out sp))
312 { 341 {
313 AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); 342 if (!UserManagementModule.IsLocalGridUser(userID))
314 if (aCircuit != null && aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI")) 343 { // foreign
315 { 344 ScenePresence sp = null;
316 assetServerURL = aCircuit.ServiceURLs["AssetServerURI"].ToString(); 345 if (m_Scene.TryGetScenePresence(userID, out sp))
317 assetServerURL = assetServerURL.Trim(new char[] { '/' }); 346 {
347 AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
348 if (aCircuit != null && aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI"))
349 {
350 assetServerURL = aCircuit.ServiceURLs["AssetServerURI"].ToString();
351 assetServerURL = assetServerURL.Trim(new char[] { '/' });
352 }
353 }
354 else
355 {
356 assetServerURL = UserManagementModule.GetUserServerURL(userID, "AssetServerURI");
357 assetServerURL = assetServerURL.Trim(new char[] { '/' });
358 }
359 return true;
318 } 360 }
319 } 361 }
320 else 362 else
321 { 363 {
322 assetServerURL = UserManagementModule.GetUserServerURL(userID, "AssetServerURI"); 364 if (IsLocalInventoryAssetsUser(userID, out assetServerURL))
323 assetServerURL = assetServerURL.Trim(new char[] { '/' }); 365 {
366 m_log.DebugFormat("[HGScene]: user {0} has local assets {1}", userID, assetServerURL);
367 return false;
368 }
369 else
370 {
371 m_log.DebugFormat("[HGScene]: user {0} has foreign assets {1}", userID, assetServerURL);
372 return true;
373 }
324 } 374 }
325 return true;
326 } 375 }
327
328 return false; 376 return false;
329 } 377 }
330 378
379 private bool IsLocalInventoryAssetsUser(UUID uuid, out string assetsURL)
380 {
381 assetsURL = UserManagementModule.GetUserServerURL(uuid, "AssetServerURI");
382 if (assetsURL == string.Empty)
383 {
384 AgentCircuitData agent = m_Scene.AuthenticateHandler.GetAgentCircuitData(uuid);
385 if (agent != null)
386 {
387 assetsURL = agent.ServiceURLs["AssetServerURI"].ToString();
388 assetsURL = assetsURL.Trim(new char[] { '/' });
389 }
390 }
391 return m_LocalAssetsURL.Equals(assetsURL);
392 }
393
394
331 protected override InventoryItemBase GetItem(UUID agentID, UUID itemID) 395 protected override InventoryItemBase GetItem(UUID agentID, UUID itemID)
332 { 396 {
333 InventoryItemBase item = base.GetItem(agentID, itemID); 397 InventoryItemBase item = base.GetItem(agentID, itemID);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index bb9f457..64da5f6 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -125,13 +125,18 @@ namespace OpenSim.Region.Framework.Scenes
125 125
126 return false; 126 return false;
127 } 127 }
128 }
129
130 public bool AddInventoryItem(InventoryItemBase item)
131 {
132 return AddInventoryItem(item, true);
128 } 133 }
129 134
130 /// <summary> 135 /// <summary>
131 /// Add the given inventory item to a user's inventory. 136 /// Add the given inventory item to a user's inventory.
132 /// </summary> 137 /// </summary>
133 /// <param name="item"></param> 138 /// <param name="item"></param>
134 public bool AddInventoryItem(InventoryItemBase item) 139 public bool AddInventoryItem(InventoryItemBase item, bool trigger)
135 { 140 {
136 if (item.Folder != UUID.Zero && InventoryService.AddItem(item)) 141 if (item.Folder != UUID.Zero && InventoryService.AddItem(item))
137 { 142 {
@@ -140,7 +145,8 @@ namespace OpenSim.Region.Framework.Scenes
140 { 145 {
141 userlevel = 1; 146 userlevel = 1;
142 } 147 }
143 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, (AssetType)item.AssetType, item.AssetID, item.Name, userlevel); 148 if (trigger)
149 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, (AssetType)item.AssetType, item.AssetID, item.Name, userlevel);
144 150
145 return true; 151 return true;
146 } 152 }
@@ -179,7 +185,8 @@ namespace OpenSim.Region.Framework.Scenes
179 { 185 {
180 userlevel = 1; 186 userlevel = 1;
181 } 187 }
182 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, (AssetType)item.AssetType, item.AssetID, item.Name, userlevel); 188 if (trigger)
189 EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, (AssetType)item.AssetType, item.AssetID, item.Name, userlevel);
183 190
184 if (originalFolder != UUID.Zero) 191 if (originalFolder != UUID.Zero)
185 { 192 {
@@ -751,7 +758,7 @@ namespace OpenSim.Region.Framework.Scenes
751 IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>(); 758 IInventoryAccessModule invAccess = RequestModuleInterface<IInventoryAccessModule>();
752 if (invAccess != null) 759 if (invAccess != null)
753 invAccess.TransferInventoryAssets(itemCopy, senderId, recipient); 760 invAccess.TransferInventoryAssets(itemCopy, senderId, recipient);
754 AddInventoryItem(itemCopy); 761 AddInventoryItem(itemCopy, false);
755 762
756 if (!Permissions.BypassPermissions()) 763 if (!Permissions.BypassPermissions())
757 { 764 {
diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example
index 5460c0a..59eebd8 100644
--- a/bin/config-include/GridCommon.ini.example
+++ b/bin/config-include/GridCommon.ini.example
@@ -160,13 +160,21 @@
160 HomeURI = "http://mygridserver.com:8002" 160 HomeURI = "http://mygridserver.com:8002"
161 Gatekeeper = "http://mygridserver.com:8002" 161 Gatekeeper = "http://mygridserver.com:8002"
162 ;; If you want to protect your assets from being copied by foreign visitors 162 ;; If you want to protect your assets from being copied by foreign visitors
163 ;; uncomment the next line. You may want to do this on sims that have licensed content. 163 ;; set this to false. You may want to do this on sims that have licensed content.
164 ; OutboundPermission = False 164 ;; Default is true.
165 ; OutboundPermission = True
165 166
166 ;; Send visual reminder to local users that their inventories are unavailable while they are traveling 167 ;; Send visual reminder to local users that their inventories are unavailable while they are traveling
167 ;; and available when they return. True by default. 168 ;; and available when they return. True by default.
168 ;RestrictInventoryAccessAbroad = True 169 ;RestrictInventoryAccessAbroad = True
169 170
171 ;; Warning: advanced and unusual. Default is false.
172 ;; Enables configurations where grids share user services, including inventory,
173 ;; while separating regions' assets from users' assets. Asset transfer between
174 ;; the users' asset server and the regions' asset server is done in HG-like manner.
175 ; CheckSeparateAssets = false
176 ; RegionHGAssetServerURI = http://mygridserver.com:8002
177
170 178
171[HGAssetService] 179[HGAssetService]
172 ; 180 ;