diff --git a/OpenSim/Framework/Constants.cs b/OpenSim/Framework/Constants.cs
index 3ba264c7af..209c991fa2 100644
--- a/OpenSim/Framework/Constants.cs
+++ b/OpenSim/Framework/Constants.cs
@@ -46,12 +46,20 @@ namespace OpenSim.Framework
public enum EstateAccessCodex : uint
{
- AccessOptions = 1,
+ AllowedAccess = 1,
AllowedGroups = 2,
EstateBans = 4,
EstateManagers = 8
}
+ public enum EstateAccessLimits : int
+ {
+ AllowedAccess = 500,
+ AllowedGroups = 63,
+ EstateBans = 500,
+ EstateManagers = 10
+ }
+
[Flags]public enum TeleportFlags : uint
{
/// No flags set, or teleport failed
diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs
index 4c9f6e9b38..844230b278 100644
--- a/OpenSim/Framework/EstateSettings.cs
+++ b/OpenSim/Framework/EstateSettings.cs
@@ -305,11 +305,17 @@ namespace OpenSim.Framework
OnSave(this);
}
+ public int EstateUsersCount()
+ {
+ return l_EstateAccess.Count;
+ }
+
public void AddEstateUser(UUID avatarID)
{
if (avatarID == UUID.Zero)
return;
- if (!l_EstateAccess.Contains(avatarID))
+ if (!l_EstateAccess.Contains(avatarID) &&
+ (l_EstateAccess.Count < (int)Constants.EstateAccessLimits.AllowedAccess))
l_EstateAccess.Add(avatarID);
}
@@ -319,11 +325,17 @@ namespace OpenSim.Framework
l_EstateAccess.Remove(avatarID);
}
+ public int EstateGroupsCount()
+ {
+ return l_EstateGroups.Count;
+ }
+
public void AddEstateGroup(UUID avatarID)
{
if (avatarID == UUID.Zero)
return;
- if (!l_EstateGroups.Contains(avatarID))
+ if (!l_EstateGroups.Contains(avatarID) &&
+ (l_EstateGroups.Count < (int)Constants.EstateAccessLimits.AllowedGroups))
l_EstateGroups.Add(avatarID);
}
@@ -333,11 +345,17 @@ namespace OpenSim.Framework
l_EstateGroups.Remove(avatarID);
}
+ public int EstateManagersCount()
+ {
+ return l_EstateManagers.Count;
+ }
+
public void AddEstateManager(UUID avatarID)
{
if (avatarID == UUID.Zero)
return;
- if (!l_EstateManagers.Contains(avatarID))
+ if (!l_EstateManagers.Contains(avatarID) &&
+ (l_EstateManagers.Count < (int)Constants.EstateAccessLimits.EstateManagers))
l_EstateManagers.Add(avatarID);
}
@@ -403,11 +421,17 @@ namespace OpenSim.Framework
return false;
}
+ public int EstateBansCount()
+ {
+ return l_EstateBans.Count;
+ }
+
public void AddBan(EstateBan ban)
{
if (ban == null)
return;
- if (!IsBanned(ban.BannedUserID, 32)) //Ignore age-based bans
+ if (!IsBanned(ban.BannedUserID, 32) &&
+ (l_EstateBans.Count < (int)Constants.EstateAccessLimits.EstateBans)) //Ignore age-based bans
l_EstateBans.Add(ban);
}
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index fd3f997525..ad25bc89ac 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -5072,52 +5072,74 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
public void SendEstateList(UUID invoice, int code, UUID[] Data, uint estateID)
-
{
- EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
- packet.AgentData.TransactionID = UUID.Random();
- packet.AgentData.AgentID = AgentId;
- packet.AgentData.SessionID = SessionId;
- packet.MethodData.Invoice = invoice;
- packet.MethodData.Method = Utils.StringToBytes("setaccess");
+ int TotalnumberIDs = Data.Length;
+ int numberIDs;
+ int IDIndex = 0;
- EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + Data.Length];
-
- for (int i = 0; i < (6 + Data.Length); i++)
+ do
{
- returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
- }
- int j = 0;
+ if(TotalnumberIDs > 63)
+ numberIDs = 63;
+ else
+ numberIDs = TotalnumberIDs;
- returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
- returnblock[j].Parameter = Utils.StringToBytes(code.ToString()); j++;
- returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
- returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
- returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
- returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
+ TotalnumberIDs -= numberIDs;
- j = 2; // Agents
- if ((code & 2) != 0)
- j = 3; // Groups
- if ((code & 8) != 0)
- j = 5; // Managers
+ EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
+ packet.AgentData.TransactionID = UUID.Random();
+ packet.AgentData.AgentID = AgentId;
+ packet.AgentData.SessionID = SessionId;
+ packet.MethodData.Invoice = invoice;
+ packet.MethodData.Method = Utils.StringToBytes("setaccess");
- returnblock[j].Parameter = Utils.StringToBytes(Data.Length.ToString());
- j = 6;
+ EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + numberIDs];
- for (int i = 0; i < Data.Length; i++)
- {
- returnblock[j].Parameter = Data[i].GetBytes(); j++;
- }
- packet.ParamList = returnblock;
- packet.Header.Reliable = true;
- OutPacket(packet, ThrottleOutPacketType.Task);
+ for (int i = 0; i < (6 + numberIDs); i++)
+ {
+ returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
+ }
+
+ returnblock[0].Parameter = Utils.StringToBytes(estateID.ToString());
+ returnblock[1].Parameter = Utils.StringToBytes(code.ToString());
+
+ if((code & 1) != 0) // allowagents
+ returnblock[2].Parameter = Utils.StringToBytes(numberIDs.ToString());
+ else
+ returnblock[2].Parameter = Utils.StringToBytes("0");
+
+ if((code & 2) != 0) // groups
+ returnblock[3].Parameter = Utils.StringToBytes(numberIDs.ToString());
+ else
+ returnblock[3].Parameter = Utils.StringToBytes("0");
+
+ if((code & 4) != 0) // bans
+ returnblock[4].Parameter = Utils.StringToBytes(numberIDs.ToString());
+ else
+ returnblock[4].Parameter = Utils.StringToBytes("0");
+
+ if((code & 8) != 0) // managers
+ returnblock[5].Parameter = Utils.StringToBytes(numberIDs.ToString());
+ else
+ returnblock[5].Parameter = Utils.StringToBytes("0");
+
+ int j = 6;
+
+ for (int i = 0; i < numberIDs; i++)
+ {
+ returnblock[j].Parameter = Data[IDIndex].GetBytes();
+ j++;
+ IDIndex++;
+ }
+ packet.ParamList = returnblock;
+ packet.Header.Reliable = true;
+ OutPacket(packet, ThrottleOutPacketType.Task);
+ } while (TotalnumberIDs > 0);
}
public void SendBannedUserList(UUID invoice, EstateBan[] bl, uint estateID)
{
List BannedUsers = new List();
-
for (int i = 0; i < bl.Length; i++)
{
if (bl[i] == null)
@@ -5125,44 +5147,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (bl[i].BannedUserID == UUID.Zero)
continue;
BannedUsers.Add(bl[i].BannedUserID);
-
- if (BannedUsers.Count >= 50 || (i == (bl.Length - 1) && BannedUsers.Count > 0))
- {
- EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
- packet.AgentData.TransactionID = UUID.Random();
- packet.AgentData.AgentID = AgentId;
- packet.AgentData.SessionID = SessionId;
- packet.MethodData.Invoice = invoice;
- packet.MethodData.Method = Utils.StringToBytes("setaccess");
-
- EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + BannedUsers.Count];
-
- int j;
- for (j = 0; j < (6 + BannedUsers.Count); j++)
- {
- returnblock[j] = new EstateOwnerMessagePacket.ParamListBlock();
- }
- j = 0;
-
- returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
- returnblock[j].Parameter = Utils.StringToBytes(((int)Constants.EstateAccessCodex.EstateBans).ToString()); j++;
- returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
- returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
- returnblock[j].Parameter = Utils.StringToBytes(BannedUsers.Count.ToString()); j++;
- returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
-
- foreach (UUID banned in BannedUsers)
- {
- returnblock[j].Parameter = banned.GetBytes(); j++;
- }
- packet.ParamList = returnblock;
- packet.Header.Reliable = true;
- OutPacket(packet, ThrottleOutPacketType.Task);
-
- BannedUsers.Clear();
- }
}
-
+ SendEstateList(invoice, 4, BannedUsers.ToArray(), estateID);
}
public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
@@ -10240,6 +10226,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
{
int estateAccessType = Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
+
OnUpdateEstateAccessDeltaRequest(this, messagePacket.MethodData.Invoice, estateAccessType, new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter)));
}
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index 87fb0db2bb..8eb2b1eb37 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -33,15 +33,19 @@ using System.Linq;
using System.Reflection;
using System.Security;
using System.Timers;
+using System.Threading;
using log4net;
using Mono.Addins;
using Nini.Config;
using OpenMetaverse;
using OpenSim.Framework;
+using OpenSim.Framework.Monitoring;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Services.Interfaces;
using RegionFlags = OpenMetaverse.RegionFlags;
+using Timer = System.Timers.Timer;
+
namespace OpenSim.Region.CoreModules.World.Estate
{
@@ -441,7 +445,7 @@ namespace OpenSim.Region.CoreModules.World.Estate
Scene.RegionInfo.EstateSettings.EstateID);
remote_client.SendEstateList(invoice,
- (int)Constants.EstateAccessCodex.AccessOptions,
+ (int)Constants.EstateAccessCodex.AllowedAccess,
Scene.RegionInfo.EstateSettings.EstateAccess,
Scene.RegionInfo.EstateSettings.EstateID);
@@ -651,227 +655,354 @@ namespace OpenSim.Region.CoreModules.World.Estate
TriggerRegionInfoChange();
}
- private void handleEstateAccessDeltaRequest(IClientAPI remote_client, UUID invoice, int estateAccessType, UUID user)
+ private object deltareqLock = new object();
+ private bool runnigDeltaExec = false;
+
+ private class EstateAccessDeltaRequest
+ {
+ public IClientAPI remote_client;
+ public UUID invoice;
+ public int estateAccessType;
+ public UUID user;
+ }
+
+ private OpenSim.Framework.BlockingQueue deltaRequests = new OpenSim.Framework.BlockingQueue();
+
+ private void handleEstateAccessDeltaRequest(IClientAPI _remote_client, UUID _invoice, int _estateAccessType, UUID _user)
{
// EstateAccessDelta handles Estate Managers, Sim Access, Sim Banlist, allowed Groups.. etc.
- if (user == Scene.RegionInfo.EstateSettings.EstateOwner)
+ if (_user == Scene.RegionInfo.EstateSettings.EstateOwner)
return; // never process EO
- if ((estateAccessType & 4) != 0) // User add
+ EstateAccessDeltaRequest newreq = new EstateAccessDeltaRequest();
+ newreq.remote_client = _remote_client;
+ newreq.invoice = _invoice;
+ newreq.estateAccessType = _estateAccessType;
+ newreq.user = _user;
+
+ deltaRequests.Enqueue(newreq);
+
+ lock(deltareqLock)
{
- if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
+ if(!runnigDeltaExec)
{
- if ((estateAccessType & 1) != 0) // All estates
- {
- List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
- EstateSettings estateSettings;
-
- foreach (int estateID in estateIDs)
- {
- if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
- {
- estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
- estateSettings.AddEstateUser(user);
- Scene.EstateDataService.StoreEstateSettings(estateSettings);
- }
- }
- }
-
- Scene.RegionInfo.EstateSettings.AddEstateUser(user);
- Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings);
-
- TriggerEstateInfoChange();
- remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, Scene.RegionInfo.EstateSettings.EstateAccess, Scene.RegionInfo.EstateSettings.EstateID);
- }
- else
- {
- remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
- }
-
- }
-
- if ((estateAccessType & 8) != 0) // User remove
- {
- if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
- {
- if ((estateAccessType & 1) != 0) // All estates
- {
- List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
- EstateSettings estateSettings;
-
- foreach (int estateID in estateIDs)
- {
- if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
- {
- estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
- estateSettings.RemoveEstateUser(user);
- Scene.EstateDataService.StoreEstateSettings(estateSettings);
- }
- }
- }
-
- Scene.RegionInfo.EstateSettings.RemoveEstateUser(user);
- Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings);
-
- TriggerEstateInfoChange();
- remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, Scene.RegionInfo.EstateSettings.EstateAccess, Scene.RegionInfo.EstateSettings.EstateID);
- }
- else
- {
- remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
+ runnigDeltaExec = true;
+ WorkManager.RunInThreadPool(execDeltaRequests,null,"execDeltaRequests");
}
}
+ }
+
+ private void execDeltaRequests(object o)
+ {
+ IClientAPI remote_client;
+ UUID invoice;
+ int estateAccessType;
+ UUID user;
+ Dictionary changed = new Dictionary();
+ Dictionary sendAllowedOrBanList = new Dictionary();
+ Dictionary sendManagers = new Dictionary();
+ Dictionary sendGroups = new Dictionary();
- if ((estateAccessType & 16) != 0) // Group add
+ List otherEstates = new List();
+
+ bool sentAllowedFull = false;
+ bool sentBansFull = false;
+ bool sentGroupsFull = false;
+ bool sentManagersFull = false;
+
+ while(Scene.IsRunning)
{
- if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
+ EstateAccessDeltaRequest req = deltaRequests.Dequeue(500);
+
+ if(!Scene.IsRunning)
+ break;
+
+ if(req == null)
{
- if ((estateAccessType & 1) != 0) // All estates
+ if(changed.Count > 0)
{
- List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
- EstateSettings estateSettings;
-
- foreach (int estateID in estateIDs)
- {
- if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
- {
- estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
- estateSettings.AddEstateGroup(user);
- Scene.EstateDataService.StoreEstateSettings(estateSettings);
- }
- }
- }
-
- Scene.RegionInfo.EstateSettings.AddEstateGroup(user);
- Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings);
-
- TriggerEstateInfoChange();
- remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, Scene.RegionInfo.EstateSettings.EstateGroups, Scene.RegionInfo.EstateSettings.EstateID);
- }
- else
- {
- remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
- }
- }
-
- if ((estateAccessType & 32) != 0) // Group remove
- {
- if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
- {
- if ((estateAccessType & 1) != 0) // All estates
- {
- List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
- EstateSettings estateSettings;
-
- foreach (int estateID in estateIDs)
- {
- if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
- {
- estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
- estateSettings.RemoveEstateGroup(user);
- Scene.EstateDataService.StoreEstateSettings(estateSettings);
- }
- }
- }
-
- Scene.RegionInfo.EstateSettings.RemoveEstateGroup(user);
- Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings);
-
- TriggerEstateInfoChange();
- remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, Scene.RegionInfo.EstateSettings.EstateGroups, Scene.RegionInfo.EstateSettings.EstateID);
- }
- else
- {
- remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
- }
- }
-
- if ((estateAccessType & 64) != 0) // Ban add
- {
- if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false))
- {
- EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans;
-
- bool alreadyInList = false;
-
- for (int i = 0; i < banlistcheck.Length; i++)
- {
- if (user == banlistcheck[i].BannedUserID)
- {
- alreadyInList = true;
- break;
- }
-
- }
- if (!alreadyInList)
- {
-
- if ((estateAccessType & 1) != 0) // All estates
- {
- List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
- EstateSettings estateSettings;
-
- foreach (int estateID in estateIDs)
- {
- if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
- {
- EstateBan bitem = new EstateBan();
-
- bitem.BannedUserID = user;
- bitem.EstateID = (uint)estateID;
- bitem.BannedHostAddress = "0.0.0.0";
- bitem.BannedHostIPMask = "0.0.0.0";
-
- estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
- estateSettings.AddBan(bitem);
- Scene.EstateDataService.StoreEstateSettings(estateSettings);
- }
- }
- }
-
- EstateBan item = new EstateBan();
-
- item.BannedUserID = user;
- item.EstateID = Scene.RegionInfo.EstateSettings.EstateID;
- item.BannedHostAddress = "0.0.0.0";
- item.BannedHostIPMask = "0.0.0.0";
-
- Scene.RegionInfo.EstateSettings.AddBan(item);
- Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings);
-
+ foreach(EstateSettings est in changed.Values)
+ Scene.EstateDataService.StoreEstateSettings(est);
+
TriggerEstateInfoChange();
+ }
+
+ EstateSettings es = Scene.RegionInfo.EstateSettings;
+ foreach(KeyValuePair kvp in sendAllowedOrBanList)
+ {
+ IClientAPI cli = kvp.Key;
+ UUID invoive = kvp.Value;
+ cli.SendEstateList(invoive, (int)Constants.EstateAccessCodex.AllowedAccess, es.EstateAccess, es.EstateID);
+ cli.SendBannedUserList(invoive, es.EstateBans, es.EstateID);
+ }
+ sendAllowedOrBanList.Clear();
- ScenePresence s = Scene.GetScenePresence(user);
- if (s != null)
+ foreach(KeyValuePair kvp in sendManagers)
+ {
+ IClientAPI cli = kvp.Key;
+ cli.SendEstateList(kvp.Value, (int)Constants.EstateAccessCodex.EstateManagers, es.EstateManagers, es.EstateID);
+ }
+ foreach(KeyValuePair kvp in sendGroups)
+ {
+ IClientAPI cli = kvp.Key;
+ cli.SendEstateList(kvp.Value, (int)Constants.EstateAccessCodex.AllowedGroups, es.EstateGroups, es.EstateID);
+ }
+ otherEstates.Clear();
+ sendAllowedOrBanList.Clear();
+ sendManagers.Clear();
+ sendGroups.Clear();
+ changed.Clear();
+ lock(deltareqLock)
+ {
+ if(deltaRequests.Count() != 0)
+ continue;
+ runnigDeltaExec = false;
+ return;
+ }
+ }
+
+ remote_client = req.remote_client;
+ if(!remote_client.IsActive)
+ continue;
+
+ invoice = req.invoice;
+ user = req.user;
+
+ estateAccessType = req.estateAccessType;
+
+ bool needReply = ((estateAccessType & 1024) == 0);
+ bool doOtherEstates = ((estateAccessType & 3) != 0);
+
+ EstateSettings thisSettings = Scene.RegionInfo.EstateSettings;
+ int thisEstateID =(int)thisSettings.EstateID;
+
+ UUID agentID = remote_client.AgentId;
+
+ bool isadmin = Scene.Permissions.IsAdministrator(agentID);
+ // just i case recheck rights
+ if (!isadmin && !Scene.Permissions.IsEstateManager(agentID))
+ {
+ remote_client.SendAlertMessage("Method EstateAccess Failed, you don't have permissions");
+ continue;
+ }
+
+ otherEstates.Clear();
+ if(doOtherEstates)
+ {
+ UUID thisOwner = Scene.RegionInfo.EstateSettings.EstateOwner;
+ List estateIDs = Scene.EstateDataService.GetEstatesByOwner(thisOwner);
+ foreach (int estateID in estateIDs)
+ {
+ if (estateID == thisEstateID)
+ continue;
+
+ EstateSettings estateSettings;
+ if(changed.ContainsKey(estateID))
+ estateSettings = changed[estateID];
+ else
+ estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
+
+ if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID))
+ continue;
+ otherEstates.Add(estateSettings);
+ }
+ estateIDs.Clear();
+ }
+
+ // the commands
+ // first the ones allowed for estate managers on this region
+ if ((estateAccessType & 4) != 0) // User add
+ {
+ if(thisSettings.EstateUsersCount() >= (int)Constants.EstateAccessLimits.AllowedAccess)
+ {
+ if(!sentAllowedFull)
{
- if (!s.IsChildAgent)
- {
- if (!Scene.TeleportClientHome(user, s.ControllingClient))
- {
- s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out.");
- Scene.CloseAgent(s.UUID, false);
- }
- }
- }
-
+ sentAllowedFull = true;
+ remote_client.SendAlertMessage("Estate Allowed users list is full");
+ }
}
else
{
- remote_client.SendAlertMessage("User is already on the region ban list");
- }
- //Scene.RegionInfo.regionBanlist.Add(Manager(user);
- remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID);
- }
- else
- {
- remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
- }
- }
+ if (doOtherEstates)
+ {
+ foreach (EstateSettings estateSettings in otherEstates)
+ {
+ if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID))
+ continue;
+ if(estateSettings.EstateUsersCount() >= (int)Constants.EstateAccessLimits.AllowedAccess)
+ continue;
+ estateSettings.AddEstateUser(user);
+ estateSettings.RemoveBan(user);
+ changed[(int)estateSettings.EstateID] = estateSettings;
+ }
+ }
- if ((estateAccessType & 128) != 0) // Ban remove
- {
- if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false))
+ thisSettings.AddEstateUser(user);
+ thisSettings.RemoveBan(user);
+ changed[thisEstateID] = thisSettings;;
+
+ if(needReply)
+ sendAllowedOrBanList[remote_client] = invoice;
+ }
+ }
+
+ if ((estateAccessType & 8) != 0) // User remove
+ {
+ if (doOtherEstates) // All estates
+ {
+ foreach (EstateSettings estateSettings in otherEstates)
+ {
+ if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID))
+ continue;
+ estateSettings.RemoveEstateUser(user);
+ changed[(int)estateSettings.EstateID] = estateSettings;
+ }
+ }
+
+ thisSettings.RemoveEstateUser(user);
+ changed[thisEstateID] = thisSettings;;
+
+ if(needReply)
+ sendAllowedOrBanList[remote_client] = invoice;
+ }
+
+ if ((estateAccessType & 16) != 0) // Group add
+ {
+ if(thisSettings.EstateGroupsCount() >= (int)Constants.EstateAccessLimits.AllowedGroups)
+ {
+ if(!sentGroupsFull)
+ {
+ sentGroupsFull = true;
+ remote_client.SendAlertMessage("Estate Allowed groups list is full");
+ }
+ }
+ else
+ {
+ if (doOtherEstates) // All estates
+ {
+ foreach (EstateSettings estateSettings in otherEstates)
+ {
+ if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID))
+ continue;
+ if(estateSettings.EstateGroupsCount() >= (int)Constants.EstateAccessLimits.AllowedGroups)
+ continue;
+ estateSettings.AddEstateGroup(user);
+ changed[(int)estateSettings.EstateID] = estateSettings;
+ }
+ }
+
+ thisSettings.AddEstateGroup(user);
+ changed[thisEstateID] = thisSettings;
+
+ sendGroups[remote_client] = invoice;
+ }
+ }
+
+ if ((estateAccessType & 32) != 0) // Group remove
+ {
+ if (doOtherEstates) // All estates
+ {
+ foreach (EstateSettings estateSettings in otherEstates)
+ {
+ if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID))
+ continue;
+ estateSettings.RemoveEstateGroup(user);
+ changed[(int)estateSettings.EstateID] = estateSettings;
+ }
+ }
+
+ thisSettings.RemoveEstateGroup(user);
+ changed[thisEstateID] = thisSettings;
+
+ sendGroups[remote_client] = invoice;
+ }
+
+ if ((estateAccessType & 64) != 0) // Ban add
+ {
+
+ if(thisSettings.EstateBansCount() >= (int)Constants.EstateAccessLimits.EstateBans)
+ {
+ if(!sentBansFull)
+ {
+ sentBansFull = true;
+ remote_client.SendAlertMessage("Estate Ban list is full");
+ }
+ }
+ else
+ {
+ EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans;
+
+ bool alreadyInList = false;
+
+ for (int i = 0; i < banlistcheck.Length; i++)
+ {
+ if (user == banlistcheck[i].BannedUserID)
+ {
+ alreadyInList = true;
+ break;
+ }
+ }
+ if (!alreadyInList)
+ {
+ if (doOtherEstates) // All estates
+ {
+ foreach (EstateSettings estateSettings in otherEstates)
+ {
+ if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID))
+ continue;
+
+ if(estateSettings.EstateBansCount() >= (int)Constants.EstateAccessLimits.EstateBans)
+ continue;
+
+ EstateBan bitem = new EstateBan();
+
+ bitem.BannedUserID = user;
+ bitem.EstateID = estateSettings.EstateID;
+ bitem.BannedHostAddress = "0.0.0.0";
+ bitem.BannedHostIPMask = "0.0.0.0";
+
+ estateSettings.AddBan(bitem);
+ estateSettings.RemoveEstateUser(user);
+ changed[(int)estateSettings.EstateID] = estateSettings;
+ }
+ }
+
+ EstateBan item = new EstateBan();
+
+ item.BannedUserID = user;
+ item.EstateID = Scene.RegionInfo.EstateSettings.EstateID;
+ item.BannedHostAddress = "0.0.0.0";
+ item.BannedHostIPMask = "0.0.0.0";
+
+ thisSettings.AddBan(item);
+ thisSettings.RemoveEstateUser(user);
+ changed[thisEstateID] = thisSettings;
+
+ ScenePresence s = Scene.GetScenePresence(user);
+ if (s != null)
+ {
+ if (!s.IsChildAgent)
+ {
+ if (!Scene.TeleportClientHome(user, s.ControllingClient))
+ {
+ s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out.");
+ Scene.CloseAgent(s.UUID, false);
+ }
+ }
+ }
+ }
+ else
+ {
+ remote_client.SendAlertMessage("User is already on the region ban list");
+ }
+ //Scene.RegionInfo.regionBanlist.Add(Manager(user);
+ if(needReply)
+ sendAllowedOrBanList[remote_client] = invoice;
+ }
+ }
+
+ if ((estateAccessType & 128) != 0) // Ban remove
{
EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans;
@@ -890,104 +1021,90 @@ namespace OpenSim.Region.CoreModules.World.Estate
if (alreadyInList && listitem != null)
{
- if ((estateAccessType & 1) != 0) // All estates
+ if (doOtherEstates) // All estates
{
- List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
- EstateSettings estateSettings;
-
- foreach (int estateID in estateIDs)
+ foreach (EstateSettings estateSettings in otherEstates)
{
- if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
- {
- estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
- estateSettings.RemoveBan(user);
- Scene.EstateDataService.StoreEstateSettings(estateSettings);
- }
+ if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID))
+ continue;
+ estateSettings.RemoveBan(user);
+ changed[(int)estateSettings.EstateID] = estateSettings;
}
}
- Scene.RegionInfo.EstateSettings.RemoveBan(listitem.BannedUserID);
- Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings);
-
- TriggerEstateInfoChange();
+ thisSettings.RemoveBan(listitem.BannedUserID);
+ changed[thisEstateID] = thisSettings;
}
else
{
remote_client.SendAlertMessage("User is not on the region ban list");
}
-
- //Scene.RegionInfo.regionBanlist.Add(Manager(user);
- remote_client.SendBannedUserList(invoice, Scene.RegionInfo.EstateSettings.EstateBans, Scene.RegionInfo.EstateSettings.EstateID);
- }
- else
- {
- remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
- }
- }
- if ((estateAccessType & 256) != 0) // Manager add
- {
- if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
+ if(needReply)
+ sendAllowedOrBanList[remote_client] = invoice;
+ }
+
+ // last the ones only for owners of this region
+ if (!Scene.Permissions.CanIssueEstateCommand(agentID, true))
{
- if ((estateAccessType & 1) != 0) // All estates
+ remote_client.SendAlertMessage("Method EstateAccess Failed, you don't have permissions");
+ continue;
+ }
+
+ if ((estateAccessType & 256) != 0) // Manager add
+ {
+ if(thisSettings.EstateManagersCount() >= (int)Constants.EstateAccessLimits.EstateManagers)
{
- List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
- EstateSettings estateSettings;
-
- foreach (int estateID in estateIDs)
+ if(!sentManagersFull)
{
- if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
+ sentManagersFull = true;
+ remote_client.SendAlertMessage("Estate Managers list is full");
+ }
+ }
+ else
+ {
+ if (doOtherEstates) // All estates
+ {
+ foreach (EstateSettings estateSettings in otherEstates)
{
- estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
+ if(!isadmin && !estateSettings.IsEstateOwner(agentID)) // redundante check?
+ continue;
+ if(estateSettings.EstateManagersCount() >= (int)Constants.EstateAccessLimits.EstateManagers)
+ continue;
estateSettings.AddEstateManager(user);
- Scene.EstateDataService.StoreEstateSettings(estateSettings);
+ changed[(int)estateSettings.EstateID] = estateSettings;
}
}
+
+ thisSettings.AddEstateManager(user);
+ changed[thisEstateID] = thisSettings;
+
+ sendManagers[remote_client] = invoice;
}
-
- Scene.RegionInfo.EstateSettings.AddEstateManager(user);
- Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings);
-
- TriggerEstateInfoChange();
- remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.EstateManagers, Scene.RegionInfo.EstateSettings.EstateManagers, Scene.RegionInfo.EstateSettings.EstateID);
}
- else
- {
- remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
- }
- }
- if ((estateAccessType & 512) != 0) // Manager remove
- {
- if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true))
+ if ((estateAccessType & 512) != 0) // Manager remove
{
- if ((estateAccessType & 1) != 0) // All estates
+ if (doOtherEstates) // All estates
{
- List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner);
- EstateSettings estateSettings;
-
- foreach (int estateID in estateIDs)
+ foreach (EstateSettings estateSettings in otherEstates)
{
- if (estateID != Scene.RegionInfo.EstateSettings.EstateID)
- {
- estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID);
- estateSettings.RemoveEstateManager(user);
- Scene.EstateDataService.StoreEstateSettings(estateSettings);
- }
+ if(!isadmin && !estateSettings.IsEstateOwner(agentID))
+ continue;
+
+ estateSettings.RemoveEstateManager(user);
+ changed[(int)estateSettings.EstateID] = estateSettings;
}
}
- Scene.RegionInfo.EstateSettings.RemoveEstateManager(user);
- Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings);
+ thisSettings.RemoveEstateManager(user);
+ changed[thisEstateID] = thisSettings;
- TriggerEstateInfoChange();
- remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.EstateManagers, Scene.RegionInfo.EstateSettings.EstateManagers, Scene.RegionInfo.EstateSettings.EstateID);
- }
- else
- {
- remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
+ sendManagers[remote_client] = invoice;
}
}
+ lock(deltareqLock)
+ runnigDeltaExec = false;
}
public void HandleOnEstateManageTelehub(IClientAPI client, UUID invoice, UUID senderID, string cmd, uint param1)