PATH-292: Ensuring that the terrain linkset is not visible and/or editable to a non-estate non-god agent.

master
Todd Stinson 2012-02-27 16:15:16 -08:00
parent 518bc51e66
commit 1503338ddc
2 changed files with 30 additions and 6 deletions

View File

@ -173,6 +173,12 @@ bool LLPathfindingManager::isAllowAlterPermanent()
return (!isPathfindingEnabledForCurrentRegion() || (getAgentState() == kAgentStateUnfrozen));
}
bool LLPathfindingManager::isAllowViewTerrainProperties() const
{
LLViewerRegion* region = getCurrentRegion();
return (gAgent.isGodlike() || ((region != NULL) && region->canManageEstate()));
}
LLPathfindingManager::agent_state_slot_t LLPathfindingManager::registerAgentStateSignal(agent_state_callback_t pAgentStateCallback)
{
return mAgentStateSignal.connect(pAgentStateCallback);
@ -231,13 +237,18 @@ LLPathfindingManager::ELinksetsRequestStatus LLPathfindingManager::requestGetLin
}
else
{
LinksetsResponderPtr linksetsResponderPtr(new LinksetsResponder(pLinksetsCallback, true, true));
bool doRequestTerrain = isAllowViewTerrainProperties();
LinksetsResponderPtr linksetsResponderPtr(new LinksetsResponder(pLinksetsCallback, true, doRequestTerrain));
LLHTTPClient::ResponderPtr objectLinksetsResponder = new ObjectLinksetsResponder(objectLinksetsURL, linksetsResponderPtr);
LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(terrainLinksetsURL, linksetsResponderPtr);
LLHTTPClient::get(objectLinksetsURL, objectLinksetsResponder);
LLHTTPClient::get(terrainLinksetsURL, terrainLinksetsResponder);
if (doRequestTerrain)
{
LLHTTPClient::ResponderPtr terrainLinksetsResponder = new TerrainLinksetsResponder(terrainLinksetsURL, linksetsResponderPtr);
LLHTTPClient::get(terrainLinksetsURL, terrainLinksetsResponder);
}
status = kLinksetsRequestStarted;
}
@ -257,7 +268,12 @@ LLPathfindingManager::ELinksetsRequestStatus LLPathfindingManager::requestSetLin
else
{
LLSD objectPostData = pLinksetList->encodeObjectFields(pLinksetUse, pA, pB, pC, pD);
LLSD terrainPostData = pLinksetList->encodeTerrainFields(pLinksetUse, pA, pB, pC, pD);
LLSD terrainPostData;
if (isAllowViewTerrainProperties())
{
terrainPostData = pLinksetList->encodeTerrainFields(pLinksetUse, pA, pB, pC, pD);
}
if (objectPostData.isUndefined() && terrainPostData.isUndefined())
{
status = kLinksetsRequestCompleted;
@ -362,7 +378,7 @@ std::string LLPathfindingManager::getCapabilityURLForCurrentRegion(const std::st
{
std::string capabilityURL("");
LLViewerRegion* region = gAgent.getRegion();
LLViewerRegion* region = getCurrentRegion();
if (region != NULL)
{
capabilityURL = region->getCapability(pCapabilityName);
@ -377,6 +393,11 @@ std::string LLPathfindingManager::getCapabilityURLForCurrentRegion(const std::st
return capabilityURL;
}
LLViewerRegion *LLPathfindingManager::getCurrentRegion() const
{
return gAgent.getRegion();
}
//---------------------------------------------------------------------------
// AgentStateResponder
//---------------------------------------------------------------------------

View File

@ -38,6 +38,7 @@
#include "llpathfindinglinksetlist.h"
class LLFloater;
class LLViewerRegion;
class LLPathfindingManager : public LLSingleton<LLPathfindingManager>
{
@ -70,6 +71,7 @@ public:
bool isPathfindingEnabledForCurrentRegion() const;
bool isAllowAlterPermanent();
bool isAllowViewTerrainProperties() const;
agent_state_slot_t registerAgentStateSignal(agent_state_callback_t pAgentStateCallback);
EAgentState getAgentState();
@ -95,6 +97,7 @@ private:
std::string getTerrainLinksetsURLForCurrentRegion() const;
std::string getCapabilityURLForCurrentRegion(const std::string &pCapabilityName) const;
LLViewerRegion *getCurrentRegion() const;
agent_state_signal_t mAgentStateSignal;
EAgentState mAgentState;