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.viewer-2-initial-appearance
parent
d6803e6448
commit
9bd7f3b03a
|
@ -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);
|
||||||
|
|
|
@ -8239,7 +8239,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8247,8 +8247,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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -159,7 +159,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;
|
||||||
|
@ -508,14 +508,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)
|
||||||
{
|
{
|
||||||
|
@ -524,9 +532,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
|
||||||
|
@ -854,7 +868,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;
|
||||||
}
|
}
|
||||||
|
@ -922,7 +936,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;
|
||||||
}
|
}
|
||||||
|
@ -1570,7 +1584,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;
|
||||||
|
|
|
@ -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)
|
||||||
|
@ -295,14 +371,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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -316,15 +392,14 @@ 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)
|
||||||
{
|
{
|
||||||
//They are not allowed in this parcel, but not banned, so lets send them a notice about this parcel
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -421,39 +496,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);
|
||||||
|
@ -711,7 +797,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
|
||||||
|
@ -761,7 +847,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>();
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1001,7 +1001,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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -6287,16 +6287,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);
|
||||||
|
@ -9023,7 +9032,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;
|
||||||
|
@ -9466,16 +9475,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);
|
||||||
|
@ -9485,19 +9503,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);
|
||||||
|
@ -9507,19 +9527,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);
|
||||||
|
|
|
@ -1335,7 +1335,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;
|
||||||
|
|
Loading…
Reference in New Issue