From 5e4d6cab00cb29cd088ab7b62ab13aff103b64cb Mon Sep 17 00:00:00 2001 From: onefang Date: Sun, 19 May 2019 21:24:15 +1000 Subject: Dump OpenSim 0.9.0.1 into it's own branch. --- .../World/Estate/EstateManagementModule.cs | 648 +++++++++++++-------- 1 file changed, 412 insertions(+), 236 deletions(-) (limited to 'OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs') diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 80fa08a..3c45b68 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 { @@ -53,8 +57,8 @@ namespace OpenSim.Region.CoreModules.World.Estate private Timer m_regionChangeTimer = new Timer(); public Scene Scene { get; private set; } public IUserManagement UserManager { get; private set; } - - protected EstateManagementCommands m_commands; + + protected EstateManagementCommands m_commands; /// /// If false, region restart requests from the client are blocked even if they are otherwise legitimate. @@ -67,14 +71,18 @@ namespace OpenSim.Region.CoreModules.World.Estate public event ChangeDelegate OnRegionInfoChange; public event ChangeDelegate OnEstateInfoChange; public event MessageDelegate OnEstateMessage; + public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; + public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest; + + private int m_delayCount = 0; #region Region Module interface - + public string Name { get { return "EstateManagementModule"; } } - - public Type ReplaceableInterface { get { return null; } } - public void Initialise(IConfigSource source) + public Type ReplaceableInterface { get { return null; } } + + public void Initialise(IConfigSource source) { AllowRegionRestartFromClient = true; @@ -83,7 +91,7 @@ namespace OpenSim.Region.CoreModules.World.Estate if (config != null) AllowRegionRestartFromClient = config.GetBoolean("AllowRegionRestartFromClient", true); } - + public void AddRegion(Scene scene) { Scene = scene; @@ -95,20 +103,24 @@ namespace OpenSim.Region.CoreModules.World.Estate m_commands = new EstateManagementCommands(this); m_commands.Initialise(); + + m_regionChangeTimer.Interval = 10000; + m_regionChangeTimer.Elapsed += RaiseRegionInfoChange; + m_regionChangeTimer.AutoReset = false; } - - public void RemoveRegion(Scene scene) {} - + + public void RemoveRegion(Scene scene) {} + public void RegionLoaded(Scene scene) { // Sets up the sun module based no the saved Estate and Region Settings // DO NOT REMOVE or the sun will stop working scene.TriggerEstateSunUpdate(); - - UserManager = scene.RequestModuleInterface(); + + UserManager = scene.RequestModuleInterface(); } - public void Close() + public void Close() { m_commands.Close(); } @@ -142,6 +154,10 @@ namespace OpenSim.Region.CoreModules.World.Estate flags |= RegionFlags.AllowParcelChanges; if (Scene.RegionInfo.RegionSettings.BlockShowInSearch) flags |= RegionFlags.BlockParcelSearch; + if (Scene.RegionInfo.RegionSettings.GodBlockSearch) + flags |= (RegionFlags)(1 << 11); + if (Scene.RegionInfo.RegionSettings.Casino) + flags |= (RegionFlags)(1 << 10); if (Scene.RegionInfo.RegionSettings.FixedSun) flags |= RegionFlags.SunFixed; @@ -194,6 +210,14 @@ namespace OpenSim.Region.CoreModules.World.Estate change(Scene.RegionInfo.RegionID); } + protected void RaiseRegionInfoChange(object sender, ElapsedEventArgs e) + { + ChangeDelegate change = OnRegionInfoChange; + + if (change != null) + change(Scene.RegionInfo.RegionID); + } + public void TriggerRegionInfoChange() { m_regionChangeTimer.Stop(); @@ -423,7 +447,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); @@ -462,7 +486,7 @@ namespace OpenSim.Region.CoreModules.World.Estate if((byte)maxAgents <= Scene.RegionInfo.AgentCapacity) Scene.RegionInfo.RegionSettings.AgentLimit = (byte) maxAgents; - else + else Scene.RegionInfo.RegionSettings.AgentLimit = Scene.RegionInfo.AgentCapacity; Scene.RegionInfo.RegionSettings.ObjectBonus = objectBonusFactor; @@ -554,6 +578,7 @@ namespace OpenSim.Region.CoreModules.World.Estate bool UseEstateSun, bool UseFixedSun, float SunHour, bool UseGlobal, bool EstateFixedSun, float EstateSunHour) { + double lastwaterlevel = Scene.RegionInfo.RegionSettings.WaterHeight; // Water Height Scene.RegionInfo.RegionSettings.WaterHeight = WaterHeight; @@ -566,6 +591,9 @@ namespace OpenSim.Region.CoreModules.World.Estate Scene.RegionInfo.RegionSettings.FixedSun = UseFixedSun; Scene.RegionInfo.RegionSettings.SunPosition = SunHour; + if(Scene.PhysicsEnabled && Scene.PhysicsScene != null && lastwaterlevel != WaterHeight) + Scene.PhysicsScene.SetWaterLevel(WaterHeight); + Scene.TriggerEstateSunUpdate(); //m_log.Debug("[ESTATE]: UFS: " + UseFixedSun.ToString()); @@ -587,6 +615,16 @@ namespace OpenSim.Region.CoreModules.World.Estate IRestartModule restartModule = Scene.RequestModuleInterface(); if (restartModule != null) { + if (timeInSeconds == -1) + { + m_delayCount++; + if (m_delayCount > 3) + return; + + restartModule.DelayRestart(3600, "Restart delayed by region manager"); + return; + } + List times = new List(); while (timeInSeconds > 0) { @@ -602,7 +640,7 @@ namespace OpenSim.Region.CoreModules.World.Estate restartModule.ScheduleRestart(UUID.Zero, "Region will restart in {0}", times.ToArray(), false); m_log.InfoFormat( - "User {0} requested restart of region {1} in {2} seconds", + "User {0} requested restart of region {1} in {2} seconds", remoteClient.Name, Scene.Name, times.Count != 0 ? times[0] : 0); } } @@ -610,236 +648,363 @@ namespace OpenSim.Region.CoreModules.World.Estate private void handleChangeEstateCovenantRequest(IClientAPI remoteClient, UUID estateCovenantID) { // m_log.DebugFormat( -// "[ESTATE MANAGEMENT MODULE]: Handling request from {0} to change estate covenant to {1}", +// "[ESTATE MANAGEMENT MODULE]: Handling request from {0} to change estate covenant to {1}", // remoteClient.Name, estateCovenantID); - + Scene.RegionInfo.RegionSettings.Covenant = estateCovenantID; Scene.RegionInfo.RegionSettings.CovenantChangedDateTime = Util.UnixTimeSinceEpoch(); Scene.RegionInfo.RegionSettings.Save(); 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 + 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(); + + List otherEstates = new List(); + + bool sentAllowedFull = false; + bool sentBansFull = false; + bool sentGroupsFull = false; + bool sentManagersFull = false; + + while(Scene.IsRunning) + { + EstateAccessDeltaRequest req = deltaRequests.Dequeue(500); + + if(!Scene.IsRunning) + break; + + if(req == null) + { + if(changed.Count > 0) { - List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); - EstateSettings estateSettings; + foreach(EstateSettings est in changed.Values) + Scene.EstateDataService.StoreEstateSettings(est); - foreach (int estateID in estateIDs) - { - if (estateID != Scene.RegionInfo.EstateSettings.EstateID) - { - estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); - estateSettings.AddEstateUser(user); - Scene.EstateDataService.StoreEstateSettings(estateSettings); - } - } + TriggerEstateInfoChange(); } - Scene.RegionInfo.EstateSettings.AddEstateUser(user); - Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); + 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(); - TriggerEstateInfoChange(); - remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, Scene.RegionInfo.EstateSettings.EstateAccess, Scene.RegionInfo.EstateSettings.EstateID); + 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; + } } - else + + 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 EstateAccessDelta Failed, you don't have permissions"); + remote_client.SendAlertMessage("Method EstateAccess Failed, you don't have permissions"); + continue; } - } - - if ((estateAccessType & 8) != 0) // User remove - { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) + otherEstates.Clear(); + if(doOtherEstates) { - if ((estateAccessType & 1) != 0) // All estates + UUID thisOwner = Scene.RegionInfo.EstateSettings.EstateOwner; + List estateIDs = Scene.EstateDataService.GetEstatesByOwner(thisOwner); + foreach (int estateID in estateIDs) { - List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); + 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(); + } - foreach (int estateID in estateIDs) + // 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 (estateID != Scene.RegionInfo.EstateSettings.EstateID) + sentAllowedFull = true; + remote_client.SendAlertMessage("Estate Allowed users list is full"); + } + } + else + { + if (doOtherEstates) + { + foreach (EstateSettings estateSettings in otherEstates) { - estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); - estateSettings.RemoveEstateUser(user); - Scene.EstateDataService.StoreEstateSettings(estateSettings); + 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; } } - } - Scene.RegionInfo.EstateSettings.RemoveEstateUser(user); - Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); + thisSettings.AddEstateUser(user); + thisSettings.RemoveBan(user); + changed[thisEstateID] = thisSettings;; - TriggerEstateInfoChange(); - remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AccessOptions, Scene.RegionInfo.EstateSettings.EstateAccess, Scene.RegionInfo.EstateSettings.EstateID); + if(needReply) + sendAllowedOrBanList[remote_client] = invoice; + } } - else + + if ((estateAccessType & 8) != 0) // User remove { - remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); + 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 (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) + if ((estateAccessType & 16) != 0) // Group add { - if ((estateAccessType & 1) != 0) // All estates + if(thisSettings.EstateGroupsCount() >= (int)Constants.EstateAccessLimits.AllowedGroups) { - List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); - EstateSettings estateSettings; - - foreach (int estateID in estateIDs) + if(!sentGroupsFull) + { + sentGroupsFull = true; + remote_client.SendAlertMessage("Estate Allowed groups list is full"); + } + } + else + { + if (doOtherEstates) // All estates { - if (estateID != Scene.RegionInfo.EstateSettings.EstateID) + foreach (EstateSettings estateSettings in otherEstates) { - estateSettings = Scene.EstateDataService.LoadEstateSettings(estateID); + if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) + continue; + if(estateSettings.EstateGroupsCount() >= (int)Constants.EstateAccessLimits.AllowedGroups) + continue; estateSettings.AddEstateGroup(user); - Scene.EstateDataService.StoreEstateSettings(estateSettings); + changed[(int)estateSettings.EstateID] = estateSettings; } } - } - Scene.RegionInfo.EstateSettings.AddEstateGroup(user); - Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); + thisSettings.AddEstateGroup(user); + changed[thisEstateID] = thisSettings; - 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"); + sendGroups[remote_client] = invoice; + } } - } - if ((estateAccessType & 32) != 0) // Group remove - { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) + if ((estateAccessType & 32) != 0) // Group 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.RemoveEstateGroup(user); - Scene.EstateDataService.StoreEstateSettings(estateSettings); - } + if(!isadmin && !estateSettings.IsEstateManagerOrOwner(agentID)) + continue; + estateSettings.RemoveEstateGroup(user); + changed[(int)estateSettings.EstateID] = estateSettings; } } - Scene.RegionInfo.EstateSettings.RemoveEstateGroup(user); - Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); + thisSettings.RemoveEstateGroup(user); + changed[thisEstateID] = thisSettings; - TriggerEstateInfoChange(); - remote_client.SendEstateList(invoice, (int)Constants.EstateAccessCodex.AllowedGroups, Scene.RegionInfo.EstateSettings.EstateGroups, Scene.RegionInfo.EstateSettings.EstateID); + sendGroups[remote_client] = invoice; } - 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)) + if ((estateAccessType & 64) != 0) // Ban add { - EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; - bool alreadyInList = false; - - for (int i = 0; i < banlistcheck.Length; i++) + if(thisSettings.EstateBansCount() >= (int)Constants.EstateAccessLimits.EstateBans) { - if (user == banlistcheck[i].BannedUserID) + if(!sentBansFull) { - alreadyInList = true; - break; + sentBansFull = true; + remote_client.SendAlertMessage("Estate Ban list is full"); } - } - if (!alreadyInList) + else { + EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; - if ((estateAccessType & 1) != 0) // All estates - { - List estateIDs = Scene.EstateDataService.GetEstatesByOwner(Scene.RegionInfo.EstateSettings.EstateOwner); - EstateSettings estateSettings; + bool alreadyInList = false; - foreach (int estateID in estateIDs) + for (int i = 0; i < banlistcheck.Length; i++) + { + if (user == banlistcheck[i].BannedUserID) + { + alreadyInList = true; + break; + } + } + if (!alreadyInList) + { + if (doOtherEstates) // All estates { - if (estateID != Scene.RegionInfo.EstateSettings.EstateID) + 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 = (uint)estateID; + bitem.EstateID = estateSettings.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); + estateSettings.RemoveEstateUser(user); + changed[(int)estateSettings.EstateID] = estateSettings; } } - } - EstateBan item = new EstateBan(); + 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"; + 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); + thisSettings.AddBan(item); + thisSettings.RemoveEstateUser(user); + changed[thisEstateID] = thisSettings; - TriggerEstateInfoChange(); - - ScenePresence s = Scene.GetScenePresence(user); - if (s != null) - { - if (!s.IsChildAgent) + ScenePresence s = Scene.GetScenePresence(user); + if (s != null) { - if (!Scene.TeleportClientHome(user, s.ControllingClient)) + if (!s.IsChildAgent) { - s.ControllingClient.Kick("Your access to the region was revoked and TP home failed - you have been logged out."); - Scene.CloseAgent(s.UUID, false); + 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"); + else + { + remote_client.SendAlertMessage("User is already on the region ban list"); + } + //Scene.RegionInfo.regionBanlist.Add(Manager(user); + if(needReply) + sendAllowedOrBanList[remote_client] = invoice; } - //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 & 128) != 0) // Ban remove - { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, false)) + if ((estateAccessType & 128) != 0) // Ban remove { EstateBan[] banlistcheck = Scene.RegionInfo.EstateSettings.EstateBans; @@ -855,107 +1020,93 @@ namespace OpenSim.Region.CoreModules.World.Estate break; } } - + 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); + + if(needReply) + sendAllowedOrBanList[remote_client] = invoice; } - else + + // last the ones only for owners of this region + if (!Scene.Permissions.CanIssueEstateCommand(agentID, true)) { - remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions"); + remote_client.SendAlertMessage("Method EstateAccess Failed, you don't have permissions"); + continue; } - } - if ((estateAccessType & 256) != 0) // Manager add - { - if (Scene.Permissions.CanIssueEstateCommand(remote_client.AgentId, true)) + if ((estateAccessType & 256) != 0) // Manager add { - if ((estateAccessType & 1) != 0) // All estates + 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) + { + sentManagersFull = true; + remote_client.SendAlertMessage("Estate Managers list is full"); + } + } + else + { + if (doOtherEstates) // All estates { - if (estateID != Scene.RegionInfo.EstateSettings.EstateID) + 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; } } - } - Scene.RegionInfo.EstateSettings.AddEstateManager(user); - Scene.EstateDataService.StoreEstateSettings(Scene.RegionInfo.EstateSettings); + thisSettings.AddEstateManager(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; + } } - } - 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) @@ -1007,7 +1158,7 @@ namespace OpenSim.Region.CoreModules.World.Estate IClientAPI remote_client, UUID invoice, UUID senderID, UUID sessionID, string senderName, string message) { IDialogModule dm = Scene.RequestModuleInterface(); - + if (dm != null) dm.SendNotificationToUsersInRegion(senderID, senderName, message); } @@ -1044,13 +1195,20 @@ namespace OpenSim.Region.CoreModules.World.Estate private void handleEstateTeleportOneUserHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID, UUID prey) { + EstateTeleportOneUserHomeRequest evOverride = OnEstateTeleportOneUserHomeRequest; + if(evOverride != null) + { + evOverride(remover_client, invoice, senderID, prey); + return; + } + if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false)) return; if (prey != UUID.Zero) { ScenePresence s = Scene.GetScenePresence(prey); - if (s != null) + if (s != null && !s.IsDeleted && !s.IsInTransit) { if (!Scene.TeleportClientHome(prey, s.ControllingClient)) { @@ -1063,6 +1221,13 @@ namespace OpenSim.Region.CoreModules.World.Estate private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID) { + EstateTeleportAllUsersHomeRequest evOverride = OnEstateTeleportAllUsersHomeRequest; + if(evOverride != null) + { + evOverride(remover_client, invoice, senderID); + return; + } + if (!Scene.Permissions.CanIssueEstateCommand(remover_client.AgentId, false)) return; @@ -1084,7 +1249,7 @@ namespace OpenSim.Region.CoreModules.World.Estate } }); } - + private void AbortTerrainXferHandler(IClientAPI remoteClient, ulong XferID) { lock (this) @@ -1167,7 +1332,7 @@ namespace OpenSim.Region.CoreModules.World.Estate if (TerrainUploader == null) { m_log.DebugFormat( - "[TERRAIN]: Started receiving terrain upload for region {0} from {1}", + "[TERRAIN]: Started receiving terrain upload for region {0} from {1}", Scene.Name, remote_client.Name); TerrainUploader = new EstateTerrainXferHandler(remote_client, clientFileName); @@ -1187,7 +1352,7 @@ namespace OpenSim.Region.CoreModules.World.Estate { // Save terrain here ITerrainModule terr = Scene.RequestModuleInterface(); - + if (terr != null) { // m_log.Warn("[CLIENT]: Got Request to Send Terrain in region " + Scene.RegionInfo.RegionName); @@ -1197,15 +1362,24 @@ namespace OpenSim.Region.CoreModules.World.Estate } terr.SaveToFile(Util.dataDir() + "/terrain.raw"); - FileStream input = new FileStream(Util.dataDir() + "/terrain.raw", FileMode.Open); - byte[] bdata = new byte[input.Length]; - input.Read(bdata, 0, (int)input.Length); + byte[] bdata; + using(FileStream input = new FileStream(Util.dataDir() + "/terrain.raw",FileMode.Open)) + { + bdata = new byte[input.Length]; + input.Read(bdata, 0, (int)input.Length); + } + if(bdata == null || bdata.Length == 0) + { + remote_client.SendAlertMessage("Terrain error"); + return; + } + remote_client.SendAlertMessage("Terrain file written, starting download..."); - Scene.XferManager.AddNewFile("terrain.raw", bdata); + string xfername = (UUID.Random()).ToString(); + Scene.XferManager.AddNewFile(xfername, bdata); m_log.DebugFormat("[CLIENT]: Sending terrain for region {0} to {1}", Scene.Name, remote_client.Name); - - remote_client.SendInitiateDownload("terrain.raw", clientFileName); + remote_client.SendInitiateDownload(xfername, clientFileName); } } @@ -1319,7 +1493,8 @@ namespace OpenSim.Region.CoreModules.World.Estate public void sendRegionInfoPacketToAll() { - Scene.ForEachRootClient(delegate(IClientAPI client) +// Scene.ForEachRootClient(delegate(IClientAPI client) + Scene.ForEachClient(delegate(IClientAPI client) { HandleRegionInfoRequest(client); }); @@ -1443,7 +1618,7 @@ namespace OpenSim.Region.CoreModules.World.Estate Scene.RegionInfo.EstateSettings.FixedSun, (float)Scene.RegionInfo.EstateSettings.SunPosition); - sendRegionInfoPacketToAll(); +// sendRegionInfoPacketToAll(); already done by setRegionTerrainSettings } @@ -1477,7 +1652,8 @@ namespace OpenSim.Region.CoreModules.World.Estate sendRegionHandshake(client); } - private uint GetEstateFlags() + + public uint GetEstateFlags() { RegionFlags flags = RegionFlags.None; -- cgit v1.1