aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2011-12-07 17:31:57 +0000
committerJustin Clark-Casey (justincc)2011-12-07 17:31:57 +0000
commit415b7b7ec4be9f87e7d5b65000e092d3372a4391 (patch)
tree315ba0fc1f42a542a274b997b0d62a490ef78e73
parentproperly lock CapsHandlers.m_capsHandlers (diff)
downloadopensim-SC-415b7b7ec4be9f87e7d5b65000e092d3372a4391.zip
opensim-SC-415b7b7ec4be9f87e7d5b65000e092d3372a4391.tar.gz
opensim-SC-415b7b7ec4be9f87e7d5b65000e092d3372a4391.tar.bz2
opensim-SC-415b7b7ec4be9f87e7d5b65000e092d3372a4391.tar.xz
Implement XMLRPCAdmin command admin_teleport_agent.
This allows someone with access to this command on the XMLRPCAdmin interface to teleport an avatar to an arbitrary region and/or position.
-rw-r--r--OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs113
-rw-r--r--OpenSim/Framework/IScene.cs4
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneBase.cs6
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneManager.cs33
5 files changed, 157 insertions, 5 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index a634f1c..1b289a6 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -134,16 +134,22 @@ namespace OpenSim.ApplicationPlugins.RemoteController
134 availableMethods["admin_restart"] = XmlRpcRestartMethod; 134 availableMethods["admin_restart"] = XmlRpcRestartMethod;
135 availableMethods["admin_load_heightmap"] = XmlRpcLoadHeightmapMethod; 135 availableMethods["admin_load_heightmap"] = XmlRpcLoadHeightmapMethod;
136 availableMethods["admin_save_heightmap"] = XmlRpcSaveHeightmapMethod; 136 availableMethods["admin_save_heightmap"] = XmlRpcSaveHeightmapMethod;
137
138 // Agent management
139 availableMethods["admin_teleport_agent"] = XmlRpcTeleportAgentMethod;
140
137 // User management 141 // User management
138 availableMethods["admin_create_user"] = XmlRpcCreateUserMethod; 142 availableMethods["admin_create_user"] = XmlRpcCreateUserMethod;
139 availableMethods["admin_create_user_email"] = XmlRpcCreateUserMethod; 143 availableMethods["admin_create_user_email"] = XmlRpcCreateUserMethod;
140 availableMethods["admin_exists_user"] = XmlRpcUserExistsMethod; 144 availableMethods["admin_exists_user"] = XmlRpcUserExistsMethod;
141 availableMethods["admin_update_user"] = XmlRpcUpdateUserAccountMethod; 145 availableMethods["admin_update_user"] = XmlRpcUpdateUserAccountMethod;
146
142 // Region state management 147 // Region state management
143 availableMethods["admin_load_xml"] = XmlRpcLoadXMLMethod; 148 availableMethods["admin_load_xml"] = XmlRpcLoadXMLMethod;
144 availableMethods["admin_save_xml"] = XmlRpcSaveXMLMethod; 149 availableMethods["admin_save_xml"] = XmlRpcSaveXMLMethod;
145 availableMethods["admin_load_oar"] = XmlRpcLoadOARMethod; 150 availableMethods["admin_load_oar"] = XmlRpcLoadOARMethod;
146 availableMethods["admin_save_oar"] = XmlRpcSaveOARMethod; 151 availableMethods["admin_save_oar"] = XmlRpcSaveOARMethod;
152
147 // Estate access list management 153 // Estate access list management
148 availableMethods["admin_acl_clear"] = XmlRpcAccessListClear; 154 availableMethods["admin_acl_clear"] = XmlRpcAccessListClear;
149 availableMethods["admin_acl_add"] = XmlRpcAccessListAdd; 155 availableMethods["admin_acl_add"] = XmlRpcAccessListAdd;
@@ -2965,6 +2971,112 @@ namespace OpenSim.ApplicationPlugins.RemoteController
2965 return response; 2971 return response;
2966 } 2972 }
2967 2973
2974 public XmlRpcResponse XmlRpcTeleportAgentMethod(XmlRpcRequest request, IPEndPoint remoteClient)
2975 {
2976 XmlRpcResponse response = new XmlRpcResponse();
2977 Hashtable responseData = new Hashtable();
2978
2979 try
2980 {
2981 responseData["success"] = true;
2982
2983 Hashtable requestData = (Hashtable)request.Params[0];
2984
2985 CheckStringParameters(request, new string[] {"password"});
2986
2987 FailIfRemoteAdminNotAllowed((string)requestData["password"], remoteClient.Address.ToString());
2988
2989 UUID agentId;
2990 string regionName = null;
2991 Vector3 pos, lookAt;
2992 bool agentSpecified = false;
2993 ScenePresence sp = null;
2994
2995 if (requestData.Contains("agent_first_name") && requestData.Contains("agent_last_name"))
2996 {
2997 string firstName = requestData["agent_first_name"].ToString();
2998 string lastName = requestData["agent_last_name"].ToString();
2999 m_application.SceneManager.TryGetRootScenePresenceByName(firstName, lastName, out sp);
3000
3001 if (sp == null)
3002 throw new Exception(
3003 string.Format(
3004 "No agent found with agent_first_name {0} and agent_last_name {1}", firstName, lastName));
3005 }
3006 else if (requestData.Contains("agent_id"))
3007 {
3008 string rawAgentId = (string)requestData["agent_id"];
3009
3010 if (!UUID.TryParse(rawAgentId, out agentId))
3011 throw new Exception(string.Format("agent_id {0} does not have the correct id format", rawAgentId));
3012
3013 m_application.SceneManager.TryGetRootScenePresence(agentId, out sp);
3014
3015 if (sp == null)
3016 throw new Exception(string.Format("No agent with agent_id {0} found in this simulator", agentId));
3017 }
3018 else
3019 {
3020 throw new Exception("No agent_id or agent_first_name and agent_last_name parameters specified");
3021 }
3022
3023 if (requestData.Contains("region_name"))
3024 regionName = (string)requestData["region_name"];
3025
3026 pos.X = ParseFloat(requestData, "pos_x", sp.AbsolutePosition.X);
3027 pos.Y = ParseFloat(requestData, "pos_y", sp.AbsolutePosition.Y);
3028 pos.Z = ParseFloat(requestData, "pos_z", sp.AbsolutePosition.Z);
3029 lookAt.X = ParseFloat(requestData, "lookat_x", sp.Lookat.X);
3030 lookAt.Y = ParseFloat(requestData, "lookat_y", sp.Lookat.Y);
3031 lookAt.Z = ParseFloat(requestData, "lookat_z", sp.Lookat.Z);
3032
3033 sp.Scene.RequestTeleportLocation(
3034 sp.ControllingClient, regionName, pos, lookAt, (uint)Constants.TeleportFlags.ViaLocation);
3035 }
3036 catch (Exception e)
3037 {
3038 m_log.ErrorFormat("[RADMIN]: admin_teleport_agent exception: {0}{1}", e.Message, e.StackTrace);
3039
3040 responseData["success"] = false;
3041 responseData["error"] = e.Message;
3042 }
3043 finally
3044 {
3045 response.Value = responseData;
3046 }
3047
3048 return response;
3049 }
3050
3051 /// <summary>
3052 /// Parse a float with the given parameter name from a request data hash table.
3053 /// </summary>
3054 /// <remarks>
3055 /// Will throw an exception if parameter is not a float.
3056 /// Will not throw if parameter is not found, passes back default value instead.
3057 /// </remarks>
3058 /// <param name="requestData"></param>
3059 /// <param name="paramName"></param>
3060 /// <param name="defaultVal"></param>
3061 /// <returns></returns>
3062 private static float ParseFloat(Hashtable requestData, string paramName, float defaultVal)
3063 {
3064 if (requestData.Contains(paramName))
3065 {
3066 string rawVal = (string)requestData[paramName];
3067 float val;
3068
3069 if (!float.TryParse(rawVal, out val))
3070 throw new Exception(string.Format("{0} {1} is not a valid float", paramName, rawVal));
3071 else
3072 return val;
3073 }
3074 else
3075 {
3076 return defaultVal;
3077 }
3078 }
3079
2968 private static void CheckStringParameters(XmlRpcRequest request, string[] param) 3080 private static void CheckStringParameters(XmlRpcRequest request, string[] param)
2969 { 3081 {
2970 Hashtable requestData = (Hashtable) request.Params[0]; 3082 Hashtable requestData = (Hashtable) request.Params[0];
@@ -3144,6 +3256,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
3144 return false; 3256 return false;
3145 } 3257 }
3146 } 3258 }
3259
3147 private bool LoadHeightmap(string file, UUID regionID) 3260 private bool LoadHeightmap(string file, UUID regionID)
3148 { 3261 {
3149 m_log.InfoFormat("[RADMIN]: Terrain Loading: {0}", file); 3262 m_log.InfoFormat("[RADMIN]: Terrain Loading: {0}", file);
diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs
index 76b731f..7b0fe37 100644
--- a/OpenSim/Framework/IScene.cs
+++ b/OpenSim/Framework/IScene.cs
@@ -90,9 +90,9 @@ namespace OpenSim.Framework
90 /// <summary> 90 /// <summary>
91 /// Is the agent denoted by the given agentID a child presence in this scene? 91 /// Is the agent denoted by the given agentID a child presence in this scene?
92 /// </summary> 92 /// </summary>
93 /// 93 /// <remarks>
94 /// Used by ClientView when a 'kick everyone' or 'estate message' occurs 94 /// Used by ClientView when a 'kick everyone' or 'estate message' occurs
95 /// 95 /// </remarks>
96 /// <param name="avatarID">AvatarID to lookup</param> 96 /// <param name="avatarID">AvatarID to lookup</param>
97 /// <returns>true if the presence is a child agent, false if the presence is a root exception</returns> 97 /// <returns>true if the presence is a child agent, false if the presence is a root exception</returns>
98 /// <exception cref="System.NullReferenceException"> 98 /// <exception cref="System.NullReferenceException">
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 3ac6327..604f035 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -4206,7 +4206,7 @@ namespace OpenSim.Region.Framework.Scenes
4206 /// <param name="action"></param> 4206 /// <param name="action"></param>
4207 public void ForEachRootScenePresence(Action<ScenePresence> action) 4207 public void ForEachRootScenePresence(Action<ScenePresence> action)
4208 { 4208 {
4209 if(m_sceneGraph != null) 4209 if (m_sceneGraph != null)
4210 { 4210 {
4211 m_sceneGraph.ForEachAvatar(action); 4211 m_sceneGraph.ForEachAvatar(action);
4212 } 4212 }
@@ -4286,9 +4286,9 @@ namespace OpenSim.Region.Framework.Scenes
4286 return m_sceneGraph.GetGroupByPrim(localID); 4286 return m_sceneGraph.GetGroupByPrim(localID);
4287 } 4287 }
4288 4288
4289 public override bool TryGetScenePresence(UUID avatarId, out ScenePresence avatar) 4289 public override bool TryGetScenePresence(UUID agentID, out ScenePresence sp)
4290 { 4290 {
4291 return m_sceneGraph.TryGetScenePresence(avatarId, out avatar); 4291 return m_sceneGraph.TryGetScenePresence(agentID, out sp);
4292 } 4292 }
4293 4293
4294 public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) 4294 public bool TryGetAvatarByName(string avatarName, out ScenePresence avatar)
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index 0336fe5..a633c72 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -191,6 +191,12 @@ namespace OpenSim.Region.Framework.Scenes
191 return false; 191 return false;
192 } 192 }
193 193
194 /// <summary>
195 /// Try to get a scene presence from the scene
196 /// </summary>
197 /// <param name="agentID"></param>
198 /// <param name="scenePresence">null if there is no scene presence with the given agent id</param>
199 /// <returns>true if there was a scene presence with the given id, false otherwise.</returns>
194 public abstract bool TryGetScenePresence(UUID agentID, out ScenePresence scenePresence); 200 public abstract bool TryGetScenePresence(UUID agentID, out ScenePresence scenePresence);
195 201
196 #endregion 202 #endregion
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs
index 82458e2..0491205 100644
--- a/OpenSim/Region/Framework/Scenes/SceneManager.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs
@@ -545,6 +545,23 @@ namespace OpenSim.Region.Framework.Scenes
545 return false; 545 return false;
546 } 546 }
547 547
548 public bool TryGetRootScenePresence(UUID avatarId, out ScenePresence avatar)
549 {
550 lock (m_localScenes)
551 {
552 foreach (Scene scene in m_localScenes)
553 {
554 avatar = scene.GetScenePresence(avatarId);
555
556 if (avatar != null && !avatar.IsChildAgent)
557 return true;
558 }
559 }
560
561 avatar = null;
562 return false;
563 }
564
548 public bool TryGetAvatarsScene(UUID avatarId, out Scene scene) 565 public bool TryGetAvatarsScene(UUID avatarId, out Scene scene)
549 { 566 {
550 ScenePresence avatar = null; 567 ScenePresence avatar = null;
@@ -590,6 +607,22 @@ namespace OpenSim.Region.Framework.Scenes
590 return false; 607 return false;
591 } 608 }
592 609
610 public bool TryGetRootScenePresenceByName(string firstName, string lastName, out ScenePresence sp)
611 {
612 lock (m_localScenes)
613 {
614 foreach (Scene scene in m_localScenes)
615 {
616 sp = scene.GetScenePresence(firstName, lastName);
617 if (sp != null && !sp.IsChildAgent)
618 return true;
619 }
620 }
621
622 sp = null;
623 return false;
624 }
625
593 public void ForEachScene(Action<Scene> action) 626 public void ForEachScene(Action<Scene> action)
594 { 627 {
595 lock (m_localScenes) 628 lock (m_localScenes)