From a72d33d3a5da5bb48e9c95fd355458be335fee3e Mon Sep 17 00:00:00 2001
From: Teravus Ovares
Date: Wed, 2 Jan 2008 20:25:47 +0000
Subject: * Added the ability for Region Owners to add and remove estate
 managers using the estate tools. * Estate managers get abilities like the
 region owner for now. * Estate managers, you'll need to request server admin
 status to be able to activate the estate tools dialog (haven't figured out
 why this is the case yet) * Switching from grid mode to standalone or
 switching grids will make the stored Estate Manager UUIDs not match up with a
 valid account so you'll see (waiting) listed there instead of a user until
 you reset them or go back to the grid you added them from.

---
 OpenSim/Framework/EstateSettings.cs         |  61 +++++++++++++++-
 OpenSim/Region/Environment/EstateManager.cs | 106 +++++++++++++++++++++-------
 OpenSim/Region/Environment/Scenes/Scene.cs  |   4 +-
 3 files changed, 142 insertions(+), 29 deletions(-)

diff --git a/OpenSim/Framework/EstateSettings.cs b/OpenSim/Framework/EstateSettings.cs
index 1078c10..9e4b9a4 100644
--- a/OpenSim/Framework/EstateSettings.cs
+++ b/OpenSim/Framework/EstateSettings.cs
@@ -646,8 +646,8 @@ namespace OpenSim.Framework
             for (int i = 0; i < numEstateManagers; i++)
             {
                 pos = GetNextEstateManager(pos);
-                
-                rEstateManagers[i] = GetEstateManagerAtPos(pos);
+
+                rEstateManagers[i] = GetEstateManagerAtPos(pos); pos++;
          
             }
             return rEstateManagers;
@@ -683,8 +683,63 @@ namespace OpenSim.Framework
             return numEstateManagers;
         }
 
+        public void AddEstateManager(LLUUID avatarID)
+        {
+            LLUUID[] testateManagers = GetEstateManagers();
+            LLUUID[] nestateManagers = new LLUUID[testateManagers.Length + 1];
+
+            int i = 0;
+            for (i = 0; i < testateManagers.Length; i++)
+            {
+                nestateManagers[i] = testateManagers[i];
+            }
+
+            nestateManagers[i] = avatarID;
+
+            //Saves it to the estate settings file
+            estateManagers = nestateManagers;
+
+        }
+        public void RemoveEstateManager(LLUUID avatarID)
+        {
+            int notfoundparam = 11; // starting high so the condense routine (max ten) doesn't run if we don't find it.
+            LLUUID[] testateManagers = GetEstateManagers(); // temporary estate managers list
+ 
+
+            int i = 0;
+            int foundpos = notfoundparam;
+
+            // search for estate manager.
+            for (i = 0; i < testateManagers.Length; i++)
+            {
+                if (testateManagers[i] == avatarID)
+                {
+                    foundpos = i;
+                    break;
+                }
+            }
+            if (foundpos < notfoundparam)
+            {
+                LLUUID[] restateManagers = new LLUUID[testateManagers.Length - 1];
+
+                // fill new estate managers array up to the found spot
+                for (int j = 0; j < foundpos; j++)
+                    restateManagers[j] = testateManagers[j];
+
+                // skip over the estate manager we're removing and compress
+                for (int j = foundpos + 1; j < testateManagers.Length; j++)
+                    restateManagers[j - 1] = testateManagers[j];
+
+                estateManagers = restateManagers;
+            }
+            else
+            {
+                OpenSim.Framework.Console.MainLog.Instance.Error("ESTATESETTINGS", "Unable to locate estate manager : " + avatarID.ToString() + " for removal");
+            }
+        }
+
         #endregion
-        
+
         private ConfigurationMember configMember;
 
         public EstateSettings()
