diff options
author | Melanie | 2010-07-13 20:45:16 +0100 |
---|---|---|
committer | Melanie | 2010-07-13 20:45:16 +0100 |
commit | dd14016885d9c9a411ffc19b0afb0a6771d47cad (patch) | |
tree | 872758572e7aa7322965d4f0cbbc8b1fa52b307a /OpenSim/Region/Framework | |
parent | Add CreateSelected flag onto objects rezzed from inventory (diff) | |
download | opensim-SC_OLD-dd14016885d9c9a411ffc19b0afb0a6771d47cad.zip opensim-SC_OLD-dd14016885d9c9a411ffc19b0afb0a6771d47cad.tar.gz opensim-SC_OLD-dd14016885d9c9a411ffc19b0afb0a6771d47cad.tar.bz2 opensim-SC_OLD-dd14016885d9c9a411ffc19b0afb0a6771d47cad.tar.xz |
Revamp the permissions propagation. This MAY mess up. Please test.
Change the slam bit from 3 to 4. Assume the old slam bit is always set.
The new slam bit is a "changed owner" bit, correcting a bug where an item
passed from the creator to another with less than full perms, then back (sale
test) would arrive back full perm. Lots of in-code docs.
Diffstat (limited to 'OpenSim/Region/Framework')
4 files changed, 103 insertions, 39 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 9ba13ae..34461dc 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -265,6 +265,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
265 | public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, | 265 | public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID, |
266 | UUID itemID, InventoryItemBase itemUpd) | 266 | UUID itemID, InventoryItemBase itemUpd) |
267 | { | 267 | { |
268 | // This one will let people set next perms on items in agent | ||
269 | // inventory. Rut-Roh. Whatever. Make this secure. Yeah. | ||
270 | // | ||
271 | // Passing something to another avatar or a an object will already | ||
268 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | 272 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); |
269 | item = InventoryService.GetItem(item); | 273 | item = InventoryService.GetItem(item); |
270 | 274 | ||
@@ -274,11 +278,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
274 | { | 278 | { |
275 | item.Name = itemUpd.Name; | 279 | item.Name = itemUpd.Name; |
276 | item.Description = itemUpd.Description; | 280 | item.Description = itemUpd.Description; |
277 | item.NextPermissions = itemUpd.NextPermissions; | 281 | item.NextPermissions = itemUpd.NextPermissions & item.BasePermissions; |
278 | item.CurrentPermissions |= 8; // Slam! | 282 | item.EveryOnePermissions = itemUpd.EveryOnePermissions & item.BasePermissions; |
279 | item.EveryOnePermissions = itemUpd.EveryOnePermissions; | 283 | item.GroupPermissions = itemUpd.GroupPermissions & item.BasePermissions; |
280 | item.GroupPermissions = itemUpd.GroupPermissions; | ||
281 | |||
282 | item.GroupID = itemUpd.GroupID; | 284 | item.GroupID = itemUpd.GroupID; |
283 | item.GroupOwned = itemUpd.GroupOwned; | 285 | item.GroupOwned = itemUpd.GroupOwned; |
284 | item.CreationDate = itemUpd.CreationDate; | 286 | item.CreationDate = itemUpd.CreationDate; |
@@ -384,28 +386,96 @@ namespace OpenSim.Region.Framework.Scenes | |||
384 | 386 | ||
385 | if (Permissions.PropagatePermissions() && recipient != senderId) | 387 | if (Permissions.PropagatePermissions() && recipient != senderId) |
386 | { | 388 | { |
387 | // First, make sore base is limited to the next perms | 389 | // Trying to do this right this time. This is evil. If |
388 | itemCopy.BasePermissions = item.BasePermissions & (item.NextPermissions | (uint)PermissionMask.Move); | 390 | // you believe in Good, go elsewhere. Vampires and other |
389 | // By default, current equals base | 391 | // evil creatores only beyond this point. You have been |
390 | itemCopy.CurrentPermissions = itemCopy.BasePermissions & item.CurrentPermissions; | 392 | // warned. |
391 | 393 | ||
392 | // If this is an object, replace current perms | 394 | // We're going to mask a lot of things by the next perms |
393 | // with folded perms | 395 | // Tweak the next perms to be nicer to our data |
396 | // | ||
397 | // In this mask, all the bits we do NOT want to mess | ||
398 | // with are set. These are: | ||
399 | // | ||
400 | // Transfer | ||
401 | // Copy | ||
402 | // Modufy | ||
403 | uint permsMask = ~ ((uint)PermissionMask.Copy | | ||
404 | (uint)PermissionMask.Transfer | | ||
405 | (uint)PermissionMask.Modify); | ||
406 | |||
407 | // Now, reduce the next perms to the mask bits | ||
408 | // relevant to the operation | ||
409 | uint nextPerms = permsMask | (item.NextPermissions & | ||
410 | ((uint)PermissionMask.Copy | | ||
411 | (uint)PermissionMask.Transfer | | ||
412 | (uint)PermissionMask.Modify)); | ||
413 | |||
414 | // nextPerms now has all bits set, except for the actual | ||
415 | // next permission bits. | ||
416 | |||
417 | // This checks for no mod, no copy, no trans. | ||
418 | // This indicates an error or messed up item. Do it like | ||
419 | // SL and assume trans | ||
420 | if (nextPerms == permsMask) | ||
421 | nextPerms |= (uint)PermissionMask.Transfer; | ||
422 | |||
423 | // Inventory owner perms are the logical AND of the | ||
424 | // folded perms and the root prim perms, however, if | ||
425 | // the root prim is mod, the inventory perms will be | ||
426 | // mod. This happens on "take" and is of little concern | ||
427 | // here, save for preventing escalation | ||
428 | |||
429 | // This hack ensures that items previously permalocked | ||
430 | // get unlocked when they're passed or rezzed | ||
431 | uint basePerms = item.BasePermissions | | ||
432 | (uint)PermissionMask.Move; | ||
433 | uint ownerPerms = item.CurrentPermissions; | ||
434 | |||
435 | // Mask the base permissions. This is a conservative | ||
436 | // approach altering only the three main perms | ||
437 | basePerms &= nextPerms; | ||
438 | |||
439 | // If this is an object, root prim perms may be more | ||
440 | // permissive than folded perms. Use folded perms as | ||
441 | // a mask | ||
394 | if (item.InvType == (int)InventoryType.Object) | 442 | if (item.InvType == (int)InventoryType.Object) |
395 | { | 443 | { |
396 | itemCopy.CurrentPermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer); | 444 | // Create a safe mask for the current perms |
397 | itemCopy.CurrentPermissions |= (item.CurrentPermissions & 7) << 13; | 445 | uint foldedPerms = (item.CurrentPermissions & 7) << 13; |
446 | foldedPerms |= permsMask; | ||
447 | |||
448 | bool isRootMod = (item.CurrentPermissions & | ||
449 | (uint)PermissionMask.Modify) != 0 ? | ||
450 | true : false; | ||
451 | |||
452 | // Mask the owner perms to the folded perms | ||
453 | ownerPerms &= foldedPerms; | ||
454 | |||
455 | // If the root was mod, let the mask reflect that | ||
456 | if (isRootMod) | ||
457 | ownerPerms |= (uint)PermissionMask.Modify; | ||
398 | } | 458 | } |
399 | 459 | ||
400 | // Ensure there is no escalation | 460 | // These will be applied to the root prim at next rez. |
401 | itemCopy.CurrentPermissions &= (item.NextPermissions | (uint)PermissionMask.Move); | 461 | // The slam bit (bit 3) and folded permission (bits 0-2) |
462 | // are preserved due to the above mangling | ||
463 | ownerPerms &= nextPerms; | ||
402 | 464 | ||
403 | // Need slam bit on xfer | 465 | // Assign to the actual item. Make sure the slam bit is |
404 | itemCopy.CurrentPermissions |= 8; | 466 | // set, if it wasn't set before. |
467 | itemCopy.BasePermissions = basePerms; | ||
468 | itemCopy.CurrentPermissions = ownerPerms | 16; // Slam | ||
405 | 469 | ||
406 | itemCopy.NextPermissions = item.NextPermissions; | 470 | itemCopy.NextPermissions = item.NextPermissions; |
407 | 471 | ||
408 | itemCopy.EveryOnePermissions = 0; | 472 | // This preserves "everyone can move" |
473 | itemCopy.EveryOnePermissions = item.EveryOnePermissions & | ||
474 | nextPerms; | ||
475 | |||
476 | // Intentionally killing "share with group" here, as | ||
477 | // the recipient will not have the group this is | ||
478 | // set to | ||
409 | itemCopy.GroupPermissions = 0; | 479 | itemCopy.GroupPermissions = 0; |
410 | } | 480 | } |
411 | else | 481 | else |
@@ -903,7 +973,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
903 | else | 973 | else |
904 | agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions; | 974 | agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions; |
905 | 975 | ||
906 | agentItem.CurrentPermissions |= 8; | 976 | agentItem.CurrentPermissions |= 16; // Slam |
907 | agentItem.NextPermissions = taskItem.NextPermissions; | 977 | agentItem.NextPermissions = taskItem.NextPermissions; |
908 | agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move); | 978 | agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move); |
909 | agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions; | 979 | agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions; |
@@ -1094,7 +1164,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1094 | (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); | 1164 | (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); |
1095 | destTaskItem.BasePermissions = srcTaskItem.BasePermissions & | 1165 | destTaskItem.BasePermissions = srcTaskItem.BasePermissions & |
1096 | (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); | 1166 | (srcTaskItem.NextPermissions | (uint)PermissionMask.Move); |
1097 | destTaskItem.CurrentPermissions |= 8; // Slam! | 1167 | destTaskItem.CurrentPermissions |= 16; // Slam! |
1098 | } | 1168 | } |
1099 | } | 1169 | } |
1100 | 1170 | ||
@@ -1478,7 +1548,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1478 | srcTaskItem.NextPermissions; | 1548 | srcTaskItem.NextPermissions; |
1479 | destTaskItem.BasePermissions = srcTaskItem.BasePermissions & | 1549 | destTaskItem.BasePermissions = srcTaskItem.BasePermissions & |
1480 | srcTaskItem.NextPermissions; | 1550 | srcTaskItem.NextPermissions; |
1481 | destTaskItem.CurrentPermissions |= 8; // Slam! | 1551 | destTaskItem.CurrentPermissions |= 16; // Slam! |
1482 | } | 1552 | } |
1483 | } | 1553 | } |
1484 | 1554 | ||
@@ -1864,17 +1934,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1864 | 1934 | ||
1865 | group.SetGroup(sourcePart.GroupID, null); | 1935 | group.SetGroup(sourcePart.GroupID, null); |
1866 | 1936 | ||
1867 | if (rootPart.OwnerID != item.OwnerID) | 1937 | if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) |
1868 | { | 1938 | { |
1869 | if (Permissions.PropagatePermissions()) | 1939 | if (Permissions.PropagatePermissions()) |
1870 | { | 1940 | { |
1871 | if ((item.CurrentPermissions & 8) != 0) | 1941 | foreach (SceneObjectPart part in partList) |
1872 | { | 1942 | { |
1873 | foreach (SceneObjectPart part in partList) | 1943 | part.EveryoneMask = item.EveryonePermissions; |
1874 | { | 1944 | part.NextOwnerMask = item.NextPermissions; |
1875 | part.EveryoneMask = item.EveryonePermissions; | ||
1876 | part.NextOwnerMask = item.NextPermissions; | ||
1877 | } | ||
1878 | } | 1945 | } |
1879 | group.ApplyNextOwnerPermissions(); | 1946 | group.ApplyNextOwnerPermissions(); |
1880 | } | 1947 | } |
@@ -1882,17 +1949,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1882 | 1949 | ||
1883 | foreach (SceneObjectPart part in partList) | 1950 | foreach (SceneObjectPart part in partList) |
1884 | { | 1951 | { |
1885 | if (part.OwnerID != item.OwnerID) | 1952 | if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) |
1886 | { | 1953 | { |
1887 | part.LastOwnerID = part.OwnerID; | 1954 | part.LastOwnerID = part.OwnerID; |
1888 | part.OwnerID = item.OwnerID; | 1955 | part.OwnerID = item.OwnerID; |
1889 | part.Inventory.ChangeInventoryOwner(item.OwnerID); | 1956 | part.Inventory.ChangeInventoryOwner(item.OwnerID); |
1890 | } | 1957 | } |
1891 | else if ((item.CurrentPermissions & 8) != 0) // Slam! | 1958 | part.EveryoneMask = item.EveryonePermissions; |
1892 | { | 1959 | part.NextOwnerMask = item.NextPermissions; |
1893 | part.EveryoneMask = item.EveryonePermissions; | ||
1894 | part.NextOwnerMask = item.NextPermissions; | ||
1895 | } | ||
1896 | } | 1960 | } |
1897 | 1961 | ||
1898 | rootPart.TrimPermissions(); | 1962 | rootPart.TrimPermissions(); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index e2ab643..f7d2d37 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -4731,7 +4731,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4731 | part.NextOwnerMask; | 4731 | part.NextOwnerMask; |
4732 | item.GroupPermissions = part.GroupMask & | 4732 | item.GroupPermissions = part.GroupMask & |
4733 | part.NextOwnerMask; | 4733 | part.NextOwnerMask; |
4734 | item.CurrentPermissions |= 8; // Slam! | 4734 | item.CurrentPermissions |= 16; // Slam! |
4735 | item.CreationDate = Util.UnixTimeSinceEpoch(); | 4735 | item.CreationDate = Util.UnixTimeSinceEpoch(); |
4736 | 4736 | ||
4737 | if (InventoryService.AddItem(item)) | 4737 | if (InventoryService.AddItem(item)) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs index f7e46af..55d2e32 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs | |||
@@ -172,13 +172,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
172 | taskItem.GroupPermissions = item.GroupPermissions & | 172 | taskItem.GroupPermissions = item.GroupPermissions & |
173 | item.NextPermissions; | 173 | item.NextPermissions; |
174 | taskItem.NextPermissions = item.NextPermissions; | 174 | taskItem.NextPermissions = item.NextPermissions; |
175 | taskItem.CurrentPermissions |= 8; | 175 | // We're adding this to a prim we don't own. Force |
176 | // owner change | ||
177 | taskItem.CurrentPermissions |= 16; // Slam | ||
176 | } | 178 | } |
177 | else | 179 | else |
178 | { | 180 | { |
179 | taskItem.BasePermissions = item.BasePermissions; | 181 | taskItem.BasePermissions = item.BasePermissions; |
180 | taskItem.CurrentPermissions = item.CurrentPermissions; | 182 | taskItem.CurrentPermissions = item.CurrentPermissions; |
181 | taskItem.CurrentPermissions |= 8; | ||
182 | taskItem.EveryonePermissions = item.EveryOnePermissions; | 183 | taskItem.EveryonePermissions = item.EveryOnePermissions; |
183 | taskItem.GroupPermissions = item.GroupPermissions; | 184 | taskItem.GroupPermissions = item.GroupPermissions; |
184 | taskItem.NextPermissions = item.NextPermissions; | 185 | taskItem.NextPermissions = item.NextPermissions; |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 3a8f168..cabcf37 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -952,7 +952,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
952 | item.CurrentPermissions &= ~(uint)PermissionMask.Transfer; | 952 | item.CurrentPermissions &= ~(uint)PermissionMask.Transfer; |
953 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) | 953 | if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0) |
954 | item.CurrentPermissions &= ~(uint)PermissionMask.Modify; | 954 | item.CurrentPermissions &= ~(uint)PermissionMask.Modify; |
955 | item.CurrentPermissions |= 8; | ||
956 | } | 955 | } |
957 | item.CurrentPermissions &= item.NextPermissions; | 956 | item.CurrentPermissions &= item.NextPermissions; |
958 | item.BasePermissions &= item.NextPermissions; | 957 | item.BasePermissions &= item.NextPermissions; |