refactor: Move existing npc owner checks to NPCModule.CheckPermissions() methods and expose on interface for external calls.

iar_mods
Justin Clark-Casey (justincc) 2012-01-12 18:14:19 +00:00
parent 38db874755
commit b47c0d7e51
3 changed files with 45 additions and 18 deletions

View File

@ -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>

View File

@ -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; }
} }
} }
} }

View File

@ -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);