diff --git a/OpenSim/Region/Environment/EstateManager.cs b/OpenSim/Region/Environment/EstateManager.cs
index d0dbaea..9fe11fc 100644
--- a/OpenSim/Region/Environment/EstateManager.cs
+++ b/OpenSim/Region/Environment/EstateManager.cs
@@ -155,8 +155,8 @@ namespace OpenSim.Region.Environment
             switch (Helpers.FieldToUTF8String(packet.MethodData.Method))
             {
                 case "getinfo":
-                    
-                    
+
+                    //MainLog.Instance.Verbose("ESTATE","CLIENT--->" +  packet.ToString());
                     sendRegionInfoPacketToAll();
                     if (m_scene.PermissionsMngr.GenericEstatePermission(remote_client.AgentId))
                     {
@@ -198,6 +198,12 @@ namespace OpenSim.Region.Environment
                         EstateChangeCovenant(packet);
                     }
                     break;
+                case "estateaccessdelta":
+                    if (m_scene.PermissionsMngr.GenericEstatePermission(remote_client.AgentId))
+                    {
+                        estateAccessDelta(remote_client, packet);
+                    }
+                    break;
                 default:
                     MainLog.Instance.Error("EstateOwnerMessage: Unknown method requested\n" + packet.ToString());
                     break;
@@ -220,53 +226,105 @@ namespace OpenSim.Region.Environment
             //Sending Estate Settings
             returnblock[0].Parameter = Helpers.StringToField(m_scene.RegionInfo.MasterAvatarFirstName + m_scene.RegionInfo.MasterAvatarLastName);
             returnblock[1].Parameter = Helpers.StringToField(m_scene.RegionInfo.MasterAvatarAssignedUUID.ToString());
-            returnblock[2].Parameter = Helpers.IntToBytes((int)m_scene.RegionInfo.EstateSettings.estateID);
-            returnblock[3].Parameter = Helpers.IntToBytes(269516800);
-            returnblock[4].Parameter = Helpers.IntToBytes(0);
-            returnblock[5].Parameter = Helpers.IntToBytes(1);
-            returnblock[6].Parameter = Helpers.StringToField(LLUUID.Random().ToString());
-            returnblock[7].Parameter = Helpers.IntToBytes(1160895077);
-            returnblock[8].Parameter = Helpers.IntToBytes(1);
+            returnblock[2].Parameter = Helpers.StringToField(m_scene.RegionInfo.EstateSettings.estateID.ToString());
+            
+            // TODO: Resolve Magic numbers here
+            returnblock[3].Parameter = Helpers.StringToField("269516800");
+            returnblock[4].Parameter = Helpers.StringToField("0");
+            returnblock[5].Parameter = Helpers.StringToField("1");
+            returnblock[6].Parameter = Helpers.StringToField(m_scene.RegionInfo.RegionID.ToString());
+            returnblock[7].Parameter = Helpers.StringToField("1160895077");
+            returnblock[8].Parameter = Helpers.StringToField("1");
+
             packet.ParamList = returnblock;
+            //MainLog.Instance.Verbose("ESTATE", "SIM--->" + packet.ToString());
             remote_client.OutPacket(packet, ThrottleOutPacketType.Task);
 
-            // Stuck here at the moment  The client sends a bunch of getinfo methods that need to be decoded the hard way
+            sendEstateManagerList(remote_client, packet);
+            
+        }
+
+        private void sendEstateManagerList(IClientAPI remote_client, EstateOwnerMessagePacket packet)
+        {
+            LLUUID invoice = packet.MethodData.Invoice;
+            
             //Sending Estate Managers
             packet = new EstateOwnerMessagePacket();
             packet.AgentData.TransactionID = LLUUID.Random();
-            packet.AgentData.AgentID=remote_client.AgentId;
-            packet.AgentData.SessionID=remote_client.SessionId;
+            packet.AgentData.AgentID = remote_client.AgentId;
+            packet.AgentData.SessionID = remote_client.SessionId;
             packet.MethodData.Invoice = invoice;
             packet.MethodData.Method = Helpers.StringToField("setaccess");
 
             LLUUID[] EstateManagers = m_scene.RegionInfo.EstateSettings.estateManagers;
-            
-            returnblock = new EstateOwnerMessagePacket.ParamListBlock[6+EstateManagers.Length];
-            
+
+            EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + EstateManagers.Length];
+
             for (int i = 0; i < (6 + EstateManagers.Length); i++)
             {
                 returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
             }
