diff options
-rw-r--r-- | OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | 334 |
1 files changed, 231 insertions, 103 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs index cfd3885..9d4bfea 100644 --- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs +++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs | |||
@@ -28,6 +28,7 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections; | 29 | using System.Collections; |
30 | using System.Net; | 30 | using System.Net; |
31 | using System.IO; | ||
31 | using System.Timers; | 32 | using System.Timers; |
32 | using libsecondlife; | 33 | using libsecondlife; |
33 | using Mono.Addins; | 34 | using Mono.Addins; |
@@ -233,104 +234,228 @@ namespace OpenSim.ApplicationPlugins.LoadRegions | |||
233 | m_app.Shutdown(); | 234 | m_app.Shutdown(); |
234 | } | 235 | } |
235 | 236 | ||
237 | /// <summary> | ||
238 | /// Create a new region. | ||
239 | /// <summary> | ||
240 | /// <param name="request">incoming XML RPC request</param> | ||
241 | /// <remarks> | ||
242 | /// XmlRpcCreateRegionMethod takes the following XMLRPC | ||
243 | /// parameters | ||
244 | /// <list type="table"> | ||
245 | /// <listheader><term>parameter name</term><description>description</description></listheader> | ||
246 | /// <item><term>password</term> | ||
247 | /// <description>admin password as set in OpenSim.ini</description></item> | ||
248 | /// <item><term>region_name</term> | ||
249 | /// <description>desired region name</description></item> | ||
250 | /// <item><term>region_id</term> | ||
251 | /// <description>(optional) desired region UUID</description></item> | ||
252 | /// <item><term>region_x</term> | ||
253 | /// <description>desired region X coordinate</description></item> | ||
254 | /// <item><term>region_y</term> | ||
255 | /// <description>desired region Y coordinate</description></item> | ||
256 | /// <item><term>region_master_first</term> | ||
257 | /// <description>firstname of region master</description></item> | ||
258 | /// <item><term>region_master_last</term> | ||
259 | /// <description>lastname of region master</description></item> | ||
260 | /// <item><term>listen_ip</term> | ||
261 | /// <description>internal IP address</description></item> | ||
262 | /// <item><term>listen_port</term> | ||
263 | /// <description>internal port</description></item> | ||
264 | /// <item><term>external_address</term> | ||
265 | /// <description>external IP address</description></item> | ||
266 | /// <item><term>datastore</term> | ||
267 | /// <description>datastore parameter (?)</description></item> | ||
268 | /// </list> | ||
269 | /// | ||
270 | /// XmlRpcCreateRegionMethod returns | ||
271 | /// <list type="table"> | ||
272 | /// <listheader><term>name</term><description>description</description></listheader> | ||
273 | /// <item><term>success</term> | ||
274 | /// <description>true or false</description></item> | ||
275 | /// <item><term>error</term> | ||
276 | /// <description>error message if success is false</description></item> | ||
277 | /// <item><term>region_uuid</term> | ||
278 | /// <description>UUID of the newly created region</description></item> | ||
279 | /// <item><term>region_name</term> | ||
280 | /// <description>name of the newly created region</description></item> | ||
281 | /// </list> | ||
282 | /// </remarks> | ||
236 | public XmlRpcResponse XmlRpcCreateRegionMethod(XmlRpcRequest request) | 283 | public XmlRpcResponse XmlRpcCreateRegionMethod(XmlRpcRequest request) |
237 | { | 284 | { |
238 | m_log.Info("[RADMIN]: Received Create Region Administrator Request"); | 285 | m_log.Info("[RADMIN]: Received Create Region Administrator Request"); |
239 | XmlRpcResponse response = new XmlRpcResponse(); | 286 | XmlRpcResponse response = new XmlRpcResponse(); |
240 | Hashtable requestData = (Hashtable) request.Params[0]; | 287 | Hashtable requestData = (Hashtable) request.Params[0]; |
241 | Hashtable responseData = new Hashtable(); | 288 | Hashtable responseData = new Hashtable(); |
242 | if (requiredPassword != System.String.Empty && | ||
243 | (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) | ||
244 | { | ||
245 | responseData["created"] = "false"; | ||
246 | response.Value = responseData; | ||
247 | } | ||
248 | else | ||
249 | { | ||
250 | RegionInfo newRegionData = new RegionInfo(); | ||
251 | 289 | ||
252 | try | 290 | try { |
291 | // check completeness | ||
292 | foreach (string p in new string[] { "password", | ||
293 | "region_name", "region_x", "region_y", | ||
294 | "region_master_first", "region_master_last", | ||
295 | "listen_ip", "listen_port", "external_address"}) | ||
253 | { | 296 | { |
254 | newRegionData.RegionID = (string) requestData["region_id"]; | 297 | if (!requestData.Contains(p)) |
255 | newRegionData.RegionName = (string) requestData["region_name"]; | 298 | throw new Exception(String.Format("missing parameter {0}", p)); |
256 | newRegionData.RegionLocX = Convert.ToUInt32((Int32) requestData["region_x"]); | 299 | } |
257 | newRegionData.RegionLocY = Convert.ToUInt32((Int32) requestData["region_y"]); | ||
258 | |||
259 | // Security risk | ||
260 | newRegionData.DataStore = (string) requestData["datastore"]; | ||
261 | 300 | ||
262 | newRegionData.InternalEndPoint = new IPEndPoint( | 301 | // check password |
263 | IPAddress.Parse((string) requestData["listen_ip"]), 0); | 302 | if (!String.IsNullOrEmpty(requiredPassword) && |
303 | (string)requestData["password"] != requiredPassword) throw new Exception("wrong password"); | ||
304 | |||
305 | // bool persist = Convert.ToBoolean((string)requestData["persist"]); | ||
306 | RegionInfo region = null; | ||
307 | // if (!persist) | ||
308 | // { | ||
309 | // region = new RegionInfo(); | ||
310 | // } | ||
311 | // else | ||
312 | // { | ||
313 | // region = new RegionInfo("DEFAULT REGION CONFIG", | ||
314 | // Path.Combine(regionConfigPath, "default.xml"), false); | ||
315 | // } | ||
316 | region = new RegionInfo(); | ||
317 | |||
318 | |||
319 | if (requestData.ContainsKey("region_id") && | ||
320 | !String.IsNullOrEmpty((string) requestData["region_id"])) | ||
321 | { | ||
322 | // FIXME: need to check whether region_id already | ||
323 | // in use | ||
324 | region.RegionID = (string) requestData["region_id"]; | ||
325 | } | ||
326 | else | ||
327 | { | ||
328 | region.RegionID = LLUUID.Random(); | ||
329 | } | ||
264 | 330 | ||
265 | newRegionData.InternalEndPoint.Port = (Int32) requestData["listen_port"]; | 331 | // FIXME: need to check whether region_name already |
266 | newRegionData.ExternalHostName = (string) requestData["external_address"]; | 332 | // in use |
333 | region.RegionName = (string) requestData["region_name"]; | ||
334 | region.RegionLocX = Convert.ToUInt32((Int32) requestData["region_x"]); | ||
335 | region.RegionLocY = Convert.ToUInt32((Int32) requestData["region_y"]); | ||
336 | |||
337 | // Security risk | ||
338 | if (requestData.ContainsKey("datastore")) | ||
339 | region.DataStore = (string) requestData["datastore"]; | ||
340 | |||
341 | region.InternalEndPoint = | ||
342 | new IPEndPoint(IPAddress.Parse((string) requestData["listen_ip"]), 0); | ||
343 | |||
344 | // FIXME: need to check whether listen_port already in use! | ||
345 | region.InternalEndPoint.Port = (Int32) requestData["listen_port"]; | ||
346 | region.ExternalHostName = (string) requestData["external_address"]; | ||
347 | |||
348 | region.MasterAvatarFirstName = (string) requestData["region_master_first"]; | ||
349 | region.MasterAvatarLastName = (string) requestData["region_master_last"]; | ||
350 | |||
351 | m_app.CreateRegion(region, true); | ||
267 | 352 | ||
268 | newRegionData.MasterAvatarFirstName = (string) requestData["region_master_first"]; | 353 | responseData["success"] = "true"; |
269 | newRegionData.MasterAvatarLastName = (string) requestData["region_master_last"]; | 354 | responseData["region_name"] = region.RegionName; |
355 | responseData["region_uuid"] = region.RegionID.ToString(); | ||
270 | 356 | ||
271 | m_app.CreateRegion(newRegionData, true); | 357 | response.Value = responseData; |
358 | } | ||
359 | catch (Exception e) | ||
360 | { | ||
361 | responseData["success"] = "false"; | ||
362 | responseData["error"] = e.Message; | ||
272 | 363 | ||
273 | responseData["created"] = "true"; | 364 | response.Value = responseData; |
274 | response.Value = responseData; | ||
275 | } | ||
276 | catch (Exception e) | ||
277 | { | ||
278 | responseData["created"] = "false"; | ||
279 | responseData["error"] = e.ToString(); | ||
280 | response.Value = responseData; | ||
281 | } | ||
282 | } | 365 | } |
283 | 366 | ||
284 | return response; | 367 | return response; |
285 | } | 368 | } |
286 | 369 | ||
370 | /// <summary> | ||
371 | /// Create a new user account. | ||
372 | /// <summary> | ||
373 | /// <param name="request">incoming XML RPC request</param> | ||
374 | /// <remarks> | ||
375 | /// XmlRpcCreateUserMethod takes the following XMLRPC | ||
376 | /// parameters | ||
377 | /// <list type="table"> | ||
378 | /// <listheader><term>parameter name</term><description>description</description></listheader> | ||
379 | /// <item><term>password</term> | ||
380 | /// <description>admin password as set in OpenSim.ini</description></item> | ||
381 | /// <item><term>user_firstname</term> | ||
382 | /// <description>avatar's first name</description></item> | ||
383 | /// <item><term>user_lastname</term> | ||
384 | /// <description>avatar's last name</description></item> | ||
385 | /// <item><term>user_password</term> | ||
386 | /// <description>avatar's password</description></item> | ||
387 | /// <item><term>start_region_x</term> | ||
388 | /// <description>avatar's start region coordinates, X value</description></item> | ||
389 | /// <item><term>start_region_y</term> | ||
390 | /// <description>avatar's start region coordinates, Y value</description></item> | ||
391 | /// </list> | ||
392 | /// | ||
393 | /// XmlRpcCreateUserMethod returns | ||
394 | /// <list type="table"> | ||
395 | /// <listheader><term>name</term><description>description</description></listheader> | ||
396 | /// <item><term>success</term> | ||
397 | /// <description>true or false</description></item> | ||
398 | /// <item><term>error</term> | ||
399 | /// <description>error message if success is false</description></item> | ||
400 | /// <item><term>avatar_uuid</term> | ||
401 | /// <description>UUID of the newly created avatar | ||
402 | /// account; LLUUID.Zero if failed. | ||
403 | /// </description></item> | ||
404 | /// </list> | ||
405 | /// </remarks> | ||
287 | public XmlRpcResponse XmlRpcCreateUserMethod(XmlRpcRequest request) | 406 | public XmlRpcResponse XmlRpcCreateUserMethod(XmlRpcRequest request) |
288 | { | 407 | { |
289 | m_log.Info("[RADMIN]: Received Create User Administrator Request"); | 408 | m_log.Info("[RADMIN]: Received Create User Administrator Request"); |
290 | XmlRpcResponse response = new XmlRpcResponse(); | 409 | XmlRpcResponse response = new XmlRpcResponse(); |
291 | Hashtable requestData = (Hashtable) request.Params[0]; | 410 | Hashtable requestData = (Hashtable) request.Params[0]; |
292 | Hashtable responseData = new Hashtable(); | 411 | Hashtable responseData = new Hashtable(); |
293 | if (requiredPassword != System.String.Empty && | 412 | |
294 | (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) | 413 | try |
295 | { | 414 | { |
296 | responseData["created"] = "false"; | 415 | // check completeness |
416 | foreach (string p in new string[] { "password", | ||
417 | "user_firstname", "user_lastname", "user_password", | ||
418 | "start_region_x", "start_region_y" }) | ||
419 | { | ||
420 | if (!requestData.Contains(p)) | ||
421 | throw new Exception(String.Format("missing parameter {0}", p)); | ||
422 | } | ||
423 | |||
424 | // check password | ||
425 | if (!String.IsNullOrEmpty(requiredPassword) && | ||
426 | (string)requestData["password"] != requiredPassword) throw new Exception("wrong password"); | ||
427 | |||
428 | // do the job | ||
429 | string firstname = (string) requestData["user_firstname"]; | ||
430 | string lastname = (string) requestData["user_lastname"]; | ||
431 | string passwd = (string) requestData["user_password"]; | ||
432 | uint regX = Convert.ToUInt32((Int32)requestData["start_region_x"]); | ||
433 | uint regY = Convert.ToUInt32((Int32)requestData["start_region_y"]); | ||
434 | |||
435 | // FIXME: need to check whether "firstname lastname" | ||
436 | // already exists! | ||
437 | LLUUID userID = m_app.CreateUser(firstname, lastname, passwd, regX, regY); | ||
438 | |||
439 | if (userID == LLUUID.Zero) throw new Exception(String.Format("failed to create new user {0} {1}", | ||
440 | firstname, lastname)); | ||
441 | |||
442 | responseData["success"] = "true"; | ||
443 | responseData["avatar_uuid"] = userID.ToString(); | ||
444 | |||
297 | response.Value = responseData; | 445 | response.Value = responseData; |
446 | |||
447 | m_log.InfoFormat("[RADMIN]: User {0} {1} created, UUID {2}", firstname, lastname, userID); | ||
298 | } | 448 | } |
299 | else | 449 | catch (Exception e) |
300 | { | 450 | { |
301 | try | 451 | m_log.ErrorFormat("[RADMIN] create user: failed: {0}", e.Message); |
302 | { | 452 | m_log.DebugFormat("[RADMIN] create user: failed: {0}", e.ToString()); |
303 | string tempfirstname = (string) requestData["user_firstname"]; | 453 | |
304 | string templastname = (string) requestData["user_lastname"]; | 454 | responseData["success"] = "false"; |
305 | string tempPasswd = (string) requestData["user_password"]; | 455 | responseData["avatar_uuid"] = LLUUID.Zero.ToString(); |
306 | uint regX = Convert.ToUInt32((Int32) requestData["start_region_x"]); | 456 | responseData["error"] = e.Message; |
307 | uint regY = Convert.ToUInt32((Int32) requestData["start_region_y"]); | 457 | |
308 | 458 | response.Value = responseData; | |
309 | LLUUID tempuserID = m_app.CreateUser(tempfirstname, templastname, tempPasswd, regX, regY); | ||
310 | |||
311 | if (tempuserID == LLUUID.Zero) | ||
312 | { | ||
313 | responseData["created"] = "false"; | ||
314 | responseData["error"] = "Error creating user"; | ||
315 | responseData["avatar_uuid"] = LLUUID.Zero; | ||
316 | response.Value = responseData; | ||
317 | m_log.Error("[RADMIN]: Error creating user (" + tempfirstname + " " + templastname + ") :"); | ||
318 | } | ||
319 | else | ||
320 | { | ||
321 | responseData["created"] = "true"; | ||
322 | responseData["avatar_uuid"] = tempuserID; | ||
323 | response.Value = responseData; | ||
324 | m_log.Info("[RADMIN]: User " + tempfirstname + " " + templastname + " created. Userid " + tempuserID + " assigned."); | ||
325 | } | ||
326 | } | ||
327 | catch (Exception e) | ||
328 | { | ||
329 | responseData["created"] = "false"; | ||
330 | responseData["error"] = e.ToString(); | ||
331 | responseData["avatar_uuid"] = LLUUID.Zero; | ||
332 | response.Value = responseData; | ||
333 | } | ||
334 | } | 459 | } |
335 | 460 | ||
336 | return response; | 461 | return response; |
@@ -342,42 +467,45 @@ namespace OpenSim.ApplicationPlugins.LoadRegions | |||
342 | XmlRpcResponse response = new XmlRpcResponse(); | 467 | XmlRpcResponse response = new XmlRpcResponse(); |
343 | Hashtable requestData = (Hashtable) request.Params[0]; | 468 | Hashtable requestData = (Hashtable) request.Params[0]; |
344 | Hashtable responseData = new Hashtable(); | 469 | Hashtable responseData = new Hashtable(); |
345 | if (requiredPassword != System.String.Empty && | 470 | |
346 | (!requestData.Contains("password") || (string) requestData["password"] != requiredPassword)) | 471 | try |
347 | { | ||
348 | responseData["loaded"] = "false"; | ||
349 | responseData["switched"] = "false"; | ||
350 | response.Value = responseData; | ||
351 | } | ||
352 | else | ||
353 | { | 472 | { |
354 | try | 473 | // check completeness |
355 | { | 474 | foreach (string p in new string[] { "password", |
356 | string region_name = (string) requestData["region_name"]; | 475 | "region_name", "filename" }) |
357 | string filename = (string) requestData["filename"]; | ||
358 | |||
359 | if (m_app.SceneManager.TrySetCurrentScene(region_name)) | ||
360 | { | ||
361 | m_log.Info("[RADMIN] Switched to region "+region_name); | ||
362 | responseData["switched"] = "true"; | ||
363 | m_app.SceneManager.LoadCurrentSceneFromXml(filename, true, new LLVector3(0, 0, 0)); | ||
364 | responseData["loaded"] = "true"; | ||
365 | response.Value = responseData; | ||
366 | } | ||
367 | else | ||
368 | { | ||
369 | m_log.Info("[RADMIN] Failed to switch to region "+region_name); | ||
370 | responseData["loaded"] = "false"; | ||
371 | responseData["switched"] = "false"; | ||
372 | response.Value = responseData; | ||
373 | } | ||
374 | } | ||
375 | catch (Exception e) | ||
376 | { | 476 | { |
377 | responseData["loaded"] = "false"; | 477 | if (!requestData.Contains(p)) |
378 | responseData["error"] = e.ToString(); | 478 | throw new Exception(String.Format("missing parameter {0}", p)); |
379 | response.Value = responseData; | ||
380 | } | 479 | } |
480 | |||
481 | // check password | ||
482 | if (!String.IsNullOrEmpty(requiredPassword) && | ||
483 | (string)requestData["password"] != requiredPassword) throw new Exception("wrong password"); | ||
484 | |||
485 | string region_name = (string)requestData["region_name"]; | ||
486 | string filename = (string)requestData["filename"]; | ||
487 | |||
488 | if (!m_app.SceneManager.TrySetCurrentScene(region_name)) | ||
489 | throw new Exception(String.Format("failed to switch to region {0}", region_name)); | ||
490 | m_log.InfoFormat("[RADMIN] Switched to region {0}"); | ||
491 | |||
492 | responseData["switched"] = "true"; | ||
493 | |||
494 | m_app.SceneManager.LoadCurrentSceneFromXml(filename, true, new LLVector3(0, 0, 0)); | ||
495 | responseData["loaded"] = "true"; | ||
496 | |||
497 | response.Value = responseData; | ||
498 | } | ||
499 | catch (Exception e) | ||
500 | { | ||
501 | m_log.InfoFormat("[RADMIN] LoadXml: {0}", e.Message); | ||
502 | m_log.DebugFormat("[RADMIN] LoadXML {0}: {1}", e.ToString()); | ||
503 | |||
504 | responseData["loaded"] = "false"; | ||
505 | responseData["switched"] = "false"; | ||
506 | responseData["error"] = e.Message; | ||
507 | |||
508 | response.Value = responseData; | ||
381 | } | 509 | } |
382 | 510 | ||
383 | return response; | 511 | return response; |