fix merge
commit
832ca518d7
|
@ -3087,15 +3087,13 @@ namespace OpenSim.ApplicationPlugins.RemoteController
|
|||
/// </summary>
|
||||
private void ApplyNextOwnerPermissions(InventoryItemBase item)
|
||||
{
|
||||
if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
|
||||
if (item.InvType == (int)InventoryType.Object)
|
||||
{
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
|
||||
uint perms = item.CurrentPermissions;
|
||||
PermissionsUtil.ApplyFoldedPermissions(item.CurrentPermissions, ref perms);
|
||||
item.CurrentPermissions = perms;
|
||||
}
|
||||
|
||||
item.CurrentPermissions &= item.NextPermissions;
|
||||
item.BasePermissions &= item.NextPermissions;
|
||||
item.EveryOnePermissions &= item.NextPermissions;
|
||||
|
|
|
@ -60,9 +60,57 @@ namespace OpenSim.Framework
|
|||
str += "C";
|
||||
if ((perms & (int)PermissionMask.Transfer) != 0)
|
||||
str += "T";
|
||||
if ((perms & (int)PermissionMask.Export) != 0)
|
||||
str += "X";
|
||||
if (str == "")
|
||||
str = ".";
|
||||
return str;
|
||||
}
|
||||
|
||||
public static void ApplyFoldedPermissions(uint foldedSourcePerms, ref uint targetPerms)
|
||||
{
|
||||
uint folded = foldedSourcePerms & (uint)PermissionMask.FoldedMask;
|
||||
if(folded == 0 || folded == (uint)PermissionMask.FoldedMask) // invalid we need to ignore, or nothing to do
|
||||
return;
|
||||
|
||||
folded <<= (int)PermissionMask.FoldingShift;
|
||||
folded |= ~(uint)PermissionMask.UnfoldedMask;
|
||||
|
||||
uint tmp = targetPerms;
|
||||
tmp &= folded;
|
||||
targetPerms = tmp;
|
||||
}
|
||||
|
||||
// do not touch MOD
|
||||
public static void ApplyNoModFoldedPermissions(uint foldedSourcePerms, ref uint target)
|
||||
{
|
||||
uint folded = foldedSourcePerms & (uint)PermissionMask.FoldedMask;
|
||||
if(folded == 0 || folded == (uint)PermissionMask.FoldedMask) // invalid we need to ignore, or nothing to do
|
||||
return;
|
||||
|
||||
folded <<= (int)PermissionMask.FoldingShift;
|
||||
folded |= (~(uint)PermissionMask.UnfoldedMask | (uint)PermissionMask.Modify);
|
||||
|
||||
uint tmp = target;
|
||||
tmp &= folded;
|
||||
target = tmp;
|
||||
}
|
||||
|
||||
public static uint FixAndFoldPermissions(uint perms)
|
||||
{
|
||||
uint tmp = perms;
|
||||
|
||||
// C & T rule
|
||||
if((tmp & (uint)(PermissionMask.Copy | PermissionMask.Transfer)) == 0)
|
||||
tmp |= (uint)PermissionMask.Transfer;
|
||||
|
||||
// unlock
|
||||
tmp |= (uint)PermissionMask.Move;
|
||||
|
||||
tmp &= ~(uint)PermissionMask.FoldedMask;
|
||||
tmp |= ((tmp >> (int)PermissionMask.FoldingShift) & (uint)PermissionMask.FoldedMask);
|
||||
|
||||
return tmp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -191,8 +191,7 @@ namespace OpenSim.Framework.Servers
|
|||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
m_log.FatalFormat("Fatal error: {0}",
|
||||
(e.Message == null || e.Message == String.Empty) ? "Unknown reason":e.Message );
|
||||
m_log.Fatal("Fatal error: " + e.ToString());
|
||||
Environment.Exit(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -79,7 +79,9 @@ namespace OpenSim.Framework
|
|||
|
||||
FoldedMask = 0x0f,
|
||||
|
||||
//
|
||||
FoldingShift = 13 , // number of bit shifts from normal perm to folded or back (same as Transfer shift below)
|
||||
// when doing as a block
|
||||
|
||||
Transfer = 1 << 13, // 0x02000
|
||||
Modify = 1 << 14, // 0x04000
|
||||
Copy = 1 << 15, // 0x08000
|
||||
|
@ -90,7 +92,8 @@ namespace OpenSim.Framework
|
|||
// explicitly given
|
||||
All = 0x8e000,
|
||||
AllAndExport = 0x9e000,
|
||||
AllEffective = 0x9e000
|
||||
AllEffective = 0x9e000,
|
||||
UnfoldedMask = 0x1e000
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
@ -237,7 +237,7 @@ namespace OpenSim
|
|||
string permissionModules = Util.GetConfigVarFromSections<string>(Config, "permissionmodules",
|
||||
new string[] { "Startup", "Permissions" }, "DefaultPermissionsModule");
|
||||
|
||||
m_permsModules = new List<string>(permissionModules.Split(','));
|
||||
m_permsModules = new List<string>(permissionModules.Split(',').Select(m => m.Trim()));
|
||||
|
||||
managedStatsURI = startupConfig.GetString("ManagedStatsRemoteFetchURI", String.Empty);
|
||||
managedStatsPassword = startupConfig.GetString("ManagedStatsRemoteFetchPassword", String.Empty);
|
||||
|
|
|
@ -212,6 +212,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
if (m_Scene.TryGetScenePresence(remoteClient.AgentId, out presence))
|
||||
{
|
||||
byte[] data = null;
|
||||
uint everyonemask = 0;
|
||||
uint groupmask = 0;
|
||||
|
||||
if (invType == (sbyte)InventoryType.Landmark && presence != null)
|
||||
{
|
||||
|
@ -220,6 +222,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
data = Encoding.ASCII.GetBytes(strdata);
|
||||
name = prefix + name;
|
||||
description += suffix;
|
||||
groupmask = (uint)PermissionMask.AllAndExport;
|
||||
everyonemask = (uint)(PermissionMask.AllAndExport & ~PermissionMask.Modify);
|
||||
}
|
||||
|
||||
AssetBase asset = m_Scene.CreateAsset(name, description, assetType, data, remoteClient.AgentId);
|
||||
|
@ -227,9 +231,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
m_Scene.CreateNewInventoryItem(
|
||||
remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID,
|
||||
name, description, 0, callbackID, asset.FullID, asset.Type, invType,
|
||||
(uint)PermissionMask.All | (uint)PermissionMask.Export, // Base
|
||||
(uint)PermissionMask.All | (uint)PermissionMask.Export, // Current
|
||||
0, nextOwnerMask, 0, creationDate, false); // Data from viewer
|
||||
(uint)PermissionMask.AllAndExport, // Base
|
||||
(uint)PermissionMask.AllAndExport, // Current
|
||||
everyonemask,
|
||||
nextOwnerMask, groupmask, creationDate, false); // Data from viewer
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -573,41 +578,27 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
InventoryItemBase item, SceneObjectGroup so, List<SceneObjectGroup> objsForEffectivePermissions,
|
||||
IClientAPI remoteClient)
|
||||
{
|
||||
uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7;
|
||||
uint allObjectsNextOwnerPerms = 0x7fffffff;
|
||||
|
||||
// For the porposes of inventory, an object is modify if the prims
|
||||
// are modify. This allows renaming an object that contains no
|
||||
// mod items.
|
||||
uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export | PermissionMask.FoldedMask);
|
||||
|
||||
foreach (SceneObjectGroup grp in objsForEffectivePermissions)
|
||||
{
|
||||
uint groupPerms = grp.GetEffectivePermissions(true);
|
||||
if ((grp.RootPart.BaseMask & (uint)PermissionMask.Modify) != 0)
|
||||
groupPerms |= (uint)PermissionMask.Modify;
|
||||
|
||||
effectivePerms &= groupPerms;
|
||||
effectivePerms &= grp.CurrentAndFoldedNextPermissions();
|
||||
}
|
||||
effectivePerms |= (uint)PermissionMask.Move;
|
||||
|
||||
|
||||
if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions())
|
||||
{
|
||||
uint perms = effectivePerms;
|
||||
uint nextPerms = (perms & 7) << 13;
|
||||
if ((nextPerms & (uint)PermissionMask.Copy) == 0)
|
||||
perms &= ~(uint)PermissionMask.Copy;
|
||||
if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
|
||||
perms &= ~(uint)PermissionMask.Transfer;
|
||||
if ((nextPerms & (uint)PermissionMask.Modify) == 0)
|
||||
perms &= ~(uint)PermissionMask.Modify;
|
||||
|
||||
// item.BasePermissions = perms & so.RootPart.NextOwnerMask;
|
||||
|
||||
uint nextp = so.RootPart.NextOwnerMask | (uint)PermissionMask.FoldedMask;
|
||||
item.BasePermissions = perms & nextp;
|
||||
item.CurrentPermissions = item.BasePermissions;
|
||||
item.NextPermissions = perms & so.RootPart.NextOwnerMask;
|
||||
item.EveryOnePermissions = so.RootPart.EveryoneMask & so.RootPart.NextOwnerMask;
|
||||
item.GroupPermissions = so.RootPart.GroupMask & so.RootPart.NextOwnerMask;
|
||||
// apply parts inventory items next owner
|
||||
PermissionsUtil.ApplyNoModFoldedPermissions(effectivePerms, ref effectivePerms);
|
||||
// change to next owner
|
||||
uint basePerms = effectivePerms & so.RootPart.NextOwnerMask;
|
||||
// fix and update folded
|
||||
basePerms = PermissionsUtil.FixAndFoldPermissions(basePerms);
|
||||
|
||||
item.BasePermissions = basePerms;
|
||||
item.CurrentPermissions = basePerms;
|
||||
item.NextPermissions = basePerms & so.RootPart.NextOwnerMask;
|
||||
item.EveryOnePermissions = basePerms & so.RootPart.EveryoneMask;
|
||||
item.GroupPermissions = basePerms & so.RootPart.GroupMask;
|
||||
|
||||
// apply next owner perms on rez
|
||||
item.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm;
|
||||
|
@ -626,7 +617,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
(uint)PermissionMask.Modify |
|
||||
(uint)PermissionMask.Move |
|
||||
(uint)PermissionMask.Export |
|
||||
7); // Preserve folded permissions
|
||||
(uint)PermissionMask.FoldedMask); // Preserve folded permissions ??
|
||||
}
|
||||
|
||||
return item;
|
||||
|
@ -1144,9 +1135,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
|
|||
if ((item.BasePermissions & (uint)PermissionMask.FoldedMask) != 0)
|
||||
{
|
||||
// We have permissions stored there so use them
|
||||
part.NextOwnerMask = ((item.BasePermissions & 7) << 13);
|
||||
if ((item.BasePermissions & (uint)PermissionMask.FoldedExport) != 0)
|
||||
part.NextOwnerMask |= (uint)PermissionMask.Export;
|
||||
part.NextOwnerMask = ((item.BasePermissions & (uint)PermissionMask.FoldedMask) << (int)PermissionMask.FoldingShift);
|
||||
part.NextOwnerMask |= (uint)PermissionMask.Move;
|
||||
}
|
||||
else
|
||||
|
|
|
@ -223,20 +223,16 @@ namespace OpenSim.Region.CoreModules.Scripting.HttpRequest
|
|||
if (parms.Length - i < 2)
|
||||
break;
|
||||
|
||||
//Have we reached the end of the list of headers?
|
||||
//End is marked by a string with a single digit.
|
||||
//We already know we have at least one parameter
|
||||
//so it is safe to do this check at top of loop.
|
||||
if (Char.IsDigit(parms[i][0]))
|
||||
break;
|
||||
|
||||
if (htc.HttpCustomHeaders == null)
|
||||
htc.HttpCustomHeaders = new List<string>();
|
||||
|
||||
htc.HttpCustomHeaders.Add(parms[i]);
|
||||
htc.HttpCustomHeaders.Add(parms[i+1]);
|
||||
int nexti = i + 2;
|
||||
if (nexti >= parms.Length || Char.IsDigit(parms[nexti][0]))
|
||||
break;
|
||||
|
||||
i += 2;
|
||||
i = nexti;
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -26,15 +26,15 @@
|
|||
*/
|
||||
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections;
|
||||
using System.Reflection;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using log4net;
|
||||
using Mono.Addins;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Framework.Servers;
|
||||
using OpenSim.Framework.Servers.HttpServer;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
|
@ -89,6 +89,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
|||
protected Dictionary<string, UrlData> m_UrlMap =
|
||||
new Dictionary<string, UrlData>();
|
||||
|
||||
protected bool m_enabled = false;
|
||||
protected string m_ErrorStr;
|
||||
protected uint m_HttpsPort = 0;
|
||||
protected IHttpServer m_HttpServer = null;
|
||||
protected IHttpServer m_HttpsServer = null;
|
||||
|
@ -118,6 +120,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
|||
public void Initialise(IConfigSource config)
|
||||
{
|
||||
IConfig networkConfig = config.Configs["Network"];
|
||||
m_enabled = false;
|
||||
|
||||
if (networkConfig != null)
|
||||
{
|
||||
|
@ -128,9 +131,47 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
|||
if (ssl_enabled)
|
||||
m_HttpsPort = (uint)config.Configs["Network"].GetInt("https_port", (int)m_HttpsPort);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_ErrorStr = "[Network] configuration missing, HTTP listener for LSL disabled";
|
||||
m_log.Warn("[URL MODULE]: " + m_ErrorStr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ExternalHostNameForLSL == null)
|
||||
ExternalHostNameForLSL = System.Environment.MachineName;
|
||||
if (String.IsNullOrWhiteSpace(ExternalHostNameForLSL))
|
||||
{
|
||||
m_ErrorStr = "ExternalHostNameForLSL not defined in configuration, HTTP listener for LSL disabled";
|
||||
m_log.Warn("[URL MODULE]: " + m_ErrorStr);
|
||||
return;
|
||||
}
|
||||
|
||||
IPAddress ia = null;
|
||||
try
|
||||
{
|
||||
foreach (IPAddress Adr in Dns.GetHostAddresses(ExternalHostNameForLSL))
|
||||
{
|
||||
if (Adr.AddressFamily == AddressFamily.InterNetwork ||
|
||||
Adr.AddressFamily == AddressFamily.InterNetworkV6) // ipv6 will most likely smoke
|
||||
{
|
||||
ia = Adr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
ia = null;
|
||||
}
|
||||
|
||||
if (ia == null)
|
||||
{
|
||||
m_ErrorStr = "Could not resolve ExternalHostNameForLSL, HTTP listener for LSL disabled";
|
||||
m_log.Warn("[URL MODULE]: " + m_ErrorStr);
|
||||
return;
|
||||
}
|
||||
|
||||
m_enabled = true;
|
||||
m_ErrorStr = String.Empty;
|
||||
|
||||
IConfig llFunctionsConfig = config.Configs["LL-Functions"];
|
||||
|
||||
|
@ -146,7 +187,7 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
|||
|
||||
public void AddRegion(Scene scene)
|
||||
{
|
||||
if (m_HttpServer == null)
|
||||
if (m_enabled && m_HttpServer == null)
|
||||
{
|
||||
// There can only be one
|
||||
//
|
||||
|
@ -197,11 +238,18 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
|||
{
|
||||
UUID urlcode = UUID.Random();
|
||||
|
||||
if(!m_enabled)
|
||||
{
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", m_ErrorStr });
|
||||
return urlcode;
|
||||
}
|
||||
|
||||
lock (m_UrlMap)
|
||||
{
|
||||
if (m_UrlMap.Count >= TotalUrls)
|
||||
{
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED",
|
||||
"Too many URLs already open" });
|
||||
return urlcode;
|
||||
}
|
||||
string url = "http://" + ExternalHostNameForLSL + ":" + m_HttpServer.Port.ToString() + "/lslhttp/" + urlcode.ToString() + "/";
|
||||
|
@ -243,6 +291,12 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
|||
{
|
||||
UUID urlcode = UUID.Random();
|
||||
|
||||
if(!m_enabled)
|
||||
{
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", m_ErrorStr });
|
||||
return urlcode;
|
||||
}
|
||||
|
||||
if (m_HttpsServer == null)
|
||||
{
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
|
||||
|
@ -253,7 +307,8 @@ namespace OpenSim.Region.CoreModules.Scripting.LSLHttp
|
|||
{
|
||||
if (m_UrlMap.Count >= TotalUrls)
|
||||
{
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED", "" });
|
||||
engine.PostScriptEvent(itemID, "http_request", new Object[] { urlcode.ToString(), "URL_REQUEST_DENIED",
|
||||
"Too many URLs already open" });
|
||||
return urlcode;
|
||||
}
|
||||
string url = "https://" + ExternalHostNameForLSL + ":" + m_HttpsServer.Port.ToString() + "/lslhttps/" + urlcode.ToString() + "/";
|
||||
|
|
|
@ -113,7 +113,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
|||
// wrap this in a try block so that defaults will work if
|
||||
// the config file doesn't specify otherwise.
|
||||
int maxlisteners = 1000;
|
||||
int maxhandles = 64;
|
||||
int maxhandles = 65;
|
||||
try
|
||||
{
|
||||
m_whisperdistance = config.Configs["Chat"].GetInt(
|
||||
|
@ -130,8 +130,15 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
|||
catch (Exception)
|
||||
{
|
||||
}
|
||||
if (maxlisteners < 1) maxlisteners = int.MaxValue;
|
||||
if (maxhandles < 1) maxhandles = int.MaxValue;
|
||||
|
||||
if (maxlisteners < 1)
|
||||
maxlisteners = int.MaxValue;
|
||||
if (maxhandles < 1)
|
||||
maxhandles = int.MaxValue;
|
||||
|
||||
if (maxlisteners < maxhandles)
|
||||
maxlisteners = maxhandles;
|
||||
|
||||
m_listenerManager = new ListenerManager(maxlisteners, maxhandles);
|
||||
m_pendingQ = new Queue();
|
||||
m_pending = Queue.Synchronized(m_pendingQ);
|
||||
|
@ -605,11 +612,9 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
|||
li.GetHandle().Equals(handle))
|
||||
{
|
||||
lis.Value.Remove(li);
|
||||
m_curlisteners--;
|
||||
if (lis.Value.Count == 0)
|
||||
{
|
||||
m_listeners.Remove(lis.Key);
|
||||
m_curlisteners--;
|
||||
}
|
||||
m_listeners.Remove(lis.Key); // bailing of loop so this does not smoke
|
||||
// there should be only one, so we bail out early
|
||||
return;
|
||||
}
|
||||
|
@ -718,6 +723,9 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
|||
}
|
||||
}
|
||||
|
||||
if(handles.Count >= m_maxhandles)
|
||||
return -1;
|
||||
|
||||
// Note: 0 is NOT a valid handle for llListen() to return
|
||||
for (int i = 1; i <= m_maxhandles; i++)
|
||||
{
|
||||
|
|
|
@ -118,6 +118,11 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
|
|||
return false;
|
||||
|
||||
SceneObjectGroup group = part.ParentGroup;
|
||||
if(group == null || group.IsDeleted || group.inTransit)
|
||||
return false;
|
||||
|
||||
// make sure we are not buying a child part
|
||||
part = group.RootPart;
|
||||
|
||||
switch (saleType)
|
||||
{
|
||||
|
@ -157,18 +162,6 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
|
|||
break;
|
||||
|
||||
case 2: // Sell a copy
|
||||
Vector3 inventoryStoredPosition = new Vector3(
|
||||
Math.Min(group.AbsolutePosition.X, m_scene.RegionInfo.RegionSizeX - 6),
|
||||
Math.Min(group.AbsolutePosition.Y, m_scene.RegionInfo.RegionSizeY - 6),
|
||||
group.AbsolutePosition.Z);
|
||||
|
||||
Vector3 originalPosition = group.AbsolutePosition;
|
||||
|
||||
group.AbsolutePosition = inventoryStoredPosition;
|
||||
|
||||
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group);
|
||||
group.AbsolutePosition = originalPosition;
|
||||
|
||||
uint perms = group.EffectiveOwnerPerms;
|
||||
|
||||
if ((perms & (uint)PermissionMask.Transfer) == 0)
|
||||
|
@ -185,6 +178,8 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
|
|||
return false;
|
||||
}
|
||||
|
||||
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(group);
|
||||
|
||||
AssetBase asset = m_scene.CreateAsset(
|
||||
group.GetPartName(localID),
|
||||
group.GetPartDescription(localID),
|
||||
|
@ -205,22 +200,21 @@ namespace OpenSim.Region.CoreModules.World.Objects.BuySell
|
|||
item.AssetType = asset.Type;
|
||||
item.InvType = (int)InventoryType.Object;
|
||||
item.Folder = categoryID;
|
||||
|
||||
perms = group.CurrentAndFoldedNextPermissions();
|
||||
// apply parts inventory next perms
|
||||
PermissionsUtil.ApplyNoModFoldedPermissions(perms, ref perms);
|
||||
// change to next owner perms
|
||||
perms &= part.NextOwnerMask;
|
||||
// update folded
|
||||
perms = PermissionsUtil.FixAndFoldPermissions(perms);
|
||||
|
||||
uint nextPerms=(perms & 7) << 13;
|
||||
if ((nextPerms & (uint)PermissionMask.Copy) == 0)
|
||||
perms &= ~(uint)PermissionMask.Copy;
|
||||
if ((nextPerms & (uint)PermissionMask.Transfer) == 0)
|
||||
perms &= ~(uint)PermissionMask.Transfer;
|
||||
if ((nextPerms & (uint)PermissionMask.Modify) == 0)
|
||||
perms &= ~(uint)PermissionMask.Modify;
|
||||
item.BasePermissions = perms;
|
||||
item.CurrentPermissions = perms;
|
||||
item.NextPermissions = part.NextOwnerMask & perms;
|
||||
item.EveryOnePermissions = part.EveryoneMask & perms;
|
||||
item.GroupPermissions = part.GroupMask & perms;
|
||||
|
||||
item.BasePermissions = perms & part.NextOwnerMask;
|
||||
item.CurrentPermissions = perms & part.NextOwnerMask;
|
||||
item.NextPermissions = part.NextOwnerMask;
|
||||
item.EveryOnePermissions = part.EveryoneMask &
|
||||
part.NextOwnerMask;
|
||||
item.GroupPermissions = part.GroupMask &
|
||||
part.NextOwnerMask;
|
||||
item.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm;
|
||||
item.CreationDate = Util.UnixTimeSinceEpoch();
|
||||
|
||||
|
|
|
@ -2022,7 +2022,10 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
|||
|
||||
uint perms = GetObjectPermissions(sp, sog, true);
|
||||
if((perms & (uint)PermissionMask.Copy) == 0)
|
||||
{
|
||||
sp.ControllingClient.SendAgentAlertMessage("Copying this item has been denied by the permissions system", false);
|
||||
return false;
|
||||
}
|
||||
|
||||
if(sog.OwnerID != sp.UUID && (perms & (uint)PermissionMask.Transfer) == 0)
|
||||
return false;
|
||||
|
|
|
@ -682,30 +682,26 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// These will be applied to the root prim at next rez.
|
||||
// The legacy slam bit (bit 3) and folded permission (bits 0-2)
|
||||
// are preserved due to the above mangling
|
||||
ownerPerms &= nextPerms;
|
||||
// ownerPerms &= nextPerms;
|
||||
|
||||
// Mask the base permissions. This is a conservative
|
||||
// approach altering only the three main perms
|
||||
basePerms &= nextPerms;
|
||||
// basePerms &= nextPerms;
|
||||
|
||||
// Mask out the folded portion of the base mask.
|
||||
// While the owner mask carries the actual folded
|
||||
// permissions, the base mask carries the original
|
||||
// base mask, before masking with the folded perms.
|
||||
// We need this later for rezzing.
|
||||
basePerms &= ~(uint)PermissionMask.FoldedMask;
|
||||
basePerms |= ((basePerms >> 13) & 7) | (((basePerms & (uint)PermissionMask.Export) != 0) ? (uint)PermissionMask.FoldedExport : 0);
|
||||
// basePerms &= ~(uint)PermissionMask.FoldedMask;
|
||||
// basePerms |= ((basePerms >> 13) & 7) | (((basePerms & (uint)PermissionMask.Export) != 0) ? (uint)PermissionMask.FoldedExport : 0);
|
||||
|
||||
// If this is an object, root prim perms may be more
|
||||
// permissive than folded perms. Use folded perms as
|
||||
// a mask
|
||||
if (item.InvType == (int)InventoryType.Object)
|
||||
uint foldedPerms = (item.CurrentPermissions & (uint)PermissionMask.FoldedMask) << (int)PermissionMask.FoldingShift;
|
||||
if (foldedPerms != 0 && item.InvType == (int)InventoryType.Object)
|
||||
{
|
||||
// Create a safe mask for the current perms
|
||||
uint foldedPerms = (item.CurrentPermissions & 7) << 13;
|
||||
if ((item.CurrentPermissions & (uint)PermissionMask.FoldedExport) != 0)
|
||||
foldedPerms |= (uint)PermissionMask.Export;
|
||||
|
||||
foldedPerms |= permsMask;
|
||||
|
||||
bool isRootMod = (item.CurrentPermissions &
|
||||
|
@ -729,6 +725,11 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
}
|
||||
|
||||
// move here so nextperms are mandatory
|
||||
ownerPerms &= nextPerms;
|
||||
basePerms &= nextPerms;
|
||||
basePerms &= ~(uint)PermissionMask.FoldedMask;
|
||||
basePerms |= ((basePerms >> 13) & 7) | (((basePerms & (uint)PermissionMask.Export) != 0) ? (uint)PermissionMask.FoldedExport : 0);
|
||||
// Assign to the actual item. Make sure the slam bit is
|
||||
// set, if it wasn't set before.
|
||||
itemCopy.BasePermissions = basePerms;
|
||||
|
@ -1266,20 +1267,26 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// TODO: Fix this after the inventory fixer exists and has beenr run
|
||||
if ((part.OwnerID != destAgent) && Permissions.PropagatePermissions())
|
||||
{
|
||||
agentItem.BasePermissions = taskItem.BasePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
|
||||
uint perms = taskItem.BasePermissions & taskItem.NextPermissions;
|
||||
if (taskItem.InvType == (int)InventoryType.Object)
|
||||
agentItem.CurrentPermissions = agentItem.BasePermissions & (((taskItem.CurrentPermissions & 7) << 13) | (taskItem.CurrentPermissions & (uint)PermissionMask.Move));
|
||||
{
|
||||
PermissionsUtil.ApplyFoldedPermissions(taskItem.CurrentPermissions, ref perms );
|
||||
perms = PermissionsUtil.FixAndFoldPermissions(perms);
|
||||
}
|
||||
else
|
||||
agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions;
|
||||
|
||||
agentItem.BasePermissions = agentItem.CurrentPermissions;
|
||||
perms &= taskItem.CurrentPermissions;
|
||||
|
||||
// always unlock
|
||||
perms |= (uint)PermissionMask.Move;
|
||||
|
||||
agentItem.BasePermissions = perms;
|
||||
agentItem.CurrentPermissions = perms;
|
||||
agentItem.NextPermissions = perms & taskItem.NextPermissions;
|
||||
agentItem.EveryOnePermissions = perms & taskItem.EveryonePermissions;
|
||||
agentItem.GroupPermissions = perms & taskItem.GroupPermissions;
|
||||
|
||||
agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm;
|
||||
agentItem.Flags &= ~(uint)(InventoryItemFlags.ObjectOverwriteBase | InventoryItemFlags.ObjectOverwriteOwner | InventoryItemFlags.ObjectOverwriteGroup | InventoryItemFlags.ObjectOverwriteEveryone | InventoryItemFlags.ObjectOverwriteNextOwner);
|
||||
agentItem.NextPermissions = taskItem.NextPermissions;
|
||||
agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
|
||||
// Group permissions make no sense here
|
||||
agentItem.GroupPermissions = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1287,7 +1294,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
agentItem.CurrentPermissions = taskItem.CurrentPermissions;
|
||||
agentItem.NextPermissions = taskItem.NextPermissions;
|
||||
agentItem.EveryOnePermissions = taskItem.EveryonePermissions;
|
||||
agentItem.GroupPermissions = 0;
|
||||
agentItem.GroupPermissions = taskItem.GroupPermissions;
|
||||
}
|
||||
|
||||
message = null;
|
||||
|
|
|
@ -252,18 +252,26 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
}
|
||||
|
||||
// new test code, to place in better place later
|
||||
private object PermissionsLock = new object();
|
||||
private object m_PermissionsLock = new object();
|
||||
private bool m_EffectivePermsInvalid = true;
|
||||
|
||||
public void InvalidateEffectivePerms()
|
||||
{
|
||||
lock(m_PermissionsLock)
|
||||
m_EffectivePermsInvalid = true;
|
||||
}
|
||||
|
||||
private uint m_EffectiveEveryOnePerms;
|
||||
public uint EffectiveEveryOnePerms
|
||||
{
|
||||
get
|
||||
{
|
||||
// this can't be done here but on every place where a change may happen (rez, (de)link, contents , perms, etc)
|
||||
// bc this is on heavy duty code paths
|
||||
// but for now we need to test the concept
|
||||
// AggregateDeepPerms();
|
||||
return m_EffectiveEveryOnePerms;
|
||||
lock(m_PermissionsLock)
|
||||
{
|
||||
if(m_EffectivePermsInvalid)
|
||||
AggregatePerms();
|
||||
return m_EffectiveEveryOnePerms;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -272,11 +280,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
get
|
||||
{
|
||||
// this can't be done here but on every place where a change may happen (rez, (de)link, contents , perms, etc)
|
||||
// bc this is on heavy duty code paths
|
||||
// but for now we need to test the concept
|
||||
// AggregateDeepPerms();
|
||||
return m_EffectiveGroupPerms;
|
||||
lock(m_PermissionsLock)
|
||||
{
|
||||
if(m_EffectivePermsInvalid)
|
||||
AggregatePerms();
|
||||
return m_EffectiveGroupPerms;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -285,11 +294,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
get
|
||||
{
|
||||
// this can't be done here but on every place where a change may happen (rez, (de)link, contents , perms, etc)
|
||||
// bc this is on heavy duty code paths
|
||||
// but for now we need to test the concept
|
||||
// AggregateDeepPerms();
|
||||
return m_EffectiveGroupOrEveryOnePerms;
|
||||
lock(m_PermissionsLock)
|
||||
{
|
||||
if(m_EffectivePermsInvalid)
|
||||
AggregatePerms();
|
||||
return m_EffectiveGroupOrEveryOnePerms;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -298,11 +308,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
get
|
||||
{
|
||||
// this can't be done here but on every place where a change may happen (rez, (de)link, contents , perms, etc)
|
||||
// bc this is on heavy duty code paths
|
||||
// but for now we need to test the concept
|
||||
// AggregateDeepPerms();
|
||||
return m_EffectiveOwnerPerms;
|
||||
lock(m_PermissionsLock)
|
||||
{
|
||||
if(m_EffectivePermsInvalid)
|
||||
AggregatePerms();
|
||||
return m_EffectiveOwnerPerms;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -310,12 +321,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// AggregatePerms does same using cached parts content perms
|
||||
public void AggregateDeepPerms()
|
||||
{
|
||||
lock(PermissionsLock)
|
||||
lock(m_PermissionsLock)
|
||||
{
|
||||
// aux
|
||||
const uint allmask = (uint)PermissionMask.AllEffective;
|
||||
const uint movemodmask = (uint)(PermissionMask.Move | PermissionMask.Modify);
|
||||
const uint copytransfermast = (uint)(PermissionMask.Copy | PermissionMask.Transfer);
|
||||
const uint copytransfermask = (uint)(PermissionMask.Copy | PermissionMask.Transfer);
|
||||
|
||||
uint basePerms = (RootPart.BaseMask & allmask) | (uint)PermissionMask.Move;
|
||||
bool noBaseTransfer = (basePerms & (uint)PermissionMask.Transfer) == 0;
|
||||
|
@ -327,6 +338,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
uint rootEveryonePerms = RootPart.EveryoneMask;
|
||||
uint everyone = rootEveryonePerms;
|
||||
|
||||
// date is time of writing april 30th 2017
|
||||
bool newObject = (RootPart.CreationDate == 0 || RootPart.CreationDate > 1493574994);
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
|
@ -334,12 +347,13 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
part.AggregateInnerPerms();
|
||||
owner &= part.AggregatedInnerOwnerPerms;
|
||||
group &= part.AggregatedInnerGroupPerms;
|
||||
everyone &= part.AggregatedInnerEveryonePerms;
|
||||
if(newObject)
|
||||
everyone &= part.AggregatedInnerEveryonePerms;
|
||||
}
|
||||
// recover modify and move
|
||||
rootOwnerPerms &= movemodmask;
|
||||
owner |= rootOwnerPerms;
|
||||
if((owner & copytransfermast) == 0)
|
||||
if((owner & copytransfermask) == 0)
|
||||
owner |= (uint)PermissionMask.Transfer;
|
||||
|
||||
owner &= basePerms;
|
||||
|
@ -370,6 +384,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
m_EffectiveEveryOnePerms = everyone & owner;
|
||||
m_EffectiveGroupOrEveryOnePerms = groupOrEveryone & owner;
|
||||
m_EffectivePermsInvalid = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -377,7 +392,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
// ie is AggregateDeepPerms without the part.AggregateInnerPerms() call on parts loop
|
||||
public void AggregatePerms()
|
||||
{
|
||||
lock(PermissionsLock)
|
||||
lock(m_PermissionsLock)
|
||||
{
|
||||
// aux
|
||||
const uint allmask = (uint)PermissionMask.AllEffective;
|
||||
|
@ -394,13 +409,17 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
uint rootEveryonePerms = RootPart.EveryoneMask;
|
||||
uint everyone = rootEveryonePerms;
|
||||
|
||||
bool needUpdate = false;
|
||||
// date is time of writing april 30th 2017
|
||||
bool newObject = (RootPart.CreationDate == 0 || RootPart.CreationDate > 1493574994);
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
SceneObjectPart part = parts[i];
|
||||
owner &= part.AggregatedInnerOwnerPerms;
|
||||
group &= part.AggregatedInnerGroupPerms;
|
||||
everyone &= part.AggregatedInnerEveryonePerms;
|
||||
if(newObject)
|
||||
everyone &= part.AggregatedInnerEveryonePerms;
|
||||
}
|
||||
// recover modify and move
|
||||
rootOwnerPerms &= movemodmask;
|
||||
|
@ -409,7 +428,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
owner |= (uint)PermissionMask.Transfer;
|
||||
|
||||
owner &= basePerms;
|
||||
m_EffectiveOwnerPerms = owner;
|
||||
if(owner != m_EffectiveOwnerPerms)
|
||||
{
|
||||
needUpdate = true;
|
||||
m_EffectiveOwnerPerms = owner;
|
||||
}
|
||||
|
||||
uint ownertransfermask = owner & (uint)PermissionMask.Transfer;
|
||||
|
||||
// recover modify and move
|
||||
|
@ -421,7 +445,12 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
group |= ownertransfermask;
|
||||
|
||||
uint groupOrEveryone = group;
|
||||
m_EffectiveGroupPerms = group & owner;
|
||||
uint tmpPerms = group & owner;
|
||||
if(tmpPerms != m_EffectiveGroupPerms)
|
||||
{
|
||||
needUpdate = true;
|
||||
m_EffectiveGroupPerms = tmpPerms;
|
||||
}
|
||||
|
||||
// recover move
|
||||
rootEveryonePerms &= (uint)PermissionMask.Move;
|
||||
|
@ -434,35 +463,42 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
groupOrEveryone |= everyone;
|
||||
|
||||
m_EffectiveEveryOnePerms = everyone & owner;
|
||||
m_EffectiveGroupOrEveryOnePerms = groupOrEveryone & owner;
|
||||
tmpPerms = everyone & owner;
|
||||
if(tmpPerms != m_EffectiveEveryOnePerms)
|
||||
{
|
||||
needUpdate = true;
|
||||
m_EffectiveEveryOnePerms = tmpPerms;
|
||||
}
|
||||
|
||||
tmpPerms = groupOrEveryone & owner;
|
||||
if(tmpPerms != m_EffectiveGroupOrEveryOnePerms)
|
||||
{
|
||||
needUpdate = true;
|
||||
m_EffectiveGroupOrEveryOnePerms = tmpPerms;
|
||||
}
|
||||
|
||||
m_EffectivePermsInvalid = false;
|
||||
|
||||
if(needUpdate)
|
||||
RootPart.ScheduleFullUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
public uint GetEffectivePermissions()
|
||||
{
|
||||
return GetEffectivePermissions(false);
|
||||
}
|
||||
|
||||
public uint GetEffectivePermissions(bool useBase)
|
||||
public uint CurrentAndFoldedNextPermissions()
|
||||
{
|
||||
uint perms=(uint)(PermissionMask.Modify |
|
||||
PermissionMask.Copy |
|
||||
PermissionMask.Move |
|
||||
PermissionMask.Transfer) | 7;
|
||||
PermissionMask.Transfer |
|
||||
PermissionMask.FoldedMask);
|
||||
|
||||
uint ownerMask = 0x7fffffff;
|
||||
uint ownerMask = RootPart.OwnerMask;
|
||||
|
||||
SceneObjectPart[] parts = m_parts.GetArray();
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
SceneObjectPart part = parts[i];
|
||||
|
||||
if (useBase)
|
||||
ownerMask &= part.BaseMask;
|
||||
else
|
||||
ownerMask &= part.OwnerMask;
|
||||
|
||||
ownerMask &= part.BaseMask;
|
||||
perms &= part.Inventory.MaskEffectivePermissions();
|
||||
}
|
||||
|
||||
|
@ -472,17 +508,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
perms &= ~(uint)PermissionMask.Copy;
|
||||
if ((ownerMask & (uint)PermissionMask.Transfer) == 0)
|
||||
perms &= ~(uint)PermissionMask.Transfer;
|
||||
|
||||
// If root prim permissions are applied here, this would screw
|
||||
// with in-inventory manipulation of the next owner perms
|
||||
// in a major way. So, let's move this to the give itself.
|
||||
// Yes. I know. Evil.
|
||||
// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Modify) == 0)
|
||||
// perms &= ~((uint)PermissionMask.Modify >> 13);
|
||||
// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Copy) == 0)
|
||||
// perms &= ~((uint)PermissionMask.Copy >> 13);
|
||||
// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Transfer) == 0)
|
||||
// perms &= ~((uint)PermissionMask.Transfer >> 13);
|
||||
if ((ownerMask & (uint)PermissionMask.Export) == 0)
|
||||
perms &= ~(uint)PermissionMask.Export;
|
||||
|
||||
return perms;
|
||||
}
|
||||
|
|
|
@ -2579,6 +2579,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
AggregatedInnerOwnerPerms = owner & mask;
|
||||
AggregatedInnerGroupPerms = group & mask;
|
||||
AggregatedInnerEveryonePerms = everyone & mask;
|
||||
if(ParentGroup != null)
|
||||
ParentGroup.InvalidateEffectivePerms();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5286,9 +5288,9 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter
|
|||
// Export needs to be preserved in the base and everyone
|
||||
// mask, but removed in the owner mask as a next owner
|
||||
// can never change the export status
|
||||
BaseMask &= NextOwnerMask | (uint)PermissionMask.Export;
|
||||
BaseMask &= (NextOwnerMask | (uint)PermissionMask.Export);
|
||||
OwnerMask &= NextOwnerMask;
|
||||
EveryoneMask &= NextOwnerMask | (uint)PermissionMask.Export;
|
||||
EveryoneMask &= (NextOwnerMask | (uint)PermissionMask.Export);
|
||||
GroupMask = 0; // Giving an object zaps group permissions
|
||||
|
||||
Inventory.ApplyNextOwnerPermissions();
|
||||
|
|
|
@ -1332,6 +1332,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
foreach (TaskInventoryItem item in m_items.Values)
|
||||
{
|
||||
if(item.InvType == (sbyte)InventoryType.Landmark)
|
||||
continue;
|
||||
owner &= item.CurrentPermissions;
|
||||
group &= item.GroupPermissions;
|
||||
everyone &= item.EveryonePermissions;
|
||||
|
@ -1340,33 +1342,35 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public uint MaskEffectivePermissions()
|
||||
{
|
||||
// used to propagate permissions restrictions outwards
|
||||
// Modify does not propagate outwards.
|
||||
uint mask=0x7fffffff;
|
||||
|
||||
|
||||
foreach (TaskInventoryItem item in m_items.Values)
|
||||
{
|
||||
if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0)
|
||||
mask &= ~((uint)PermissionMask.Copy >> 13);
|
||||
if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0)
|
||||
mask &= ~((uint)PermissionMask.Transfer >> 13);
|
||||
if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0)
|
||||
mask &= ~((uint)PermissionMask.Modify >> 13);
|
||||
if(item.InvType == (sbyte)InventoryType.Landmark)
|
||||
continue;
|
||||
|
||||
if (item.InvType == (int)InventoryType.Object)
|
||||
{
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
|
||||
mask &= ~((uint)PermissionMask.Copy >> 13);
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
|
||||
mask &= ~((uint)PermissionMask.Transfer >> 13);
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
|
||||
mask &= ~((uint)PermissionMask.Modify >> 13);
|
||||
}
|
||||
// apply current to normal permission bits
|
||||
uint newperms = item.CurrentPermissions;
|
||||
|
||||
if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
|
||||
if ((newperms & (uint)PermissionMask.Copy) == 0)
|
||||
mask &= ~(uint)PermissionMask.Copy;
|
||||
if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
|
||||
if ((newperms & (uint)PermissionMask.Transfer) == 0)
|
||||
mask &= ~(uint)PermissionMask.Transfer;
|
||||
if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
|
||||
mask &= ~(uint)PermissionMask.Modify;
|
||||
if ((newperms & (uint)PermissionMask.Export) == 0)
|
||||
mask &= ~((uint)PermissionMask.Export);
|
||||
|
||||
// apply next owner restricted by current to folded bits
|
||||
newperms &= item.NextPermissions;
|
||||
|
||||
if ((newperms & (uint)PermissionMask.Copy) == 0)
|
||||
mask &= ~((uint)PermissionMask.FoldedCopy);
|
||||
if ((newperms & (uint)PermissionMask.Transfer) == 0)
|
||||
mask &= ~((uint)PermissionMask.FoldedTransfer);
|
||||
if ((newperms & (uint)PermissionMask.Export) == 0)
|
||||
mask &= ~((uint)PermissionMask.FoldedExport);
|
||||
|
||||
}
|
||||
return mask;
|
||||
}
|
||||
|
@ -1375,19 +1379,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
{
|
||||
foreach (TaskInventoryItem item in m_items.Values)
|
||||
{
|
||||
if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
|
||||
{
|
||||
// m_log.DebugFormat (
|
||||
// "[SCENE OBJECT PART INVENTORY]: Applying next permissions {0} to {1} in {2} with current {3}, base {4}, everyone {5}",
|
||||
// item.NextPermissions, item.Name, m_part.Name, item.CurrentPermissions, item.BasePermissions, item.EveryonePermissions);
|
||||
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
|
||||
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
|
||||
item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
|
||||
}
|
||||
item.CurrentPermissions &= item.NextPermissions;
|
||||
item.BasePermissions &= item.NextPermissions;
|
||||
item.EveryonePermissions &= item.NextPermissions;
|
||||
|
|
|
@ -755,8 +755,8 @@ namespace PrimMesher
|
|||
if (hollowAngles.angles[0].angle - angles.angles[i].angle < angles.angles[i].angle - hollowAngles.angles[maxJ].angle + 0.000001f)
|
||||
{
|
||||
newFace.v1 = 0;
|
||||
newFace.v2 = numTotalVerts - maxJ - 1;
|
||||
newFace.v3 = numTotalVerts - 1;
|
||||
newFace.v2 = numTotalVerts - 1;
|
||||
newFace.v3 = numTotalVerts - maxJ - 1;
|
||||
|
||||
faces.Add(newFace);
|
||||
}
|
||||
|
|
|
@ -13405,6 +13405,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
List<string> param = new List<string>();
|
||||
bool ok;
|
||||
Int32 flag;
|
||||
int nCustomHeaders = 0;
|
||||
|
||||
for (int i = 0; i < parameters.Data.Length; i += 2)
|
||||
{
|
||||
|
@ -13431,6 +13432,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
//Second Life documentation for llHTTPRequest.
|
||||
for (int count = 1; count <= 8; ++count)
|
||||
{
|
||||
if(nCustomHeaders >= 8)
|
||||
{
|
||||
Error("llHTTPRequest", "Max number of custom headers is 8, excess ignored");
|
||||
break;
|
||||
}
|
||||
|
||||
//Enough parameters remaining for (another) header?
|
||||
if (parameters.Data.Length - i < 2)
|
||||
{
|
||||
|
@ -13445,15 +13452,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
param.Add(parameters.Data[i].ToString());
|
||||
param.Add(parameters.Data[i+1].ToString());
|
||||
nCustomHeaders++;
|
||||
|
||||
//Have we reached the end of the list of headers?
|
||||
//End is marked by a string with a single digit.
|
||||
if (i+2 >= parameters.Data.Length ||
|
||||
Char.IsDigit(parameters.Data[i].ToString()[0]))
|
||||
if (i + 2 >= parameters.Data.Length ||
|
||||
Char.IsDigit(parameters.Data[i + 2].ToString()[0]))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
i += 2;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -87,17 +87,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
|
|||
uint port = 9999;
|
||||
MainServer.RemoveHttpServer(port);
|
||||
|
||||
BaseHttpServer server = new BaseHttpServer(port, false, "", "", "");
|
||||
m_engine = new MockScriptEngine();
|
||||
m_urlModule = new UrlModule();
|
||||
|
||||
IConfigSource config = new IniConfigSource();
|
||||
config.AddConfig("Network");
|
||||
config.Configs["Network"].Set("ExternalHostNameForLSL", "127.0.0.1");
|
||||
m_scene = new SceneHelpers().SetupScene();
|
||||
|
||||
BaseHttpServer server = new BaseHttpServer(port, false, 0, "");
|
||||
MainServer.AddHttpServer(server);
|
||||
MainServer.Instance = server;
|
||||
|
||||
server.Start();
|
||||
|
||||
m_engine = new MockScriptEngine();
|
||||
m_urlModule = new UrlModule();
|
||||
|
||||
m_scene = new SceneHelpers().SetupScene();
|
||||
SceneHelpers.SetupSceneModules(m_scene, new IniConfigSource(), m_engine, m_urlModule);
|
||||
SceneHelpers.SetupSceneModules(m_scene, config, m_engine, m_urlModule);
|
||||
|
||||
SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
|
||||
m_scriptItem = TaskInventoryHelpers.AddScript(m_scene.AssetService, so.RootPart);
|
||||
|
|
|
@ -909,9 +909,9 @@ namespace OpenSim.Services.GridService
|
|||
private void OutputRegionsToConsoleSummary(List<RegionData> regions)
|
||||
{
|
||||
ConsoleDisplayTable dispTable = new ConsoleDisplayTable();
|
||||
dispTable.AddColumn("Name", 44);
|
||||
dispTable.AddColumn("ID", 36);
|
||||
dispTable.AddColumn("Position", 11);
|
||||
dispTable.AddColumn("Name", ConsoleDisplayUtil.RegionNameSize);
|
||||
dispTable.AddColumn("ID", ConsoleDisplayUtil.UuidSize);
|
||||
dispTable.AddColumn("Position", ConsoleDisplayUtil.CoordTupleSize);
|
||||
dispTable.AddColumn("Size", 11);
|
||||
dispTable.AddColumn("Flags", 60);
|
||||
|
||||
|
|
|
@ -640,9 +640,11 @@ namespace OpenSim.Services.UserAccountService
|
|||
m_log.DebugFormat("[USER ACCOUNT SERVICE]: Creating default appearance items for {0}", principalID);
|
||||
|
||||
InventoryFolderBase bodyPartsFolder = m_InventoryService.GetFolderForType(principalID, FolderType.BodyPart);
|
||||
// Get Current Outfit folder
|
||||
InventoryFolderBase currentOutfitFolder = m_InventoryService.GetFolderForType(principalID, FolderType.CurrentOutfit);
|
||||
|
||||
InventoryItemBase eyes = new InventoryItemBase(UUID.Random(), principalID);
|
||||
eyes.AssetID = new UUID("4bb6fa4d-1cd2-498a-a84c-95c1a0e745a7");
|
||||
eyes.AssetID = AvatarWearable.DEFAULT_EYES_ASSET;
|
||||
eyes.Name = "Default Eyes";
|
||||
eyes.CreatorId = principalID.ToString();
|
||||
eyes.AssetType = (int)AssetType.Bodypart;
|
||||
|
@ -655,6 +657,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
eyes.NextPermissions = (uint)PermissionMask.All;
|
||||
eyes.Flags = (uint)WearableType.Eyes;
|
||||
m_InventoryService.AddItem(eyes);
|
||||
CreateCurrentOutfitLink((int)InventoryType.Wearable, (uint)WearableType.Eyes, eyes.Name, eyes.ID, principalID, currentOutfitFolder.ID);
|
||||
|
||||
InventoryItemBase shape = new InventoryItemBase(UUID.Random(), principalID);
|
||||
shape.AssetID = AvatarWearable.DEFAULT_BODY_ASSET;
|
||||
|
@ -670,6 +673,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
shape.NextPermissions = (uint)PermissionMask.All;
|
||||
shape.Flags = (uint)WearableType.Shape;
|
||||
m_InventoryService.AddItem(shape);
|
||||
CreateCurrentOutfitLink((int)InventoryType.Wearable, (uint)WearableType.Shape, shape.Name, shape.ID, principalID, currentOutfitFolder.ID);
|
||||
|
||||
InventoryItemBase skin = new InventoryItemBase(UUID.Random(), principalID);
|
||||
skin.AssetID = AvatarWearable.DEFAULT_SKIN_ASSET;
|
||||
|
@ -685,6 +689,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
skin.NextPermissions = (uint)PermissionMask.All;
|
||||
skin.Flags = (uint)WearableType.Skin;
|
||||
m_InventoryService.AddItem(skin);
|
||||
CreateCurrentOutfitLink((int)InventoryType.Wearable, (uint)WearableType.Skin, skin.Name, skin.ID, principalID, currentOutfitFolder.ID);
|
||||
|
||||
InventoryItemBase hair = new InventoryItemBase(UUID.Random(), principalID);
|
||||
hair.AssetID = AvatarWearable.DEFAULT_HAIR_ASSET;
|
||||
|
@ -700,6 +705,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
hair.NextPermissions = (uint)PermissionMask.All;
|
||||
hair.Flags = (uint)WearableType.Hair;
|
||||
m_InventoryService.AddItem(hair);
|
||||
CreateCurrentOutfitLink((int)InventoryType.Wearable, (uint)WearableType.Hair, hair.Name, hair.ID, principalID, currentOutfitFolder.ID);
|
||||
|
||||
InventoryFolderBase clothingFolder = m_InventoryService.GetFolderForType(principalID, FolderType.Clothing);
|
||||
|
||||
|
@ -717,6 +723,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
shirt.NextPermissions = (uint)PermissionMask.All;
|
||||
shirt.Flags = (uint)WearableType.Shirt;
|
||||
m_InventoryService.AddItem(shirt);
|
||||
CreateCurrentOutfitLink((int)InventoryType.Wearable, (uint)WearableType.Shirt, shirt.Name, shirt.ID, principalID, currentOutfitFolder.ID);
|
||||
|
||||
InventoryItemBase pants = new InventoryItemBase(UUID.Random(), principalID);
|
||||
pants.AssetID = AvatarWearable.DEFAULT_PANTS_ASSET;
|
||||
|
@ -732,6 +739,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
pants.NextPermissions = (uint)PermissionMask.All;
|
||||
pants.Flags = (uint)WearableType.Pants;
|
||||
m_InventoryService.AddItem(pants);
|
||||
CreateCurrentOutfitLink((int)InventoryType.Wearable, (uint)WearableType.Pants, pants.Name, pants.ID, principalID, currentOutfitFolder.ID);
|
||||
|
||||
if (m_AvatarService != null)
|
||||
{
|
||||
|
@ -815,6 +823,8 @@ namespace OpenSim.Services.UserAccountService
|
|||
{
|
||||
// Get Clothing folder of receiver
|
||||
InventoryFolderBase destinationFolder = m_InventoryService.GetFolderForType(destination, FolderType.Clothing);
|
||||
// Get Current Outfit folder
|
||||
InventoryFolderBase currentOutfitFolder = m_InventoryService.GetFolderForType(destination, FolderType.CurrentOutfit);
|
||||
|
||||
if (destinationFolder == null)
|
||||
throw new Exception("Cannot locate folder(s)");
|
||||
|
@ -841,6 +851,7 @@ namespace OpenSim.Services.UserAccountService
|
|||
for (int i = 0; i < wearables.Length; i++)
|
||||
{
|
||||
wearable = wearables[i];
|
||||
m_log.DebugFormat("[XXX]: Getting item {0} from avie {1}", wearable[0].ItemID, source);
|
||||
if (wearable[0].ItemID != UUID.Zero)
|
||||
{
|
||||
// Get inventory item and copy it
|
||||
|
@ -878,6 +889,9 @@ namespace OpenSim.Services.UserAccountService
|
|||
AvatarWearable newWearable = new AvatarWearable();
|
||||
newWearable.Wear(destinationItem.ID, wearable[0].AssetID);
|
||||
avatarAppearance.SetWearable(i, newWearable);
|
||||
|
||||
// Add to Current Outfit
|
||||
CreateCurrentOutfitLink((int)InventoryType.Wearable, item.Flags, item.Name, destinationItem.ID, destination, currentOutfitFolder.ID);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -930,6 +944,9 @@ namespace OpenSim.Services.UserAccountService
|
|||
// Attach item
|
||||
avatarAppearance.SetAttachment(attachpoint, destinationItem.ID, destinationItem.AssetID);
|
||||
m_log.DebugFormat("[USER ACCOUNT SERVICE]: Attached {0}", destinationItem.ID);
|
||||
|
||||
// Add to Current Outfit
|
||||
CreateCurrentOutfitLink(destinationItem.InvType, item.Flags, item.Name, destinationItem.ID, destination, currentOutfitFolder.ID);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -939,6 +956,30 @@ namespace OpenSim.Services.UserAccountService
|
|||
}
|
||||
}
|
||||
|
||||
protected void CreateCurrentOutfitLink(int invType, uint itemType, string name, UUID itemID, UUID userID, UUID currentOutfitFolderUUID)
|
||||
{
|
||||
UUID LinkInvItem = UUID.Random();
|
||||
InventoryItemBase itembase = new InventoryItemBase(LinkInvItem, userID)
|
||||
{
|
||||
AssetID = itemID,
|
||||
AssetType = (int)AssetType.Link,
|
||||
CreatorId = userID.ToString(),
|
||||
InvType = invType,
|
||||
Description = "",
|
||||
//Folder = m_InventoryService.GetFolderForType(userID, FolderType.CurrentOutfit).ID,
|
||||
Folder = currentOutfitFolderUUID,
|
||||
Flags = itemType,
|
||||
Name = name,
|
||||
BasePermissions = (uint)PermissionMask.Copy,
|
||||
CurrentPermissions = (uint)PermissionMask.Copy,
|
||||
EveryOnePermissions = (uint)PermissionMask.Copy,
|
||||
GroupPermissions = (uint)PermissionMask.Copy,
|
||||
NextPermissions = (uint)PermissionMask.Copy
|
||||
};
|
||||
|
||||
m_InventoryService.AddItem(itembase);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Apply next owner permissions.
|
||||
/// </summary>
|
||||
|
|
|
@ -0,0 +1,365 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using Nini.Config;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.CoreModules.World.Permissions;
|
||||
using OpenSim.Region.CoreModules.Avatar.Inventory.Transfer;
|
||||
using OpenSim.Region.CoreModules.Framework.InventoryAccess;
|
||||
using OpenSim.Services.Interfaces;
|
||||
using OpenSim.Tests.Common;
|
||||
using PermissionMask = OpenSim.Framework.PermissionMask;
|
||||
|
||||
namespace OpenSim.Tests.Permissions
|
||||
{
|
||||
[SetUpFixture]
|
||||
public class Common : OpenSimTestCase
|
||||
{
|
||||
public static Common TheInstance;
|
||||
|
||||
public static TestScene TheScene
|
||||
{
|
||||
get { return TheInstance.m_Scene; }
|
||||
}
|
||||
|
||||
public static ScenePresence[] TheAvatars
|
||||
{
|
||||
get { return TheInstance.m_Avatars; }
|
||||
}
|
||||
|
||||
private static string Perms = "Owner: {0}; Group: {1}; Everyone: {2}; Next: {3}";
|
||||
private TestScene m_Scene;
|
||||
private ScenePresence[] m_Avatars = new ScenePresence[3];
|
||||
|
||||
[SetUp]
|
||||
public override void SetUp()
|
||||
{
|
||||
if (TheInstance == null)
|
||||
TheInstance = this;
|
||||
|
||||
base.SetUp();
|
||||
TestHelpers.EnableLogging();
|
||||
|
||||
IConfigSource config = new IniConfigSource();
|
||||
config.AddConfig("Messaging");
|
||||
config.Configs["Messaging"].Set("InventoryTransferModule", "InventoryTransferModule");
|
||||
config.AddConfig("Modules");
|
||||
config.Configs["Modules"].Set("InventoryAccessModule", "BasicInventoryAccessModule");
|
||||
config.AddConfig("InventoryService");
|
||||
config.Configs["InventoryService"].Set("LocalServiceModule", "OpenSim.Services.InventoryService.dll:XInventoryService");
|
||||
config.Configs["InventoryService"].Set("StorageProvider", "OpenSim.Tests.Common.dll:TestXInventoryDataPlugin");
|
||||
|
||||
m_Scene = new SceneHelpers().SetupScene("Test", UUID.Random(), 1000, 1000, config);
|
||||
// Add modules
|
||||
SceneHelpers.SetupSceneModules(m_Scene, config, new DefaultPermissionsModule(), new InventoryTransferModule(), new BasicInventoryAccessModule());
|
||||
|
||||
SetUpBasicEnvironment();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The basic environment consists of:
|
||||
/// - 3 avatars: A1, A2, A3
|
||||
/// - 6 simple boxes inworld belonging to A0 and with Next Owner perms:
|
||||
/// C, CT, MC, MCT, MT, T
|
||||
/// - Copies of all of these boxes in A0's inventory in the Objects folder
|
||||
/// - One additional box inworld and in A0's inventory which is a copy of MCT, but
|
||||
/// with C removed in inventory. This one is called MCT-C
|
||||
/// </summary>
|
||||
private void SetUpBasicEnvironment()
|
||||
{
|
||||
Console.WriteLine("===> SetUpBasicEnvironment <===");
|
||||
|
||||
// Add 3 avatars
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
UUID id = TestHelpers.ParseTail(i + 1);
|
||||
|
||||
m_Avatars[i] = AddScenePresence("Bot", "Bot_" + (i+1), id);
|
||||
Assert.That(m_Avatars[i], Is.Not.Null);
|
||||
Assert.That(m_Avatars[i].IsChildAgent, Is.False);
|
||||
Assert.That(m_Avatars[i].UUID, Is.EqualTo(id));
|
||||
Assert.That(m_Scene.GetScenePresences().Count, Is.EqualTo(i + 1));
|
||||
}
|
||||
|
||||
AddA1Object("Box C", 10, PermissionMask.Copy);
|
||||
AddA1Object("Box CT", 11, PermissionMask.Copy | PermissionMask.Transfer);
|
||||
AddA1Object("Box MC", 12, PermissionMask.Modify | PermissionMask.Copy);
|
||||
AddA1Object("Box MCT", 13, PermissionMask.Modify | PermissionMask.Copy | PermissionMask.Transfer);
|
||||
AddA1Object("Box MT", 14, PermissionMask.Modify | PermissionMask.Transfer);
|
||||
AddA1Object("Box T", 15, PermissionMask.Transfer);
|
||||
|
||||
// MCT-C
|
||||
AddA1Object("Box MCT-C", 16, PermissionMask.Modify | PermissionMask.Copy | PermissionMask.Transfer);
|
||||
|
||||
Thread.Sleep(5000);
|
||||
|
||||
InventoryFolderBase objsFolder = UserInventoryHelpers.GetInventoryFolder(m_Scene.InventoryService, m_Avatars[0].UUID, "Objects");
|
||||
List<InventoryItemBase> items = m_Scene.InventoryService.GetFolderItems(m_Avatars[0].UUID, objsFolder.ID);
|
||||
Assert.That(items.Count, Is.EqualTo(7));
|
||||
|
||||
RevokePermission(0, "Box MCT-C", PermissionMask.Copy);
|
||||
}
|
||||
|
||||
private ScenePresence AddScenePresence(string first, string last, UUID id)
|
||||
{
|
||||
UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(m_Scene, first, last, id, "pw");
|
||||
ScenePresence sp = SceneHelpers.AddScenePresence(m_Scene, id);
|
||||
Assert.That(m_Scene.AuthenticateHandler.GetAgentCircuitData(id), Is.Not.Null);
|
||||
|
||||
return sp;
|
||||
}
|
||||
|
||||
private void AddA1Object(string name, int suffix, PermissionMask nextOwnerPerms)
|
||||
{
|
||||
// Create a Box. Default permissions are just T
|
||||
SceneObjectGroup box = AddSceneObject(name, suffix, 1, m_Avatars[0].UUID);
|
||||
Assert.True((box.RootPart.NextOwnerMask & (int)PermissionMask.Copy) == 0);
|
||||
Assert.True((box.RootPart.NextOwnerMask & (int)PermissionMask.Modify) == 0);
|
||||
Assert.True((box.RootPart.NextOwnerMask & (int)PermissionMask.Transfer) != 0);
|
||||
|
||||
// field = 16 is NextOwner
|
||||
// set = 1 means add the permission; set = 0 means remove permission
|
||||
|
||||
if ((nextOwnerPerms & PermissionMask.Copy) != 0)
|
||||
m_Scene.HandleObjectPermissionsUpdate((IClientAPI)m_Avatars[0].ClientView, m_Avatars[0].UUID,
|
||||
((IClientAPI)(m_Avatars[0].ClientView)).SessionId, 16, box.LocalId, (uint)PermissionMask.Copy, 1);
|
||||
|
||||
if ((nextOwnerPerms & PermissionMask.Modify) != 0)
|
||||
m_Scene.HandleObjectPermissionsUpdate((IClientAPI)m_Avatars[0].ClientView, m_Avatars[0].UUID,
|
||||
((IClientAPI)(m_Avatars[0].ClientView)).SessionId, 16, box.LocalId, (uint)PermissionMask.Modify, 1);
|
||||
|
||||
if ((nextOwnerPerms & PermissionMask.Transfer) == 0)
|
||||
m_Scene.HandleObjectPermissionsUpdate((IClientAPI)m_Avatars[0].ClientView, m_Avatars[0].UUID,
|
||||
((IClientAPI)(m_Avatars[0].ClientView)).SessionId, 16, box.LocalId, (uint)PermissionMask.Transfer, 0);
|
||||
|
||||
PrintPerms(box);
|
||||
AssertPermissions(nextOwnerPerms, (PermissionMask)box.RootPart.NextOwnerMask, box.OwnerID.ToString().Substring(34) + " : " + box.Name);
|
||||
|
||||
TakeCopyToInventory(0, box);
|
||||
|
||||
}
|
||||
|
||||
public void RevokePermission(int ownerIndex, string name, PermissionMask perm)
|
||||
{
|
||||
InventoryItemBase item = Common.TheInstance.GetItemFromInventory(m_Avatars[ownerIndex].UUID, "Objects", name);
|
||||
Assert.That(item, Is.Not.Null);
|
||||
|
||||
// Clone it, so to avoid aliasing -- just like the viewer does.
|
||||
InventoryItemBase clone = Common.TheInstance.CloneInventoryItem(item);
|
||||
// Revoke the permission in this copy
|
||||
clone.NextPermissions &= ~(uint)perm;
|
||||
Common.TheInstance.AssertPermissions((PermissionMask)clone.NextPermissions & ~perm,
|
||||
(PermissionMask)clone.NextPermissions, Common.TheInstance.IdStr(clone));
|
||||
Assert.That(clone.ID == item.ID);
|
||||
|
||||
// Update properties of the item in inventory. This should affect the original item above.
|
||||
Common.TheScene.UpdateInventoryItemAsset(m_Avatars[ownerIndex].ControllingClient, UUID.Zero, clone.ID, clone);
|
||||
|
||||
item = Common.TheInstance.GetItemFromInventory(m_Avatars[ownerIndex].UUID, "Objects", name);
|
||||
Assert.That(item, Is.Not.Null);
|
||||
Common.TheInstance.PrintPerms(item);
|
||||
Common.TheInstance.AssertPermissions((PermissionMask)item.NextPermissions & ~perm,
|
||||
(PermissionMask)item.NextPermissions, Common.TheInstance.IdStr(item));
|
||||
|
||||
}
|
||||
|
||||
public void PrintPerms(SceneObjectGroup sog)
|
||||
{
|
||||
Console.WriteLine("SOG " + sog.Name + " (" + sog.OwnerID.ToString().Substring(34) + "): " +
|
||||
String.Format(Perms, (PermissionMask)sog.EffectiveOwnerPerms,
|
||||
(PermissionMask)sog.EffectiveGroupPerms, (PermissionMask)sog.EffectiveEveryOnePerms, (PermissionMask)sog.RootPart.NextOwnerMask));
|
||||
|
||||
}
|
||||
|
||||
public void PrintPerms(InventoryItemBase item)
|
||||
{
|
||||
Console.WriteLine("Inv " + item.Name + " (" + item.Owner.ToString().Substring(34) + "): " +
|
||||
String.Format(Perms, (PermissionMask)item.BasePermissions,
|
||||
(PermissionMask)item.GroupPermissions, (PermissionMask)item.EveryOnePermissions, (PermissionMask)item.NextPermissions));
|
||||
|
||||
}
|
||||
|
||||
public void AssertPermissions(PermissionMask desired, PermissionMask actual, string message)
|
||||
{
|
||||
if ((desired & PermissionMask.Copy) != 0)
|
||||
Assert.True((actual & PermissionMask.Copy) != 0, message);
|
||||
else
|
||||
Assert.True((actual & PermissionMask.Copy) == 0, message);
|
||||
|
||||
if ((desired & PermissionMask.Modify) != 0)
|
||||
Assert.True((actual & PermissionMask.Modify) != 0, message);
|
||||
else
|
||||
Assert.True((actual & PermissionMask.Modify) == 0, message);
|
||||
|
||||
if ((desired & PermissionMask.Transfer) != 0)
|
||||
Assert.True((actual & PermissionMask.Transfer) != 0, message);
|
||||
else
|
||||
Assert.True((actual & PermissionMask.Transfer) == 0, message);
|
||||
|
||||
}
|
||||
|
||||
public SceneObjectGroup AddSceneObject(string name, int suffix, int partsToTestCount, UUID ownerID)
|
||||
{
|
||||
SceneObjectGroup so = SceneHelpers.CreateSceneObject(partsToTestCount, ownerID, name, suffix);
|
||||
so.Name = name;
|
||||
so.Description = name;
|
||||
|
||||
Assert.That(m_Scene.AddNewSceneObject(so, false), Is.True);
|
||||
SceneObjectGroup retrievedSo = m_Scene.GetSceneObjectGroup(so.UUID);
|
||||
|
||||
// If the parts have the same UUID then we will consider them as one and the same
|
||||
Assert.That(retrievedSo.PrimCount, Is.EqualTo(partsToTestCount));
|
||||
|
||||
return so;
|
||||
}
|
||||
|
||||
public void TakeCopyToInventory(int userIndex, SceneObjectGroup sog)
|
||||
{
|
||||
InventoryFolderBase objsFolder = UserInventoryHelpers.GetInventoryFolder(m_Scene.InventoryService, m_Avatars[userIndex].UUID, "Objects");
|
||||
Assert.That(objsFolder, Is.Not.Null);
|
||||
|
||||
List<uint> localIds = new List<uint>(); localIds.Add(sog.LocalId);
|
||||
// This is an async operation
|
||||
m_Scene.DeRezObjects((IClientAPI)m_Avatars[userIndex].ClientView, localIds, m_Avatars[userIndex].UUID, DeRezAction.TakeCopy, objsFolder.ID);
|
||||
}
|
||||
|
||||
public InventoryItemBase GetItemFromInventory(UUID userID, string folderName, string itemName)
|
||||
{
|
||||
InventoryFolderBase objsFolder = UserInventoryHelpers.GetInventoryFolder(m_Scene.InventoryService, userID, folderName);
|
||||
Assert.That(objsFolder, Is.Not.Null);
|
||||
List<InventoryItemBase> items = m_Scene.InventoryService.GetFolderItems(userID, objsFolder.ID);
|
||||
InventoryItemBase item = items.Find(i => i.Name == itemName);
|
||||
Assert.That(item, Is.Not.Null);
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
public InventoryItemBase CloneInventoryItem(InventoryItemBase item)
|
||||
{
|
||||
InventoryItemBase clone = new InventoryItemBase(item.ID);
|
||||
clone.Name = item.Name;
|
||||
clone.Description = item.Description;
|
||||
clone.AssetID = item.AssetID;
|
||||
clone.AssetType = item.AssetType;
|
||||
clone.BasePermissions = item.BasePermissions;
|
||||
clone.CreatorId = item.CreatorId;
|
||||
clone.CurrentPermissions = item.CurrentPermissions;
|
||||
clone.EveryOnePermissions = item.EveryOnePermissions;
|
||||
clone.Flags = item.Flags;
|
||||
clone.Folder = item.Folder;
|
||||
clone.GroupID = item.GroupID;
|
||||
clone.GroupOwned = item.GroupOwned;
|
||||
clone.GroupPermissions = item.GroupPermissions;
|
||||
clone.InvType = item.InvType;
|
||||
clone.NextPermissions = item.NextPermissions;
|
||||
clone.Owner = item.Owner;
|
||||
|
||||
return clone;
|
||||
}
|
||||
|
||||
public void DeleteObjectsFolders()
|
||||
{
|
||||
// Delete everything in A2 and A3's Objects folders, so we can restart
|
||||
for (int i = 1; i < 3; i++)
|
||||
{
|
||||
InventoryFolderBase objsFolder = UserInventoryHelpers.GetInventoryFolder(Common.TheScene.InventoryService, Common.TheAvatars[i].UUID, "Objects");
|
||||
Assert.That(objsFolder, Is.Not.Null);
|
||||
|
||||
List<InventoryItemBase> items = Common.TheScene.InventoryService.GetFolderItems(Common.TheAvatars[i].UUID, objsFolder.ID);
|
||||
List<UUID> ids = new List<UUID>();
|
||||
foreach (InventoryItemBase it in items)
|
||||
ids.Add(it.ID);
|
||||
|
||||
Common.TheScene.InventoryService.DeleteItems(Common.TheAvatars[i].UUID, ids);
|
||||
items = Common.TheScene.InventoryService.GetFolderItems(Common.TheAvatars[i].UUID, objsFolder.ID);
|
||||
Assert.That(items.Count, Is.EqualTo(0), "A" + (i + 1));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public string IdStr(InventoryItemBase item)
|
||||
{
|
||||
return item.Owner.ToString().Substring(34) + " : " + item.Name;
|
||||
}
|
||||
|
||||
public string IdStr(SceneObjectGroup sog)
|
||||
{
|
||||
return sog.OwnerID.ToString().Substring(34) + " : " + sog.Name;
|
||||
}
|
||||
|
||||
public void GiveInventoryItem(UUID itemId, ScenePresence giverSp, ScenePresence receiverSp)
|
||||
{
|
||||
TestClient giverClient = (TestClient)giverSp.ControllingClient;
|
||||
TestClient receiverClient = (TestClient)receiverSp.ControllingClient;
|
||||
|
||||
UUID initialSessionId = TestHelpers.ParseTail(0x10);
|
||||
byte[] giveImBinaryBucket = new byte[17];
|
||||
byte[] itemIdBytes = itemId.GetBytes();
|
||||
Array.Copy(itemIdBytes, 0, giveImBinaryBucket, 1, itemIdBytes.Length);
|
||||
|
||||
GridInstantMessage giveIm
|
||||
= new GridInstantMessage(
|
||||
m_Scene,
|
||||
giverSp.UUID,
|
||||
giverSp.Name,
|
||||
receiverSp.UUID,
|
||||
(byte)InstantMessageDialog.InventoryOffered,
|
||||
false,
|
||||
"inventory offered msg",
|
||||
initialSessionId,
|
||||
false,
|
||||
Vector3.Zero,
|
||||
giveImBinaryBucket,
|
||||
true);
|
||||
|
||||
giverClient.HandleImprovedInstantMessage(giveIm);
|
||||
|
||||
// These details might not all be correct.
|
||||
GridInstantMessage acceptIm
|
||||
= new GridInstantMessage(
|
||||
m_Scene,
|
||||
receiverSp.UUID,
|
||||
receiverSp.Name,
|
||||
giverSp.UUID,
|
||||
(byte)InstantMessageDialog.InventoryAccepted,
|
||||
false,
|
||||
"inventory accepted msg",
|
||||
initialSessionId,
|
||||
false,
|
||||
Vector3.Zero,
|
||||
null,
|
||||
true);
|
||||
|
||||
receiverClient.HandleImprovedInstantMessage(acceptIm);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,146 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Tests.Common;
|
||||
using PermissionMask = OpenSim.Framework.PermissionMask;
|
||||
|
||||
namespace OpenSim.Tests.Permissions
|
||||
{
|
||||
/// <summary>
|
||||
/// Basic scene object tests (create, read and delete but not update).
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class DirectTransferTests
|
||||
{
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
Common.TheInstance.DeleteObjectsFolders();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test giving simple objecta with various combinations of next owner perms.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestGiveBox()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
|
||||
// C, CT, MC, MCT, MT, T
|
||||
string[] names = new string[6] { "Box C", "Box CT", "Box MC", "Box MCT", "Box MT", "Box T" };
|
||||
PermissionMask[] perms = new PermissionMask[6] {
|
||||
PermissionMask.Copy,
|
||||
PermissionMask.Copy | PermissionMask.Transfer,
|
||||
PermissionMask.Modify | PermissionMask.Copy,
|
||||
PermissionMask.Modify | PermissionMask.Copy | PermissionMask.Transfer,
|
||||
PermissionMask.Modify | PermissionMask.Transfer,
|
||||
PermissionMask.Transfer
|
||||
};
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
TestOneBox(names[i], perms[i]);
|
||||
}
|
||||
|
||||
private void TestOneBox(string name, PermissionMask mask)
|
||||
{
|
||||
InventoryItemBase item = Common.TheInstance.GetItemFromInventory(Common.TheAvatars[0].UUID, "Objects", name);
|
||||
|
||||
Common.TheInstance.GiveInventoryItem(item.ID, Common.TheAvatars[0], Common.TheAvatars[1]);
|
||||
|
||||
item = Common.TheInstance.GetItemFromInventory(Common.TheAvatars[1].UUID, "Objects", name);
|
||||
|
||||
// Check the receiver
|
||||
Common.TheInstance.PrintPerms(item);
|
||||
Common.TheInstance.AssertPermissions(mask, (PermissionMask)item.BasePermissions, item.Owner.ToString().Substring(34) + " : " + item.Name);
|
||||
|
||||
int nObjects = Common.TheScene.GetSceneObjectGroups().Count;
|
||||
// Rez it and check perms in scene too
|
||||
Common.TheScene.RezObject(Common.TheAvatars[1].ControllingClient, item.ID, UUID.Zero, Vector3.One, Vector3.Zero, UUID.Zero, 0, false, false, false, UUID.Zero);
|
||||
Assert.That(Common.TheScene.GetSceneObjectGroups().Count, Is.EqualTo(nObjects + 1));
|
||||
|
||||
SceneObjectGroup box = Common.TheScene.GetSceneObjectGroups().Find(sog => sog.OwnerID == Common.TheAvatars[1].UUID && sog.Name == name);
|
||||
Common.TheInstance.PrintPerms(box);
|
||||
Assert.That(box, Is.Not.Null);
|
||||
|
||||
// Check Owner permissions
|
||||
Common.TheInstance.AssertPermissions(mask, (PermissionMask)box.EffectiveOwnerPerms, box.OwnerID.ToString().Substring(34) + " : " + box.Name);
|
||||
|
||||
// Check Next Owner permissions
|
||||
Common.TheInstance.AssertPermissions(mask, (PermissionMask)box.RootPart.NextOwnerMask, box.OwnerID.ToString().Substring(34) + " : " + box.Name);
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test giving simple objecta with variour combinations of next owner perms.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void TestDoubleGiveWithChange()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
|
||||
string name = "Box MCT-C";
|
||||
InventoryItemBase item = Common.TheInstance.GetItemFromInventory(Common.TheAvatars[0].UUID, "Objects", name);
|
||||
|
||||
// Now give the item to A2. We give the original item, not a clone.
|
||||
// The giving methods are supposed to duplicate it.
|
||||
Common.TheInstance.GiveInventoryItem(item.ID, Common.TheAvatars[0], Common.TheAvatars[1]);
|
||||
|
||||
item = Common.TheInstance.GetItemFromInventory(Common.TheAvatars[1].UUID, "Objects", name);
|
||||
|
||||
// Check the receiver
|
||||
Common.TheInstance.PrintPerms(item);
|
||||
Common.TheInstance.AssertPermissions(PermissionMask.Modify | PermissionMask.Transfer,
|
||||
(PermissionMask)item.BasePermissions, Common.TheInstance.IdStr(item));
|
||||
|
||||
// ---------------------------
|
||||
// Second transfer
|
||||
//----------------------------
|
||||
|
||||
// A2 revokes M
|
||||
Common.TheInstance.RevokePermission(1, name, PermissionMask.Modify);
|
||||
|
||||
item = Common.TheInstance.GetItemFromInventory(Common.TheAvatars[1].UUID, "Objects", name);
|
||||
|
||||
// Now give the item to A3. We give the original item, not a clone.
|
||||
// The giving methods are supposed to duplicate it.
|
||||
Common.TheInstance.GiveInventoryItem(item.ID, Common.TheAvatars[1], Common.TheAvatars[2]);
|
||||
|
||||
item = Common.TheInstance.GetItemFromInventory(Common.TheAvatars[2].UUID, "Objects", name);
|
||||
|
||||
// Check the receiver
|
||||
Common.TheInstance.PrintPerms(item);
|
||||
Common.TheInstance.AssertPermissions(PermissionMask.Transfer,
|
||||
(PermissionMask)item.BasePermissions, Common.TheInstance.IdStr(item));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using NUnit.Framework;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Tests.Common;
|
||||
using PermissionMask = OpenSim.Framework.PermissionMask;
|
||||
|
||||
namespace OpenSim.Tests.Permissions
|
||||
{
|
||||
/// <summary>
|
||||
/// Basic scene object tests (create, read and delete but not update).
|
||||
/// </summary>
|
||||
[TestFixture]
|
||||
public class IndirectTransferTests
|
||||
{
|
||||
|
||||
[SetUp]
|
||||
public void SetUp()
|
||||
{
|
||||
Common.TheInstance.DeleteObjectsFolders();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test giving simple objecta with various combinations of next owner perms.
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void SimpleTakeCopy()
|
||||
{
|
||||
TestHelpers.InMethod();
|
||||
|
||||
// The Objects folder of A2
|
||||
InventoryFolderBase objsFolder = UserInventoryHelpers.GetInventoryFolder(Common.TheScene.InventoryService, Common.TheAvatars[1].UUID, "Objects");
|
||||
|
||||
// C, CT, MC, MCT, MT, T
|
||||
string[] names = new string[6] { "Box C", "Box CT", "Box MC", "Box MCT", "Box MT", "Box T" };
|
||||
PermissionMask[] perms = new PermissionMask[6] {
|
||||
PermissionMask.Copy,
|
||||
PermissionMask.Copy | PermissionMask.Transfer,
|
||||
PermissionMask.Modify | PermissionMask.Copy,
|
||||
PermissionMask.Modify | PermissionMask.Copy | PermissionMask.Transfer,
|
||||
PermissionMask.Modify | PermissionMask.Transfer,
|
||||
PermissionMask.Transfer
|
||||
};
|
||||
|
||||
// Try A2 takes copies of objects that cannot be copied.
|
||||
for (int i = 0; i < 6; i++)
|
||||
TakeOneBox(Common.TheScene.GetSceneObjectGroups(), names[i], perms[i]);
|
||||
Thread.Sleep(5000);
|
||||
|
||||
List<InventoryItemBase> items = Common.TheScene.InventoryService.GetFolderItems(Common.TheAvatars[1].UUID, objsFolder.ID);
|
||||
Assert.That(items.Count, Is.EqualTo(0));
|
||||
|
||||
// A1 makes the objects copyable
|
||||
for (int i = 0; i < 6; i++)
|
||||
MakeCopyable(Common.TheScene.GetSceneObjectGroups(), names[i]);
|
||||
|
||||
// Try A2 takes copies of objects that can be copied.
|
||||
for (int i = 0; i < 6; i++)
|
||||
TakeOneBox(Common.TheScene.GetSceneObjectGroups(), names[i], perms[i]);
|
||||
Thread.Sleep(5000);
|
||||
|
||||
items = Common.TheScene.InventoryService.GetFolderItems(Common.TheAvatars[1].UUID, objsFolder.ID);
|
||||
Assert.That(items.Count, Is.EqualTo(6));
|
||||
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
InventoryItemBase item = Common.TheInstance.GetItemFromInventory(Common.TheAvatars[1].UUID, "Objects", names[i]);
|
||||
Assert.That(item, Is.Not.Null);
|
||||
Common.TheInstance.AssertPermissions(perms[i], (PermissionMask)item.BasePermissions, Common.TheInstance.IdStr(item));
|
||||
}
|
||||
}
|
||||
|
||||
private void TakeOneBox(List<SceneObjectGroup> objs, string name, PermissionMask mask)
|
||||
{
|
||||
SceneObjectGroup box = objs.Find(sog => sog.Name == name && sog.OwnerID == Common.TheAvatars[0].UUID);
|
||||
Assert.That(box, Is.Not.Null, name);
|
||||
|
||||
// A2's inventory (index 1)
|
||||
Common.TheInstance.TakeCopyToInventory(1, box);
|
||||
}
|
||||
|
||||
private void MakeCopyable(List<SceneObjectGroup> objs, string name)
|
||||
{
|
||||
SceneObjectGroup box = objs.Find(sog => sog.Name == name && sog.OwnerID == Common.TheAvatars[0].UUID);
|
||||
Assert.That(box, Is.Not.Null, name);
|
||||
|
||||
// field = 8 is Everyone
|
||||
// set = 1 means add the permission; set = 0 means remove permission
|
||||
Common.TheScene.HandleObjectPermissionsUpdate((IClientAPI)Common.TheAvatars[0].ClientView, Common.TheAvatars[0].UUID,
|
||||
Common.TheAvatars[0].ControllingClient.SessionId, 8, box.LocalId, (uint)PermissionMask.Copy, 1);
|
||||
Common.TheInstance.PrintPerms(box);
|
||||
}
|
||||
}
|
||||
}
|
BIN
bin/CSJ2K.dll
BIN
bin/CSJ2K.dll
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -49,19 +49,13 @@
|
|||
; this section defines constants for grid services
|
||||
; to simplify other configuration files default settings
|
||||
|
||||
; BaseURL
|
||||
; should be the externally accessible IP/DNS name of grid or standalone
|
||||
; http://externalHostName or https://externalHostName if using ssl
|
||||
; examples: http://mymachine.example.com, https://mymachine.example.com, https://127.0.0.1
|
||||
; default: http://127.0.0.1
|
||||
;# {BaseURL} {} {BaseURL} {"http://example.com" "http://127.0.0.1"} ""
|
||||
BaseURL = http://127.0.0.1
|
||||
;# {BaseHostname} {} {BaseHostname} {"example.com" "127.0.0.1"} "127.0.0.1"
|
||||
BaseHostname = "127.0.0.1"
|
||||
|
||||
; default public port
|
||||
; usually 8002 for grids.
|
||||
; on standalones it needs to match http_listener_port or http_listener_sslport if using ssl
|
||||
; in [Network] section below (defaults 9000 or 9001 if using ssl)
|
||||
;# {PublicPort} {} {PublicPort} {8002 9000 9001} "8002"
|
||||
;# {BaseURL} {} {BaseURL} {"http://${Const|BaseHostname}} "http://${Const|BaseHostname}"
|
||||
BaseURL = http://${Const|BaseHostname}
|
||||
|
||||
;# {PublicPort} {} {PublicPort} {8002 9000} "8002"
|
||||
PublicPort = "8002"
|
||||
|
||||
;grid default private port 8003, not used in standalone
|
||||
|
@ -569,10 +563,9 @@
|
|||
|
||||
;# {ExternalHostNameForLSL} {} {Hostname to use for HTTP-IN URLs. This should be reachable from the internet.} {}
|
||||
;; Hostname to use in llRequestURL/llRequestSecureURL
|
||||
;; if not defined - default machine name is being used
|
||||
;; (on Windows this mean NETBIOS name - useably only inside local network)
|
||||
; ExternalHostNameForLSL = "127.0.0.1"
|
||||
|
||||
;; if not defined - llRequestURL/llRequestSecureURL are disabled
|
||||
ExternalHostNameForLSL = ${Const|BaseHostname}
|
||||
|
||||
;# {shard} {} {Name to use for X-Secondlife-Shard header? (press enter if unsure)} {} OpenSim
|
||||
;; What is reported as the "X-Secondlife-Shard"
|
||||
;; Defaults to the user server url if not set
|
||||
|
|
|
@ -614,8 +614,7 @@
|
|||
|
||||
; Hostname to use in llRequestURL/llRequestSecureURL
|
||||
; must be a valid hostname for the ssl cert.
|
||||
; if not defined - default machine name is being used
|
||||
; (on Windows this mean NETBIOS name - useably only inside local network)
|
||||
; if not defined - llRequestURL/llRequestSecureURL are disabled
|
||||
; ExternalHostNameForLSL=127.0.0.1
|
||||
|
||||
; Disallow the following address ranges for user scripting calls (e.g. llHttpRequest())
|
||||
|
@ -1913,7 +1912,8 @@
|
|||
|
||||
; regex specifying for which regions concierge service is desired; if
|
||||
; empty, then for all
|
||||
regions = "^MeetingSpace-"
|
||||
;regions = "^MeetingSpace-"
|
||||
regions = ""
|
||||
|
||||
; for each region that matches the regions regexp you can provide
|
||||
; (optionally) a welcome template using format substitution:
|
||||
|
@ -1921,14 +1921,14 @@
|
|||
; {1} is replaced with the name of the region
|
||||
; {2} is replaced with the name of the concierge (whoami variable above)
|
||||
|
||||
welcomes = /path/to/welcome/template/directory
|
||||
;welcomes = /path/to/welcome/template/directory
|
||||
|
||||
; Concierge can send attendee lists to an event broker whenever an
|
||||
; avatar enters or leaves a concierged region. the URL is subject
|
||||
; to format substitution:
|
||||
; {0} is replaced with the region's name
|
||||
; {1} is replaced with the region's UUID
|
||||
broker = "http://broker.place.com/{1}"
|
||||
;broker = "http://broker.place.com/{1}"
|
||||
|
||||
|
||||
[MRM]
|
||||
|
|
41
prebuild.xml
41
prebuild.xml
|
@ -3300,7 +3300,46 @@
|
|||
</Files>
|
||||
</Project>
|
||||
|
||||
<?include file="addon-modules/*/prebuild*.xml" ?>
|
||||
<Project frameworkVersion="v4_0" name="OpenSim.Tests.Permissions" path="OpenSim/Tests/Permissions" type="Library">
|
||||
<Configuration name="Debug">
|
||||
<Options>
|
||||
<OutputPath>../../../bin/</OutputPath>
|
||||
</Options>
|
||||
</Configuration>
|
||||
<Configuration name="Release">
|
||||
<Options>
|
||||
<OutputPath>../../../bin/</OutputPath>
|
||||
</Options>
|
||||
</Configuration>
|
||||
|
||||
<ReferencePath>../../../bin/</ReferencePath>
|
||||
<Reference name="System"/>
|
||||
<Reference name="System.Core"/>
|
||||
<Reference name="System.Xml"/>
|
||||
<Reference name="Mono.Addins" path="../../../bin/"/>
|
||||
<Reference name="OpenMetaverseTypes" path="../../../bin/"/>
|
||||
<Reference name="OpenMetaverse" path="../../../bin/"/>
|
||||
<Reference name="OpenSim"/>
|
||||
<Reference name="OpenSim.ApplicationPlugins.RegionModulesController"/>
|
||||
<Reference name="OpenSim.Framework"/>
|
||||
<Reference name="OpenSim.Region.Framework"/>
|
||||
<Reference name="OpenSim.Region.CoreModules"/>
|
||||
<Reference name="OpenSim.Services.Interfaces"/>
|
||||
|
||||
<!-- Unit tests -->
|
||||
<!-- <Reference name="OpenSim.Tests.Common"/> -->
|
||||
<Reference name="OpenSim.Tests.Common"/>
|
||||
<Reference name="Nini" path="../../../bin/"/>
|
||||
<Reference name="nunit.framework" path="../../../bin/"/>
|
||||
|
||||
<Reference name="log4net" path="../../../bin/"/>
|
||||
|
||||
<Files>
|
||||
<Match pattern="*.cs" recurse="false"/>
|
||||
</Files>
|
||||
</Project>
|
||||
|
||||
<?include file="addon-modules/*/prebuild*.xml" ?>
|
||||
|
||||
</Solution>
|
||||
|
||||
|
|
Loading…
Reference in New Issue