diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index c4de81e93a..1541b3a3dc 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -227,10 +227,10 @@ namespace OpenSim.Framework byte RayEndIsIntersection); public delegate void RequestGodlikePowers( - UUID AgentID, UUID SessionID, UUID token, bool GodLike, IClientAPI remote_client); + UUID AgentID, UUID SessionID, UUID token, bool GodLike); public delegate void GodKickUser( - UUID GodAgentID, UUID GodSessionID, UUID AgentID, uint kickflags, byte[] reason); + UUID GodAgentID, UUID AgentID, uint kickflags, byte[] reason); public delegate void CreateInventoryFolder( IClientAPI remoteClient, UUID folderID, ushort folderType, string folderName, UUID parentID); diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 55050d9de4..27ca74043b 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -10455,6 +10455,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP private bool HandleRequestGodlikePowers(IClientAPI sender, Packet Pack) { RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack; + + if (rglpPack.AgentData.SessionID != SessionId || + rglpPack.AgentData.AgentID != AgentId) + return true; + RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock; UUID token = rblock.Token; @@ -10464,7 +10469,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP if (handlerReqGodlikePowers != null) { - handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike, this); + handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike); } return true; @@ -10475,6 +10480,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP GodUpdateRegionInfoPacket GodUpdateRegionInfo = (GodUpdateRegionInfoPacket)Packet; + if (GodUpdateRegionInfo.AgentData.SessionID != SessionId || + GodUpdateRegionInfo.AgentData.AgentID != AgentId) + return true; + GodUpdateRegionInfoUpdate handlerGodUpdateRegionInfo = OnGodUpdateRegionInfoUpdate; if (handlerGodUpdateRegionInfo != null) { @@ -10508,6 +10517,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP GodlikeMessagePacket GodlikeMessage = (GodlikeMessagePacket)Packet; + if (GodlikeMessage.AgentData.SessionID != SessionId || + GodlikeMessage.AgentData.AgentID != AgentId) + return true; + GodlikeMessage handlerGodlikeMessage = onGodlikeMessage; if (handlerGodlikeMessage != null) { @@ -10524,6 +10537,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP { StateSavePacket SaveStateMessage = (StateSavePacket)Packet; + + if (SaveStateMessage.AgentData.SessionID != SessionId || + SaveStateMessage.AgentData.AgentID != AgentId) + return true; + SaveStateHandler handlerSaveStatePacket = OnSaveState; if (handlerSaveStatePacket != null) { @@ -10537,30 +10555,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP { GodKickUserPacket gkupack = (GodKickUserPacket)Pack; - if (gkupack.UserInfo.GodSessionID == SessionId && AgentId == gkupack.UserInfo.GodID) + if (gkupack.UserInfo.GodSessionID != SessionId || + gkupack.UserInfo.GodID != AgentId) + return true; + + GodKickUser handlerGodKickUser = OnGodKickUser; + if (handlerGodKickUser != null) { - GodKickUser handlerGodKickUser = OnGodKickUser; - if (handlerGodKickUser != null) - { - handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.GodSessionID, - gkupack.UserInfo.AgentID, gkupack.UserInfo.KickFlags, gkupack.UserInfo.Reason); - } + handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.AgentID, gkupack.UserInfo.KickFlags, gkupack.UserInfo.Reason); } - else - { - SendAgentAlertMessage("Kick request denied", false); - } - //KickUserPacket kupack = new KickUserPacket(); - //KickUserPacket.UserInfoBlock kupackib = kupack.UserInfo; - //kupack.UserInfo.AgentID = gkupack.UserInfo.AgentID; - //kupack.UserInfo.SessionID = gkupack.UserInfo.GodSessionID; - - //kupack.TargetBlock.TargetIP = (uint)0; - //kupack.TargetBlock.TargetPort = (ushort)0; - //kupack.UserInfo.Reason = gkupack.UserInfo.Reason; - - //OutPacket(kupack, ThrottleOutPacketType.Task); return true; } #endregion GodPackets diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs index e0c492419c..db023792bd 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs @@ -152,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods if (god == null || god.ControllingClient.SessionId != godSessionID) return String.Empty; - KickUser(godID, godSessionID, agentID, kickFlags, Util.StringToBytes1024(reason)); + KickUser(godID, agentID, kickFlags, Util.StringToBytes1024(reason)); } else { @@ -162,59 +162,53 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods } public void RequestGodlikePowers( - UUID agentID, UUID sessionID, UUID token, bool godLike, IClientAPI controllingClient) + UUID agentID, UUID sessionID, UUID token, bool godLike) { ScenePresence sp = m_scene.GetScenePresence(agentID); + if(sp == null || sp.IsDeleted || sp.isNPC) + return; - if (sp != null) - { - if (godLike == false) - { - sp.GrantGodlikePowers(agentID, sessionID, token, godLike); - return; - } + if (sessionID != sp.ControllingClient.SessionId) + return; - // First check that this is the sim owner - if (m_scene.Permissions.IsGod(agentID)) - { - // Next we check for spoofing..... - UUID testSessionID = sp.ControllingClient.SessionId; - if (sessionID == testSessionID) - { - if (sessionID == controllingClient.SessionId) - { - //m_log.Info("godlike: " + godLike.ToString()); - sp.GrantGodlikePowers(agentID, testSessionID, token, godLike); - } - } - } - else - { - if (DialogModule != null) - DialogModule.SendAlertToUser(agentID, "Request for god powers denied"); - } - } + sp.GrantGodlikePowers(token, godLike); + + if (godLike && sp.GodLevel < 200 && DialogModule != null) + DialogModule.SendAlertToUser(agentID, "Request for god powers denied"); } /// - /// Kicks User specified from the simulator. This logs them off of the grid - /// If the client gets the UUID: 44e87126e7944ded05b37c42da3d5cdb it assumes - /// that you're kicking it even if the avatar's UUID isn't the UUID that the - /// agent is assigned + /// Kicks or freezes User specified from the simulator. This logs them off of the grid /// /// The person doing the kicking - /// The session of the person doing the kicking /// the person that is being kicked /// Tells what to do to the user /// The message to send to the user after it's been turned into a field - public void KickUser(UUID godID, UUID sessionID, UUID agentID, uint kickflags, byte[] reason) + public void KickUser(UUID godID, UUID agentID, uint kickflags, byte[] reason) { - if (!m_scene.Permissions.IsGod(godID)) + // assuming automatic god rights on this for fast griefing reaction + // this is also needed for kick via message + if(!m_scene.Permissions.IsGod(godID)) return; - ScenePresence sp = m_scene.GetScenePresence(agentID); + int godlevel = 200; + // update level so higher gods can kick lower ones + ScenePresence god = m_scene.GetScenePresence(godID); + if(god != null && god.GodLevel > godlevel) + godlevel = god.GodLevel; - if (sp == null && agentID != ALL_AGENTS) + if(agentID == ALL_AGENTS) + { + m_scene.ForEachRootScenePresence(delegate(ScenePresence p) + { + if (p.UUID != godID && godlevel > p.GodLevel) + doKickmodes(godID, p, kickflags, reason); + }); + return; + } + + ScenePresence sp = m_scene.GetScenePresence(agentID); + if (sp == null || sp.IsChildAgent) { IMessageTransferModule transferModule = m_scene.RequestModuleInterface(); @@ -230,48 +224,41 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods return; } + if (godlevel <= sp.GodLevel) // no god wars + return; + + if(sp.UUID == godID) + return; + + doKickmodes(godID, sp, kickflags, reason); + } + + private void doKickmodes(UUID godID, ScenePresence sp, uint kickflags, byte[] reason) + { switch (kickflags) { - case 0: - if (sp != null) - { + case 0: KickPresence(sp, Utils.BytesToString(reason)); - } - else if (agentID == ALL_AGENTS) - { - m_scene.ForEachRootScenePresence( - delegate(ScenePresence p) - { - if (p.UUID != godID && (!m_scene.Permissions.IsGod(p.UUID))) - KickPresence(p, Utils.BytesToString(reason)); - } - ); - } - break; - case 1: - if (sp != null) - { + break; + case 1: sp.AllowMovement = false; - m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason)); + m_dialogModule.SendAlertToUser(sp.UUID, Utils.BytesToString(reason)); m_dialogModule.SendAlertToUser(godID, "User Frozen"); - } - break; - case 2: - if (sp != null) - { + break; + case 2: sp.AllowMovement = true; - m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason)); + m_dialogModule.SendAlertToUser(sp.UUID, Utils.BytesToString(reason)); m_dialogModule.SendAlertToUser(godID, "User Unfrozen"); - } - break; - default: - break; + break; + default: + break; } } + private void KickPresence(ScenePresence sp, string reason) { - if (sp.IsChildAgent) + if(sp.IsDeleted || sp.IsChildAgent) return; sp.ControllingClient.Kick(reason); sp.Scene.CloseAgent(sp.UUID, true); @@ -286,7 +273,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods UUID godID = new UUID(msg.fromAgentID); uint kickMode = (uint)msg.binaryBucket[0]; - KickUser(godID, UUID.Zero, agentID, kickMode, Util.StringToBytes1024(reason)); + KickUser(godID, agentID, kickMode, Util.StringToBytes1024(reason)); } } } diff --git a/OpenSim/Region/Framework/Interfaces/IGodsModule.cs b/OpenSim/Region/Framework/Interfaces/IGodsModule.cs index 552ce01199..1cb9a3002c 100644 --- a/OpenSim/Region/Framework/Interfaces/IGodsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IGodsModule.cs @@ -43,16 +43,15 @@ namespace OpenSim.Region.Framework.Interfaces /// /// /// - void RequestGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godLike, IClientAPI controllingClient); + void RequestGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godLike); /// /// Kicks User specified from the simulator. This logs them off of the grid. /// /// The person doing the kicking - /// The session of the person doing the kicking /// the person that is being kicked /// This isn't used apparently /// The message to send to the user after it's been turned into a field - void KickUser(UUID godID, UUID sessionID, UUID agentID, uint kickflags, byte[] reason); + void KickUser(UUID godID, UUID agentID, uint kickflags, byte[] reason); } } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f906d9fed0..c1b1a6386d 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -4506,34 +4506,22 @@ namespace OpenSim.Region.Framework.Scenes #endregion /// - /// This allows the Sim owner the abiility to kick users from their sim currently. - /// It tells the client that the agent has permission to do so. + /// handle god level requests. /// - public void GrantGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godStatus) + public void GrantGodlikePowers(UUID token, bool godStatus) { int oldgodlevel = GodLevel; - - if (godStatus) + + if (godStatus && !isNPC && m_scene.Permissions.IsGod(UUID)) { - // For now, assign god level 200 to anyone - // who is granted god powers, but has no god level set. - // - UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, agentID); - if (account != null) - { - if (account.UserLevel > 0) - GodLevel = account.UserLevel; - else - GodLevel = 200; - } + GodLevel = 200; + if(GodLevel < UserLevel) + GodLevel = UserLevel; } else - { - GodLevel = 0; - } + GodLevel = 0; ControllingClient.SendAdminResponse(token, (uint)GodLevel); - if(oldgodlevel != GodLevel) parcelGodCheck(m_currentParcelUUID, GodLevel >= 200); } @@ -4640,7 +4628,7 @@ namespace OpenSim.Region.Framework.Scenes cAgent.BodyRotation = Rotation; cAgent.ControlFlags = (uint)m_AgentControlFlags; - if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) + if (GodLevel > 200 && m_scene.Permissions.IsGod(cAgent.AgentID)) cAgent.GodLevel = (byte)GodLevel; else cAgent.GodLevel = (byte) 0; @@ -4741,10 +4729,12 @@ namespace OpenSim.Region.Framework.Scenes Rotation = cAgent.BodyRotation; m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags; - if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) + if (cAgent.GodLevel >200 && m_scene.Permissions.IsGod(cAgent.AgentID)) GodLevel = cAgent.GodLevel; - SetAlwaysRun = cAgent.AlwaysRun; + else + GodLevel = 0; + SetAlwaysRun = cAgent.AlwaysRun; Appearance = new AvatarAppearance(cAgent.Appearance); /*