diff options
Diffstat (limited to 'OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs')
-rw-r--r-- | OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs | 205 |
1 files changed, 204 insertions, 1 deletions
diff --git a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs index 0e8ce80..eb184a5 100644 --- a/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs +++ b/OpenSim/Server/Handlers/Hypergrid/UserAgentServerConnector.cs | |||
@@ -52,15 +52,24 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
52 | // MethodBase.GetCurrentMethod().DeclaringType); | 52 | // MethodBase.GetCurrentMethod().DeclaringType); |
53 | 53 | ||
54 | private IUserAgentService m_HomeUsersService; | 54 | private IUserAgentService m_HomeUsersService; |
55 | private string[] m_AuthorizedCallers; | ||
56 | |||
57 | private bool m_VerifyCallers = false; | ||
55 | 58 | ||
56 | public UserAgentServerConnector(IConfigSource config, IHttpServer server) : | 59 | public UserAgentServerConnector(IConfigSource config, IHttpServer server) : |
60 | this(config, server, null) | ||
61 | { | ||
62 | } | ||
63 | |||
64 | public UserAgentServerConnector(IConfigSource config, IHttpServer server, IFriendsSimConnector friendsConnector) : | ||
57 | base(config, server, String.Empty) | 65 | base(config, server, String.Empty) |
58 | { | 66 | { |
59 | IConfig gridConfig = config.Configs["UserAgentService"]; | 67 | IConfig gridConfig = config.Configs["UserAgentService"]; |
60 | if (gridConfig != null) | 68 | if (gridConfig != null) |
61 | { | 69 | { |
62 | string serviceDll = gridConfig.GetString("LocalServiceModule", string.Empty); | 70 | string serviceDll = gridConfig.GetString("LocalServiceModule", string.Empty); |
63 | Object[] args = new Object[] { config }; | 71 | |
72 | Object[] args = new Object[] { config, friendsConnector }; | ||
64 | m_HomeUsersService = ServerUtils.LoadPlugin<IUserAgentService>(serviceDll, args); | 73 | m_HomeUsersService = ServerUtils.LoadPlugin<IUserAgentService>(serviceDll, args); |
65 | } | 74 | } |
66 | if (m_HomeUsersService == null) | 75 | if (m_HomeUsersService == null) |
@@ -69,12 +78,24 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
69 | string loginServerIP = gridConfig.GetString("LoginServerIP", "127.0.0.1"); | 78 | string loginServerIP = gridConfig.GetString("LoginServerIP", "127.0.0.1"); |
70 | bool proxy = gridConfig.GetBoolean("HasProxy", false); | 79 | bool proxy = gridConfig.GetBoolean("HasProxy", false); |
71 | 80 | ||
81 | m_VerifyCallers = gridConfig.GetBoolean("VerifyCallers", false); | ||
82 | string csv = gridConfig.GetString("AuthorizedCallers", "127.0.0.1"); | ||
83 | csv = csv.Replace(" ", ""); | ||
84 | m_AuthorizedCallers = csv.Split(','); | ||
85 | |||
72 | server.AddXmlRPCHandler("agent_is_coming_home", AgentIsComingHome, false); | 86 | server.AddXmlRPCHandler("agent_is_coming_home", AgentIsComingHome, false); |
73 | server.AddXmlRPCHandler("get_home_region", GetHomeRegion, false); | 87 | server.AddXmlRPCHandler("get_home_region", GetHomeRegion, false); |
74 | server.AddXmlRPCHandler("verify_agent", VerifyAgent, false); | 88 | server.AddXmlRPCHandler("verify_agent", VerifyAgent, false); |
75 | server.AddXmlRPCHandler("verify_client", VerifyClient, false); | 89 | server.AddXmlRPCHandler("verify_client", VerifyClient, false); |
76 | server.AddXmlRPCHandler("logout_agent", LogoutAgent, false); | 90 | server.AddXmlRPCHandler("logout_agent", LogoutAgent, false); |
77 | 91 | ||
92 | server.AddXmlRPCHandler("status_notification", StatusNotification, false); | ||
93 | server.AddXmlRPCHandler("get_online_friends", GetOnlineFriends, false); | ||
94 | server.AddXmlRPCHandler("get_server_urls", GetServerURLs, false); | ||
95 | |||
96 | server.AddXmlRPCHandler("locate_user", LocateUser, false); | ||
97 | server.AddXmlRPCHandler("get_uui", GetUUI, false); | ||
98 | |||
78 | server.AddHTTPHandler("/homeagent/", new HomeAgentHandler(m_HomeUsersService, loginServerIP, proxy).Handler); | 99 | server.AddHTTPHandler("/homeagent/", new HomeAgentHandler(m_HomeUsersService, loginServerIP, proxy).Handler); |
79 | } | 100 | } |
80 | 101 | ||
@@ -194,5 +215,187 @@ namespace OpenSim.Server.Handlers.Hypergrid | |||
194 | 215 | ||
195 | } | 216 | } |
196 | 217 | ||
218 | public XmlRpcResponse StatusNotification(XmlRpcRequest request, IPEndPoint remoteClient) | ||
219 | { | ||
220 | Hashtable hash = new Hashtable(); | ||
221 | hash["result"] = "false"; | ||
222 | |||
223 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
224 | //string host = (string)requestData["host"]; | ||
225 | //string portstr = (string)requestData["port"]; | ||
226 | if (requestData.ContainsKey("userID") && requestData.ContainsKey("online")) | ||
227 | { | ||
228 | string userID_str = (string)requestData["userID"]; | ||
229 | UUID userID = UUID.Zero; | ||
230 | UUID.TryParse(userID_str, out userID); | ||
231 | List<string> ids = new List<string>(); | ||
232 | foreach (object key in requestData.Keys) | ||
233 | { | ||
234 | if (key is string && ((string)key).StartsWith("friend_") && requestData[key] != null) | ||
235 | ids.Add(requestData[key].ToString()); | ||
236 | } | ||
237 | bool online = false; | ||
238 | bool.TryParse(requestData["online"].ToString(), out online); | ||
239 | |||
240 | hash["result"] = "true"; | ||
241 | |||
242 | // let's spawn a thread for this, because it may take a long time... | ||
243 | Util.FireAndForget(delegate { m_HomeUsersService.StatusNotification(ids, userID, online); }); | ||
244 | } | ||
245 | |||
246 | XmlRpcResponse response = new XmlRpcResponse(); | ||
247 | response.Value = hash; | ||
248 | return response; | ||
249 | |||
250 | } | ||
251 | |||
252 | public XmlRpcResponse GetOnlineFriends(XmlRpcRequest request, IPEndPoint remoteClient) | ||
253 | { | ||
254 | Hashtable hash = new Hashtable(); | ||
255 | |||
256 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
257 | //string host = (string)requestData["host"]; | ||
258 | //string portstr = (string)requestData["port"]; | ||
259 | if (requestData.ContainsKey("userID")) | ||
260 | { | ||
261 | string userID_str = (string)requestData["userID"]; | ||
262 | UUID userID = UUID.Zero; | ||
263 | UUID.TryParse(userID_str, out userID); | ||
264 | List<string> ids = new List<string>(); | ||
265 | foreach (object key in requestData.Keys) | ||
266 | { | ||
267 | if (key is string && ((string)key).StartsWith("friend_") && requestData[key] != null) | ||
268 | ids.Add(requestData[key].ToString()); | ||
269 | } | ||
270 | |||
271 | List<UUID> online = m_HomeUsersService.GetOnlineFriends(userID, ids); | ||
272 | if (online.Count > 0) | ||
273 | { | ||
274 | int i = 0; | ||
275 | foreach (UUID id in online) | ||
276 | { | ||
277 | hash["friend_" + i.ToString()] = id.ToString(); | ||
278 | i++; | ||
279 | } | ||
280 | } | ||
281 | else | ||
282 | hash["result"] = "No Friends Online"; | ||
283 | } | ||
284 | |||
285 | XmlRpcResponse response = new XmlRpcResponse(); | ||
286 | response.Value = hash; | ||
287 | return response; | ||
288 | |||
289 | } | ||
290 | |||
291 | public XmlRpcResponse GetServerURLs(XmlRpcRequest request, IPEndPoint remoteClient) | ||
292 | { | ||
293 | Hashtable hash = new Hashtable(); | ||
294 | |||
295 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
296 | //string host = (string)requestData["host"]; | ||
297 | //string portstr = (string)requestData["port"]; | ||
298 | if (requestData.ContainsKey("userID")) | ||
299 | { | ||
300 | string userID_str = (string)requestData["userID"]; | ||
301 | UUID userID = UUID.Zero; | ||
302 | UUID.TryParse(userID_str, out userID); | ||
303 | |||
304 | Dictionary<string, object> serverURLs = m_HomeUsersService.GetServerURLs(userID); | ||
305 | if (serverURLs.Count > 0) | ||
306 | { | ||
307 | foreach (KeyValuePair<string, object> kvp in serverURLs) | ||
308 | hash["SRV_" + kvp.Key] = kvp.Value.ToString(); | ||
309 | } | ||
310 | else | ||
311 | hash["result"] = "No Service URLs"; | ||
312 | } | ||
313 | |||
314 | XmlRpcResponse response = new XmlRpcResponse(); | ||
315 | response.Value = hash; | ||
316 | return response; | ||
317 | |||
318 | } | ||
319 | |||
320 | /// <summary> | ||
321 | /// Locates the user. | ||
322 | /// This is a sensitive operation, only authorized IP addresses can perform it. | ||
323 | /// </summary> | ||
324 | /// <param name="request"></param> | ||
325 | /// <param name="remoteClient"></param> | ||
326 | /// <returns></returns> | ||
327 | public XmlRpcResponse LocateUser(XmlRpcRequest request, IPEndPoint remoteClient) | ||
328 | { | ||
329 | Hashtable hash = new Hashtable(); | ||
330 | |||
331 | bool authorized = true; | ||
332 | if (m_VerifyCallers) | ||
333 | { | ||
334 | authorized = false; | ||
335 | foreach (string s in m_AuthorizedCallers) | ||
336 | if (s == remoteClient.Address.ToString()) | ||
337 | { | ||
338 | authorized = true; | ||
339 | break; | ||
340 | } | ||
341 | } | ||
342 | |||
343 | if (authorized) | ||
344 | { | ||
345 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
346 | //string host = (string)requestData["host"]; | ||
347 | //string portstr = (string)requestData["port"]; | ||
348 | if (requestData.ContainsKey("userID")) | ||
349 | { | ||
350 | string userID_str = (string)requestData["userID"]; | ||
351 | UUID userID = UUID.Zero; | ||
352 | UUID.TryParse(userID_str, out userID); | ||
353 | |||
354 | string url = m_HomeUsersService.LocateUser(userID); | ||
355 | if (url != string.Empty) | ||
356 | hash["URL"] = url; | ||
357 | } | ||
358 | } | ||
359 | |||
360 | XmlRpcResponse response = new XmlRpcResponse(); | ||
361 | response.Value = hash; | ||
362 | return response; | ||
363 | |||
364 | } | ||
365 | |||
366 | /// <summary> | ||
367 | /// Locates the user. | ||
368 | /// This is a sensitive operation, only authorized IP addresses can perform it. | ||
369 | /// </summary> | ||
370 | /// <param name="request"></param> | ||
371 | /// <param name="remoteClient"></param> | ||
372 | /// <returns></returns> | ||
373 | public XmlRpcResponse GetUUI(XmlRpcRequest request, IPEndPoint remoteClient) | ||
374 | { | ||
375 | Hashtable hash = new Hashtable(); | ||
376 | |||
377 | Hashtable requestData = (Hashtable)request.Params[0]; | ||
378 | //string host = (string)requestData["host"]; | ||
379 | //string portstr = (string)requestData["port"]; | ||
380 | if (requestData.ContainsKey("userID") && requestData.ContainsKey("targetUserID")) | ||
381 | { | ||
382 | string userID_str = (string)requestData["userID"]; | ||
383 | UUID userID = UUID.Zero; | ||
384 | UUID.TryParse(userID_str, out userID); | ||
385 | |||
386 | string tuserID_str = (string)requestData["targetUserID"]; | ||
387 | UUID targetUserID = UUID.Zero; | ||
388 | UUID.TryParse(tuserID_str, out targetUserID); | ||
389 | string uui = m_HomeUsersService.GetUUI(userID, targetUserID); | ||
390 | if (uui != string.Empty) | ||
391 | hash["UUI"] = uui; | ||
392 | } | ||
393 | |||
394 | XmlRpcResponse response = new XmlRpcResponse(); | ||
395 | response.Value = hash; | ||
396 | return response; | ||
397 | |||
398 | } | ||
399 | |||
197 | } | 400 | } |
198 | } | 401 | } |