* A tweak of the caps system so that new caps have random paths instead of a fixed path
* This allows caps requests to be routed to regions where the agent is currently a root agent instead of the region that they logged into as it did previously. * This fixes a wide variety of bugs related to 'can't do X once i've crossed a border'. * The first seed cap request fails, the second one works. (this generates an error message on the console) * Experimental.0.6.0-stable
parent
3891b2f86f
commit
e777f88028
|
@ -251,6 +251,11 @@ namespace OpenSim.Framework.Communications.Cache
|
|||
ItemReceive(userID, itemInfo);
|
||||
m_commsManager.InventoryService.AddNewInventoryItem(userID, itemInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Error("[UNABLE TO UPLOAD]: ");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -264,6 +269,10 @@ namespace OpenSim.Framework.Communications.Cache
|
|||
{
|
||||
m_commsManager.InventoryService.AddNewInventoryItem(userID, itemInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Error("[UNABLE TO UPDATE]: ");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -283,6 +292,10 @@ namespace OpenSim.Framework.Communications.Cache
|
|||
m_commsManager.InventoryService.DeleteInventoryItem(userID, item);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Error("[UNABLE TO DELETE]: ");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
|
@ -64,6 +64,7 @@ namespace OpenSim.Framework
|
|||
|
||||
ClientManager ClientManager { get; }
|
||||
|
||||
string GetCapsPath(LLUUID agentId);
|
||||
string GetCapsPath(LLUUID agentId);
|
||||
string GetNewCapsPath(LLUUID agentId);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1867,8 +1867,25 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
/// <param name="agentId"></param>
|
||||
/// <param name="capsObjectPath"></param>
|
||||
public void AddCapsHandler(LLUUID agentId)
|
||||
{
|
||||
String capsObjectPath = GetCapsPath(agentId);
|
||||
{
|
||||
// Here we clear out old Caps handlers for the agent
|
||||
// this is required because we potentially have multiple simulators in an instance nearby.
|
||||
Caps oldcap = null;
|
||||
lock (m_capsHandlers)
|
||||
{
|
||||
if (m_capsHandlers.ContainsKey(agentId))
|
||||
oldcap = m_capsHandlers[agentId];
|
||||
}
|
||||
if (oldcap != null)
|
||||
{
|
||||
oldcap.DeregisterHandlers();
|
||||
}
|
||||
|
||||
// Generate a new base caps path LLUUID.Random().ToString() instead of agentId.ToString()
|
||||
// If the caps paths are not different for each region, the client and sim will do weird
|
||||
// things like send the request to a region the agent is no longer in.
|
||||
|
||||
String capsObjectPath = GetNewCapsPath(agentId);
|
||||
|
||||
m_log.DebugFormat(
|
||||
"[CAPS]: Setting up CAPS handler for root agent {0} in {1}",
|
||||
|
|
|
@ -214,5 +214,17 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
|
||||
return null;
|
||||
}
|
||||
public string GetNewCapsPath(LLUUID agentID)
|
||||
{
|
||||
if (capsPaths.ContainsKey(agentID))
|
||||
{
|
||||
capsPaths[agentID] = LLUUID.Random().ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
capsPaths.Add(agentID, LLUUID.Random().ToString());
|
||||
}
|
||||
return GetCapsPath(agentID);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue