diff options
Diffstat (limited to 'OpenSim/Services/InventoryService')
-rw-r--r-- | OpenSim/Services/InventoryService/XInventoryService.cs | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/OpenSim/Services/InventoryService/XInventoryService.cs b/OpenSim/Services/InventoryService/XInventoryService.cs index f48bf60..f581f76 100644 --- a/OpenSim/Services/InventoryService/XInventoryService.cs +++ b/OpenSim/Services/InventoryService/XInventoryService.cs | |||
@@ -45,6 +45,7 @@ namespace OpenSim.Services.InventoryService | |||
45 | MethodBase.GetCurrentMethod().DeclaringType); | 45 | MethodBase.GetCurrentMethod().DeclaringType); |
46 | 46 | ||
47 | protected IXInventoryData m_Database; | 47 | protected IXInventoryData m_Database; |
48 | protected bool m_AllowDelete = true; | ||
48 | 49 | ||
49 | public XInventoryService(IConfigSource config) : base(config) | 50 | public XInventoryService(IConfigSource config) : base(config) |
50 | { | 51 | { |
@@ -60,6 +61,7 @@ namespace OpenSim.Services.InventoryService | |||
60 | { | 61 | { |
61 | dllName = authConfig.GetString("StorageProvider", dllName); | 62 | dllName = authConfig.GetString("StorageProvider", dllName); |
62 | connString = authConfig.GetString("ConnectionString", connString); | 63 | connString = authConfig.GetString("ConnectionString", connString); |
64 | m_AllowDelete = authConfig.GetBoolean("AllowDelete", true); | ||
63 | // realm = authConfig.GetString("Realm", realm); | 65 | // realm = authConfig.GetString("Realm", realm); |
64 | } | 66 | } |
65 | 67 | ||
@@ -259,13 +261,15 @@ namespace OpenSim.Services.InventoryService | |||
259 | 261 | ||
260 | public virtual List<InventoryItemBase> GetFolderItems(UUID principalID, UUID folderID) | 262 | public virtual List<InventoryItemBase> GetFolderItems(UUID principalID, UUID folderID) |
261 | { | 263 | { |
264 | // m_log.DebugFormat("[XINVENTORY]: Fetch items for folder {0}", folderID); | ||
265 | |||
262 | // Since we probably don't get a valid principal here, either ... | 266 | // Since we probably don't get a valid principal here, either ... |
263 | // | 267 | // |
264 | List<InventoryItemBase> invItems = new List<InventoryItemBase>(); | 268 | List<InventoryItemBase> invItems = new List<InventoryItemBase>(); |
265 | 269 | ||
266 | XInventoryItem[] items = m_Database.GetItems( | 270 | XInventoryItem[] items = m_Database.GetItems( |
267 | new string[] { "parentFolderID"}, | 271 | new string[] { "parentFolderID" }, |
268 | new string[] { UUID.Zero.ToString() }); | 272 | new string[] { folderID.ToString() }); |
269 | 273 | ||
270 | foreach (XInventoryItem i in items) | 274 | foreach (XInventoryItem i in items) |
271 | invItems.Add(ConvertToOpenSim(i)); | 275 | invItems.Add(ConvertToOpenSim(i)); |
@@ -302,10 +306,15 @@ namespace OpenSim.Services.InventoryService | |||
302 | // | 306 | // |
303 | public virtual bool DeleteFolders(UUID principalID, List<UUID> folderIDs) | 307 | public virtual bool DeleteFolders(UUID principalID, List<UUID> folderIDs) |
304 | { | 308 | { |
309 | if (!m_AllowDelete) | ||
310 | return false; | ||
311 | |||
305 | // Ignore principal ID, it's bogus at connector level | 312 | // Ignore principal ID, it's bogus at connector level |
306 | // | 313 | // |
307 | foreach (UUID id in folderIDs) | 314 | foreach (UUID id in folderIDs) |
308 | { | 315 | { |
316 | if (!ParentIsTrash(id)) | ||
317 | continue; | ||
309 | InventoryFolderBase f = new InventoryFolderBase(); | 318 | InventoryFolderBase f = new InventoryFolderBase(); |
310 | f.ID = id; | 319 | f.ID = id; |
311 | PurgeFolder(f); | 320 | PurgeFolder(f); |
@@ -317,6 +326,12 @@ namespace OpenSim.Services.InventoryService | |||
317 | 326 | ||
318 | public virtual bool PurgeFolder(InventoryFolderBase folder) | 327 | public virtual bool PurgeFolder(InventoryFolderBase folder) |
319 | { | 328 | { |
329 | if (!m_AllowDelete) | ||
330 | return false; | ||
331 | |||
332 | if (!ParentIsTrash(folder.ID)) | ||
333 | return false; | ||
334 | |||
320 | XInventoryFolder[] subFolders = m_Database.GetFolders( | 335 | XInventoryFolder[] subFolders = m_Database.GetFolders( |
321 | new string[] { "parentFolderID" }, | 336 | new string[] { "parentFolderID" }, |
322 | new string[] { folder.ID.ToString() }); | 337 | new string[] { folder.ID.ToString() }); |
@@ -356,6 +371,9 @@ namespace OpenSim.Services.InventoryService | |||
356 | 371 | ||
357 | public virtual bool DeleteItems(UUID principalID, List<UUID> itemIDs) | 372 | public virtual bool DeleteItems(UUID principalID, List<UUID> itemIDs) |
358 | { | 373 | { |
374 | if (!m_AllowDelete) | ||
375 | return false; | ||
376 | |||
359 | // Just use the ID... *facepalms* | 377 | // Just use the ID... *facepalms* |
360 | // | 378 | // |
361 | foreach (UUID id in itemIDs) | 379 | foreach (UUID id in itemIDs) |
@@ -517,5 +535,29 @@ namespace OpenSim.Services.InventoryService | |||
517 | 535 | ||
518 | return newItem; | 536 | return newItem; |
519 | } | 537 | } |
538 | |||
539 | private bool ParentIsTrash(UUID folderID) | ||
540 | { | ||
541 | XInventoryFolder[] folder = m_Database.GetFolders(new string[] {"folderID"}, new string[] {folderID.ToString()}); | ||
542 | if (folder.Length < 1) | ||
543 | return false; | ||
544 | |||
545 | UUID parentFolder = folder[0].parentFolderID; | ||
546 | |||
547 | while (parentFolder != UUID.Zero) | ||
548 | { | ||
549 | XInventoryFolder[] parent = m_Database.GetFolders(new string[] {"folderID"}, new string[] {parentFolder.ToString()}); | ||
550 | if (parent.Length < 1) | ||
551 | return false; | ||
552 | |||
553 | if (parent[0].type == (int)AssetType.TrashFolder) | ||
554 | return true; | ||
555 | if (parent[0].type == (int)AssetType.RootFolder) | ||
556 | return false; | ||
557 | |||
558 | parentFolder = parent[0].parentFolderID; | ||
559 | } | ||
560 | return false; | ||
561 | } | ||
520 | } | 562 | } |
521 | } | 563 | } |