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);
/*