diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs | 198 |
1 files changed, 164 insertions, 34 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs index 964efda..582b267 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs | |||
@@ -62,6 +62,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
62 | private string m_ThisGatekeeper; | 62 | private string m_ThisGatekeeper; |
63 | private bool m_RestrictInventoryAccessAbroad; | 63 | private bool m_RestrictInventoryAccessAbroad; |
64 | 64 | ||
65 | private bool m_bypassPermissions = true; | ||
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 | |||
65 | // private bool m_Initialized = false; | 76 | // private bool m_Initialized = false; |
66 | 77 | ||
67 | #region INonSharedRegionModule | 78 | #region INonSharedRegionModule |
@@ -88,16 +99,26 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
88 | IConfig thisModuleConfig = source.Configs["HGInventoryAccessModule"]; | 99 | IConfig thisModuleConfig = source.Configs["HGInventoryAccessModule"]; |
89 | if (thisModuleConfig != null) | 100 | if (thisModuleConfig != null) |
90 | { | 101 | { |
91 | // legacy configuration [obsolete] | 102 | m_HomeURI = Util.GetConfigVarFromSections<string>(source, "HomeURI", |
92 | m_HomeURI = thisModuleConfig.GetString("ProfileServerURI", string.Empty); | 103 | new string[] { "Startup", "Hypergrid", "HGInventoryAccessModule" }, String.Empty); |
93 | // preferred | 104 | m_ThisGatekeeper = Util.GetConfigVarFromSections<string>(source, "GatekeeperURI", |
94 | m_HomeURI = thisModuleConfig.GetString("HomeURI", m_HomeURI); | 105 | new string[] { "Startup", "Hypergrid", "HGInventoryAccessModule" }, String.Empty); |
106 | // Legacy. Renove soon! | ||
107 | m_ThisGatekeeper = thisModuleConfig.GetString("Gatekeeper", m_ThisGatekeeper); | ||
108 | |||
95 | m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true); | 109 | m_OutboundPermission = thisModuleConfig.GetBoolean("OutboundPermission", true); |
96 | m_ThisGatekeeper = thisModuleConfig.GetString("Gatekeeper", string.Empty); | ||
97 | 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 | |||
98 | } | 115 | } |
99 | else | 116 | else |
100 | 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!"); |
118 | |||
119 | m_bypassPermissions = !Util.GetConfigVarFromSections<bool>(source, "serverside_object_permissions", | ||
120 | new string[] { "Startup", "Permissions" }, true); | ||
121 | |||
101 | } | 122 | } |
102 | } | 123 | } |
103 | } | 124 | } |
@@ -109,9 +130,14 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
109 | 130 | ||
110 | base.AddRegion(scene); | 131 | base.AddRegion(scene); |
111 | m_assMapper = new HGAssetMapper(scene, m_HomeURI); | 132 | m_assMapper = new HGAssetMapper(scene, m_HomeURI); |
112 | scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem; | 133 | scene.EventManager.OnNewInventoryItemUploadComplete += PostInventoryAsset; |
113 | scene.EventManager.OnTeleportStart += TeleportStart; | 134 | scene.EventManager.OnTeleportStart += TeleportStart; |
114 | scene.EventManager.OnTeleportFail += TeleportFail; | 135 | scene.EventManager.OnTeleportFail += TeleportFail; |
136 | |||
137 | // We're fgoing to enforce some stricter permissions if Outbound is false | ||
138 | scene.Permissions.OnTakeObject += CanTakeObject; | ||
139 | scene.Permissions.OnTakeCopyObject += CanTakeObject; | ||
140 | scene.Permissions.OnTransferUserInventory += OnTransferUserInventory; | ||
115 | } | 141 | } |
116 | 142 | ||
117 | #endregion | 143 | #endregion |
@@ -133,7 +159,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
133 | if (sp is ScenePresence) | 159 | if (sp is ScenePresence) |
134 | { | 160 | { |
135 | AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId); | 161 | AgentCircuitData aCircuit = ((ScenePresence)sp).Scene.AuthenticateHandler.GetAgentCircuitData(client.AgentId); |
136 | if ((aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0) | 162 | if (aCircuit != null && (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0) |
137 | { | 163 | { |
138 | if (m_RestrictInventoryAccessAbroad) | 164 | if (m_RestrictInventoryAccessAbroad) |
139 | { | 165 | { |
@@ -183,8 +209,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
183 | } | 209 | } |
184 | } | 210 | } |
185 | 211 | ||
186 | public void UploadInventoryItem(UUID avatarID, UUID assetID, string name, int userlevel) | 212 | public void PostInventoryAsset(UUID avatarID, AssetType type, UUID assetID, string name, int userlevel) |
187 | { | 213 | { |
214 | if (type == AssetType.Link) | ||
215 | return; | ||
216 | |||
188 | string userAssetServer = string.Empty; | 217 | string userAssetServer = string.Empty; |
189 | if (IsForeignUser(avatarID, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission) | 218 | if (IsForeignUser(avatarID, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission) |
190 | { | 219 | { |
@@ -219,18 +248,32 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
219 | { | 248 | { |
220 | UUID newAssetID = base.CapsUpdateInventoryItemAsset(remoteClient, itemID, data); | 249 | UUID newAssetID = base.CapsUpdateInventoryItemAsset(remoteClient, itemID, data); |
221 | 250 | ||
222 | UploadInventoryItem(remoteClient.AgentId, newAssetID, "", 0); | 251 | PostInventoryAsset(remoteClient.AgentId, AssetType.Unknown, newAssetID, "", 0); |
223 | 252 | ||
224 | return newAssetID; | 253 | return newAssetID; |
225 | } | 254 | } |
226 | 255 | ||
256 | /// | ||
257 | /// UpdateInventoryItemAsset | ||
258 | /// | ||
259 | public override bool UpdateInventoryItemAsset(UUID ownerID, InventoryItemBase item, AssetBase asset) | ||
260 | { | ||
261 | if (base.UpdateInventoryItemAsset(ownerID, item, asset)) | ||
262 | { | ||
263 | PostInventoryAsset(ownerID, (AssetType)asset.Type, asset.FullID, asset.Name, 0); | ||
264 | return true; | ||
265 | } | ||
266 | |||
267 | return false; | ||
268 | } | ||
269 | |||
227 | /// | 270 | /// |
228 | /// Used in DeleteToInventory | 271 | /// Used in DeleteToInventory |
229 | /// | 272 | /// |
230 | protected override void ExportAsset(UUID agentID, UUID assetID) | 273 | protected override void ExportAsset(UUID agentID, UUID assetID) |
231 | { | 274 | { |
232 | if (!assetID.Equals(UUID.Zero)) | 275 | if (!assetID.Equals(UUID.Zero)) |
233 | UploadInventoryItem(agentID, assetID, "", 0); | 276 | PostInventoryAsset(agentID, AssetType.Unknown, assetID, "", 0); |
234 | else | 277 | else |
235 | m_log.Debug("[HGScene]: Scene.Inventory did not create asset"); | 278 | m_log.Debug("[HGScene]: Scene.Inventory did not create asset"); |
236 | } | 279 | } |
@@ -242,7 +285,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
242 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | 285 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, |
243 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) | 286 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) |
244 | { | 287 | { |
245 | m_log.DebugFormat("[HGScene] RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID); | 288 | m_log.DebugFormat("[HGScene]: RezObject itemID={0} fromTaskID={1}", itemID, fromTaskID); |
246 | 289 | ||
247 | //if (fromTaskID.Equals(UUID.Zero)) | 290 | //if (fromTaskID.Equals(UUID.Zero)) |
248 | //{ | 291 | //{ |
@@ -268,50 +311,98 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
268 | SceneObjectGroup sog = base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, | 311 | SceneObjectGroup sog = base.RezObject(remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, |
269 | RezSelected, RemoveItem, fromTaskID, attachment); | 312 | RezSelected, RemoveItem, fromTaskID, attachment); |
270 | 313 | ||
271 | if (sog == null) | ||
272 | remoteClient.SendAgentAlertMessage("Unable to rez: problem accessing inventory or locating assets", false); | ||
273 | |||
274 | return sog; | 314 | return sog; |
275 | 315 | ||
276 | } | 316 | } |
277 | 317 | ||
278 | public override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) | 318 | public override void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver) |
279 | { | 319 | { |
280 | string userAssetServer = string.Empty; | 320 | string senderAssetServer = string.Empty; |
281 | if (IsForeignUser(sender, out userAssetServer) && userAssetServer != string.Empty) | 321 | string receiverAssetServer = string.Empty; |
282 | m_assMapper.Get(item.AssetID, sender, userAssetServer); | 322 | bool isForeignSender, isForeignReceiver; |
323 | isForeignSender = IsForeignUser(sender, out senderAssetServer); | ||
324 | isForeignReceiver = IsForeignUser(receiver, out receiverAssetServer); | ||
325 | |||
326 | // They're both local. Nothing to do. | ||
327 | if (!isForeignSender && !isForeignReceiver) | ||
328 | return; | ||
329 | |||
330 | // At least one of them is foreign. | ||
331 | // If both users have the same asset server, no need to transfer the asset | ||
332 | if (senderAssetServer.Equals(receiverAssetServer)) | ||
333 | { | ||
334 | m_log.DebugFormat("[HGScene]: Asset transfer between foreign users, but they have the same server. No transfer."); | ||
335 | return; | ||
336 | } | ||
337 | |||
338 | if (isForeignSender && senderAssetServer != string.Empty) | ||
339 | m_assMapper.Get(item.AssetID, sender, senderAssetServer); | ||
283 | 340 | ||
284 | if (IsForeignUser(receiver, out userAssetServer) && userAssetServer != string.Empty && m_OutboundPermission) | 341 | if (isForeignReceiver && receiverAssetServer != string.Empty && m_OutboundPermission) |
285 | m_assMapper.Post(item.AssetID, receiver, userAssetServer); | 342 | m_assMapper.Post(item.AssetID, receiver, receiverAssetServer); |
286 | } | 343 | } |
287 | 344 | ||
288 | public override bool IsForeignUser(UUID userID, out string assetServerURL) | 345 | public override bool IsForeignUser(UUID userID, out string assetServerURL) |
289 | { | 346 | { |
290 | assetServerURL = string.Empty; | 347 | assetServerURL = string.Empty; |
291 | 348 | ||
292 | if (UserManagementModule != null && !UserManagementModule.IsLocalGridUser(userID)) | 349 | if (UserManagementModule != null) |
293 | { // foreign | 350 | { |
294 | ScenePresence sp = null; | 351 | if (!m_CheckSeparateAssets) |
295 | if (m_Scene.TryGetScenePresence(userID, out sp)) | ||
296 | { | 352 | { |
297 | AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | 353 | if (!UserManagementModule.IsLocalGridUser(userID)) |
298 | if (aCircuit.ServiceURLs.ContainsKey("AssetServerURI")) | 354 | { // foreign |
299 | { | 355 | ScenePresence sp = null; |
300 | assetServerURL = aCircuit.ServiceURLs["AssetServerURI"].ToString(); | 356 | if (m_Scene.TryGetScenePresence(userID, out sp)) |
301 | assetServerURL = assetServerURL.Trim(new char[] { '/' }); | 357 | { |
358 | AgentCircuitData aCircuit = m_Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode); | ||
359 | if (aCircuit != null && aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI")) | ||
360 | { | ||
361 | assetServerURL = aCircuit.ServiceURLs["AssetServerURI"].ToString(); | ||
362 | assetServerURL = assetServerURL.Trim(new char[] { '/' }); | ||
363 | } | ||
364 | } | ||
365 | else | ||
366 | { | ||
367 | assetServerURL = UserManagementModule.GetUserServerURL(userID, "AssetServerURI"); | ||
368 | assetServerURL = assetServerURL.Trim(new char[] { '/' }); | ||
369 | } | ||
370 | return true; | ||
302 | } | 371 | } |
303 | } | 372 | } |
304 | else | 373 | else |
305 | { | 374 | { |
306 | assetServerURL = UserManagementModule.GetUserServerURL(userID, "AssetServerURI"); | 375 | if (IsLocalInventoryAssetsUser(userID, out assetServerURL)) |
307 | assetServerURL = assetServerURL.Trim(new char[] { '/' }); | 376 | { |
377 | m_log.DebugFormat("[HGScene]: user {0} has local assets {1}", userID, assetServerURL); | ||
378 | return false; | ||
379 | } | ||
380 | else | ||
381 | { | ||
382 | m_log.DebugFormat("[HGScene]: user {0} has foreign assets {1}", userID, assetServerURL); | ||
383 | return true; | ||
384 | } | ||
308 | } | 385 | } |
309 | return true; | ||
310 | } | 386 | } |
311 | |||
312 | return false; | 387 | return false; |
313 | } | 388 | } |
314 | 389 | ||
390 | private bool IsLocalInventoryAssetsUser(UUID uuid, out string assetsURL) | ||
391 | { | ||
392 | assetsURL = UserManagementModule.GetUserServerURL(uuid, "AssetServerURI"); | ||
393 | if (assetsURL == string.Empty) | ||
394 | { | ||
395 | AgentCircuitData agent = m_Scene.AuthenticateHandler.GetAgentCircuitData(uuid); | ||
396 | if (agent != null) | ||
397 | { | ||
398 | assetsURL = agent.ServiceURLs["AssetServerURI"].ToString(); | ||
399 | assetsURL = assetsURL.Trim(new char[] { '/' }); | ||
400 | } | ||
401 | } | ||
402 | return m_LocalAssetsURL.Equals(assetsURL); | ||
403 | } | ||
404 | |||
405 | |||
315 | protected override InventoryItemBase GetItem(UUID agentID, UUID itemID) | 406 | protected override InventoryItemBase GetItem(UUID agentID, UUID itemID) |
316 | { | 407 | { |
317 | InventoryItemBase item = base.GetItem(agentID, itemID); | 408 | InventoryItemBase item = base.GetItem(agentID, itemID); |
@@ -346,7 +437,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
346 | InventoryFolderBase root = m_Scene.InventoryService.GetRootFolder(client.AgentId); | 437 | InventoryFolderBase root = m_Scene.InventoryService.GetRootFolder(client.AgentId); |
347 | InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID); | 438 | InventoryCollection content = m_Scene.InventoryService.GetFolderContent(client.AgentId, root.ID); |
348 | 439 | ||
349 | inv.SendBulkUpdateInventory(content.Folders.ToArray(), content.Items.ToArray()); | 440 | List<InventoryFolderBase> keep = new List<InventoryFolderBase>(); |
441 | |||
442 | foreach (InventoryFolderBase f in content.Folders) | ||
443 | { | ||
444 | if (f.Name != "My Suitcase" && f.Name != "Current Outfit") | ||
445 | keep.Add(f); | ||
446 | } | ||
447 | |||
448 | inv.SendBulkUpdateInventory(keep.ToArray(), content.Items.ToArray()); | ||
350 | } | 449 | } |
351 | } | 450 | } |
352 | } | 451 | } |
@@ -379,7 +478,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
379 | 478 | ||
380 | foreach (InventoryFolderBase f in content.Folders) | 479 | foreach (InventoryFolderBase f in content.Folders) |
381 | { | 480 | { |
382 | if (f.Name != "My Suitcase") | 481 | if (f.Name != "My Suitcase" && f.Name != "Current Outfit") |
383 | { | 482 | { |
384 | f.Name = f.Name + " (Unavailable)"; | 483 | f.Name = f.Name + " (Unavailable)"; |
385 | keep.Add(f); | 484 | keep.Add(f); |
@@ -404,5 +503,36 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
404 | } | 503 | } |
405 | 504 | ||
406 | #endregion | 505 | #endregion |
506 | |||
507 | #region Permissions | ||
508 | |||
509 | private bool CanTakeObject(UUID objectID, UUID stealer, Scene scene) | ||
510 | { | ||
511 | if (m_bypassPermissions) return true; | ||
512 | |||
513 | if (!m_OutboundPermission && !UserManagementModule.IsLocalGridUser(stealer)) | ||
514 | { | ||
515 | SceneObjectGroup sog = null; | ||
516 | if (m_Scene.TryGetSceneObjectGroup(objectID, out sog) && sog.OwnerID == stealer) | ||
517 | return true; | ||
518 | |||
519 | return false; | ||
520 | } | ||
521 | |||
522 | return true; | ||
523 | } | ||
524 | |||
525 | private bool OnTransferUserInventory(UUID itemID, UUID userID, UUID recipientID) | ||
526 | { | ||
527 | if (m_bypassPermissions) return true; | ||
528 | |||
529 | if (!m_OutboundPermission && !UserManagementModule.IsLocalGridUser(recipientID)) | ||
530 | return false; | ||
531 | |||
532 | return true; | ||
533 | } | ||
534 | |||
535 | |||
536 | #endregion | ||
407 | } | 537 | } |
408 | } \ No newline at end of file | 538 | } \ No newline at end of file |