refactor: Move existing npc owner checks to NPCModule.CheckPermissions() methods and expose on interface for external calls.
parent
38db874755
commit
b47c0d7e51
|
@ -52,6 +52,14 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
/// <returns>True if the agent is an NPC in the given scene. False otherwise.</returns>
|
/// <returns>True if the agent is an NPC in the given scene. False otherwise.</returns>
|
||||||
bool IsNPC(UUID agentID, Scene scene);
|
bool IsNPC(UUID agentID, Scene scene);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Check if the caller has permission to manipulate the given NPC.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="npcID"></param>
|
||||||
|
/// <param name="callerID"></param>
|
||||||
|
/// <returns>true if they do, false if they don't or if there's no NPC with the given ID.</returns>
|
||||||
|
bool CheckPermissions(UUID npcID, UUID callerID);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Set the appearance for an NPC.
|
/// Set the appearance for an NPC.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -56,6 +56,24 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void PostInitialise()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Close()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name
|
||||||
|
{
|
||||||
|
get { return "NPCModule"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsSharedModule
|
||||||
|
{
|
||||||
|
get { return true; }
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsNPC(UUID agentId, Scene scene)
|
public bool IsNPC(UUID agentId, Scene scene)
|
||||||
{
|
{
|
||||||
// FIXME: This implementation could not just use the ScenePresence.PresenceType (and callers could inspect
|
// FIXME: This implementation could not just use the ScenePresence.PresenceType (and callers could inspect
|
||||||
|
@ -255,7 +273,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
NPCAvatar av;
|
NPCAvatar av;
|
||||||
if (m_avatars.TryGetValue(agentID, out av))
|
if (m_avatars.TryGetValue(agentID, out av))
|
||||||
{
|
{
|
||||||
if (av.OwnerID != UUID.Zero && callerID != UUID.Zero && av.OwnerID != callerID)
|
if (!CheckPermissions(av, callerID));
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
scene.RemoveClient(agentID, false);
|
scene.RemoveClient(agentID, false);
|
||||||
|
@ -268,22 +286,27 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void PostInitialise()
|
public bool CheckPermissions(UUID npcID, UUID callerID)
|
||||||
{
|
{
|
||||||
|
lock (m_avatars)
|
||||||
|
{
|
||||||
|
NPCAvatar av;
|
||||||
|
if (m_avatars.TryGetValue(npcID, out av))
|
||||||
|
return CheckPermissions(av, callerID);
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Close()
|
/// <summary>
|
||||||
|
/// Check if the caller has permission to manipulate the given NPC.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="av"></param>
|
||||||
|
/// <param name="callerID"></param>
|
||||||
|
/// <returns>true if they do, false if they don't.</returns>
|
||||||
|
private bool CheckPermissions(NPCAvatar av, UUID callerID)
|
||||||
{
|
{
|
||||||
}
|
return callerID == UUID.Zero || av.OwnerID == UUID.Zero || av.OwnerID == callerID;
|
||||||
|
|
||||||
public string Name
|
|
||||||
{
|
|
||||||
get { return "NPCModule"; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool IsSharedModule
|
|
||||||
{
|
|
||||||
get { return true; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2152,11 +2152,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
if (!UUID.TryParse(npc.m_string, out npcId))
|
if (!UUID.TryParse(npc.m_string, out npcId))
|
||||||
return new LSL_Key(UUID.Zero.ToString());
|
return new LSL_Key(UUID.Zero.ToString());
|
||||||
|
|
||||||
if (!npcModule.IsNPC(npcId, m_host.ParentGroup.Scene))
|
if (!npcModule.CheckPermissions(npcId, m_host.OwnerID))
|
||||||
return new LSL_Key(UUID.Zero.ToString());
|
|
||||||
|
|
||||||
UUID ownerID = npcModule.GetOwner(npcId);
|
|
||||||
if (ownerID != UUID.Zero && ownerID != m_host.OwnerID)
|
|
||||||
return new LSL_Key(UUID.Zero.ToString());
|
return new LSL_Key(UUID.Zero.ToString());
|
||||||
|
|
||||||
return SaveAppearanceToNotecard(npcId, notecard);
|
return SaveAppearanceToNotecard(npcId, notecard);
|
||||||
|
|
Loading…
Reference in New Issue