aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs97
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Permissions.cs14
3 files changed, 68 insertions, 49 deletions
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index 094da2b..b60cd93 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -592,10 +592,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions
592 592
593 protected bool IsFriendWithPerms(UUID user, UUID objectOwner) 593 protected bool IsFriendWithPerms(UUID user, UUID objectOwner)
594 { 594 {
595 if (user == UUID.Zero) 595 if (FriendsModule == null)
596 return false; 596 return false;
597 597
598 if (FriendsModule == null) 598 if (user == UUID.Zero)
599 return false; 599 return false;
600 600
601 int friendPerms = FriendsModule.GetRightsGrantedByFriend(user, objectOwner); 601 int friendPerms = FriendsModule.GetRightsGrantedByFriend(user, objectOwner);
@@ -684,7 +684,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
684 // gods have owner rights with Modify and Move always on 684 // gods have owner rights with Modify and Move always on
685 if(sp.IsGod) 685 if(sp.IsGod)
686 { 686 {
687 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags); 687 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, true);
688 returnMask |= EXTRAGODMASK; 688 returnMask |= EXTRAGODMASK;
689 return returnMask; 689 return returnMask;
690 } 690 }
@@ -692,20 +692,22 @@ namespace OpenSim.Region.CoreModules.World.Permissions
692 //bypass option == owner rights 692 //bypass option == owner rights
693 if (m_bypassPermissions) 693 if (m_bypassPermissions)
694 { 694 {
695 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags); 695 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, true);
696 returnMask |= EXTRAOWNERMASK; 696 returnMask |= EXTRAOWNERMASK;
697 if((returnMask & (uint)PrimFlags.ObjectModify) != 0) 697 if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
698 returnMask |= (uint)PrimFlags.ObjectOwnerModify; 698 returnMask |= (uint)PrimFlags.ObjectOwnerModify;
699 return returnMask; 699 return returnMask;
700 } 700 }
701 701
702 bool unlocked = (task.ParentGroup.RootPart.OwnerMask & (uint)PermissionMask.Move) != 0;
703
702 UUID taskOwnerID = task.OwnerID; 704 UUID taskOwnerID = task.OwnerID;
703 UUID spID = sp.UUID; 705 UUID spID = sp.UUID;
704 706
705 // owner 707 // owner
706 if (spID == taskOwnerID) 708 if (spID == taskOwnerID)
707 { 709 {
708 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags); 710 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked);
709 returnMask |= EXTRAOWNERMASK; 711 returnMask |= EXTRAOWNERMASK;
710 if((returnMask & (uint)PrimFlags.ObjectModify) != 0) 712 if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
711 returnMask |= (uint)PrimFlags.ObjectOwnerModify; 713 returnMask |= (uint)PrimFlags.ObjectOwnerModify;
@@ -715,16 +717,19 @@ namespace OpenSim.Region.CoreModules.World.Permissions
715 // if not god or owner, do attachments as everyone 717 // if not god or owner, do attachments as everyone
716 if(task.ParentGroup.IsAttachment) 718 if(task.ParentGroup.IsAttachment)
717 { 719 {
718 returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags); 720 returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags, unlocked);
719 if (taskOwnerID != UUID.Zero) 721 if (taskOwnerID != UUID.Zero)
720 returnMask |= (uint)PrimFlags.ObjectAnyOwner; 722 returnMask |= (uint)PrimFlags.ObjectAnyOwner;
721 return returnMask; 723 return returnMask;
722 } 724 }
723 725
726 UUID taskGroupID = task.GroupID;
727 bool groupdOwned = taskOwnerID == taskGroupID;
728
724 // if friends with rights then owner 729 // if friends with rights then owner
725 if (IsFriendWithPerms(spID, taskOwnerID)) 730 if (!groupdOwned && IsFriendWithPerms(spID, taskOwnerID))
726 { 731 {
727 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags); 732 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked);
728 returnMask |= EXTRAOWNERMASK; 733 returnMask |= EXTRAOWNERMASK;
729 if((returnMask & (uint)PrimFlags.ObjectModify) != 0) 734 if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
730 returnMask |= (uint)PrimFlags.ObjectOwnerModify; 735 returnMask |= (uint)PrimFlags.ObjectOwnerModify;
@@ -732,18 +737,15 @@ namespace OpenSim.Region.CoreModules.World.Permissions
732 } 737 }
733 738
734 // group owned or shared ? 739 // group owned or shared ?
735 UUID taskGroupID = task.GroupID;
736 IClientAPI client = sp.ControllingClient; 740 IClientAPI client = sp.ControllingClient;
737 if(taskGroupID != UUID.Zero && client != null && client.IsGroupMember(taskGroupID)) 741 if(taskGroupID != UUID.Zero && client != null && client.IsGroupMember(taskGroupID))
738 { 742 {
739 if(taskGroupID == taskOwnerID) 743 if(groupdOwned)
740 { 744 {
741 // object is owned by group, owner rights and group role powers do apply 745 // object is owned by group, check role powers
742 if((client.GetGroupPowers(taskGroupID) & (ulong)GroupPowers.ObjectManipulate) != 0) 746 if((client.GetGroupPowers(taskGroupID) & (ulong)GroupPowers.ObjectManipulate) != 0)
743 // instead forcing active group can be safeguard againts casual mistakes ??
744 //if(CheckActiveGroupPowers(sp, task.GroupID, (ulong)GroupPowers.ObjectManipulate))
745 { 747 {
746 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags); 748 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked);
747 returnMask |= 749 returnMask |=
748 (uint)PrimFlags.ObjectGroupOwned | 750 (uint)PrimFlags.ObjectGroupOwned |
749 (uint)PrimFlags.ObjectAnyOwner; 751 (uint)PrimFlags.ObjectAnyOwner;
@@ -753,16 +755,18 @@ namespace OpenSim.Region.CoreModules.World.Permissions
753 } 755 }
754 else 756 else
755 { 757 {
756 // no special rights 758 // group sharing or everyone
757 returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags); 759 returnMask = ApplyObjectModifyMasks(task.GroupMask | task.EveryoneMask, objflags, unlocked);
758 returnMask |= (uint)PrimFlags.ObjectAnyOwner; 760 returnMask |=
761 (uint)PrimFlags.ObjectGroupOwned |
762 (uint)PrimFlags.ObjectAnyOwner;
759 return returnMask; 763 return returnMask;
760 } 764 }
761 } 765 }
762 else 766 else
763 { 767 {
764 // group sharing 768 // group sharing or everyone
765 returnMask = ApplyObjectModifyMasks(task.GroupMask, objflags); 769 returnMask = ApplyObjectModifyMasks(task.GroupMask | task.EveryoneMask, objflags, unlocked);
766 if (taskOwnerID != UUID.Zero) 770 if (taskOwnerID != UUID.Zero)
767 returnMask |= (uint)PrimFlags.ObjectAnyOwner; 771 returnMask |= (uint)PrimFlags.ObjectAnyOwner;
768 return returnMask; 772 return returnMask;
@@ -770,13 +774,13 @@ namespace OpenSim.Region.CoreModules.World.Permissions
770 } 774 }
771 775
772 // fallback is everyone rights 776 // fallback is everyone rights
773 returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags); 777 returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags, unlocked);
774 if (taskOwnerID != UUID.Zero) 778 if (taskOwnerID != UUID.Zero)
775 returnMask |= (uint)PrimFlags.ObjectAnyOwner; 779 returnMask |= (uint)PrimFlags.ObjectAnyOwner;
776 return returnMask; 780 return returnMask;
777 } 781 }
778 782
779 private uint ApplyObjectModifyMasks(uint setPermissionMask, uint objectFlagsMask) 783 private uint ApplyObjectModifyMasks(uint setPermissionMask, uint objectFlagsMask, bool unlocked)
780 { 784 {
781 // We are adding the temporary objectflags to the object's objectflags based on the 785 // We are adding the temporary objectflags to the object's objectflags based on the
782 // permission flag given. These change the F flags on the client. 786 // permission flag given. These change the F flags on the client.
@@ -786,14 +790,17 @@ namespace OpenSim.Region.CoreModules.World.Permissions
786 objectFlagsMask |= (uint)PrimFlags.ObjectCopy; 790 objectFlagsMask |= (uint)PrimFlags.ObjectCopy;
787 } 791 }
788 792
789 if ((setPermissionMask & (uint)PermissionMask.Move) != 0) 793 if (unlocked)
790 { 794 {
791 objectFlagsMask |= (uint)PrimFlags.ObjectMove; 795 if ((setPermissionMask & (uint)PermissionMask.Move) != 0)
792 } 796 {
797 objectFlagsMask |= (uint)PrimFlags.ObjectMove;
798 }
793 799
794 if ((setPermissionMask & (uint)PermissionMask.Modify) != 0) 800 if ((setPermissionMask & (uint)PermissionMask.Modify) != 0)
795 { 801 {
796 objectFlagsMask |= (uint)PrimFlags.ObjectModify; 802 objectFlagsMask |= (uint)PrimFlags.ObjectModify;
803 }
797 } 804 }
798 805
799 if ((setPermissionMask & (uint)PermissionMask.Transfer) != 0) 806 if ((setPermissionMask & (uint)PermissionMask.Transfer) != 0)
@@ -1559,35 +1566,35 @@ namespace OpenSim.Region.CoreModules.World.Permissions
1559 private bool CanRezObject(int objectCount, UUID owner, Vector3 objectPosition, Scene scene) 1566 private bool CanRezObject(int objectCount, UUID owner, Vector3 objectPosition, Scene scene)
1560 { 1567 {
1561 DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); 1568 DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
1562 if (m_bypassPermissions) return m_bypassPermissionsValue; 1569 if (m_bypassPermissions)
1570 return m_bypassPermissionsValue;
1563 1571
1564// m_log.DebugFormat("[PERMISSIONS MODULE]: Checking rez object at {0} in {1}", objectPosition, m_scene.Name); 1572// m_log.DebugFormat("[PERMISSIONS MODULE]: Checking rez object at {0} in {1}", objectPosition, m_scene.Name);
1565 1573
1566 ILandObject parcel = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y); 1574 ILandObject parcel = m_scene.LandChannel.GetLandObject(objectPosition.X, objectPosition.Y);
1567 if (parcel == null) 1575 if (parcel == null || parcel.LandData == null)
1568 return false; 1576 return false;
1569 1577
1570 if ((parcel.LandData.Flags & (uint)ParcelFlags.CreateObjects) != 0) 1578 LandData landdata = parcel.LandData;
1571 { 1579 if ((owner == landdata.OwnerID))
1572 return true;
1573 }
1574 else if ((owner == parcel.LandData.OwnerID) || IsAdministrator(owner))
1575 {
1576 return true; 1580 return true;
1577 } 1581
1578 else if (((parcel.LandData.Flags & (uint)ParcelFlags.CreateGroupObjects) != 0) 1582 if ((landdata.Flags & (uint)ParcelFlags.CreateObjects) != 0)
1579 && (parcel.LandData.GroupID != UUID.Zero) && IsGroupMember(parcel.LandData.GroupID, owner, 0))
1580 {
1581 return true; 1583 return true;
1582 } 1584
1583 else if (parcel.LandData.GroupID != UUID.Zero && IsGroupMember(parcel.LandData.GroupID, owner, (ulong)GroupPowers.AllowRez)) 1585 if(IsAdministrator(owner))
1584 {
1585 return true; 1586 return true;
1586 } 1587
1587 else 1588 if(landdata.GroupID != UUID.Zero)
1588 { 1589 {
1589 return false; 1590 if ((landdata.Flags & (uint)ParcelFlags.CreateGroupObjects) != 0)
1591 return IsGroupMember(landdata.GroupID, owner, 0);
1592
1593 if (landdata.IsGroupOwned && IsGroupMember(landdata.GroupID, owner, (ulong)GroupPowers.AllowRez))
1594 return true;
1590 } 1595 }
1596
1597 return false;
1591 } 1598 }
1592 1599
1593 private bool CanRunConsoleCommand(UUID user, Scene requestFromScene) 1600 private bool CanRunConsoleCommand(UUID user, Scene requestFromScene)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
index 2d62b50..e611897 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -183,8 +183,7 @@ namespace OpenSim.Region.Framework.Scenes
183 part.SendFullUpdate(remoteClient); 183 part.SendFullUpdate(remoteClient);
184 184
185 // A prim is only tainted if it's allowed to be edited by the person clicking it. 185 // A prim is only tainted if it's allowed to be edited by the person clicking it.
186 if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) 186 if (Permissions.CanChangeSelectedState(sog.UUID, (ScenePresence)remoteClient.SceneAgent))
187 || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId))
188 { 187 {
189 part.IsSelected = true; 188 part.IsSelected = true;
190 EventManager.TriggerParcelPrimCountTainted(); 189 EventManager.TriggerParcelPrimCountTainted();
@@ -250,8 +249,7 @@ namespace OpenSim.Region.Framework.Scenes
250 // handled by group, but by prim. Legacy cruft. 249 // handled by group, but by prim. Legacy cruft.
251 // TODO: Make selection flagging per prim! 250 // TODO: Make selection flagging per prim!
252 // 251 //
253 if (Permissions.CanEditObject(part.ParentGroup.UUID, remoteClient.AgentId) 252 if (Permissions.CanChangeSelectedState(part.ParentGroup.UUID, (ScenePresence)remoteClient.SceneAgent))
254 || Permissions.CanMoveObject(part.ParentGroup.UUID, remoteClient.AgentId))
255 { 253 {
256 part.IsSelected = false; 254 part.IsSelected = false;
257 if (!part.ParentGroup.IsAttachment && oldgprSelect != part.ParentGroup.IsSelected) 255 if (!part.ParentGroup.IsAttachment && oldgprSelect != part.ParentGroup.IsSelected)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index e045c43..8f32b03 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
@@ -404,6 +404,20 @@ namespace OpenSim.Region.Framework.Scenes
404 404
405 #endregion 405 #endregion
406 406
407 #region persence EDIT or MOVE OBJECT
408 private const uint CANSELECTMASK = (uint)(
409 PrimFlags.ObjectMove |
410 PrimFlags.ObjectModify |
411 PrimFlags.ObjectOwnerModify
412 );
413
414 public bool CanChangeSelectedState(UUID objectID, ScenePresence sp)
415 {
416 uint perms = GenerateClientFlags(sp , objectID);
417 return (perms & CANSELECTMASK) != 0;
418 }
419
420 #endregion
407 #region EDIT OBJECT 421 #region EDIT OBJECT
408 public bool CanEditObject(UUID objectID, UUID editorID) 422 public bool CanEditObject(UUID objectID, UUID editorID)
409 { 423 {