aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Inventory.cs104
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs18
2 files changed, 101 insertions, 21 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 2ccb5dd..f58e27e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -384,29 +384,105 @@ namespace OpenSim.Region.Framework.Scenes
384 384
385 if (Permissions.PropagatePermissions() && recipient != senderId) 385 if (Permissions.PropagatePermissions() && recipient != senderId)
386 { 386 {
387 // First, make sore base is limited to the next perms 387 // Trying to do this right this time. This is evil. If
388 itemCopy.BasePermissions = item.BasePermissions & (item.NextPermissions | (uint)PermissionMask.Move); 388 // you believe in Good, go elsewhere. Vampires and other
389 // By default, current equals base 389 // evil creatores only beyond this point. You have been
390 itemCopy.CurrentPermissions = itemCopy.BasePermissions & item.CurrentPermissions; 390 // warned.
391 391
392 // If this is an object, replace current perms 392 // We're going to mask a lot of things by the next perms
393 // with folded perms 393 // Tweak the next perms to be nicer to our data
394 //
395 // In this mask, all the bits we do NOT want to mess
396 // with are set. These are:
397 //
398 // Transfer
399 // Copy
400 // Modufy
401 uint permsMask = ~ ((uint)PermissionMask.Copy |
402 (uint)PermissionMask.Transfer |
403 (uint)PermissionMask.Modify);
404
405 // Now, reduce the next perms to the mask bits
406 // relevant to the operation
407 uint nextPerms = permsMask | (item.NextPermissions &
408 ((uint)PermissionMask.Copy |
409 (uint)PermissionMask.Transfer |
410 (uint)PermissionMask.Modify));
411
412 // nextPerms now has all bits set, except for the actual
413 // next permission bits.
414
415 // This checks for no mod, no copy, no trans.
416 // This indicates an error or messed up item. Do it like
417 // SL and assume trans
418 if (nextPerms == permsMask)
419 nextPerms |= (uint)PermissionMask.Transfer;
420
421 // Inventory owner perms are the logical AND of the
422 // folded perms and the root prim perms, however, if
423 // the root prim is mod, the inventory perms will be
424 // mod. This happens on "take" and is of little concern
425 // here, save for preventing escalation
426
427 // This hack ensures that items previously permalocked
428 // get unlocked when they're passed or rezzed
429 uint basePerms = item.BasePermissions |
430 (uint)PermissionMask.Move;
431 uint ownerPerms = item.CurrentPermissions;
432
433 // If this is an object, root prim perms may be more
434 // permissive than folded perms. Use folded perms as
435 // a mask
394 if (item.InvType == (int)InventoryType.Object) 436 if (item.InvType == (int)InventoryType.Object)
395 { 437 {
396 itemCopy.CurrentPermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); 438 // Create a safe mask for the current perms
397 itemCopy.CurrentPermissions |= (item.CurrentPermissions & 7) << 13; 439 uint foldedPerms = (item.CurrentPermissions & 7) << 13;
440 foldedPerms |= permsMask;
441
442 bool isRootMod = (item.CurrentPermissions &
443 (uint)PermissionMask.Modify) != 0 ?
444 true : false;
445
446 // Mask the owner perms to the folded perms
447 ownerPerms &= foldedPerms;
448 basePerms &= foldedPerms;
449
450 // If the root was mod, let the mask reflect that
451 // We also need to adjust the base here, because
452 // we should be able to edit in-inventory perms
453 // for the root prim, if it's mod.
454 if (isRootMod)
455 {
456 ownerPerms |= (uint)PermissionMask.Modify;
457 basePerms |= (uint)PermissionMask.Modify;
458 }
398 } 459 }
399 460
400 // Ensure there is no escalation 461 // These will be applied to the root prim at next rez.
401 itemCopy.CurrentPermissions &= (item.NextPermissions | (uint)PermissionMask.Move); 462 // The slam bit (bit 3) and folded permission (bits 0-2)
463 // are preserved due to the above mangling
464 ownerPerms &= nextPerms;
402 465
403 // Need slam bit on xfer 466 // Mask the base permissions. This is a conservative
404 itemCopy.CurrentPermissions |= 8; 467 // approach altering only the three main perms
468 basePerms &= nextPerms;
469
470 // Assign to the actual item. Make sure the slam bit is
471 // set, if it wasn't set before.
472 itemCopy.BasePermissions = basePerms;
473 itemCopy.CurrentPermissions = ownerPerms | 16; // Slam
405 474
406 itemCopy.NextPermissions = item.NextPermissions; 475 itemCopy.NextPermissions = item.NextPermissions;
407 476
408 itemCopy.EveryOnePermissions = 0; 477 // This preserves "everyone can move"
478 itemCopy.EveryOnePermissions = item.EveryOnePermissions &
479 nextPerms;
480
481 // Intentionally killing "share with group" here, as
482 // the recipient will not have the group this is
483 // set to
409 itemCopy.GroupPermissions = 0; 484 itemCopy.GroupPermissions = 0;
485
410 } 486 }
411 else 487 else
412 { 488 {
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index f7e46af..f96573d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -281,7 +281,7 @@ namespace OpenSim.Region.Framework.Scenes
281 PermissionMask.Move | 281 PermissionMask.Move |
282 PermissionMask.Transfer) | 7; 282 PermissionMask.Transfer) | 7;
283 283
284 uint ownerMask = 0x7ffffff; 284 uint ownerMask = 0x7fffffff;
285 foreach (SceneObjectPart part in m_parts.Values) 285 foreach (SceneObjectPart part in m_parts.Values)
286 { 286 {
287 ownerMask &= part.OwnerMask; 287 ownerMask &= part.OwnerMask;
@@ -295,12 +295,16 @@ namespace OpenSim.Region.Framework.Scenes
295 if ((ownerMask & (uint)PermissionMask.Transfer) == 0) 295 if ((ownerMask & (uint)PermissionMask.Transfer) == 0)
296 perms &= ~(uint)PermissionMask.Transfer; 296 perms &= ~(uint)PermissionMask.Transfer;
297 297
298 if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Modify) == 0) 298 // If root prim permissions are applied here, this would screw
299 perms &= ~((uint)PermissionMask.Modify >> 13); 299 // with in-inventory manipulation of the next owner perms
300 if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Copy) == 0) 300 // in a major way. So, let's move this to the give itself.
301 perms &= ~((uint)PermissionMask.Copy >> 13); 301 // Yes. I know. Evil.
302 if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Transfer) == 0) 302// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Modify) == 0)
303 perms &= ~((uint)PermissionMask.Transfer >> 13); 303// perms &= ~((uint)PermissionMask.Modify >> 13);
304// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Copy) == 0)
305// perms &= ~((uint)PermissionMask.Copy >> 13);
306// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Transfer) == 0)
307// perms &= ~((uint)PermissionMask.Transfer >> 13);
304 308
305 return perms; 309 return perms;
306 } 310 }