aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
authorDiva Canto2013-07-13 21:28:46 -0700
committerDiva Canto2013-07-13 21:28:46 -0700
commitb4f1b9acf65f9e782d56602e60c58be6145c5cca (patch)
tree33860eecce915dedd2c573f2d3aad026e63706bc /OpenSim/Region/Framework
parentDeleted GET agent all around. Not used. (diff)
downloadopensim-SC_OLD-b4f1b9acf65f9e782d56602e60c58be6145c5cca.zip
opensim-SC_OLD-b4f1b9acf65f9e782d56602e60c58be6145c5cca.tar.gz
opensim-SC_OLD-b4f1b9acf65f9e782d56602e60c58be6145c5cca.tar.bz2
opensim-SC_OLD-b4f1b9acf65f9e782d56602e60c58be6145c5cca.tar.xz
Guard against unauthorized agent deletes.
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs26
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs8
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs6
3 files changed, 30 insertions, 10 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 54956ee..becea1f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3452,7 +3452,7 @@ namespace OpenSim.Region.Framework.Scenes
3452 regions.Remove(RegionInfo.RegionHandle); 3452 regions.Remove(RegionInfo.RegionHandle);
3453 3453
3454 // This ends up being done asynchronously so that a logout isn't held up where there are many present but unresponsive neighbours. 3454 // This ends up being done asynchronously so that a logout isn't held up where there are many present but unresponsive neighbours.
3455 m_sceneGridService.SendCloseChildAgentConnections(agentID, regions); 3455 m_sceneGridService.SendCloseChildAgentConnections(agentID, Util.Md5Hash(acd.Id0), regions);
3456 } 3456 }
3457 3457
3458 m_eventManager.TriggerClientClosed(agentID, this); 3458 m_eventManager.TriggerClientClosed(agentID, this);
@@ -4277,6 +4277,25 @@ namespace OpenSim.Region.Framework.Scenes
4277 4277
4278 return false; 4278 return false;
4279 } 4279 }
4280 /// <summary>
4281 /// Authenticated close (via network)
4282 /// </summary>
4283 /// <param name="agentID"></param>
4284 /// <param name="force"></param>
4285 /// <param name="auth_token"></param>
4286 /// <returns></returns>
4287 public bool IncomingCloseAgent(UUID agentID, bool force, string auth_token)
4288 {
4289 //m_log.DebugFormat("[SCENE]: Processing incoming close agent {0} in region {1} with auth_token {2}", agentID, RegionInfo.RegionName, auth_token);
4290
4291 // Check that the auth_token is valid
4292 AgentCircuitData acd = AuthenticateHandler.GetAgentCircuitData(agentID);
4293 if (acd != null && Util.Md5Hash(acd.Id0) == auth_token)
4294 return IncomingCloseAgent(agentID, force);
4295 else
4296 m_log.ErrorFormat("[SCENE]: Request to close agent {0} with invalid authorization token {1}", agentID, auth_token);
4297 return false;
4298 }
4280 4299
4281 /// <summary> 4300 /// <summary>
4282 /// Tell a single agent to disconnect from the region. 4301 /// Tell a single agent to disconnect from the region.
@@ -4292,12 +4311,9 @@ namespace OpenSim.Region.Framework.Scenes
4292 4311
4293 ScenePresence presence = m_sceneGraph.GetScenePresence(agentID); 4312 ScenePresence presence = m_sceneGraph.GetScenePresence(agentID);
4294 if (presence != null) 4313 if (presence != null)
4295 {
4296 presence.ControllingClient.Close(force); 4314 presence.ControllingClient.Close(force);
4297 return true;
4298 }
4299 4315
4300 // Agent not here 4316 // Agent not here
4301 return false; 4317 return false;
4302 } 4318 }
4303 4319
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 8238e23..77889fa 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -197,7 +197,7 @@ namespace OpenSim.Region.Framework.Scenes
197 /// <summary> 197 /// <summary>
198 /// Closes a child agent on a given region 198 /// Closes a child agent on a given region
199 /// </summary> 199 /// </summary>
200 protected void SendCloseChildAgent(UUID agentID, ulong regionHandle) 200 protected void SendCloseChildAgent(UUID agentID, ulong regionHandle, string auth_token)
201 { 201 {
202 // let's do our best, but there's not much we can do if the neighbour doesn't accept. 202 // let's do our best, but there's not much we can do if the neighbour doesn't accept.
203 203
@@ -210,7 +210,7 @@ namespace OpenSim.Region.Framework.Scenes
210 m_log.DebugFormat( 210 m_log.DebugFormat(
211 "[SCENE COMMUNICATION SERVICE]: Sending close agent ID {0} to {1}", agentID, destination.RegionName); 211 "[SCENE COMMUNICATION SERVICE]: Sending close agent ID {0} to {1}", agentID, destination.RegionName);
212 212
213 m_scene.SimulationService.CloseAgent(destination, agentID); 213 m_scene.SimulationService.CloseAgent(destination, agentID, auth_token);
214 } 214 }
215 215
216 /// <summary> 216 /// <summary>
@@ -219,14 +219,14 @@ namespace OpenSim.Region.Framework.Scenes
219 /// </summary> 219 /// </summary>
220 /// <param name="agentID"></param> 220 /// <param name="agentID"></param>
221 /// <param name="regionslst"></param> 221 /// <param name="regionslst"></param>
222 public void SendCloseChildAgentConnections(UUID agentID, List<ulong> regionslst) 222 public void SendCloseChildAgentConnections(UUID agentID, string auth_code, List<ulong> regionslst)
223 { 223 {
224 foreach (ulong handle in regionslst) 224 foreach (ulong handle in regionslst)
225 { 225 {
226 // We must take a copy here since handle is acts like a reference when used in an iterator. 226 // We must take a copy here since handle is acts like a reference when used in an iterator.
227 // This leads to race conditions if directly passed to SendCloseChildAgent with more than one neighbour region. 227 // This leads to race conditions if directly passed to SendCloseChildAgent with more than one neighbour region.
228 ulong handleCopy = handle; 228 ulong handleCopy = handle;
229 Util.FireAndForget((o) => { SendCloseChildAgent(agentID, handleCopy); }); 229 Util.FireAndForget((o) => { SendCloseChildAgent(agentID, handleCopy, auth_code); });
230 } 230 }
231 } 231 }
232 232
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 11b15a7..5991a34 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3167,7 +3167,11 @@ namespace OpenSim.Region.Framework.Scenes
3167 { 3167 {
3168 m_log.Debug("[SCENE PRESENCE]: Closing " + byebyeRegions.Count + " child agents"); 3168 m_log.Debug("[SCENE PRESENCE]: Closing " + byebyeRegions.Count + " child agents");
3169 3169
3170 m_scene.SceneGridService.SendCloseChildAgentConnections(ControllingClient.AgentId, byebyeRegions); 3170 AgentCircuitData acd = Scene.AuthenticateHandler.GetAgentCircuitData(UUID);
3171 string auth = string.Empty;
3172 if (acd != null)
3173 auth = Util.Md5Hash(acd.Id0);
3174 m_scene.SceneGridService.SendCloseChildAgentConnections(ControllingClient.AgentId, auth, byebyeRegions);
3171 } 3175 }
3172 3176
3173 foreach (ulong handle in byebyeRegions) 3177 foreach (ulong handle in byebyeRegions)