Revamp the viewer -> banlist packet processing so fix a number of bugs.

Remove the too coarse CanEditParcel method in favor of a CanEditParcelProperties
method that takes a GroupPowers argument to specify what action is to be
taken. Also, make the method to set parcel data much more granular. Permissions
in a deeded setting should now work.
avinationmerge
Melanie 2010-12-13 20:19:52 +01:00
parent d36b880022
commit 6b374fa547
11 changed files with 246 additions and 183 deletions

View File

@ -174,9 +174,10 @@ namespace OpenSim.Framework
public delegate void ParcelAccessListRequest( public delegate void ParcelAccessListRequest(
UUID agentID, UUID sessionID, uint flags, int sequenceID, int landLocalID, IClientAPI remote_client); UUID agentID, UUID sessionID, uint flags, int sequenceID, int landLocalID, IClientAPI remote_client);
public delegate void ParcelAccessListUpdateRequest( public delegate void ParcelAccessListUpdateRequest(UUID agentID, uint flags,
UUID agentID, UUID sessionID, uint flags, int landLocalID, List<ParcelManager.ParcelAccessEntry> entries, int landLocalID, UUID transactionID, int sequenceID,
IClientAPI remote_client); int sections, List<ParcelManager.ParcelAccessEntry> entries,
IClientAPI remote_client);
public delegate void ParcelPropertiesRequest( public delegate void ParcelPropertiesRequest(
int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client); int start_x, int start_y, int end_x, int end_y, int sequence_id, bool snap_selection, IClientAPI remote_client);

View File

@ -8298,7 +8298,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
entry.AgentID = block.ID; entry.AgentID = block.ID;
entry.Flags = (AccessList)block.Flags; entry.Flags = (AccessList)block.Flags;
entry.Time = new DateTime(); entry.Time = Util.ToDateTime(block.Time);
entries.Add(entry); entries.Add(entry);
} }
@ -8306,8 +8306,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (handlerParcelAccessListUpdateRequest != null) if (handlerParcelAccessListUpdateRequest != null)
{ {
handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID, handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID,
updatePacket.AgentData.SessionID, updatePacket.Data.Flags, updatePacket.Data.Flags,
updatePacket.Data.LocalID, entries, this); updatePacket.Data.LocalID,
updatePacket.Data.TransactionID,
updatePacket.Data.SequenceID,
updatePacket.Data.Sections,
entries, this);
} }
return true; return true;
} }

View File

