From a72d33d3a5da5bb48e9c95fd355458be335fee3e Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Wed, 2 Jan 2008 20:25:47 +0000 Subject: [PATCH] * 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 1078c10b80..9e4b9a47e1 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 d0dbaeab89..9fe11fcd32 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 ba99640e30..09b58e0c05 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) {