a few changes to Gods ( ie administrators) control
parent
40e982f6e7
commit
cbc3501246
|
@ -227,10 +227,10 @@ namespace OpenSim.Framework
|
||||||
byte RayEndIsIntersection);
|
byte RayEndIsIntersection);
|
||||||
|
|
||||||
public delegate void RequestGodlikePowers(
|
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(
|
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(
|
public delegate void CreateInventoryFolder(
|
||||||
IClientAPI remoteClient, UUID folderID, ushort folderType, string folderName, UUID parentID);
|
IClientAPI remoteClient, UUID folderID, ushort folderType, string folderName, UUID parentID);
|
||||||
|
|
|
@ -10455,6 +10455,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
private bool HandleRequestGodlikePowers(IClientAPI sender, Packet Pack)
|
private bool HandleRequestGodlikePowers(IClientAPI sender, Packet Pack)
|
||||||
{
|
{
|
||||||
RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack;
|
RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack;
|
||||||
|
|
||||||
|
if (rglpPack.AgentData.SessionID != SessionId ||
|
||||||
|
rglpPack.AgentData.AgentID != AgentId)
|
||||||
|
return true;
|
||||||
|
|
||||||
RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock;
|
RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock;
|
||||||
UUID token = rblock.Token;
|
UUID token = rblock.Token;
|
||||||
|
|
||||||
|
@ -10464,7 +10469,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
|
|
||||||
if (handlerReqGodlikePowers != null)
|
if (handlerReqGodlikePowers != null)
|
||||||
{
|
{
|
||||||
handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike, this);
|
handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -10475,6 +10480,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
GodUpdateRegionInfoPacket GodUpdateRegionInfo =
|
GodUpdateRegionInfoPacket GodUpdateRegionInfo =
|
||||||
(GodUpdateRegionInfoPacket)Packet;
|
(GodUpdateRegionInfoPacket)Packet;
|
||||||
|
|
||||||
|
if (GodUpdateRegionInfo.AgentData.SessionID != SessionId ||
|
||||||
|
GodUpdateRegionInfo.AgentData.AgentID != AgentId)
|
||||||
|
return true;
|
||||||
|
|
||||||
GodUpdateRegionInfoUpdate handlerGodUpdateRegionInfo = OnGodUpdateRegionInfoUpdate;
|
GodUpdateRegionInfoUpdate handlerGodUpdateRegionInfo = OnGodUpdateRegionInfoUpdate;
|
||||||
if (handlerGodUpdateRegionInfo != null)
|
if (handlerGodUpdateRegionInfo != null)
|
||||||
{
|
{
|
||||||
|
@ -10508,6 +10517,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
GodlikeMessagePacket GodlikeMessage =
|
GodlikeMessagePacket GodlikeMessage =
|
||||||
(GodlikeMessagePacket)Packet;
|
(GodlikeMessagePacket)Packet;
|
||||||
|
|
||||||
|
if (GodlikeMessage.AgentData.SessionID != SessionId ||
|
||||||
|
GodlikeMessage.AgentData.AgentID != AgentId)
|
||||||
|
return true;
|
||||||
|
|
||||||
GodlikeMessage handlerGodlikeMessage = onGodlikeMessage;
|
GodlikeMessage handlerGodlikeMessage = onGodlikeMessage;
|
||||||
if (handlerGodlikeMessage != null)
|
if (handlerGodlikeMessage != null)
|
||||||
{
|
{
|
||||||
|
@ -10524,6 +10537,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
{
|
{
|
||||||
StateSavePacket SaveStateMessage =
|
StateSavePacket SaveStateMessage =
|
||||||
(StateSavePacket)Packet;
|
(StateSavePacket)Packet;
|
||||||
|
|
||||||
|
if (SaveStateMessage.AgentData.SessionID != SessionId ||
|
||||||
|
SaveStateMessage.AgentData.AgentID != AgentId)
|
||||||
|
return true;
|
||||||
|
|
||||||
SaveStateHandler handlerSaveStatePacket = OnSaveState;
|
SaveStateHandler handlerSaveStatePacket = OnSaveState;
|
||||||
if (handlerSaveStatePacket != null)
|
if (handlerSaveStatePacket != null)
|
||||||
{
|
{
|
||||||
|
@ -10537,30 +10555,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
{
|
{
|
||||||
GodKickUserPacket gkupack = (GodKickUserPacket)Pack;
|
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;
|
handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.AgentID, gkupack.UserInfo.KickFlags, gkupack.UserInfo.Reason);
|
||||||
if (handlerGodKickUser != null)
|
|
||||||
{
|
|
||||||
handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.GodSessionID,
|
|
||||||
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;
|
return true;
|
||||||
}
|
}
|
||||||
#endregion GodPackets
|
#endregion GodPackets
|
||||||
|
|
|
@ -152,7 +152,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
|
||||||
if (god == null || god.ControllingClient.SessionId != godSessionID)
|
if (god == null || god.ControllingClient.SessionId != godSessionID)
|
||||||
return String.Empty;
|
return String.Empty;
|
||||||
|
|
||||||
KickUser(godID, godSessionID, agentID, kickFlags, Util.StringToBytes1024(reason));
|
KickUser(godID, agentID, kickFlags, Util.StringToBytes1024(reason));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -162,59 +162,53 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RequestGodlikePowers(
|
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);
|
ScenePresence sp = m_scene.GetScenePresence(agentID);
|
||||||
|
if(sp == null || sp.IsDeleted || sp.isNPC)
|
||||||
|
return;
|
||||||
|
|
||||||
if (sp != null)
|
if (sessionID != sp.ControllingClient.SessionId)
|
||||||
{
|
return;
|
||||||
if (godLike == false)
|
|
||||||
{
|
|
||||||
sp.GrantGodlikePowers(agentID, sessionID, token, godLike);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// First check that this is the sim owner
|
sp.GrantGodlikePowers(token, godLike);
|
||||||
if (m_scene.Permissions.IsGod(agentID))
|
|
||||||
{
|
if (godLike && sp.GodLevel < 200 && DialogModule != null)
|
||||||
// Next we check for spoofing.....
|
DialogModule.SendAlertToUser(agentID, "Request for god powers denied");
|
||||||
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");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Kicks User specified from the simulator. This logs them off of the grid
|
/// Kicks or freezes 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
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="godID">The person doing the kicking</param>
|
/// <param name="godID">The person doing the kicking</param>
|
||||||
/// <param name="sessionID">The session of the person doing the kicking</param>
|
|
||||||
/// <param name="agentID">the person that is being kicked</param>
|
/// <param name="agentID">the person that is being kicked</param>
|
||||||
/// <param name="kickflags">Tells what to do to the user</param>
|
/// <param name="kickflags">Tells what to do to the user</param>
|
||||||
/// <param name="reason">The message to send to the user after it's been turned into a field</param>
|
/// <param name="reason">The message to send to the user after it's been turned into a field</param>
|
||||||
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;
|
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 =
|
IMessageTransferModule transferModule =
|
||||||
m_scene.RequestModuleInterface<IMessageTransferModule>();
|
m_scene.RequestModuleInterface<IMessageTransferModule>();
|
||||||
|
@ -230,48 +224,41 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
|
||||||
return;
|
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)
|
switch (kickflags)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (sp != null)
|
|
||||||
{
|
|
||||||
KickPresence(sp, Utils.BytesToString(reason));
|
KickPresence(sp, Utils.BytesToString(reason));
|
||||||
}
|
break;
|
||||||
else if (agentID == ALL_AGENTS)
|
case 1:
|
||||||
{
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
sp.AllowMovement = false;
|
sp.AllowMovement = false;
|
||||||
m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason));
|
m_dialogModule.SendAlertToUser(sp.UUID, Utils.BytesToString(reason));
|
||||||
m_dialogModule.SendAlertToUser(godID, "User Frozen");
|
m_dialogModule.SendAlertToUser(godID, "User Frozen");
|
||||||
}
|
break;
|
||||||
break;
|
case 2:
|
||||||
case 2:
|
|
||||||
if (sp != null)
|
|
||||||
{
|
|
||||||
sp.AllowMovement = true;
|
sp.AllowMovement = true;
|
||||||
m_dialogModule.SendAlertToUser(agentID, Utils.BytesToString(reason));
|
m_dialogModule.SendAlertToUser(sp.UUID, Utils.BytesToString(reason));
|
||||||
m_dialogModule.SendAlertToUser(godID, "User Unfrozen");
|
m_dialogModule.SendAlertToUser(godID, "User Unfrozen");
|
||||||
}
|
break;
|
||||||
break;
|
default:
|
||||||
default:
|
break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void KickPresence(ScenePresence sp, string reason)
|
private void KickPresence(ScenePresence sp, string reason)
|
||||||
{
|
{
|
||||||
if (sp.IsChildAgent)
|
if(sp.IsDeleted || sp.IsChildAgent)
|
||||||
return;
|
return;
|
||||||
sp.ControllingClient.Kick(reason);
|
sp.ControllingClient.Kick(reason);
|
||||||
sp.Scene.CloseAgent(sp.UUID, true);
|
sp.Scene.CloseAgent(sp.UUID, true);
|
||||||
|
@ -286,7 +273,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods
|
||||||
UUID godID = new UUID(msg.fromAgentID);
|
UUID godID = new UUID(msg.fromAgentID);
|
||||||
uint kickMode = (uint)msg.binaryBucket[0];
|
uint kickMode = (uint)msg.binaryBucket[0];
|
||||||
|
|
||||||
KickUser(godID, UUID.Zero, agentID, kickMode, Util.StringToBytes1024(reason));
|
KickUser(godID, agentID, kickMode, Util.StringToBytes1024(reason));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,16 +43,15 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
/// <param name="token"></param>
|
/// <param name="token"></param>
|
||||||
/// <param name="godLike"></param>
|
/// <param name="godLike"></param>
|
||||||
/// <param name="controllingClient"></param>
|
/// <param name="controllingClient"></param>
|
||||||
void RequestGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godLike, IClientAPI controllingClient);
|
void RequestGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godLike);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Kicks User specified from the simulator. This logs them off of the grid.
|
/// Kicks User specified from the simulator. This logs them off of the grid.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="godID">The person doing the kicking</param>
|
/// <param name="godID">The person doing the kicking</param>
|
||||||
/// <param name="sessionID">The session of the person doing the kicking</param>
|
|
||||||
/// <param name="agentID">the person that is being kicked</param>
|
/// <param name="agentID">the person that is being kicked</param>
|
||||||
/// <param name="kickflags">This isn't used apparently</param>
|
/// <param name="kickflags">This isn't used apparently</param>
|
||||||
/// <param name="reason">The message to send to the user after it's been turned into a field</param>
|
/// <param name="reason">The message to send to the user after it's been turned into a field</param>
|
||||||
void KickUser(UUID godID, UUID sessionID, UUID agentID, uint kickflags, byte[] reason);
|
void KickUser(UUID godID, UUID agentID, uint kickflags, byte[] reason);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4506,34 +4506,22 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This allows the Sim owner the abiility to kick users from their sim currently.
|
/// handle god level requests.
|
||||||
/// It tells the client that the agent has permission to do so.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void GrantGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godStatus)
|
public void GrantGodlikePowers(UUID token, bool godStatus)
|
||||||
{
|
{
|
||||||
int oldgodlevel = GodLevel;
|
int oldgodlevel = GodLevel;
|
||||||
|
|
||||||
if (godStatus)
|
if (godStatus && !isNPC && m_scene.Permissions.IsGod(UUID))
|
||||||
{
|
{
|
||||||
// For now, assign god level 200 to anyone
|
GodLevel = 200;
|
||||||
// who is granted god powers, but has no god level set.
|
if(GodLevel < UserLevel)
|
||||||
//
|
GodLevel = UserLevel;
|
||||||
UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, agentID);
|
|
||||||
if (account != null)
|
|
||||||
{
|
|
||||||
if (account.UserLevel > 0)
|
|
||||||
GodLevel = account.UserLevel;
|
|
||||||
else
|
|
||||||
GodLevel = 200;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
GodLevel = 0;
|
GodLevel = 0;
|
||||||
}
|
|
||||||
|
|
||||||
ControllingClient.SendAdminResponse(token, (uint)GodLevel);
|
ControllingClient.SendAdminResponse(token, (uint)GodLevel);
|
||||||
|
|
||||||
if(oldgodlevel != GodLevel)
|
if(oldgodlevel != GodLevel)
|
||||||
parcelGodCheck(m_currentParcelUUID, GodLevel >= 200);
|
parcelGodCheck(m_currentParcelUUID, GodLevel >= 200);
|
||||||
}
|
}
|
||||||
|
@ -4640,7 +4628,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
cAgent.BodyRotation = Rotation;
|
cAgent.BodyRotation = Rotation;
|
||||||
cAgent.ControlFlags = (uint)m_AgentControlFlags;
|
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;
|
cAgent.GodLevel = (byte)GodLevel;
|
||||||
else
|
else
|
||||||
cAgent.GodLevel = (byte) 0;
|
cAgent.GodLevel = (byte) 0;
|
||||||
|
@ -4741,10 +4729,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Rotation = cAgent.BodyRotation;
|
Rotation = cAgent.BodyRotation;
|
||||||
m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
|
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;
|
GodLevel = cAgent.GodLevel;
|
||||||
SetAlwaysRun = cAgent.AlwaysRun;
|
else
|
||||||
|
GodLevel = 0;
|
||||||
|
|
||||||
|
SetAlwaysRun = cAgent.AlwaysRun;
|
||||||
|
|
||||||
Appearance = new AvatarAppearance(cAgent.Appearance);
|
Appearance = new AvatarAppearance(cAgent.Appearance);
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue