diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | 132 |
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 | } |