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.cs132
1 files changed, 85 insertions, 47 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index d320af4..6c4c63f 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -367,6 +367,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
367 367
368 originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition; 368 originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition;
369 369
370 // Restore attachment data after trip through the sim
371 if (objectGroup.RootPart.AttachPoint > 0)
372 inventoryStoredPosition = objectGroup.RootPart.AttachOffset;
373 objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint;
374
370 objectGroup.AbsolutePosition = inventoryStoredPosition; 375 objectGroup.AbsolutePosition = inventoryStoredPosition;
371 376
372 // Make sure all bits but the ones we want are clear 377 // Make sure all bits but the ones we want are clear
@@ -476,8 +481,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
476 IClientAPI remoteClient) 481 IClientAPI remoteClient)
477 { 482 {
478 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move) | 7; 483 uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move) | 7;
484 // For the porposes of inventory, an object is modify if the prims
485 // are modify. This allows renaming an object that contains no
486 // mod items.
479 foreach (SceneObjectGroup grp in objsForEffectivePermissions) 487 foreach (SceneObjectGroup grp in objsForEffectivePermissions)
480 effectivePerms &= grp.GetEffectivePermissions(); 488 {
489 uint groupPerms = grp.GetEffectivePermissions(true);
490 if ((grp.RootPart.BaseMask & (uint)PermissionMask.Modify) != 0)
491 groupPerms |= (uint)PermissionMask.Modify;
492
493 effectivePerms &= groupPerms;
494 }
481 effectivePerms |= (uint)PermissionMask.Move; 495 effectivePerms |= (uint)PermissionMask.Move;
482 496
483 if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) 497 if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions())
@@ -657,7 +671,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
657 if (so.RootPart.FromFolderID != UUID.Zero && userID == remoteClient.AgentId) 671 if (so.RootPart.FromFolderID != UUID.Zero && userID == remoteClient.AgentId)
658 { 672 {
659 InventoryFolderBase f = new InventoryFolderBase(so.RootPart.FromFolderID, userID); 673 InventoryFolderBase f = new InventoryFolderBase(so.RootPart.FromFolderID, userID);
660 folder = m_Scene.InventoryService.GetFolder(f); 674 if (f != null)
675 folder = m_Scene.InventoryService.GetFolder(f);
661 } 676 }
662 } 677 }
663 678
@@ -687,15 +702,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
687 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) 702 bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
688 { 703 {
689// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); 704// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID);
690
691 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); 705 InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
692 item = m_Scene.InventoryService.GetItem(item); 706 item = m_Scene.InventoryService.GetItem(item);
693 707
694 if (item == null) 708 if (item == null)
695 { 709 {
696 m_log.WarnFormat(
697 "[InventoryAccessModule]: Could not find item {0} for {1} in RezObject()",
698 itemID, remoteClient.Name);
699 710
700 return null; 711 return null;
701 } 712 }
@@ -747,6 +758,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
747 if (e == null || attachment) // Single 758 if (e == null || attachment) // Single
748 { 759 {
749 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); 760 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
761 if (!attachment)
762 {
763 g.RootPart.AttachPoint = g.RootPart.Shape.State;
764 g.RootPart.AttachOffset = g.AbsolutePosition;
765 }
750 766
751 objlist.Add(g); 767 objlist.Add(g);
752 veclist.Add(new Vector3(0, 0, 0)); 768 veclist.Add(new Vector3(0, 0, 0));
@@ -776,6 +792,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
776 foreach (XmlNode n in groups) 792 foreach (XmlNode n in groups)
777 { 793 {
778 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml); 794 SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml);
795 g.RootPart.AttachPoint = g.RootPart.Shape.State;
796 g.RootPart.AttachOffset = g.AbsolutePosition;
779 797
780 objlist.Add(g); 798 objlist.Add(g);
781 XmlElement el = (XmlElement)n; 799 XmlElement el = (XmlElement)n;
@@ -795,12 +813,35 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
795 } 813 }
796 } 814 }
797 815
816 int primcount = 0;
817 foreach (SceneObjectGroup g in objlist)
818 primcount += g.PrimCount;
819
820 if (!m_Scene.Permissions.CanRezObject(
821 primcount, remoteClient.AgentId, pos)
822 && !attachment)
823 {
824 // The client operates in no fail mode. It will
825 // have already removed the item from the folder
826 // if it's no copy.
827 // Put it back if it's not an attachment
828 //
829 if (item != null)
830 {
831 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment))
832 remoteClient.SendBulkUpdateInventory(item);
833 }
834
835 return null;
836 }
837
798 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment)) 838 if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment))
799 return null; 839 return null;
800 840
801 for (int i = 0; i < objlist.Count; i++) 841 for (int i = 0; i < objlist.Count; i++)
802 { 842 {
803 group = objlist[i]; 843 group = objlist[i];
844 SceneObjectPart rootPart = group.RootPart;
804 845
805// m_log.DebugFormat( 846// m_log.DebugFormat(
806// "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", 847// "[InventoryAccessModule]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",
@@ -861,8 +902,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
861 902
862 if (!attachment) 903 if (!attachment)
863 { 904 {
864 SceneObjectPart rootPart = group.RootPart;
865
866 if (rootPart.Shape.PCode == (byte)PCode.Prim) 905 if (rootPart.Shape.PCode == (byte)PCode.Prim)
867 group.ClearPartAttachmentData(); 906 group.ClearPartAttachmentData();
868 907
@@ -880,6 +919,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
880// remoteClient.Name); 919// remoteClient.Name);
881 } 920 }
882 921
922 group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
923
883 if (item != null) 924 if (item != null)
884 DoPostRezWhenFromItem(item, attachment); 925 DoPostRezWhenFromItem(item, attachment);
885 926
@@ -919,25 +960,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
919 } 960 }
920 } 961 }
921 962
922 int primcount = 0;
923 foreach (SceneObjectGroup g in objlist)
924 primcount += g.PrimCount;
925
926 if (!m_Scene.Permissions.CanRezObject(
927 primcount, remoteClient.AgentId, pos)
928 && !isAttachment)
929 {
930 // The client operates in no fail mode. It will
931 // have already removed the item from the folder
932 // if it's no copy.
933 // Put it back if it's not an attachment
934 //
935 if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!isAttachment))
936 remoteClient.SendBulkUpdateInventory(item);
937
938 return false;
939 }
940
941 for (int i = 0; i < objlist.Count; i++) 963 for (int i = 0; i < objlist.Count; i++)
942 { 964 {
943 SceneObjectGroup so = objlist[i]; 965 SceneObjectGroup so = objlist[i];
@@ -953,8 +975,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
953 { 975 {
954 rootPart.Name = item.Name; 976 rootPart.Name = item.Name;
955 rootPart.Description = item.Description; 977 rootPart.Description = item.Description;
956 rootPart.ObjectSaleType = item.SaleType; 978 if ((item.Flags & (uint)InventoryItemFlags.ObjectSlamSale) != 0)
957 rootPart.SalePrice = item.SalePrice; 979 {
980 rootPart.ObjectSaleType = item.SaleType;
981 rootPart.SalePrice = item.SalePrice;
982 }
958 } 983 }
959 984
960 rootPart.FromFolderID = item.Folder; 985 rootPart.FromFolderID = item.Folder;
@@ -963,7 +988,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
963// rootPart.OwnerID, item.Owner, item.CurrentPermissions); 988// rootPart.OwnerID, item.Owner, item.CurrentPermissions);
964 989
965 if ((rootPart.OwnerID != item.Owner) || 990 if ((rootPart.OwnerID != item.Owner) ||
966 (item.CurrentPermissions & 16) != 0) 991 (item.CurrentPermissions & 16) != 0 ||
992 (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0)
967 { 993 {
968 //Need to kill the for sale here 994 //Need to kill the for sale here
969 rootPart.ObjectSaleType = 0; 995 rootPart.ObjectSaleType = 0;
@@ -973,31 +999,43 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
973 { 999 {
974 foreach (SceneObjectPart part in so.Parts) 1000 foreach (SceneObjectPart part in so.Parts)
975 { 1001 {
976 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
977 {
978 part.EveryoneMask = item.EveryOnePermissions;
979 part.NextOwnerMask = item.NextPermissions;
980 }
981 part.GroupMask = 0; // DO NOT propagate here 1002 part.GroupMask = 0; // DO NOT propagate here
1003
1004 part.LastOwnerID = part.OwnerID;
1005 part.OwnerID = item.Owner;
1006 part.Inventory.ChangeInventoryOwner(item.Owner);
982 } 1007 }
983 1008
984 so.ApplyNextOwnerPermissions(); 1009 so.ApplyNextOwnerPermissions();
1010
1011 // In case the user has changed flags on a received item
1012 // we have to apply those changes after the slam. Else we
1013 // get a net loss of permissions
1014 foreach (SceneObjectPart part in so.Parts)
1015 {
1016 if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
1017 {
1018 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
1019 part.EveryoneMask = item.EveryOnePermissions & part.BaseMask;
1020 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
1021 part.NextOwnerMask = item.NextPermissions & part.BaseMask;
1022 }
1023 }
985 } 1024 }
986 } 1025 }
987 1026 else
988 foreach (SceneObjectPart part in so.Parts)
989 { 1027 {
990 part.FromUserInventoryItemID = fromUserInventoryItemId; 1028 foreach (SceneObjectPart part in so.Parts)
991
992 if ((part.OwnerID != item.Owner) ||
993 (item.CurrentPermissions & 16) != 0)
994 { 1029 {
995 part.Inventory.ChangeInventoryOwner(item.Owner); 1030 part.FromUserInventoryItemID = fromUserInventoryItemId;
996 part.GroupMask = 0; // DO NOT propagate here 1031
1032 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
1033 part.EveryoneMask = item.EveryOnePermissions;
1034 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
1035 part.NextOwnerMask = item.NextPermissions;
1036 if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
1037 part.GroupMask = item.GroupPermissions;
997 } 1038 }
998
999 part.EveryoneMask = item.EveryOnePermissions;
1000 part.NextOwnerMask = item.NextPermissions;
1001 } 1039 }
1002 1040
1003 rootPart.TrimPermissions(); 1041 rootPart.TrimPermissions();
@@ -1135,4 +1173,4 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
1135 1173
1136 #endregion 1174 #endregion
1137 } 1175 }
1138} \ No newline at end of file 1176}