@ -167,7 +167,7 @@ namespace OpenSim.Region.CoreModules.World.Land
client.OnParcelSelectObjects += ClientOnParcelSelectObjects; client.OnParcelSelectObjects += ClientOnParcelSelectObjects;
client.OnParcelObjectOwnerRequest += ClientOnParcelObjectOwnerRequest; client.OnParcelObjectOwnerRequest += ClientOnParcelObjectOwnerRequest;
client.OnParcelAccessListRequest += ClientOnParcelAccessListRequest; client.OnParcelAccessListRequest += ClientOnParcelAccessListRequest;
client.OnParcelAccessListUpdateRequest += ClientOnParcelAccessUpdateListRequest; client.OnParcelAccessListUpdateRequest += ClientOnParcelAccessListUpdateRequest;
client.OnParcelAbandonRequest += ClientOnParcelAbandonRequest; client.OnParcelAbandonRequest += ClientOnParcelAbandonRequest;
client.OnParcelGodForceOwner += ClientOnParcelGodForceOwner; client.OnParcelGodForceOwner += ClientOnParcelGodForceOwner;
client.OnParcelReclaim += ClientOnParcelReclaim; client.OnParcelReclaim += ClientOnParcelReclaim;
@ -516,14 +516,22 @@ namespace OpenSim.Region.CoreModules.World.Land
if (land != null) if (land != null)
{ {
m_landList[landLocalID].SendAccessList(agentID, sessionID, flags, sequenceID, remote_client); land.SendAccessList(agentID, sessionID, flags, sequenceID, remote_client);
} }
} }
public void ClientOnParcelAccessUpdateListRequest(UUID agentID, UUID sessionID, uint flags, int landLocalID, public void ClientOnParcelAccessListUpdateRequest(UUID agentID,
List<ParcelManager.ParcelAccessEntry> entries, uint flags, int landLocalID, UUID transactionID, int sequenceID,
IClientAPI remote_client) int sections, List<ParcelManager.ParcelAccessEntry> entries,
IClientAPI remote_client)
{ {
// Flags is the list to update, it can mean either the ban or
// the access list (WTH is a pass list? Mentioned in ParcelFlags)
//
// There may be multiple packets, because these can get LONG.
// Use transactionID to determine a new chain of packets since
// packets may have come in out of sequence and that would be
// a big mess if using the sequenceID
ILandObject land; ILandObject land;
lock (m_landList) lock (m_landList)
{ {
@ -532,9 +540,15 @@ namespace OpenSim.Region.CoreModules.World.Land
if (land != null) if (land != null)
{ {
if (agentID == land.LandData.OwnerID) GroupPowers requiredPowers = GroupPowers.LandManageAllowed;
if (flags == (uint)AccessList.Ban)
requiredPowers = GroupPowers.LandManageBanned;
if (m_scene.Permissions.CanEditParcelProperties(agentID,
land, requiredPowers))
{ {
land.UpdateAccessList(flags, entries, remote_client); land.UpdateAccessList(flags, transactionID, sequenceID,
sections, entries, remote_client);
} }
} }
else else
@ -862,7 +876,7 @@ namespace OpenSim.Region.CoreModules.World.Land
//If we are still here, then they are subdividing within one piece of land //If we are still here, then they are subdividing within one piece of land
//Check owner //Check owner
if (!m_scene.Permissions.CanEditParcel(attempting_user_id, startLandObject)) if (!m_scene.Permissions.CanEditParcelProperties(attempting_user_id, startLandObject, GroupPowers.LandDivideJoin))
{ {
return; return;
} }
@ -930,7 +944,7 @@ namespace OpenSim.Region.CoreModules.World.Land
{ {
return; return;
} }
if (!m_scene.Permissions.CanEditParcel(attempting_user_id, masterLandObject)) if (!m_scene.Permissions.CanEditParcelProperties(attempting_user_id, masterLandObject, GroupPowers.LandDivideJoin))
{ {
return; return;
} }
@ -1595,7 +1609,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (land == null) return; if (land == null) return;
if (!m_scene.Permissions.CanEditParcel(remoteClient.AgentId, land)) if (!m_scene.Permissions.CanEditParcelProperties(remoteClient.AgentId, land, GroupPowers.LandOptions))
return; return;
land.LandData.OtherCleanTime = otherCleanTime; land.LandData.OtherCleanTime = otherCleanTime;
@ -1695,7 +1709,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (targetAvatar.UserLevel == 0) if (targetAvatar.UserLevel == 0)
{ {
ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y); ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land)) if (!((Scene)client.Scene).Permissions.CanEditParcelProperties(client.AgentId, land, GroupPowers.LandEjectAndFreeze))
return; return;
if (flags == 0) if (flags == 0)
{ {
@ -1740,7 +1754,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (targetAvatar.UserLevel == 0) if (targetAvatar.UserLevel == 0)
{ {
ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y); ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land)) if (!((Scene)client.Scene).Permissions.CanEditParcelProperties(client.AgentId, land, GroupPowers.LandEjectAndFreeze))
return; return;
Vector3 position = new Vector3(0, 0, 0); Vector3 position = new Vector3(0, 0, 0);
@ -1819,7 +1833,7 @@ namespace OpenSim.Region.CoreModules.World.Land
if (targetAvatar.UserLevel == 0) if (targetAvatar.UserLevel == 0)
{ {
ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y); ILandObject land = ((Scene)client.Scene).LandChannel.GetLandObject(targetAvatar.AbsolutePosition.X, targetAvatar.AbsolutePosition.Y);
if (!((Scene)client.Scene).Permissions.CanEditParcel(client.AgentId, land)) if (!((Scene)client.Scene).Permissions.CanEditParcelProperties(client.AgentId, land, GroupPowers.LandEjectAndFreeze))
return; return;
Vector3 position = new Vector3(0, 0, 0); Vector3 position = new Vector3(0, 0, 0);

View File

@ -54,6 +54,7 @@ namespace OpenSim.Region.CoreModules.World.Land
protected LandData m_landData = new LandData(); protected LandData m_landData = new LandData();
protected Scene m_scene; protected Scene m_scene;
protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>(); protected List<SceneObjectGroup> primsOverMe = new List<SceneObjectGroup>();
protected Dictionary<uint, UUID> m_listTransactions = new Dictionary<uint, UUID>();
public bool[,] LandBitmap public bool[,] LandBitmap
{ {
@ -199,36 +200,81 @@ namespace OpenSim.Region.CoreModules.World.Land
public void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client) public void UpdateLandProperties(LandUpdateArgs args, IClientAPI remote_client)
{ {
if (m_scene.Permissions.CanEditParcel(remote_client.AgentId,this)) //Needs later group support
{ bool snap_selection = false;
//Needs later group support LandData newData = LandData.Copy();
bool snap_selection = false;
LandData newData = LandData.Copy();
if (args.AuthBuyerID != newData.AuthBuyerID || args.SalePrice != newData.SalePrice) uint allowedDelta = 0;
// These two are always blocked as no client can set them anyway
// ParcelFlags.ForSaleObjects
// ParcelFlags.LindenHome
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandOptions))
{
allowedDelta |= (uint)(ParcelFlags.AllowLandmark |
ParcelFlags.AllowTerraform |
ParcelFlags.AllowDamage |
ParcelFlags.CreateObjects |
ParcelFlags.RestrictPushObject |
ParcelFlags.AllowGroupScripts |
ParcelFlags.CreateGroupObjects |
ParcelFlags.AllowAPrimitiveEntry |
ParcelFlags.AllowGroupObjectEntry);
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandSetSale))
{
if (args.AuthBuyerID != newData.AuthBuyerID ||
args.SalePrice != newData.SalePrice)
{ {
if (m_scene.Permissions.CanSellParcel(remote_client.AgentId, this)) snap_selection = true;
{
newData.AuthBuyerID = args.AuthBuyerID;
newData.SalePrice = args.SalePrice;
snap_selection = true;
}
} }
newData.AuthBuyerID = args.AuthBuyerID;
newData.SalePrice = args.SalePrice;
if (!LandData.IsGroupOwned)
{
newData.GroupID = args.GroupID;
allowedDelta |= (uint)(ParcelFlags.AllowDeedToGroup |
ParcelFlags.ContributeWithDeed |
ParcelFlags.SellParcelObjects);
}
allowedDelta |= (uint)ParcelFlags.ForSale;
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.FindPlaces))
{
newData.Category = args.Category; newData.Category = args.Category;
allowedDelta |= (uint)(ParcelFlags.ShowDirectory |
ParcelFlags.AllowPublish |
ParcelFlags.MaturePublish);
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.LandChangeIdentity))
{
newData.Description = args.Desc; newData.Description = args.Desc;
newData.GroupID = args.GroupID; newData.Name = args.Name;
newData.SnapshotID = args.SnapshotID;
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.SetLandingPoint))
{
newData.LandingType = args.LandingType; newData.LandingType = args.LandingType;
newData.UserLocation = args.UserLocation;
newData.UserLookAt = args.UserLookAt;
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.ChangeMedia))
{
newData.MediaAutoScale = args.MediaAutoScale; newData.MediaAutoScale = args.MediaAutoScale;
newData.MediaID = args.MediaID; newData.MediaID = args.MediaID;
newData.MediaURL = args.MediaURL; newData.MediaURL = args.MediaURL;
newData.MusicURL = args.MusicURL; newData.MusicURL = args.MusicURL;
newData.Name = args.Name;
newData.Flags = args.ParcelFlags;
newData.PassHours = args.PassHours;
newData.PassPrice = args.PassPrice;
newData.SnapshotID = args.SnapshotID;
newData.UserLocation = args.UserLocation;
newData.UserLookAt = args.UserLookAt;
newData.MediaType = args.MediaType; newData.MediaType = args.MediaType;
newData.MediaDescription = args.MediaDescription; newData.MediaDescription = args.MediaDescription;
newData.MediaWidth = args.MediaWidth; newData.MediaWidth = args.MediaWidth;
@ -237,10 +283,40 @@ namespace OpenSim.Region.CoreModules.World.Land
newData.ObscureMusic = args.ObscureMusic; newData.ObscureMusic = args.ObscureMusic;
newData.ObscureMedia = args.ObscureMedia; newData.ObscureMedia = args.ObscureMedia;
m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData); allowedDelta |= (uint)(ParcelFlags.SoundLocal |
ParcelFlags.UrlWebPage |
SendLandUpdateToAvatarsOverMe(snap_selection); ParcelFlags.UrlRawHtml |
ParcelFlags.AllowVoiceChat |
ParcelFlags.UseEstateVoiceChan);
} }
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId,this, GroupPowers.LandManagePasses))
{
newData.PassHours = args.PassHours;
newData.PassPrice = args.PassPrice;
allowedDelta |= (uint)ParcelFlags.UsePassList;
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandManageAllowed))
{
allowedDelta |= (uint)(ParcelFlags.UseAccessGroup |
ParcelFlags.UseAccessList);
}
if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandManageBanned))
{
allowedDelta |= (uint)(ParcelFlags.UseBanList |
ParcelFlags.DenyAnonymous |
ParcelFlags.DenyAgeUnverified);
}
uint preserve = LandData.Flags & ~allowedDelta;
newData.Flags = preserve | (args.ParcelFlags & allowedDelta);
m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData);
SendLandUpdateToAvatarsOverMe(snap_selection);
} }
public void UpdateLandSold(UUID avatarID, UUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area) public void UpdateLandSold(UUID avatarID, UUID groupID, bool groupOwned, uint AuctionID, int claimprice, int area)
@ -326,14 +402,14 @@ namespace OpenSim.Region.CoreModules.World.Land
if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0) if ((LandData.Flags & (uint) ParcelFlags.UseBanList) > 0)
{ {
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); if (LandData.ParcelAccessList.FindIndex(
entry.AgentID = avatar; delegate(ParcelManager.ParcelAccessEntry e)
entry.Flags = AccessList.Ban; {
entry.Time = new DateTime(); if (e.AgentID == avatar && e.Flags == AccessList.Ban)
//See if they are on the list, but make sure the owner isn't banned return true;
if (LandData.ParcelAccessList.Contains(entry) && LandData.OwnerID != avatar) return false;
}) != -1 && LandData.OwnerID != avatar)
{ {
//They are banned, so lets send them a notice about this parcel
return true; return true;
} }
} }
@ -347,17 +423,16 @@ namespace OpenSim.Region.CoreModules.World.Land
if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0) if ((LandData.Flags & (uint) ParcelFlags.UseAccessList) > 0)
{ {
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); if (LandData.ParcelAccessList.FindIndex(
entry.AgentID = avatar; delegate(ParcelManager.ParcelAccessEntry e)
entry.Flags = AccessList.Access; {
entry.Time = new DateTime(); if (e.AgentID == avatar && e.Flags == AccessList.Access)
return true;
//If they are not on the access list and are not the owner return false;
if (!LandData.ParcelAccessList.Contains(entry) && LandData.OwnerID != avatar) }) == -1 && LandData.OwnerID != avatar)
{ {
if (!HasGroupAccess(avatar)) if (!HasGroupAccess(avatar))
{ {
//They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel
return true; return true;
} }
} }
@ -456,39 +531,50 @@ namespace OpenSim.Region.CoreModules.World.Land
} }
} }
public void UpdateAccessList(uint flags, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client) public void UpdateAccessList(uint flags, UUID transactionID,
int sequenceID, int sections,
List<ParcelManager.ParcelAccessEntry> entries,
IClientAPI remote_client)
{ {
LandData newData = LandData.Copy(); LandData newData = LandData.Copy();
if (entries.Count == 1 && entries[0].AgentID == UUID.Zero) if ((!m_listTransactions.ContainsKey(flags)) ||
m_listTransactions[flags] != transactionID)
{ {
entries.Clear(); m_listTransactions[flags] = transactionID;
}
List<ParcelManager.ParcelAccessEntry> toRemove = new List<ParcelManager.ParcelAccessEntry>(); List<ParcelManager.ParcelAccessEntry> toRemove =
foreach (ParcelManager.ParcelAccessEntry entry in newData.ParcelAccessList) new List<ParcelManager.ParcelAccessEntry>();
{
if (entry.Flags == (AccessList)flags) foreach (ParcelManager.ParcelAccessEntry entry in newData.ParcelAccessList)
{ {
toRemove.Add(entry); if (entry.Flags == (AccessList)flags)
toRemove.Add(entry);
}
foreach (ParcelManager.ParcelAccessEntry entry in toRemove)
{
newData.ParcelAccessList.Remove(entry);
}
// Checked here because this will always be the first
// and only packet in a transaction
if (entries.Count == 1 && entries[0].AgentID == UUID.Zero)
{
return;
} }
} }
foreach (ParcelManager.ParcelAccessEntry entry in toRemove)
{
newData.ParcelAccessList.Remove(entry);
}
foreach (ParcelManager.ParcelAccessEntry entry in entries) foreach (ParcelManager.ParcelAccessEntry entry in entries)
{ {
ParcelManager.ParcelAccessEntry temp = new ParcelManager.ParcelAccessEntry(); ParcelManager.ParcelAccessEntry temp =
new ParcelManager.ParcelAccessEntry();
temp.AgentID = entry.AgentID; temp.AgentID = entry.AgentID;
temp.Time = new DateTime(); //Pointless? Yes. temp.Time = entry.Time;
temp.Flags = (AccessList)flags; temp.Flags = (AccessList)flags;
if (!newData.ParcelAccessList.Contains(temp)) newData.ParcelAccessList.Add(temp);
{
newData.ParcelAccessList.Add(temp);
}
} }
m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData); m_scene.LandChannel.UpdateLandObject(LandData.LocalID, newData);
@ -746,7 +832,7 @@ namespace OpenSim.Region.CoreModules.World.Land
public void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client) public void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client)
{ {
if (m_scene.Permissions.CanEditParcel(remote_client.AgentId, this)) if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandOptions))
{ {
List<uint> resultLocalIDs = new List<uint>(); List<uint> resultLocalIDs = new List<uint>();
try try
@ -796,7 +882,7 @@ namespace OpenSim.Region.CoreModules.World.Land
/// </param> /// </param>
public void SendLandObjectOwners(IClientAPI remote_client) public void SendLandObjectOwners(IClientAPI remote_client)
{ {
if (m_scene.Permissions.CanEditParcel(remote_client.AgentId, this)) if (m_scene.Permissions.CanEditParcelProperties(remote_client.AgentId, this, GroupPowers.LandOptions))
{ {
Dictionary<UUID, int> primCount = new Dictionary<UUID, int>(); Dictionary<UUID, int> primCount = new Dictionary<UUID, int>();
List<UUID> groups = new List<UUID>(); List<UUID> groups = new List<UUID>();

View File

@ -37,56 +37,6 @@ using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes; using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces; using OpenSim.Services.Interfaces;
// Temporary fix of wrong GroupPowers constants in OpenMetaverse library
enum GroupPowers : long
{
None = 0,
LandEjectAndFreeze = 1,
Invite = 2,
ReturnGroupSet = 2,
Eject = 4,
ReturnNonGroup = 4,
ChangeOptions = 8,
LandGardening = 8,
CreateRole = 16,
DeedObject = 16,
ModerateChat = 32,
DeleteRole = 32,
RoleProperties = 64,
ObjectManipulate = 64,
ObjectSetForSale = 128,
AssignMemberLimited = 128,
AssignMember = 256,
Accountable = 256,
RemoveMember = 512,
SendNotices = 1024,
ChangeActions = 1024,
ChangeIdentity = 2048,
ReceiveNotices = 2048,
StartProposal = 4096,
LandDeed = 4096,
VoteOnProposal = 8192,
LandRelease = 8192,
LandSetSale = 16384,
LandDivideJoin = 32768,
ReturnGroupOwned = 65536,
JoinChat = 65536,
FindPlaces = 131072,
LandChangeIdentity = 262144,
SetLandingPoint = 524288,
ChangeMedia = 1048576,
LandEdit = 2097152,
LandOptions = 4194304,
AllowEditLand = 8388608,
AllowFly = 16777216,
AllowRez = 33554432,
AllowLandmark = 67108864,
AllowVoiceChat = 134217728,
AllowSetHome = 268435456,
LandManageAllowed = 536870912,
LandManageBanned = 1073741824
}
namespace OpenSim.Region.CoreModules.World.Permissions namespace OpenSim.Region.CoreModules.World.Permissions
{ {
public class PermissionsModule : IRegionModule public class PermissionsModule : IRegionModule
@ -214,7 +164,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
m_scene.Permissions.OnDuplicateObject += CanDuplicateObject; m_scene.Permissions.OnDuplicateObject += CanDuplicateObject;
m_scene.Permissions.OnDeleteObject += CanDeleteObject; //MAYBE FULLY IMPLEMENTED m_scene.Permissions.OnDeleteObject += CanDeleteObject; //MAYBE FULLY IMPLEMENTED
m_scene.Permissions.OnEditObject += CanEditObject; //MAYBE FULLY IMPLEMENTED m_scene.Permissions.OnEditObject += CanEditObject; //MAYBE FULLY IMPLEMENTED
m_scene.Permissions.OnEditParcel += CanEditParcel; //MAYBE FULLY IMPLEMENTED m_scene.Permissions.OnEditParcelProperties += CanEditParcelProperties; //MAYBE FULLY IMPLEMENTED
m_scene.Permissions.OnInstantMessage += CanInstantMessage; m_scene.Permissions.OnInstantMessage += CanInstantMessage;
m_scene.Permissions.OnInventoryTransfer += CanInventoryTransfer; //NOT YET IMPLEMENTED m_scene.Permissions.OnInventoryTransfer += CanInventoryTransfer; //NOT YET IMPLEMENTED
m_scene.Permissions.OnIssueEstateCommand += CanIssueEstateCommand; //FULLY IMPLEMENTED m_scene.Permissions.OnIssueEstateCommand += CanIssueEstateCommand; //FULLY IMPLEMENTED
@ -1005,12 +955,12 @@ namespace OpenSim.Region.CoreModules.World.Permissions
return GenericObjectPermission(editorID, objectID, false); return GenericObjectPermission(editorID, objectID, false);
} }
private bool CanEditParcel(UUID user, ILandObject parcel, Scene scene) private bool CanEditParcelProperties(UUID user, ILandObject parcel, GroupPowers p, Scene scene)
{ {
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name); DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
if (m_bypassPermissions) return m_bypassPermissionsValue; if (m_bypassPermissions) return m_bypassPermissionsValue;
return GenericParcelOwnerPermission(user, parcel, (ulong)GroupPowers.LandDivideJoin); return GenericParcelOwnerPermission(user, parcel, (ulong)p);
} }
/// <summary> /// <summary>

View File

@ -57,7 +57,7 @@ namespace OpenSim.Region.Framework.Interfaces
void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client); void SendLandUpdateToClient(bool snap_selection, IClientAPI remote_client);
List<UUID> CreateAccessListArrayByFlag(AccessList flag); List<UUID> CreateAccessListArrayByFlag(AccessList flag);
void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client); void SendAccessList(UUID agentID, UUID sessionID, uint flags, int sequenceID, IClientAPI remote_client);
void UpdateAccessList(uint flags, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client); void UpdateAccessList(uint flags, UUID transactionID, int sequenceID, int sections, List<ParcelManager.ParcelAccessEntry> entries, IClientAPI remote_client);
void UpdateLandBitmapByteArray(); void UpdateLandBitmapByteArray();
void SetLandBitmapFromByteArray(); void SetLandBitmapFromByteArray();
bool[,] GetLandBitmap(); bool[,] GetLandBitmap();

View File

@ -722,20 +722,6 @@ namespace OpenSim.Region.Framework.Scenes
#endregion #endregion
#region EDIT PARCEL #region EDIT PARCEL
public bool CanEditParcel(UUID user, ILandObject parcel)
{
EditParcelHandler handler = OnEditParcel;
if (handler != null)
{
Delegate[] list = handler.GetInvocationList();
foreach (EditParcelHandler h in list)
{
if (h(user, parcel, m_scene) == false)
return false;
}
}
return true;
}
public bool CanEditParcelProperties(UUID user, ILandObject parcel, GroupPowers p) public bool CanEditParcelProperties(UUID user, ILandObject parcel, GroupPowers p)
{ {

View File

@ -919,7 +919,7 @@ namespace OpenSim.Region.RegionCombinerModule
VirtualRegion.Permissions.OnDuplicateObject += BigRegion.PermissionModule.CanDuplicateObject; VirtualRegion.Permissions.OnDuplicateObject += BigRegion.PermissionModule.CanDuplicateObject;
VirtualRegion.Permissions.OnDeleteObject += BigRegion.PermissionModule.CanDeleteObject; //MAYBE FULLY IMPLEMENTED VirtualRegion.Permissions.OnDeleteObject += BigRegion.PermissionModule.CanDeleteObject; //MAYBE FULLY IMPLEMENTED
VirtualRegion.Permissions.OnEditObject += BigRegion.PermissionModule.CanEditObject; //MAYBE FULLY IMPLEMENTED VirtualRegion.Permissions.OnEditObject += BigRegion.PermissionModule.CanEditObject; //MAYBE FULLY IMPLEMENTED
VirtualRegion.Permissions.OnEditParcel += BigRegion.PermissionModule.CanEditParcel; //MAYBE FULLY IMPLEMENTED VirtualRegion.Permissions.OnEditParcelProperties += BigRegion.PermissionModule.CanEditParcelProperties; //MAYBE FULLY IMPLEMENTED
VirtualRegion.Permissions.OnInstantMessage += BigRegion.PermissionModule.CanInstantMessage; VirtualRegion.Permissions.OnInstantMessage += BigRegion.PermissionModule.CanInstantMessage;
VirtualRegion.Permissions.OnInventoryTransfer += BigRegion.PermissionModule.CanInventoryTransfer; //NOT YET IMPLEMENTED VirtualRegion.Permissions.OnInventoryTransfer += BigRegion.PermissionModule.CanInventoryTransfer; //NOT YET IMPLEMENTED
VirtualRegion.Permissions.OnIssueEstateCommand += BigRegion.PermissionModule.CanIssueEstateCommand; //FULLY IMPLEMENTED VirtualRegion.Permissions.OnIssueEstateCommand += BigRegion.PermissionModule.CanIssueEstateCommand; //FULLY IMPLEMENTED

View File

@ -105,9 +105,9 @@ namespace OpenSim.Region.RegionCombinerModule
return m_rootScene.Permissions.CanEditObject(objectid, editorid); return m_rootScene.Permissions.CanEditObject(objectid, editorid);
} }
public bool CanEditParcel(UUID user, ILandObject parcel, Scene scene) public bool CanEditParcelProperties(UUID user, ILandObject parcel, GroupPowers g, Scene scene)
{ {
return m_rootScene.Permissions.CanEditParcel(user, parcel); return m_rootScene.Permissions.CanEditParcelProperties(user, parcel, g);
} }
public bool CanInstantMessage(UUID user, UUID target, Scene startscene) public bool CanInstantMessage(UUID user, UUID target, Scene startscene)

View File

@ -6653,16 +6653,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID key; UUID key;
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (land.OwnerID == m_host.OwnerID) if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed))
{ {
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
if (UUID.TryParse(avatar, out key)) if (UUID.TryParse(avatar, out key))
{ {
entry.AgentID = key; if (land.LandData.ParcelAccessList.FindIndex(
entry.Flags = AccessList.Access; delegate(ParcelManager.ParcelAccessEntry e)
entry.Time = DateTime.Now.AddHours(hours); {
land.ParcelAccessList.Add(entry); if (e.AgentID == key && e.Flags == AccessList.Access)
return true;
return false;
}) == -1)
{
entry.AgentID = key;
entry.Flags = AccessList.Access;
entry.Time = DateTime.Now.AddHours(hours);
land.LandData.ParcelAccessList.Add(entry);
}
} }
} }
ScriptSleep(100); ScriptSleep(100);
@ -9493,7 +9502,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// according to the docs, this command only works if script owner and land owner are the same // according to the docs, this command only works if script owner and land owner are the same
// lets add estate owners and gods, too, and use the generic permission check. // lets add estate owners and gods, too, and use the generic permission check.
ILandObject landObject = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); ILandObject landObject = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (!World.Permissions.CanEditParcel(m_host.OwnerID, landObject)) return; if (!World.Permissions.CanEditParcelProperties(m_host.OwnerID, landObject, GroupPowers.ChangeMedia)) return;
bool update = false; // send a ParcelMediaUpdate (and possibly change the land's media URL)? bool update = false; // send a ParcelMediaUpdate (and possibly change the land's media URL)?
byte loop = 0; byte loop = 0;
@ -9957,16 +9966,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID key; UUID key;
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (land.OwnerID == m_host.OwnerID) if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
{ {
ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
if (UUID.TryParse(avatar, out key)) if (UUID.TryParse(avatar, out key))
{ {
entry.AgentID = key; if (land.LandData.ParcelAccessList.FindIndex(
entry.Flags = AccessList.Ban; delegate(ParcelManager.ParcelAccessEntry e)
entry.Time = DateTime.Now.AddHours(hours); {
land.ParcelAccessList.Add(entry); if (e.AgentID == key && e.Flags == AccessList.Ban)
return true;
return false;
}) == -1)
{
entry.AgentID = key;
entry.Flags = AccessList.Ban;
entry.Time = DateTime.Now.AddHours(hours);
land.LandData.ParcelAccessList.Add(entry);
}
} }
} }
ScriptSleep(100); ScriptSleep(100);
@ -9976,19 +9994,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID key; UUID key;
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (land.OwnerID == m_host.OwnerID) if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed))
{ {
if (UUID.TryParse(avatar, out key)) if (UUID.TryParse(avatar, out key))
{ {
foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList) int idx = land.LandData.ParcelAccessList.FindIndex(
{ delegate(ParcelManager.ParcelAccessEntry e)
if (entry.AgentID == key && entry.Flags == AccessList.Access) {
{ if (e.AgentID == key && e.Flags == AccessList.Access)
land.ParcelAccessList.Remove(entry); return true;
break; return false;
} });
}
if (idx != -1)
land.LandData.ParcelAccessList.RemoveAt(idx);
} }
} }
ScriptSleep(100); ScriptSleep(100);
@ -9998,19 +10018,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID key; UUID key;
LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
if (land.OwnerID == m_host.OwnerID) if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
{ {
if (UUID.TryParse(avatar, out key)) if (UUID.TryParse(avatar, out key))
{ {
foreach (ParcelManager.ParcelAccessEntry entry in land.ParcelAccessList) int idx = land.LandData.ParcelAccessList.FindIndex(
{ delegate(ParcelManager.ParcelAccessEntry e)
if (entry.AgentID == key && entry.Flags == AccessList.Ban) {
{ if (e.AgentID == key && e.Flags == AccessList.Ban)
land.ParcelAccessList.Remove(entry); return true;
break; return false;
} });
}
if (idx != -1)
land.LandData.ParcelAccessList.RemoveAt(idx);
} }
} }
ScriptSleep(100); ScriptSleep(100);

View File

@ -1342,7 +1342,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return; return;
} }
if (! World.Permissions.CanEditParcel(m_host.OwnerID, startLandObject)) if (!World.Permissions.CanEditParcelProperties(m_host.OwnerID, startLandObject, GroupPowers.LandOptions))
{ {
OSSLShoutError("You do not have permission to modify the parcel"); OSSLShoutError("You do not have permission to modify the parcel");
return; return;