aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs39
-rw-r--r--OpenSim/Region/Framework/Interfaces/IEntityInventory.cs5
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs177
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs46
4 files changed, 252 insertions, 15 deletions
diff --git a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
index b60cd93..dcf0c00 100644
--- a/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
+++ b/OpenSim/Region/CoreModules/World/Permissions/PermissionsModule.cs
@@ -631,7 +631,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
631 631
632 #region Object Permissions 632 #region Object Permissions
633#pragma warning disable 0612 633#pragma warning disable 0612
634 const uint DEFAULT_FLAGS = (uint)~( 634 const uint DEFAULT_FLAGS = (uint)(
635 PrimFlags.ObjectCopy | // Tells client you can copy the object 635 PrimFlags.ObjectCopy | // Tells client you can copy the object
636 PrimFlags.ObjectModify | // tells client you can modify the object 636 PrimFlags.ObjectModify | // tells client you can modify the object
637 PrimFlags.ObjectMove | // tells client that you can move the object (only, no mod) 637 PrimFlags.ObjectMove | // tells client that you can move the object (only, no mod)
@@ -665,6 +665,16 @@ namespace OpenSim.Region.CoreModules.World.Permissions
665 PrimFlags.ObjectMove 665 PrimFlags.ObjectMove
666 ); 666 );
667 667
668 const uint GOD_FLAGS = (uint)(
669 PrimFlags.ObjectCopy | // Tells client you can copy the object
670 PrimFlags.ObjectModify | // tells client you can modify the object
671 PrimFlags.ObjectMove | // tells client that you can move the object (only, no mod)
672 PrimFlags.ObjectTransfer | // tells the client that you can /take/ the object if you don't own it
673 PrimFlags.ObjectYouOwner | // Tells client that you're the owner of the object
674 PrimFlags.ObjectAnyOwner | // Tells client that someone owns the object
675 PrimFlags.ObjectOwnerModify // Tells client that you're the owner of the object
676 );
677
668 public uint GenerateClientFlags(ScenePresence sp, uint curEffectivePerms, UUID objID) 678 public uint GenerateClientFlags(ScenePresence sp, uint curEffectivePerms, UUID objID)
669 { 679 {
670 if(sp == null || curEffectivePerms == 0) 680 if(sp == null || curEffectivePerms == 0)
@@ -684,22 +694,25 @@ namespace OpenSim.Region.CoreModules.World.Permissions
684 // gods have owner rights with Modify and Move always on 694 // gods have owner rights with Modify and Move always on
685 if(sp.IsGod) 695 if(sp.IsGod)
686 { 696 {
687 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, true); 697// returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, true);
688 returnMask |= EXTRAGODMASK; 698// returnMask |= EXTRAGODMASK;
689 return returnMask; 699// return returnMask;
700 return objflags | GOD_FLAGS;
690 } 701 }
691 702
703 SceneObjectGroup grp = task.ParentGroup;
704 bool unlocked = (grp.RootPart.OwnerMask & (uint)PermissionMask.Move) != 0;
705
692 //bypass option == owner rights 706 //bypass option == owner rights
693 if (m_bypassPermissions) 707 if (m_bypassPermissions)
694 { 708 {
695 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, true); 709 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, true); //??
696 returnMask |= EXTRAOWNERMASK; 710 returnMask |= EXTRAOWNERMASK;
697 if((returnMask & (uint)PrimFlags.ObjectModify) != 0) 711 if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
698 returnMask |= (uint)PrimFlags.ObjectOwnerModify; 712 returnMask |= (uint)PrimFlags.ObjectOwnerModify;
699 return returnMask; 713 return returnMask;
700 } 714 }
701 715
702 bool unlocked = (task.ParentGroup.RootPart.OwnerMask & (uint)PermissionMask.Move) != 0;
703 716
704 UUID taskOwnerID = task.OwnerID; 717 UUID taskOwnerID = task.OwnerID;
705 UUID spID = sp.UUID; 718 UUID spID = sp.UUID;
@@ -707,7 +720,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
707 // owner 720 // owner
708 if (spID == taskOwnerID) 721 if (spID == taskOwnerID)
709 { 722 {
710 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked); 723 returnMask = ApplyObjectModifyMasks(grp.EffectiveOwnerPerms, objflags, unlocked);
711 returnMask |= EXTRAOWNERMASK; 724 returnMask |= EXTRAOWNERMASK;
712 if((returnMask & (uint)PrimFlags.ObjectModify) != 0) 725 if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
713 returnMask |= (uint)PrimFlags.ObjectOwnerModify; 726 returnMask |= (uint)PrimFlags.ObjectOwnerModify;
@@ -717,7 +730,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
717 // if not god or owner, do attachments as everyone 730 // if not god or owner, do attachments as everyone
718 if(task.ParentGroup.IsAttachment) 731 if(task.ParentGroup.IsAttachment)
719 { 732 {
720 returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags, unlocked); 733 returnMask = ApplyObjectModifyMasks(grp.EffectiveEveryOnePerms, objflags, unlocked);
721 if (taskOwnerID != UUID.Zero) 734 if (taskOwnerID != UUID.Zero)
722 returnMask |= (uint)PrimFlags.ObjectAnyOwner; 735 returnMask |= (uint)PrimFlags.ObjectAnyOwner;
723 return returnMask; 736 return returnMask;
@@ -729,7 +742,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
729 // if friends with rights then owner 742 // if friends with rights then owner
730 if (!groupdOwned && IsFriendWithPerms(spID, taskOwnerID)) 743 if (!groupdOwned && IsFriendWithPerms(spID, taskOwnerID))
731 { 744 {
732 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked); 745 returnMask = ApplyObjectModifyMasks(grp.EffectiveOwnerPerms, objflags, unlocked);
733 returnMask |= EXTRAOWNERMASK; 746 returnMask |= EXTRAOWNERMASK;
734 if((returnMask & (uint)PrimFlags.ObjectModify) != 0) 747 if((returnMask & (uint)PrimFlags.ObjectModify) != 0)
735 returnMask |= (uint)PrimFlags.ObjectOwnerModify; 748 returnMask |= (uint)PrimFlags.ObjectOwnerModify;
@@ -745,7 +758,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
745 // object is owned by group, check role powers 758 // object is owned by group, check role powers
746 if((client.GetGroupPowers(taskGroupID) & (ulong)GroupPowers.ObjectManipulate) != 0) 759 if((client.GetGroupPowers(taskGroupID) & (ulong)GroupPowers.ObjectManipulate) != 0)
747 { 760 {
748 returnMask = ApplyObjectModifyMasks(task.OwnerMask, objflags, unlocked); 761 returnMask = ApplyObjectModifyMasks(grp.EffectiveOwnerPerms, objflags, unlocked);
749 returnMask |= 762 returnMask |=
750 (uint)PrimFlags.ObjectGroupOwned | 763 (uint)PrimFlags.ObjectGroupOwned |
751 (uint)PrimFlags.ObjectAnyOwner; 764 (uint)PrimFlags.ObjectAnyOwner;
@@ -756,7 +769,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
756 else 769 else
757 { 770 {
758 // group sharing or everyone 771 // group sharing or everyone
759 returnMask = ApplyObjectModifyMasks(task.GroupMask | task.EveryoneMask, objflags, unlocked); 772 returnMask = ApplyObjectModifyMasks(grp.EffectiveGroupOrEveryOnePerms, objflags, unlocked);
760 returnMask |= 773 returnMask |=
761 (uint)PrimFlags.ObjectGroupOwned | 774 (uint)PrimFlags.ObjectGroupOwned |
762 (uint)PrimFlags.ObjectAnyOwner; 775 (uint)PrimFlags.ObjectAnyOwner;
@@ -766,7 +779,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
766 else 779 else
767 { 780 {
768 // group sharing or everyone 781 // group sharing or everyone
769 returnMask = ApplyObjectModifyMasks(task.GroupMask | task.EveryoneMask, objflags, unlocked); 782 returnMask = ApplyObjectModifyMasks(grp.EffectiveGroupOrEveryOnePerms, objflags, unlocked);
770 if (taskOwnerID != UUID.Zero) 783 if (taskOwnerID != UUID.Zero)
771 returnMask |= (uint)PrimFlags.ObjectAnyOwner; 784 returnMask |= (uint)PrimFlags.ObjectAnyOwner;
772 return returnMask; 785 return returnMask;
@@ -774,7 +787,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
774 } 787 }
775 788
776 // fallback is everyone rights 789 // fallback is everyone rights
777 returnMask = ApplyObjectModifyMasks(task.EveryoneMask, objflags, unlocked); 790 returnMask = ApplyObjectModifyMasks(grp.EffectiveEveryOnePerms, objflags, unlocked);
778 if (taskOwnerID != UUID.Zero) 791 if (taskOwnerID != UUID.Zero)
779 returnMask |= (uint)PrimFlags.ObjectAnyOwner; 792 returnMask |= (uint)PrimFlags.ObjectAnyOwner;
780 return returnMask; 793 return returnMask;
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 0c4017e..2af6ff0 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -278,6 +278,11 @@ namespace OpenSim.Region.Framework.Interfaces
278 /// <param name="datastore"></param> 278 /// <param name="datastore"></param>
279 void ProcessInventoryBackup(ISimulationDataService datastore); 279 void ProcessInventoryBackup(ISimulationDataService datastore);
280 280
281 void AggregateEveryOnePerms(ref uint current);
282 void AggregateGroupOrEveryonePerms(ref uint current);
283 void AggregateGroupPerms(ref uint current);
284 void AggregateOwnerPerms(ref uint current);
285
281 uint MaskEffectivePermissions(); 286 uint MaskEffectivePermissions();
282 287
283 void ApplyNextOwnerPermissions(); 288 void ApplyNextOwnerPermissions();
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index 9f98554..f44604b 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -248,6 +248,183 @@ namespace OpenSim.Region.Framework.Scenes
248 return -1; 248 return -1;
249 } 249 }
250 250
251 // new test code, to place in better place later
252 private object PermissionsLock = new object();
253
254 private uint m_EffectiveEveryOnePerms;
255 public uint EffectiveEveryOnePerms
256 {
257 get
258 {
259 // this can't be done here but on every place where a change may happen (rez, (de)link, contents , perms, etc)
260 // bc this is on heavy duty code paths
261 // but for now we need to test the concept
262 AggregateEveryOnePerms();
263 return m_EffectiveEveryOnePerms;
264 }
265 }
266
267 public void AggregateEveryOnePerms()
268 {
269 lock(PermissionsLock)
270 {
271 // get object everyone permissions
272 uint baseperms = RootPart.EveryoneMask & (uint)PermissionMask.All;
273
274 if(baseperms == 0)
275 {
276 m_EffectiveEveryOnePerms = 0;
277 return;
278 }
279
280 uint current = baseperms;
281 SceneObjectPart[] parts = m_parts.GetArray();
282 for (int i = 0; i < parts.Length; i++)
283 {
284 SceneObjectPart part = parts[i];
285 part.Inventory.AggregateEveryOnePerms(ref current);
286 if( current == 0)
287 break;
288 }
289 // recover move
290 baseperms &= (uint)PermissionMask.Move;
291 current |= baseperms;
292 current &= (uint)PermissionMask.All;
293 m_EffectiveEveryOnePerms = current;
294 }
295 }
296
297 private uint m_EffectiveGroupPerms;
298 public uint EffectiveGroupPerms
299 {
300 get
301 {
302 // this can't be done here but on every place where a change may happen (rez, (de)link, contents , perms, etc)
303 // bc this is on heavy duty code paths
304 // but for now we need to test the concept
305 AggregateGroupPerms();
306 return m_EffectiveGroupPerms;
307 }
308 }
309
310 public void AggregateGroupPerms()
311 {
312 lock(PermissionsLock)
313 {
314 // get object everyone permissions
315 uint baseperms = RootPart.GroupMask & (uint)PermissionMask.All;
316
317 if(baseperms == 0)
318 {
319 m_EffectiveGroupPerms = 0;
320 return;
321 }
322
323 uint current = baseperms;
324 SceneObjectPart[] parts = m_parts.GetArray();
325 for (int i = 0; i < parts.Length; i++)
326 {
327 SceneObjectPart part = parts[i];
328 part.Inventory.AggregateGroupPerms(ref current);
329 if( current == 0)
330 break;
331 }
332 // recover modify and move
333 baseperms &= (uint)(PermissionMask.Move | PermissionMask.Modify );
334 current |= baseperms;
335 current &= (uint)PermissionMask.All;
336 m_EffectiveGroupPerms = current;
337 }
338 }
339
340 private uint m_EffectiveGroupOrEveryOnePerms;
341 public uint EffectiveGroupOrEveryOnePerms
342 {
343 get
344 {
345 // this can't be done here but on every place where a change may happen (rez, (de)link, contents , perms, etc)
346 // bc this is on heavy duty code paths
347 // but for now we need to test the concept
348 AggregateGroupOrEveryOnePerms();
349 return m_EffectiveGroupOrEveryOnePerms;
350 }
351 }
352
353 public void AggregateGroupOrEveryOnePerms()
354 {
355 lock(PermissionsLock)
356 {
357 // get object everyone permissions
358 uint baseperms = (RootPart.EveryoneMask | RootPart.GroupMask) & (uint)PermissionMask.All;
359
360 if(baseperms == 0)
361 {
362 m_EffectiveGroupOrEveryOnePerms = 0;
363 return;
364 }
365
366 uint current = baseperms;
367 SceneObjectPart[] parts = m_parts.GetArray();
368 for (int i = 0; i < parts.Length; i++)
369 {
370 SceneObjectPart part = parts[i];
371 part.Inventory.AggregateGroupOrEveryonePerms(ref current);
372 if( current == 0)
373 break;
374 }
375 // recover modify and move
376 baseperms &= (uint)(PermissionMask.Move | PermissionMask.Modify );
377 current |= baseperms;
378 current &= (uint)PermissionMask.All;
379 m_EffectiveGroupOrEveryOnePerms = current;
380 }
381 }
382
383 private uint m_EffectiveOwnerPerms;
384 public uint EffectiveOwnerPerms
385 {
386 get
387 {
388 // this can't be done here but on every place where a change may happen (rez, (de)link, contents , perms, etc)
389 // bc this is on heavy duty code paths
390 // but for now we need to test the concept
391 AggregateOwnerPerms();
392 return m_EffectiveOwnerPerms;
393 }
394 }
395
396 public void AggregateOwnerPerms()
397 {
398 lock(PermissionsLock)
399 {
400 // get object everyone permissions
401 uint baseperms = RootPart.OwnerMask & (uint)PermissionMask.All;
402
403 if(baseperms == 0)
404 {
405 m_EffectiveOwnerPerms = 0;
406 return;
407 }
408
409 uint current = baseperms;
410 SceneObjectPart[] parts = m_parts.GetArray();
411 for (int i = 0; i < parts.Length; i++)
412 {
413 SceneObjectPart part = parts[i];
414 part.Inventory.AggregateOwnerPerms(ref current);
415 if( current == 0)
416 break;
417 }
418 // recover modify and move
419 baseperms &= (uint)(PermissionMask.Move | PermissionMask.Modify );
420 current |= baseperms;
421 current &= (uint)PermissionMask.All;
422 if((current & (uint)(PermissionMask.Copy | PermissionMask.Transfer)) == 0)
423 current |= (uint)PermissionMask.Transfer;
424 m_EffectiveOwnerPerms = current;
425 }
426 }
427
251 public uint GetEffectivePermissions() 428 public uint GetEffectivePermissions()
252 { 429 {
253 return GetEffectivePermissions(false); 430 return GetEffectivePermissions(false);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 02b94ce..48ae39e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -944,7 +944,7 @@ namespace OpenSim.Region.Framework.Scenes
944 group.SetGroup(m_part.GroupID, null); 944 group.SetGroup(m_part.GroupID, null);
945 945
946 // TODO: Remove magic number badness 946 // TODO: Remove magic number badness
947 if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number 947 if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & (uint)PermissionMask.Slam) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number
948 { 948 {
949 if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions()) 949 if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions())
950 { 950 {
@@ -965,7 +965,7 @@ namespace OpenSim.Region.Framework.Scenes
965 foreach (SceneObjectPart part in partList) 965 foreach (SceneObjectPart part in partList)
966 { 966 {
967 // TODO: Remove magic number badness 967 // TODO: Remove magic number badness
968 if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number 968 if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & (uint)PermissionMask.Slam) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) // Magic number
969 { 969 {
970 part.LastOwnerID = part.OwnerID; 970 part.LastOwnerID = part.OwnerID;
971 part.OwnerID = item.OwnerID; 971 part.OwnerID = item.OwnerID;
@@ -1319,6 +1319,48 @@ namespace OpenSim.Region.Framework.Scenes
1319 } 1319 }
1320 } 1320 }
1321 1321
1322 // reduce to minimal set
1323 public void AggregateEveryOnePerms(ref uint current)
1324 {
1325 foreach (TaskInventoryItem item in m_items.Values)
1326 {
1327 current &= item.EveryonePermissions;
1328 if(current == 0)
1329 break;
1330 }
1331 }
1332
1333 public void AggregateGroupPerms(ref uint current)
1334 {
1335 foreach (TaskInventoryItem item in m_items.Values)
1336 {
1337 current &= item.GroupPermissions;
1338 if(current == 0)
1339 break;
1340 }
1341 }
1342
1343 public void AggregateGroupOrEveryonePerms(ref uint current)
1344 {
1345 foreach (TaskInventoryItem item in m_items.Values)
1346 {
1347 current &= (item.GroupPermissions | item.EveryonePermissions);
1348 if(current == 0)
1349 break;
1350 }
1351 }
1352
1353 public void AggregateOwnerPerms(ref uint current)
1354 {
1355 foreach (TaskInventoryItem item in m_items.Values)
1356 {
1357 current &= item.CurrentPermissions;
1358 if(current == 0)
1359 break;
1360 }
1361 }
1362
1363
1322 public uint MaskEffectivePermissions() 1364 public uint MaskEffectivePermissions()
1323 { 1365 {
1324 uint mask=0x7fffffff; 1366 uint mask=0x7fffffff;