-            int j=0;
-            returnblock[j].Parameter = Helpers.IntToBytes((int)m_scene.RegionInfo.EstateSettings.estateID); j++;
-            returnblock[j].Parameter = Helpers.IntToBytes((int)EstateAccessCodex.EstateManagers); j++;
-            returnblock[j].Parameter = Helpers.IntToBytes(0); j++;
-            returnblock[j].Parameter = Helpers.IntToBytes(0); j++;
-            returnblock[j].Parameter = Helpers.IntToBytes(0); j++;
-            returnblock[j].Parameter = Helpers.IntToBytes(EstateManagers.Length); j++;
+            int j = 0;
+            returnblock[j].Parameter = Helpers.StringToField(m_scene.RegionInfo.EstateSettings.estateID.ToString()); j++;
+            returnblock[j].Parameter = Helpers.StringToField(((int)EstateAccessCodex.EstateManagers).ToString()); j++;
+            returnblock[j].Parameter = Helpers.StringToField("0"); j++;
+            returnblock[j].Parameter = Helpers.StringToField("0"); j++;
+            returnblock[j].Parameter = Helpers.StringToField("0"); j++;
+            returnblock[j].Parameter = Helpers.StringToField(EstateManagers.Length.ToString()); j++;
             for (int i = 0; i < EstateManagers.Length; i++)
             {
-                returnblock[j].Parameter = Helpers.StringToField(EstateManagers[i].ToString()); j++;
+                returnblock[j].Parameter = EstateManagers[i].GetBytes(); j++;
             }
             packet.ParamList = returnblock;
+            //MainLog.Instance.Verbose("ESTATE", "SIM--->" + packet.ToString());
             remote_client.OutPacket(packet, ThrottleOutPacketType.Task);
+        }
+
+        private void estateAccessDelta(IClientAPI remote_client, EstateOwnerMessagePacket packet)
+        {
+            // EstateAccessDelta handles Estate Managers, Sim Access, Sim Banlist, allowed Groups..  etc.
+            int estateAccessType = Convert.ToInt16(Helpers.FieldToUTF8String(packet.ParamList[1].Parameter));
 
+            switch (estateAccessType)
+            {
+                case 256:
+            
+                // This needs to be updated for SuperEstateOwnerUser..   a non existing user in the estatesettings.xml
+                // So make sure you really trust your region owners.   because they can add other estate manaagers to your other estates
+                if (packet.AgentData.AgentID == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.PermissionsMngr.BypassPermissions)
+                {
+                    m_scene.RegionInfo.EstateSettings.AddEstateManager(new LLUUID(Helpers.FieldToUTF8String(packet.ParamList[2].Parameter)));
+                    sendEstateManagerList(remote_client, packet);
+                }
+                else
+                {
+                    remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
+                }
+                
+                break;
+                case 512:
+                    // This needs to be updated for SuperEstateOwnerUser..   a non existing user in the estatesettings.xml
+                    // So make sure you really trust your region owners.   because they can add other estate manaagers to your other estates
+                    if (packet.AgentData.AgentID == m_scene.RegionInfo.MasterAvatarAssignedUUID || m_scene.PermissionsMngr.BypassPermissions)
+                    {
+                        m_scene.RegionInfo.EstateSettings.RemoveEstateManager(new LLUUID(Helpers.FieldToUTF8String(packet.ParamList[2].Parameter)));
+                        sendEstateManagerList(remote_client, packet);
+                    }
+                    else
+                    {
+                        remote_client.SendAlertMessage("Method EstateAccessDelta Failed, you don't have permissions");
+                    }
+                    break;
 
+            default:
             
+                MainLog.Instance.Error("EstateOwnerMessage: Unknown EstateAccessType requested in estateAccessDelta\n" + packet.ToString());
+                break;
+            }
+            //MainLog.Instance.Error("EstateOwnerMessage: estateAccessDelta\n" + packet.ToString());     
 
 
         }
-
         private void estateSetRegionInfoHandler(EstateOwnerMessagePacket packet)
         {
             if (packet.ParamList.Length != 9)
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index ba99640..09b58e0 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -1790,7 +1790,7 @@ namespace OpenSim.Region.Environment.Scenes
                                                IClientAPI controllingClient)
         {
             // First check that this is the sim owner
-            if (agentID == RegionInfo.MasterAvatarAssignedUUID)
+            if (m_permissionManager.GenericEstatePermission(agentID))
             {
                 // User needs to be logged into this sim
                 if (m_scenePresences.ContainsKey(agentID))
@@ -1826,7 +1826,7 @@ namespace OpenSim.Region.Environment.Scenes
             LLUUID kickUserID = new LLUUID("44e87126e7944ded05b37c42da3d5cdb");
             if (m_scenePresences.ContainsKey(agentID) || agentID == kickUserID)
             {
-                if (godID == RegionInfo.MasterAvatarAssignedUUID)
+                if (m_permissionManager.GenericEstatePermission(godID))
                 {
                     if (agentID == kickUserID)
                     {
-- 
cgit v1.1