aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs')
-rw-r--r--OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs126
1 files changed, 109 insertions, 17 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 12b6aa0..1a7da61 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -322,6 +322,18 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
322 } 322 }
323 } 323 }
324 324
325 // Override and put into where it came from, if it came
326 // from anywhere in inventory
327 //
328 if (action == DeRezAction.Take || action == DeRezAction.TakeCopy)
329 {
330 if (objectGroup.RootPart.FromFolderID != UUID.Zero)
331 {
332 InventoryFolderBase f = new InventoryFolderBase(objectGroup.RootPart.FromFolderID, userID);
333 folder = m_Scene.InventoryService.GetFolder(f);
334 }
335 }
336
325 if (folder == null) // None of the above 337 if (folder == null) // None of the above
326 { 338 {
327 folder = new InventoryFolderBase(folderID); 339 folder = new InventoryFolderBase(folderID);
@@ -369,12 +381,27 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
369 if ((nextPerms & (uint)PermissionMask.Modify) == 0) 381 if ((nextPerms & (uint)PermissionMask.Modify) == 0)
370 perms &= ~(uint)PermissionMask.Modify; 382 perms &= ~(uint)PermissionMask.Modify;
371 383
384 // Make sure all bits but the ones we want are clear
385 // on take.
386 // This will be applied to the current perms, so
387 // it will do what we want.
388 objectGroup.RootPart.NextOwnerMask &=
389 ((uint)PermissionMask.Copy |
390 (uint)PermissionMask.Transfer |
391 (uint)PermissionMask.Modify);
392 objectGroup.RootPart.NextOwnerMask |=
393 (uint)PermissionMask.Move;
394
372 item.BasePermissions = perms & objectGroup.RootPart.NextOwnerMask; 395 item.BasePermissions = perms & objectGroup.RootPart.NextOwnerMask;
373 item.CurrentPermissions = item.BasePermissions; 396 item.CurrentPermissions = item.BasePermissions;
374 item.NextPermissions = objectGroup.RootPart.NextOwnerMask; 397 item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
375 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask; 398 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask & objectGroup.RootPart.NextOwnerMask;
376 item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask; 399 item.GroupPermissions = objectGroup.RootPart.GroupMask & objectGroup.RootPart.NextOwnerMask;
377 item.CurrentPermissions |= 8; // Slam! 400
401 // Magic number badness. Maybe this deserves an enum.
402 // bit 4 (16) is the "Slam" bit, it means treat as passed
403 // and apply next owner perms on rez
404 item.CurrentPermissions |= 16; // Slam!
378 } 405 }
379 else 406 else
380 { 407 {
@@ -384,7 +411,12 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
384 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask; 411 item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
385 item.GroupPermissions = objectGroup.RootPart.GroupMask; 412 item.GroupPermissions = objectGroup.RootPart.GroupMask;
386 413
387 item.CurrentPermissions |= 8; // Slam! 414 item.CurrentPermissions &=
415 ((uint)PermissionMask.Copy |
416 (uint)PermissionMask.Transfer |
417 (uint)PermissionMask.Modify |
418 (uint)PermissionMask.Move |
419 7); // Preserve folded permissions
388 } 420 }
389 421
390 // TODO: add the new fields (Flags, Sale info, etc) 422 // TODO: add the new fields (Flags, Sale info, etc)
@@ -485,6 +517,14 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
485 SceneObjectGroup group 517 SceneObjectGroup group
486 = SceneObjectSerializer.FromOriginalXmlFormat(itemId, xmlData); 518 = SceneObjectSerializer.FromOriginalXmlFormat(itemId, xmlData);
487 519
520 group.RootPart.FromFolderID = item.Folder;
521
522 // If it's rezzed in world, select it. Much easier to
523 // find small items.
524 //
525 if (!attachment)
526 group.RootPart.CreateSelected = true;
527
488 if (!m_Scene.Permissions.CanRezObject( 528 if (!m_Scene.Permissions.CanRezObject(
489 group.Children.Count, remoteClient.AgentId, pos) 529 group.Children.Count, remoteClient.AgentId, pos)
490 && !attachment) 530 && !attachment)
@@ -557,7 +597,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
557 List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values); 597 List<SceneObjectPart> partList = new List<SceneObjectPart>(group.Children.Values);
558 598
559 group.SetGroup(remoteClient.ActiveGroupId, remoteClient); 599 group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
560 if (rootPart.OwnerID != item.Owner) 600 if ((rootPart.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0)
561 { 601 {
562 //Need to kill the for sale here 602 //Need to kill the for sale here
563 rootPart.ObjectSaleType = 0; 603 rootPart.ObjectSaleType = 0;
@@ -565,14 +605,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
565 605
566 if (m_Scene.Permissions.PropagatePermissions()) 606 if (m_Scene.Permissions.PropagatePermissions())
567 { 607 {
568 if ((item.CurrentPermissions & 8) != 0) 608 foreach (SceneObjectPart part in partList)
569 { 609 {
570 foreach (SceneObjectPart part in partList) 610 part.EveryoneMask = item.EveryOnePermissions;
571 { 611 part.NextOwnerMask = item.NextPermissions;
572 part.EveryoneMask = item.EveryOnePermissions; 612 part.GroupMask = 0; // DO NOT propagate here
573 part.NextOwnerMask = item.NextPermissions;
574 part.GroupMask = 0; // DO NOT propagate here
575 }
576 } 613 }
577 614
578 group.ApplyNextOwnerPermissions(); 615 group.ApplyNextOwnerPermissions();
@@ -581,19 +618,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
581 618
582 foreach (SceneObjectPart part in partList) 619 foreach (SceneObjectPart part in partList)
583 { 620 {
584 if (part.OwnerID != item.Owner) 621 if ((part.OwnerID != item.Owner) || (item.CurrentPermissions & 16) != 0)
585 { 622 {
586 part.LastOwnerID = part.OwnerID; 623 part.LastOwnerID = part.OwnerID;
587 part.OwnerID = item.Owner; 624 part.OwnerID = item.Owner;
588 part.Inventory.ChangeInventoryOwner(item.Owner); 625 part.Inventory.ChangeInventoryOwner(item.Owner);
589 }
590 else if (((item.CurrentPermissions & 8) != 0) && (!attachment)) // Slam!
591 {
592 part.EveryoneMask = item.EveryOnePermissions;
593 part.NextOwnerMask = item.NextPermissions;
594
595 part.GroupMask = 0; // DO NOT propagate here 626 part.GroupMask = 0; // DO NOT propagate here
596 } 627 }
628 part.EveryoneMask = item.EveryOnePermissions;
629 part.NextOwnerMask = item.NextPermissions;
597 } 630 }
598 631
599 rootPart.TrimPermissions(); 632 rootPart.TrimPermissions();
@@ -639,6 +672,57 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
639 { 672 {
640 } 673 }
641 674
675 public virtual bool GetAgentInventoryItem(IClientAPI remoteClient, UUID itemID, UUID requestID)
676 {
677 InventoryItemBase assetRequestItem = GetItem(remoteClient.AgentId, itemID);
678 if (assetRequestItem == null)
679 {
680 ILibraryService lib = m_Scene.RequestModuleInterface<ILibraryService>();
681 if (lib != null)
682 assetRequestItem = lib.LibraryRootFolder.FindItem(itemID);
683 if (assetRequestItem == null)
684 return false;
685 }
686
687 // At this point, we need to apply perms
688 // only to notecards and scripts. All
689 // other asset types are always available
690 //
691 if (assetRequestItem.AssetType == (int)AssetType.LSLText)
692 {
693 if (!m_Scene.Permissions.CanViewScript(itemID, UUID.Zero, remoteClient.AgentId))
694 {
695 remoteClient.SendAgentAlertMessage("Insufficient permissions to view script", false);
696 return false;
697 }
698 }
699 else if (assetRequestItem.AssetType == (int)AssetType.Notecard)
700 {
701 if (!m_Scene.Permissions.CanViewNotecard(itemID, UUID.Zero, remoteClient.AgentId))
702 {
703 remoteClient.SendAgentAlertMessage("Insufficient permissions to view notecard", false);
704 return false;
705 }
706 }
707
708 if (assetRequestItem.AssetID != requestID)
709 {
710 m_log.WarnFormat(
711 "[CLIENT]: {0} requested asset {1} from item {2} but this does not match item's asset {3}",
712 Name, requestID, itemID, assetRequestItem.AssetID);
713 return false;
714 }
715
716 return true;
717 }
718
719
720 public virtual bool IsForeignUser(UUID userID, out string assetServerURL)
721 {
722 assetServerURL = string.Empty;
723 return false;
724 }
725
642 #endregion 726 #endregion
643 727
644 #region Misc 728 #region Misc
@@ -661,6 +745,14 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
661 return asset; 745 return asset;
662 } 746 }
663 747
748 protected virtual InventoryItemBase GetItem(UUID agentID, UUID itemID)
749 {
750 IInventoryService invService = m_Scene.RequestModuleInterface<IInventoryService>();
751 InventoryItemBase assetRequestItem = new InventoryItemBase(itemID, agentID);
752 assetRequestItem = invService.GetItem(assetRequestItem);
753 return assetRequestItem;
754 }
755
664 #endregion 756 #endregion
665 } 757 }
666} 758}