2007-12-11 01:26:06 +00:00
/ *
2008-03-18 05:16:43 +00:00
* Copyright ( c ) Contributors , http : //opensimulator.org/
* See CONTRIBUTORS . TXT for a full list of copyright holders .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions are met :
* * Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* * Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
2009-06-01 06:37:14 +00:00
* * Neither the name of the OpenSimulator Project nor the
2008-03-18 05:16:43 +00:00
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ` ` AS IS ' ' AND ANY
* EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES
* ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ;
* LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
* /
2007-12-11 01:26:06 +00:00
2007-12-03 07:10:08 +00:00
using System ;
using System.Collections ;
2009-02-12 09:53:12 +00:00
using System.Collections.Generic ;
2008-04-04 11:48:27 +00:00
using System.IO ;
2009-05-07 12:33:53 +00:00
using System.Xml ;
2008-04-21 07:09:17 +00:00
using System.Net ;
using System.Reflection ;
2007-12-03 07:10:08 +00:00
using System.Timers ;
2009-05-18 10:04:28 +00:00
using System.Threading ;
2008-04-21 07:09:17 +00:00
using log4net ;
2008-08-21 11:04:57 +00:00
using Nini.Config ;
2007-12-27 21:41:48 +00:00
using Nwc.XmlRpc ;
2009-02-12 09:53:12 +00:00
using OpenMetaverse ;
2009-04-15 19:50:14 +00:00
using OpenSim ;
2007-12-27 21:41:48 +00:00
using OpenSim.Framework ;
2009-05-07 12:33:53 +00:00
using OpenSim.Framework.Communications ;
2009-04-17 15:51:58 +00:00
using OpenSim.Framework.Communications.Cache ;
2009-04-15 19:50:14 +00:00
using OpenSim.Framework.Console ;
2007-12-27 21:41:48 +00:00
using OpenSim.Framework.Servers ;
2009-05-04 20:15:39 +00:00
using OpenSim.Framework.Servers.HttpServer ;
2009-02-12 09:53:12 +00:00
using OpenSim.Region.CoreModules.World.Terrain ;
2009-02-06 16:55:34 +00:00
using OpenSim.Region.Framework.Interfaces ;
using OpenSim.Region.Framework.Scenes ;
2009-05-15 05:00:25 +00:00
using OpenSim.Services.Interfaces ;
2007-12-03 07:10:08 +00:00
2008-05-01 15:36:39 +00:00
namespace OpenSim.ApplicationPlugins.RemoteController
2007-12-03 07:10:08 +00:00
{
public class RemoteAdminPlugin : IApplicationPlugin
{
2008-04-21 07:09:17 +00:00
private static readonly ILog m_log = LogManager . GetLogger ( MethodBase . GetCurrentMethod ( ) . DeclaringType ) ;
2008-02-05 19:44:27 +00:00
2009-05-07 12:33:53 +00:00
private static bool daload = false ;
2009-03-27 12:49:27 +00:00
private static Object rslock = new Object ( ) ;
2009-05-18 10:04:28 +00:00
private static Object SOLock = new Object ( ) ;
2009-03-27 12:49:27 +00:00
2008-06-01 01:01:16 +00:00
private OpenSimBase m_app ;
2007-12-03 07:10:08 +00:00
private BaseHttpServer m_httpd ;
2008-08-21 11:04:57 +00:00
private IConfig m_config ;
2008-08-22 09:00:32 +00:00
private IConfigSource m_configSource ;
2009-04-29 09:05:01 +00:00
private string m_requiredPassword = String . Empty ;
2007-12-27 21:41:48 +00:00
2009-03-10 20:06:25 +00:00
private string m_name = "RemoteAdminPlugin" ;
private string m_version = "0.0" ;
2008-06-27 02:15:57 +00:00
2009-07-12 17:00:58 +00:00
//guard for XmlRpc-related methods
private void FailIfRemoteAdminDisabled ( string requestName )
{
if ( m_config = = null )
{
string errorMessage = String . Format ( "[RADMIN] {0}: Remote admin request denied! Please set [RemoteAdmin]enabled=true in OpenSim.ini in order to enable remote admin functionality" , requestName ) ;
m_log . Error ( errorMessage ) ;
throw new ApplicationException ( errorMessage ) ;
}
}
2009-03-10 20:06:25 +00:00
public string Version
{
get { return m_version ; }
}
public string Name
{
get { return m_name ; }
}
2008-06-27 02:15:57 +00:00
2008-08-18 00:39:10 +00:00
public void Initialise ( )
{
2008-06-27 02:15:57 +00:00
m_log . Info ( "[RADMIN]: " + Name + " cannot be default-initialized!" ) ;
2009-03-10 20:06:25 +00:00
throw new PluginNotInitialisedException ( Name ) ;
2008-06-27 02:15:57 +00:00
}
2008-06-01 01:01:16 +00:00
public void Initialise ( OpenSimBase openSim )
2007-12-03 07:10:08 +00:00
{
2008-08-22 09:00:32 +00:00
m_configSource = openSim . ConfigSource . Source ;
2007-12-04 05:47:51 +00:00
try
{
2008-09-08 14:30:35 +00:00
if ( m_configSource . Configs [ "RemoteAdmin" ] = = null | |
! m_configSource . Configs [ "RemoteAdmin" ] . GetBoolean ( "enabled" , false ) )
{
// No config or disabled
}
else
2007-12-04 05:47:51 +00:00
{
2008-08-22 09:00:32 +00:00
m_config = m_configSource . Configs [ "RemoteAdmin" ] ;
2008-02-05 19:44:27 +00:00
m_log . Info ( "[RADMIN]: Remote Admin Plugin Enabled" ) ;
2009-04-29 09:05:01 +00:00
m_requiredPassword = m_config . GetString ( "access_password" , String . Empty ) ;
2007-12-03 07:10:08 +00:00
2007-12-04 05:47:51 +00:00
m_app = openSim ;
2009-03-10 20:06:25 +00:00
m_httpd = openSim . HttpServer ;
2009-01-10 04:16:06 +00:00
Dictionary < string , XmlRpcMethod > availableMethods = new Dictionary < string , XmlRpcMethod > ( ) ;
availableMethods [ "admin_create_region" ] = XmlRpcCreateRegionMethod ;
availableMethods [ "admin_delete_region" ] = XmlRpcDeleteRegionMethod ;
2009-07-08 20:53:22 +00:00
availableMethods [ "admin_close_region" ] = XmlRpcCloseRegionMethod ;
2009-04-29 09:05:01 +00:00
availableMethods [ "admin_modify_region" ] = XmlRpcModifyRegionMethod ;
2009-04-27 11:51:25 +00:00
availableMethods [ "admin_region_query" ] = XmlRpcRegionQueryMethod ;
2009-01-10 04:16:06 +00:00
availableMethods [ "admin_shutdown" ] = XmlRpcShutdownMethod ;
availableMethods [ "admin_broadcast" ] = XmlRpcAlertMethod ;
availableMethods [ "admin_restart" ] = XmlRpcRestartMethod ;
availableMethods [ "admin_load_heightmap" ] = XmlRpcLoadHeightmapMethod ;
2009-04-27 11:51:25 +00:00
// User management
2009-01-10 04:16:06 +00:00
availableMethods [ "admin_create_user" ] = XmlRpcCreateUserMethod ;
2009-03-12 16:50:44 +00:00
availableMethods [ "admin_create_user_email" ] = XmlRpcCreateUserMethod ;
2009-01-10 04:16:06 +00:00
availableMethods [ "admin_exists_user" ] = XmlRpcUserExistsMethod ;
availableMethods [ "admin_update_user" ] = XmlRpcUpdateUserAccountMethod ;
2009-04-27 11:51:25 +00:00
// Region state management
2009-01-10 04:16:06 +00:00
availableMethods [ "admin_load_xml" ] = XmlRpcLoadXMLMethod ;
availableMethods [ "admin_save_xml" ] = XmlRpcSaveXMLMethod ;
availableMethods [ "admin_load_oar" ] = XmlRpcLoadOARMethod ;
availableMethods [ "admin_save_oar" ] = XmlRpcSaveOARMethod ;
2009-04-27 11:51:25 +00:00
// Estate access list management
availableMethods [ "admin_acl_clear" ] = XmlRpcAccessListClear ;
availableMethods [ "admin_acl_add" ] = XmlRpcAccessListAdd ;
availableMethods [ "admin_acl_remove" ] = XmlRpcAccessListRemove ;
availableMethods [ "admin_acl_list" ] = XmlRpcAccessListList ;
2009-01-10 04:16:06 +00:00
2009-09-30 16:00:09 +00:00
// Either enable full remote functionality or just selected features
2009-01-10 04:16:06 +00:00
string enabledMethods = m_config . GetString ( "enabled_methods" , "all" ) ;
2009-04-15 19:50:14 +00:00
// To get this, you must explicitly specify "all" or
// mention it in a whitelist. It won't be available
// If you just leave the option out!
/ /
if ( ! String . IsNullOrEmpty ( enabledMethods ) )
availableMethods [ "admin_console_command" ] = XmlRpcConsoleCommandMethod ;
2009-01-10 04:16:06 +00:00
// The assumption here is that simply enabling Remote Admin as before will produce the same
// behavior - enable all methods unless the whitelist is in place for backward-compatibility.
if ( enabledMethods . ToLower ( ) = = "all" | | String . IsNullOrEmpty ( enabledMethods ) )
{
foreach ( string method in availableMethods . Keys )
{
2009-02-20 19:15:39 +00:00
m_httpd . AddXmlRPCHandler ( method , availableMethods [ method ] , false ) ;
2009-01-10 04:16:06 +00:00
}
}
else
{
foreach ( string enabledMethod in enabledMethods . Split ( '|' ) )
{
m_httpd . AddXmlRPCHandler ( enabledMethod , availableMethods [ enabledMethod ] ) ;
}
}
2007-12-04 05:47:51 +00:00
}
}
catch ( NullReferenceException )
{
// Ignore.
}
2007-12-03 07:10:08 +00:00
}
2009-02-26 15:21:06 +00:00
public void PostInitialise ( )
{
2009-05-12 15:12:21 +00:00
if ( ! createDefaultAvatars ( ) )
{
m_log . Info ( "[RADMIN]: Default avatars not loaded" ) ;
}
2009-02-26 15:21:06 +00:00
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcRestartMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2007-12-03 07:28:04 +00:00
{
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2008-04-21 12:42:56 +00:00
2009-03-10 20:06:25 +00:00
try
{
2008-07-01 08:50:22 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
m_log . Info ( "[RADMIN]: Request to restart Region." ) ;
2009-03-10 20:06:25 +00:00
checkStringParameters ( request , new string [ ] { "password" , "regionID" } ) ;
2008-04-28 14:08:38 +00:00
2009-04-29 09:05:01 +00:00
if ( m_requiredPassword ! = String . Empty & &
( ! requestData . Contains ( "password" ) | | ( string ) requestData [ "password" ] ! = m_requiredPassword ) )
2008-09-08 14:30:35 +00:00
{
2008-04-28 14:08:38 +00:00
throw new Exception ( "wrong password" ) ;
2008-09-08 14:30:35 +00:00
}
2008-05-16 01:22:11 +00:00
2008-09-06 07:52:41 +00:00
UUID regionID = new UUID ( ( string ) requestData [ "regionID" ] ) ;
2008-04-21 12:42:56 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "accepted" ] = true ;
responseData [ "success" ] = true ;
2007-12-21 03:34:51 +00:00
response . Value = responseData ;
2008-04-28 14:08:38 +00:00
Scene rebootedScene ;
2007-12-21 03:34:51 +00:00
2008-04-28 14:08:38 +00:00
if ( ! m_app . SceneManager . TryGetScene ( regionID , out rebootedScene ) )
throw new Exception ( "region not found" ) ;
2008-05-16 01:22:11 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "rebooting" ] = true ;
2008-10-09 20:27:41 +00:00
response . Value = responseData ;
2008-04-28 14:08:38 +00:00
rebootedScene . Restart ( 30 ) ;
2008-05-16 01:22:11 +00:00
}
2009-03-10 20:06:25 +00:00
catch ( Exception e )
2008-04-28 14:08:38 +00:00
{
m_log . ErrorFormat ( "[RADMIN]: Restart region: failed: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN]: Restart region: failed: {0}" , e . ToString ( ) ) ;
2009-05-07 15:54:13 +00:00
responseData [ "accepted" ] = false ;
responseData [ "success" ] = false ;
responseData [ "rebooting" ] = false ;
2008-04-28 14:08:38 +00:00
responseData [ "error" ] = e . Message ;
response . Value = responseData ;
2007-12-03 07:28:04 +00:00
}
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Restart Region request complete" ) ;
2007-12-03 07:28:04 +00:00
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcAlertMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2007-12-03 07:14:58 +00:00
{
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2008-04-21 12:42:56 +00:00
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Alert request started" ) ;
2009-03-10 20:06:25 +00:00
try
2009-02-13 19:03:18 +00:00
{
2008-07-01 08:50:22 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2009-03-10 20:06:25 +00:00
checkStringParameters ( request , new string [ ] { "password" , "message" } ) ;
2008-04-21 12:42:56 +00:00
2009-04-29 09:05:01 +00:00
if ( m_requiredPassword ! = String . Empty & &
( ! requestData . Contains ( "password" ) | | ( string ) requestData [ "password" ] ! = m_requiredPassword ) )
2008-04-21 12:42:56 +00:00
throw new Exception ( "wrong password" ) ;
2008-05-16 01:22:11 +00:00
2007-12-27 21:41:48 +00:00
string message = ( string ) requestData [ "message" ] ;
2008-04-21 12:42:56 +00:00
m_log . InfoFormat ( "[RADMIN]: Broadcasting: {0}" , message ) ;
2007-12-21 03:34:51 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "accepted" ] = true ;
responseData [ "success" ] = true ;
2007-12-21 03:34:51 +00:00
response . Value = responseData ;
2009-03-10 20:06:25 +00:00
2009-02-13 19:03:18 +00:00
m_app . SceneManager . ForEachScene (
delegate ( Scene scene )
2009-03-10 20:06:25 +00:00
{
IDialogModule dialogModule = scene . RequestModuleInterface < IDialogModule > ( ) ;
if ( dialogModule ! = null )
dialogModule . SendGeneralAlert ( message ) ;
} ) ;
2007-12-21 03:34:51 +00:00
}
2009-03-10 20:06:25 +00:00
catch ( Exception e )
2008-04-21 12:42:56 +00:00
{
m_log . ErrorFormat ( "[RADMIN]: Broadcasting: failed: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN]: Broadcasting: failed: {0}" , e . ToString ( ) ) ;
2008-04-28 14:08:38 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "accepted" ] = false ;
responseData [ "success" ] = false ;
2008-04-28 14:08:38 +00:00
responseData [ "error" ] = e . Message ;
2008-04-21 12:42:56 +00:00
response . Value = responseData ;
}
2007-12-03 07:14:58 +00:00
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Alert request complete" ) ;
2007-12-03 07:14:58 +00:00
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcLoadHeightmapMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-01-12 03:17:28 +00:00
{
XmlRpcResponse response = new XmlRpcResponse ( ) ;
2008-04-21 12:42:56 +00:00
Hashtable responseData = new Hashtable ( ) ;
2008-07-01 08:50:22 +00:00
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Load height maps request started" ) ;
2009-03-10 20:06:25 +00:00
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2008-07-01 08:50:22 +00:00
m_log . DebugFormat ( "[RADMIN]: Load Terrain: XmlRpc {0}" , request . ToString ( ) ) ;
// foreach (string k in requestData.Keys)
// {
// m_log.DebugFormat("[RADMIN]: Load Terrain: XmlRpc {0}: >{1}< {2}",
// k, (string)requestData[k], ((string)requestData[k]).Length);
// }
2009-03-10 20:06:25 +00:00
checkStringParameters ( request , new string [ ] { "password" , "filename" , "regionid" } ) ;
2008-04-21 12:42:56 +00:00
2009-04-29 09:05:01 +00:00
if ( m_requiredPassword ! = String . Empty & &
( ! requestData . Contains ( "password" ) | | ( string ) requestData [ "password" ] ! = m_requiredPassword ) )
2008-04-21 12:42:56 +00:00
throw new Exception ( "wrong password" ) ;
2009-03-10 20:06:25 +00:00
string file = ( string ) requestData [ "filename" ] ;
UUID regionID = ( UUID ) ( string ) requestData [ "regionid" ] ;
2008-04-21 12:42:56 +00:00
m_log . InfoFormat ( "[RADMIN]: Terrain Loading: {0}" , file ) ;
2008-01-12 03:17:28 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "accepted" ] = true ;
2008-01-12 03:17:28 +00:00
Scene region = null ;
2008-04-21 12:42:56 +00:00
if ( ! m_app . SceneManager . TryGetScene ( regionID , out region ) )
throw new Exception ( "1: unable to get a scene with that name" ) ;
ITerrainModule terrainModule = region . RequestModuleInterface < ITerrainModule > ( ) ;
if ( null = = terrainModule ) throw new Exception ( "terrain module not available" ) ;
2009-12-04 18:26:58 +00:00
if ( Uri . IsWellFormedUriString ( file , UriKind . Absolute ) )
{
m_log . Info ( "[RADMIN]: Terrain path is URL" ) ;
Uri result ;
if ( Uri . TryCreate ( file , UriKind . RelativeOrAbsolute , out result ) )
{
// the url is valid
string fileType = file . Substring ( file . LastIndexOf ( '/' ) + 1 ) ;
terrainModule . LoadFromStream ( fileType , result ) ;
}
}
else
{
terrainModule . LoadFromFile ( file ) ;
}
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2008-04-21 12:42:56 +00:00
2008-01-12 03:17:28 +00:00
response . Value = responseData ;
}
2008-05-16 01:22:11 +00:00
catch ( Exception e )
2008-04-21 12:42:56 +00:00
{
2009-06-01 16:00:46 +00:00
m_log . ErrorFormat ( "[RADMIN]: Terrain Loading: failed: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN]: Terrain Loading: failed: {0}" , e . ToString ( ) ) ;
2008-04-21 12:42:56 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2008-04-21 12:42:56 +00:00
responseData [ "error" ] = e . Message ;
}
2008-01-12 03:17:28 +00:00
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Load height maps request complete" ) ;
2008-01-12 03:17:28 +00:00
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcShutdownMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2007-12-03 07:10:08 +00:00
{
2008-02-05 19:44:27 +00:00
m_log . Info ( "[RADMIN]: Received Shutdown Administrator Request" ) ;
2009-03-27 12:49:27 +00:00
2007-12-03 07:10:08 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
2007-12-21 03:34:51 +00:00
Hashtable responseData = new Hashtable ( ) ;
2008-04-21 12:42:56 +00:00
2009-03-10 20:06:25 +00:00
try
{
2008-07-01 08:50:22 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2009-04-29 09:05:01 +00:00
if ( m_requiredPassword ! = String . Empty & &
( ! requestData . Contains ( "password" ) | | ( string ) requestData [ "password" ] ! = m_requiredPassword ) )
2008-04-21 12:42:56 +00:00
throw new Exception ( "wrong password" ) ;
2009-05-07 15:54:13 +00:00
responseData [ "accepted" ] = true ;
2007-12-03 07:10:08 +00:00
response . Value = responseData ;
2008-04-21 12:42:56 +00:00
2008-04-29 14:50:27 +00:00
int timeout = 2000 ;
2009-03-10 20:06:25 +00:00
string message ;
2008-04-29 14:50:27 +00:00
2009-03-10 20:06:25 +00:00
if ( requestData . ContainsKey ( "shutdown" )
& & ( ( string ) requestData [ "shutdown" ] = = "delayed" )
2009-02-13 19:03:18 +00:00
& & requestData . ContainsKey ( "milliseconds" ) )
2007-12-21 03:34:51 +00:00
{
2009-11-02 06:13:05 +00:00
timeout = Int32 . Parse ( requestData [ "milliseconds" ] . ToString ( ) ) ;
2009-03-10 20:06:25 +00:00
message
= "Region is going down in " + ( ( int ) ( timeout / 1000 ) ) . ToString ( )
+ " second(s). Please save what you are doing and log out." ;
2008-05-16 01:22:11 +00:00
}
2007-12-21 03:34:51 +00:00
else
{
2009-02-13 19:03:18 +00:00
message = "Region is going down now." ;
2007-12-21 03:34:51 +00:00
}
2009-03-10 20:06:25 +00:00
2009-02-13 19:03:18 +00:00
m_app . SceneManager . ForEachScene (
delegate ( Scene scene )
2009-03-10 20:06:25 +00:00
{
IDialogModule dialogModule = scene . RequestModuleInterface < IDialogModule > ( ) ;
if ( dialogModule ! = null )
dialogModule . SendGeneralAlert ( message ) ;
} ) ;
2008-04-29 14:50:27 +00:00
// Perform shutdown
2009-05-18 10:04:28 +00:00
System . Timers . Timer shutdownTimer = new System . Timers . Timer ( timeout ) ; // Wait before firing
2008-04-29 14:50:27 +00:00
shutdownTimer . AutoReset = false ;
2008-05-01 18:04:42 +00:00
shutdownTimer . Elapsed + = new ElapsedEventHandler ( shutdownTimer_Elapsed ) ;
2009-09-09 20:20:19 +00:00
lock ( shutdownTimer )
{
shutdownTimer . Start ( ) ;
}
2008-04-29 14:50:27 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2007-12-03 07:10:08 +00:00
}
2008-05-16 01:22:11 +00:00
catch ( Exception e )
2008-04-21 12:42:56 +00:00
{
m_log . ErrorFormat ( "[RADMIN] Shutdown: failed: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] Shutdown: failed: {0}" , e . ToString ( ) ) ;
2009-05-07 15:54:13 +00:00
responseData [ "accepted" ] = false ;
2008-04-21 12:42:56 +00:00
responseData [ "error" ] = e . Message ;
response . Value = responseData ;
}
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Shutdown Administrator Request complete" ) ;
2007-12-21 03:34:51 +00:00
return response ;
2007-12-03 07:10:08 +00:00
}
private void shutdownTimer_Elapsed ( object sender , ElapsedEventArgs e )
{
m_app . Shutdown ( ) ;
}
2008-04-04 11:48:27 +00:00
/// <summary>
/// Create a new region.
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcCreateRegionMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>region_name</term>
/// <description>desired region name</description></item>
/// <item><term>region_id</term>
/// <description>(optional) desired region UUID</description></item>
/// <item><term>region_x</term>
2008-04-15 14:18:37 +00:00
/// <description>desired region X coordinate (integer)</description></item>
2008-04-04 11:48:27 +00:00
/// <item><term>region_y</term>
2008-04-15 14:18:37 +00:00
/// <description>desired region Y coordinate (integer)</description></item>
2008-04-04 11:48:27 +00:00
/// <item><term>region_master_first</term>
/// <description>firstname of region master</description></item>
/// <item><term>region_master_last</term>
/// <description>lastname of region master</description></item>
2008-10-23 12:19:11 +00:00
/// <item><term>region_master_uuid</term>
/// <description>explicit UUID to use for master avatar (optional)</description></item>
2008-04-04 11:48:27 +00:00
/// <item><term>listen_ip</term>
2008-04-15 14:18:37 +00:00
/// <description>internal IP address (dotted quad)</description></item>
2008-04-04 11:48:27 +00:00
/// <item><term>listen_port</term>
2008-04-15 14:18:37 +00:00
/// <description>internal port (integer)</description></item>
2008-04-04 11:48:27 +00:00
/// <item><term>external_address</term>
/// <description>external IP address</description></item>
2008-04-15 14:18:37 +00:00
/// <item><term>persist</term>
/// <description>if true, persist the region info
/// ('true' or 'false')</description></item>
2009-04-29 09:05:01 +00:00
/// <item><term>public</term>
/// <description>if true, the region is public
/// ('true' or 'false') (optional, default: true)</description></item>
/// <item><term>enable_voice</term>
/// <description>if true, enable voice on all parcels,
/// ('true' or 'false') (optional, default: false)</description></item>
2008-04-04 11:48:27 +00:00
/// </list>
2008-05-16 01:22:11 +00:00
///
2008-04-04 11:48:27 +00:00
/// XmlRpcCreateRegionMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// <item><term>region_uuid</term>
/// <description>UUID of the newly created region</description></item>
/// <item><term>region_name</term>
/// <description>name of the newly created region</description></item>
/// </list>
/// </remarks>
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcCreateRegionMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2007-12-03 07:10:08 +00:00
{
2008-04-11 15:00:41 +00:00
m_log . Info ( "[RADMIN]: CreateRegion: new request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "CreateRegion" ) ;
2007-12-03 07:10:08 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
2007-12-21 03:34:51 +00:00
Hashtable responseData = new Hashtable ( ) ;
2007-12-03 07:10:08 +00:00
2009-03-27 12:49:27 +00:00
lock ( rslock )
2008-12-05 15:28:03 +00:00
{
2009-04-29 09:05:01 +00:00
int m_regionLimit = m_config . GetInt ( "region_limit" , 0 ) ;
bool m_enableVoiceForNewRegions = m_config . GetBoolean ( "create_region_enable_voice" , false ) ;
bool m_publicAccess = m_config . GetBoolean ( "create_region_public" , true ) ;
2008-11-10 17:37:28 +00:00
2009-03-10 20:06:25 +00:00
try
{
2008-12-03 19:19:46 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2008-07-01 08:50:22 +00:00
2009-03-10 20:06:25 +00:00
checkStringParameters ( request , new string [ ]
{
"password" ,
"region_name" ,
"region_master_first" , "region_master_last" ,
"region_master_password" ,
"listen_ip" , "external_address"
} ) ;
2008-12-03 19:19:46 +00:00
checkIntegerParams ( request , new string [ ] { "region_x" , "region_y" , "listen_port" } ) ;
2007-12-03 07:10:08 +00:00
2008-12-03 19:19:46 +00:00
// check password
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2008-04-04 11:48:27 +00:00
2008-12-03 19:19:46 +00:00
// check whether we still have space left (iff we are using limits)
if ( m_regionLimit ! = 0 & & m_app . SceneManager . Scenes . Count > = m_regionLimit )
2009-09-30 16:00:09 +00:00
throw new Exception ( String . Format ( "cannot instantiate new region, server capacity {0} already reached; delete regions first" ,
2009-04-29 09:05:01 +00:00
m_regionLimit ) ) ;
2008-12-03 19:19:46 +00:00
// extract or generate region ID now
Scene scene = null ;
UUID regionID = UUID . Zero ;
if ( requestData . ContainsKey ( "region_id" ) & &
2009-03-10 20:06:25 +00:00
! String . IsNullOrEmpty ( ( string ) requestData [ "region_id" ] ) )
2008-12-03 19:19:46 +00:00
{
2009-03-10 20:06:25 +00:00
regionID = ( UUID ) ( string ) requestData [ "region_id" ] ;
2008-12-03 19:19:46 +00:00
if ( m_app . SceneManager . TryGetScene ( regionID , out scene ) )
2009-03-10 20:06:25 +00:00
throw new Exception (
String . Format ( "region UUID already in use by region {0}, UUID {1}, <{2},{3}>" ,
scene . RegionInfo . RegionName , scene . RegionInfo . RegionID ,
scene . RegionInfo . RegionLocX , scene . RegionInfo . RegionLocY ) ) ;
2008-12-03 19:19:46 +00:00
}
else
{
regionID = UUID . Random ( ) ;
m_log . DebugFormat ( "[RADMIN] CreateRegion: new region UUID {0}" , regionID ) ;
}
2007-12-03 07:10:08 +00:00
2008-12-03 19:19:46 +00:00
// create volatile or persistent region info
RegionInfo region = new RegionInfo ( ) ;
2008-04-11 15:00:41 +00:00
2008-12-03 19:19:46 +00:00
region . RegionID = regionID ;
2009-07-08 20:53:22 +00:00
region . originRegionID = regionID ;
2008-12-03 19:19:46 +00:00
region . RegionName = ( string ) requestData [ "region_name" ] ;
region . RegionLocX = Convert . ToUInt32 ( requestData [ "region_x" ] ) ;
region . RegionLocY = Convert . ToUInt32 ( requestData [ "region_y" ] ) ;
2008-04-11 15:00:41 +00:00
2008-12-03 19:19:46 +00:00
// check for collisions: region name, region UUID,
// region location
if ( m_app . SceneManager . TryGetScene ( region . RegionName , out scene ) )
2009-03-10 20:06:25 +00:00
throw new Exception (
String . Format ( "region name already in use by region {0}, UUID {1}, <{2},{3}>" ,
scene . RegionInfo . RegionName , scene . RegionInfo . RegionID ,
scene . RegionInfo . RegionLocX , scene . RegionInfo . RegionLocY ) ) ;
2008-04-11 15:00:41 +00:00
2008-12-03 19:19:46 +00:00
if ( m_app . SceneManager . TryGetScene ( region . RegionLocX , region . RegionLocY , out scene ) )
2009-03-10 20:06:25 +00:00
throw new Exception (
String . Format ( "region location <{0},{1}> already in use by region {2}, UUID {3}, <{4},{5}>" ,
region . RegionLocX , region . RegionLocY ,
scene . RegionInfo . RegionName , scene . RegionInfo . RegionID ,
scene . RegionInfo . RegionLocX , scene . RegionInfo . RegionLocY ) ) ;
2008-05-16 01:22:11 +00:00
2008-12-03 19:19:46 +00:00
region . InternalEndPoint =
new IPEndPoint ( IPAddress . Parse ( ( string ) requestData [ "listen_ip" ] ) , 0 ) ;
2008-05-16 01:22:11 +00:00
2008-12-03 19:19:46 +00:00
region . InternalEndPoint . Port = Convert . ToInt32 ( requestData [ "listen_port" ] ) ;
if ( 0 = = region . InternalEndPoint . Port ) throw new Exception ( "listen_port is 0" ) ;
if ( m_app . SceneManager . TryGetScene ( region . InternalEndPoint , out scene ) )
2009-03-10 20:06:25 +00:00
throw new Exception (
String . Format (
"region internal IP {0} and port {1} already in use by region {2}, UUID {3}, <{4},{5}>" ,
region . InternalEndPoint . Address ,
region . InternalEndPoint . Port ,
scene . RegionInfo . RegionName , scene . RegionInfo . RegionID ,
scene . RegionInfo . RegionLocX , scene . RegionInfo . RegionLocY ) ) ;
2008-05-16 01:22:11 +00:00
2009-03-10 20:06:25 +00:00
region . ExternalHostName = ( string ) requestData [ "external_address" ] ;
2008-05-16 01:22:11 +00:00
2009-03-10 20:06:25 +00:00
string masterFirst = ( string ) requestData [ "region_master_first" ] ;
string masterLast = ( string ) requestData [ "region_master_last" ] ;
string masterPassword = ( string ) requestData [ "region_master_password" ] ;
2008-10-23 11:14:25 +00:00
2008-12-03 19:19:46 +00:00
UUID userID = UUID . Zero ;
if ( requestData . ContainsKey ( "region_master_uuid" ) )
2008-10-23 12:10:58 +00:00
{
2008-12-03 19:19:46 +00:00
// ok, client wants us to use an explicit UUID
// regardless of what the avatar name provided
2009-03-10 20:06:25 +00:00
userID = new UUID ( ( string ) requestData [ "region_master_uuid" ] ) ;
2008-10-23 12:10:58 +00:00
}
else
{
2009-06-26 11:32:36 +00:00
if ( masterFirst ! = String . Empty & & masterLast ! = String . Empty ) // User requests a master avatar
2008-12-03 19:19:46 +00:00
{
2009-06-26 11:32:36 +00:00
// no client supplied UUID: look it up...
2009-09-30 16:00:09 +00:00
CachedUserInfo userInfo
2009-06-26 11:32:36 +00:00
= m_app . CommunicationsManager . UserProfileCacheService . GetUserDetails (
masterFirst , masterLast ) ;
2009-09-30 16:00:09 +00:00
2009-06-26 11:32:36 +00:00
if ( null = = userInfo )
{
m_log . InfoFormat ( "master avatar does not exist, creating it" ) ;
// ...or create new user
userID = m_app . CommunicationsManager . UserAdminService . AddUser (
masterFirst , masterLast , masterPassword , "" , region . RegionLocX , region . RegionLocY ) ;
if ( userID = = UUID . Zero )
throw new Exception ( String . Format ( "failed to create new user {0} {1}" ,
masterFirst , masterLast ) ) ;
}
else
{
userID = userInfo . UserProfile . ID ;
}
2008-12-03 19:19:46 +00:00
}
2008-10-23 12:10:58 +00:00
}
2008-10-23 11:14:25 +00:00
2008-12-03 19:19:46 +00:00
region . MasterAvatarFirstName = masterFirst ;
region . MasterAvatarLastName = masterLast ;
region . MasterAvatarSandboxPassword = masterPassword ;
region . MasterAvatarAssignedUUID = userID ;
2008-04-11 15:00:41 +00:00
2009-03-10 20:06:25 +00:00
bool persist = Convert . ToBoolean ( ( string ) requestData [ "persist" ] ) ;
2008-12-03 19:19:46 +00:00
if ( persist )
2008-08-22 09:00:32 +00:00
{
2008-12-03 19:19:46 +00:00
// default place for region XML files is in the
// Regions directory of the config dir (aka /bin)
string regionConfigPath = Path . Combine ( Util . configDir ( ) , "Regions" ) ;
try
{
// OpenSim.ini can specify a different regions dir
2009-03-10 20:06:25 +00:00
IConfig startupConfig = ( IConfig ) m_configSource . Configs [ "Startup" ] ;
2008-12-03 19:19:46 +00:00
regionConfigPath = startupConfig . GetString ( "regionload_regionsdir" , regionConfigPath ) . Trim ( ) ;
}
catch ( Exception )
{
// No INI setting recorded.
}
string regionXmlPath = Path . Combine ( regionConfigPath ,
2009-03-10 20:06:25 +00:00
String . Format (
m_config . GetString ( "region_file_template" ,
"{0}x{1}-{2}.xml" ) ,
region . RegionLocX . ToString ( ) ,
region . RegionLocY . ToString ( ) ,
regionID . ToString ( ) ,
region . InternalEndPoint . Port . ToString ( ) ,
region . RegionName . Replace ( " " , "_" ) . Replace ( ":" , "_" ) .
Replace ( "/" , "_" ) ) ) ;
2008-12-03 19:19:46 +00:00
m_log . DebugFormat ( "[RADMIN] CreateRegion: persisting region {0} to {1}" ,
region . RegionID , regionXmlPath ) ;
region . SaveRegionToFile ( "dynamic region" , regionXmlPath ) ;
2009-09-30 16:00:09 +00:00
}
2009-07-03 15:36:47 +00:00
else
{
region . Persistent = false ;
2008-08-22 09:00:32 +00:00
}
2009-04-29 09:05:01 +00:00
// Create the region and perform any initial initialization
2009-02-26 20:01:20 +00:00
IScene newscene ;
m_app . CreateRegion ( region , out newscene ) ;
2007-12-03 07:10:08 +00:00
2009-04-29 09:05:01 +00:00
// If an access specification was provided, use it.
// Otherwise accept the default.
newscene . RegionInfo . EstateSettings . PublicAccess = getBoolean ( requestData , "public" , m_publicAccess ) ;
2009-06-10 11:29:09 +00:00
if ( persist )
newscene . RegionInfo . EstateSettings . Save ( ) ;
2009-04-29 09:05:01 +00:00
// enable voice on newly created region if
// requested by either the XmlRpc request or the
// configuration
if ( getBoolean ( requestData , "enable_voice" , m_enableVoiceForNewRegions ) )
{
List < ILandObject > parcels = ( ( Scene ) newscene ) . LandChannel . AllParcels ( ) ;
2009-05-05 09:59:15 +00:00
foreach ( ILandObject parcel in parcels )
2009-04-29 09:05:01 +00:00
{
2009-10-02 09:10:52 +00:00
parcel . LandData . Flags | = ( uint ) ParcelFlags . AllowVoiceChat ;
parcel . LandData . Flags | = ( uint ) ParcelFlags . UseEstateVoiceChan ;
( ( Scene ) newscene ) . LandChannel . UpdateLandObject ( parcel . LandData . LocalID , parcel . LandData ) ;
2009-04-29 09:05:01 +00:00
}
}
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2008-12-03 19:19:46 +00:00
responseData [ "region_name" ] = region . RegionName ;
responseData [ "region_uuid" ] = region . RegionID . ToString ( ) ;
2007-12-03 07:10:08 +00:00
2008-12-03 19:19:46 +00:00
response . Value = responseData ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[RADMIN] CreateRegion: failed {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] CreateRegion: failed {0}" , e . ToString ( ) ) ;
2008-04-11 15:00:41 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2008-12-03 19:19:46 +00:00
responseData [ "error" ] = e . Message ;
2007-12-21 03:34:51 +00:00
2008-12-03 19:19:46 +00:00
response . Value = responseData ;
}
2009-09-30 16:00:09 +00:00
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: CreateRegion: request complete" ) ;
2008-12-03 19:19:46 +00:00
return response ;
2007-12-03 07:10:08 +00:00
}
}
2008-09-18 15:44:05 +00:00
/// <summary>
/// Delete a new region.
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
2009-04-29 09:05:01 +00:00
/// XmlRpcDeleteRegionMethod takes the following XMLRPC
2008-09-18 15:44:05 +00:00
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>region_name</term>
/// <description>desired region name</description></item>
/// <item><term>region_id</term>
/// <description>(optional) desired region UUID</description></item>
/// </list>
///
2009-04-29 09:05:01 +00:00
/// XmlRpcDeleteRegionMethod returns
2008-09-18 15:44:05 +00:00
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcDeleteRegionMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-09-18 15:44:05 +00:00
{
m_log . Info ( "[RADMIN]: DeleteRegion: new request" ) ;
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2009-03-27 12:49:27 +00:00
lock ( rslock )
2008-12-05 15:28:03 +00:00
{
2009-03-10 20:06:25 +00:00
try
{
2008-12-03 19:19:46 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
checkStringParameters ( request , new string [ ] { "password" , "region_name" } ) ;
2008-09-18 15:44:05 +00:00
2008-12-03 19:19:46 +00:00
Scene scene = null ;
2009-03-10 20:06:25 +00:00
string regionName = ( string ) requestData [ "region_name" ] ;
2008-12-03 19:19:46 +00:00
if ( ! m_app . SceneManager . TryGetScene ( regionName , out scene ) )
throw new Exception ( String . Format ( "region \"{0}\" does not exist" , regionName ) ) ;
2009-03-10 20:06:25 +00:00
2008-12-03 19:19:46 +00:00
m_app . RemoveRegion ( scene , true ) ;
2008-09-18 15:44:05 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2008-12-03 19:19:46 +00:00
responseData [ "region_name" ] = regionName ;
2008-09-18 15:44:05 +00:00
2008-12-03 19:19:46 +00:00
response . Value = responseData ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[RADMIN] DeleteRegion: failed {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] DeleteRegion: failed {0}" , e . ToString ( ) ) ;
2008-09-18 15:44:05 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2008-12-03 19:19:46 +00:00
responseData [ "error" ] = e . Message ;
2008-09-18 15:44:05 +00:00
2008-12-03 19:19:46 +00:00
response . Value = responseData ;
}
2008-09-18 15:44:05 +00:00
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: DeleteRegion: request complete" ) ;
2008-12-03 19:19:46 +00:00
return response ;
2009-07-08 20:53:22 +00:00
}
}
2009-09-30 16:00:09 +00:00
2009-07-08 20:53:22 +00:00
/// <summary>
/// Close a region.
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcCloseRegionMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>region_name</term>
/// <description>desired region name</description></item>
/// <item><term>region_id</term>
/// <description>(optional) desired region UUID</description></item>
/// </list>
///
/// XmlRpcShutdownRegionMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>region_name</term>
/// <description>the region name if success is true</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
public XmlRpcResponse XmlRpcCloseRegionMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
{
m_log . Info ( "[RADMIN]: CloseRegion: new request" ) ;
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
Scene scene = null ;
lock ( rslock )
{
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
checkStringParameters ( request , new string [ ] { "password" } ) ;
2009-09-30 16:00:09 +00:00
2009-07-08 20:53:22 +00:00
if ( requestData . ContainsKey ( "region_id" ) & &
! String . IsNullOrEmpty ( ( string ) requestData [ "region_id" ] ) )
{
// Region specified by UUID
UUID regionID = ( UUID ) ( string ) requestData [ "region_id" ] ;
if ( ! m_app . SceneManager . TryGetScene ( regionID , out scene ) )
throw new Exception ( String . Format ( "region \"{0}\" does not exist" , regionID ) ) ;
m_app . CloseRegion ( scene ) ;
responseData [ "success" ] = true ;
responseData [ "region_id" ] = regionID ;
response . Value = responseData ;
}
else if ( requestData . ContainsKey ( "region_name" ) & &
! String . IsNullOrEmpty ( ( string ) requestData [ "region_name" ] ) )
{
// Region specified by name
string regionName = ( string ) requestData [ "region_name" ] ;
if ( ! m_app . SceneManager . TryGetScene ( regionName , out scene ) )
throw new Exception ( String . Format ( "region \"{0}\" does not exist" , regionName ) ) ;
m_app . CloseRegion ( scene ) ;
responseData [ "success" ] = true ;
responseData [ "region_name" ] = regionName ;
response . Value = responseData ;
}
else
throw new Exception ( "no region specified" ) ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[RADMIN] CloseRegion: failed {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] CloseRegion: failed {0}" , e . ToString ( ) ) ;
responseData [ "success" ] = false ;
responseData [ "error" ] = e . Message ;
response . Value = responseData ;
}
m_log . Info ( "[RADMIN]: CloseRegion: request complete" ) ;
return response ;
2008-12-03 19:19:46 +00:00
}
2008-09-18 15:44:05 +00:00
}
2009-04-29 09:05:01 +00:00
/// <summary>
/// Change characteristics of an existing region.
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcModifyRegionMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>region_name</term>
/// <description>desired region name</description></item>
/// <item><term>region_id</term>
/// <description>(optional) desired region UUID</description></item>
/// <item><term>public</term>
/// <description>if true, set the region to public
/// ('true' or 'false'), else to private</description></item>
/// <item><term>enable_voice</term>
/// <description>if true, enable voice on all parcels of
/// the region, else disable</description></item>
/// </list>
///
/// XmlRpcModifyRegionMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcModifyRegionMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2009-04-29 09:05:01 +00:00
{
m_log . Info ( "[RADMIN]: ModifyRegion: new request" ) ;
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
lock ( rslock )
{
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
checkStringParameters ( request , new string [ ] { "password" , "region_name" } ) ;
Scene scene = null ;
string regionName = ( string ) requestData [ "region_name" ] ;
if ( ! m_app . SceneManager . TryGetScene ( regionName , out scene ) )
throw new Exception ( String . Format ( "region \"{0}\" does not exist" , regionName ) ) ;
2009-09-30 16:00:09 +00:00
// Modify access
scene . RegionInfo . EstateSettings . PublicAccess =
2009-04-29 09:05:01 +00:00
getBoolean ( requestData , "public" , scene . RegionInfo . EstateSettings . PublicAccess ) ;
2009-07-03 15:36:47 +00:00
if ( scene . RegionInfo . Persistent )
scene . RegionInfo . EstateSettings . Save ( ) ;
2009-04-29 09:05:01 +00:00
if ( requestData . ContainsKey ( "enable_voice" ) )
{
bool enableVoice = getBoolean ( requestData , "enable_voice" , true ) ;
List < ILandObject > parcels = ( ( Scene ) scene ) . LandChannel . AllParcels ( ) ;
2009-05-05 09:59:15 +00:00
foreach ( ILandObject parcel in parcels )
2009-04-29 09:05:01 +00:00
{
if ( enableVoice )
{
2009-10-02 09:10:52 +00:00
parcel . LandData . Flags | = ( uint ) ParcelFlags . AllowVoiceChat ;
parcel . LandData . Flags | = ( uint ) ParcelFlags . UseEstateVoiceChan ;
2009-04-29 09:05:01 +00:00
}
else
{
2009-10-02 09:10:52 +00:00
parcel . LandData . Flags & = ~ ( uint ) ParcelFlags . AllowVoiceChat ;
parcel . LandData . Flags & = ~ ( uint ) ParcelFlags . UseEstateVoiceChan ;
2009-04-29 09:05:01 +00:00
}
2009-10-02 09:10:52 +00:00
scene . LandChannel . UpdateLandObject ( parcel . LandData . LocalID , parcel . LandData ) ;
2009-04-29 09:05:01 +00:00
}
}
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2009-04-29 09:05:01 +00:00
responseData [ "region_name" ] = regionName ;
response . Value = responseData ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[RADMIN] ModifyRegion: failed {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] ModifyRegion: failed {0}" , e . ToString ( ) ) ;
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2009-04-29 09:05:01 +00:00
responseData [ "error" ] = e . Message ;
response . Value = responseData ;
}
m_log . Info ( "[RADMIN]: ModifyRegion: request complete" ) ;
return response ;
}
}
2008-04-04 11:48:27 +00:00
/// <summary>
/// Create a new user account.
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcCreateUserMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>user_firstname</term>
/// <description>avatar's first name</description></item>
/// <item><term>user_lastname</term>
/// <description>avatar's last name</description></item>
/// <item><term>user_password</term>
/// <description>avatar's password</description></item>
2009-03-12 16:50:44 +00:00
/// <item><term>user_email</term>
/// <description>email of the avatar's owner (optional)</description></item>
2008-04-04 11:48:27 +00:00
/// <item><term>start_region_x</term>
/// <description>avatar's start region coordinates, X value</description></item>
/// <item><term>start_region_y</term>
/// <description>avatar's start region coordinates, Y value</description></item>
/// </list>
2008-05-16 01:22:11 +00:00
///
2008-04-04 11:48:27 +00:00
/// XmlRpcCreateUserMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// <item><term>avatar_uuid</term>
/// <description>UUID of the newly created avatar
2008-09-06 07:52:41 +00:00
/// account; UUID.Zero if failed.
2008-04-04 11:48:27 +00:00
/// </description></item>
/// </list>
/// </remarks>
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcCreateUserMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2007-12-03 07:10:08 +00:00
{
2008-04-11 15:00:41 +00:00
m_log . Info ( "[RADMIN]: CreateUser: new request" ) ;
2009-09-30 16:00:09 +00:00
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "CreateUser" ) ;
2008-01-29 14:43:45 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2008-04-04 11:48:27 +00:00
2009-03-27 12:49:27 +00:00
lock ( rslock )
2008-12-05 15:28:03 +00:00
{
2008-12-03 19:19:46 +00:00
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2008-08-18 00:39:10 +00:00
2008-12-03 19:19:46 +00:00
// check completeness
2009-03-10 20:06:25 +00:00
checkStringParameters ( request , new string [ ]
{
"password" , "user_firstname" ,
"user_lastname" , "user_password" ,
} ) ;
checkIntegerParams ( request , new string [ ] { "start_region_x" , "start_region_y" } ) ;
2008-04-04 11:48:27 +00:00
2008-12-03 19:19:46 +00:00
// check password
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2008-04-04 11:48:27 +00:00
2008-12-03 19:19:46 +00:00
// do the job
string firstname = ( string ) requestData [ "user_firstname" ] ;
2009-03-10 20:06:25 +00:00
string lastname = ( string ) requestData [ "user_lastname" ] ;
string passwd = ( string ) requestData [ "user_password" ] ;
uint regX = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_region_x" ] ) ;
uint regY = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_region_y" ] ) ;
2008-05-16 01:22:11 +00:00
2009-03-12 16:50:44 +00:00
string email = "" ; // empty string for email
if ( requestData . Contains ( "user_email" ) )
email = ( string ) requestData [ "user_email" ] ;
2008-04-04 11:48:27 +00:00
2009-09-30 16:00:09 +00:00
CachedUserInfo userInfo =
2009-04-17 15:51:58 +00:00
m_app . CommunicationsManager . UserProfileCacheService . GetUserDetails ( firstname , lastname ) ;
2009-09-30 16:00:09 +00:00
2009-04-17 15:51:58 +00:00
if ( null ! = userInfo )
throw new Exception ( String . Format ( "Avatar {0} {1} already exists" , firstname , lastname ) ) ;
2008-11-23 03:38:40 +00:00
2009-09-30 16:00:09 +00:00
UUID userID =
2009-03-12 16:50:44 +00:00
m_app . CommunicationsManager . UserAdminService . AddUser ( firstname , lastname ,
passwd , email , regX , regY ) ;
2008-11-23 03:38:40 +00:00
2009-03-10 20:06:25 +00:00
if ( userID = = UUID . Zero )
throw new Exception ( String . Format ( "failed to create new user {0} {1}" ,
firstname , lastname ) ) ;
2008-11-23 03:38:40 +00:00
2009-05-07 12:33:53 +00:00
// Establish the avatar's initial appearance
2009-05-12 15:12:21 +00:00
updateUserAppearance ( responseData , requestData , userID ) ;
2009-04-29 09:35:35 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2008-12-03 19:19:46 +00:00
responseData [ "avatar_uuid" ] = userID . ToString ( ) ;
2008-11-23 03:38:40 +00:00
2008-12-03 19:19:46 +00:00
response . Value = responseData ;
2008-11-23 03:38:40 +00:00
2008-12-03 19:19:46 +00:00
m_log . InfoFormat ( "[RADMIN]: CreateUser: User {0} {1} created, UUID {2}" , firstname , lastname , userID ) ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[RADMIN] CreateUser: failed: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] CreateUser: failed: {0}" , e . ToString ( ) ) ;
2008-11-23 03:38:40 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2008-12-03 19:19:46 +00:00
responseData [ "avatar_uuid" ] = UUID . Zero . ToString ( ) ;
responseData [ "error" ] = e . Message ;
2008-11-23 03:38:40 +00:00
2008-12-03 19:19:46 +00:00
response . Value = responseData ;
}
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: CreateUser: request complete" ) ;
2008-12-03 19:19:46 +00:00
return response ;
}
2008-11-23 03:38:40 +00:00
}
2008-10-06 09:42:31 +00:00
/// <summary>
/// Check whether a certain user account exists.
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcUserExistsMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>user_firstname</term>
/// <description>avatar's first name</description></item>
/// <item><term>user_lastname</term>
/// <description>avatar's last name</description></item>
/// </list>
///
/// XmlRpcCreateUserMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>user_firstname</term>
/// <description>avatar's first name</description></item>
/// <item><term>user_lastname</term>
/// <description>avatar's last name</description></item>
2009-06-10 10:59:56 +00:00
/// <item><term>user_lastlogin</term>
/// <description>avatar's last login time (secs since UNIX epoch)</description></item>
2008-10-06 09:42:31 +00:00
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcUserExistsMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-10-06 09:42:31 +00:00
{
m_log . Info ( "[RADMIN]: UserExists: new request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "UserExists" ) ;
2008-10-06 09:42:31 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
// check completeness
2009-03-10 20:06:25 +00:00
checkStringParameters ( request , new string [ ] { "password" , "user_firstname" , "user_lastname" } ) ;
2008-10-06 09:42:31 +00:00
string firstname = ( string ) requestData [ "user_firstname" ] ;
2009-03-10 20:06:25 +00:00
string lastname = ( string ) requestData [ "user_lastname" ] ;
2009-09-30 16:00:09 +00:00
CachedUserInfo userInfo
= m_app . CommunicationsManager . UserProfileCacheService . GetUserDetails ( firstname , lastname ) ;
2008-10-06 09:42:31 +00:00
responseData [ "user_firstname" ] = firstname ;
responseData [ "user_lastname" ] = lastname ;
2009-04-17 15:51:58 +00:00
if ( null = = userInfo )
2009-06-10 10:59:56 +00:00
{
2008-10-06 09:42:31 +00:00
responseData [ "success" ] = false ;
2009-06-10 10:59:56 +00:00
responseData [ "lastlogin" ] = 0 ;
}
2008-10-06 09:42:31 +00:00
else
2009-06-10 10:59:56 +00:00
{
2008-10-06 09:42:31 +00:00
responseData [ "success" ] = true ;
2009-09-30 16:00:09 +00:00
responseData [ "lastlogin" ] = userInfo . UserProfile . LastLogin ;
2009-06-10 10:59:56 +00:00
}
2008-10-06 09:42:31 +00:00
response . Value = responseData ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[RADMIN] UserExists: failed: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] UserExists: failed: {0}" , e . ToString ( ) ) ;
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2009-01-10 04:16:06 +00:00
responseData [ "error" ] = e . Message ;
2008-10-06 09:42:31 +00:00
response . Value = responseData ;
}
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: UserExists: request complete" ) ;
2008-10-06 09:42:31 +00:00
return response ;
}
2008-07-04 11:13:25 +00:00
/// <summary>
2009-03-12 16:50:44 +00:00
/// Update a user account.
2008-07-04 11:13:25 +00:00
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcUpdateUserAccountMethod takes the following XMLRPC
2009-03-12 16:50:44 +00:00
/// parameters (changeable ones are optional)
2008-07-04 11:13:25 +00:00
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>user_firstname</term>
/// <description>avatar's first name (cannot be changed)</description></item>
/// <item><term>user_lastname</term>
/// <description>avatar's last name (cannot be changed)</description></item>
/// <item><term>user_password</term>
/// <description>avatar's password (changeable)</description></item>
/// <item><term>start_region_x</term>
/// <description>avatar's start region coordinates, X
/// value (changeable)</description></item>
/// <item><term>start_region_y</term>
/// <description>avatar's start region coordinates, Y
/// value (changeable)</description></item>
2009-03-12 16:50:44 +00:00
/// <item><term>about_real_world</term>
/// <description>"about" text of avatar owner (changeable)</description></item>
/// <item><term>about_virtual_world</term>
/// <description>"about" text of avatar (changeable)</description></item>
2008-07-04 11:13:25 +00:00
/// </list>
///
/// XmlRpcCreateUserMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
2009-05-07 12:33:53 +00:00
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcUpdateUserAccountMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-07-04 11:13:25 +00:00
{
m_log . Info ( "[RADMIN]: UpdateUserAccount: new request" ) ;
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2009-03-27 12:49:27 +00:00
lock ( rslock )
2008-12-05 15:28:03 +00:00
{
2008-12-03 19:19:46 +00:00
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2008-08-18 00:39:10 +00:00
2008-12-03 19:19:46 +00:00
// check completeness
2009-03-12 16:50:44 +00:00
checkStringParameters ( request , new string [ ] {
"password" , "user_firstname" ,
"user_lastname" } ) ;
2008-07-04 11:13:25 +00:00
2008-12-03 19:19:46 +00:00
// check password
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2008-07-04 11:13:25 +00:00
2008-12-03 19:19:46 +00:00
// do the job
string firstname = ( string ) requestData [ "user_firstname" ] ;
2009-03-10 20:06:25 +00:00
string lastname = ( string ) requestData [ "user_lastname" ] ;
2008-07-04 11:13:25 +00:00
2008-12-03 19:19:46 +00:00
string passwd = String . Empty ;
2009-03-10 20:06:25 +00:00
uint? regX = null ;
uint? regY = null ;
uint? ulaX = null ;
uint? ulaY = null ;
uint? ulaZ = null ;
uint? usaX = null ;
uint? usaY = null ;
uint? usaZ = null ;
2009-03-12 16:50:44 +00:00
string aboutFirstLive = String . Empty ;
string aboutAvatar = String . Empty ;
2009-03-10 20:06:25 +00:00
if ( requestData . ContainsKey ( "user_password" ) ) passwd = ( string ) requestData [ "user_password" ] ;
if ( requestData . ContainsKey ( "start_region_x" ) )
regX = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_region_x" ] ) ;
if ( requestData . ContainsKey ( "start_region_y" ) )
regY = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_region_y" ] ) ;
if ( requestData . ContainsKey ( "start_lookat_x" ) )
ulaX = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_lookat_x" ] ) ;
if ( requestData . ContainsKey ( "start_lookat_y" ) )
ulaY = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_lookat_y" ] ) ;
if ( requestData . ContainsKey ( "start_lookat_z" ) )
ulaZ = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_lookat_z" ] ) ;
if ( requestData . ContainsKey ( "start_standat_x" ) )
usaX = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_standat_x" ] ) ;
if ( requestData . ContainsKey ( "start_standat_y" ) )
usaY = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_standat_y" ] ) ;
if ( requestData . ContainsKey ( "start_standat_z" ) )
usaZ = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_standat_z" ] ) ;
2009-03-12 16:50:44 +00:00
if ( requestData . ContainsKey ( "about_real_world" ) )
aboutFirstLive = ( string ) requestData [ "about_real_world" ] ;
if ( requestData . ContainsKey ( "about_virtual_world" ) )
aboutAvatar = ( string ) requestData [ "about_virtual_world" ] ;
2008-07-04 11:13:25 +00:00
2009-09-30 16:00:09 +00:00
UserProfileData userProfile
2009-04-17 15:51:58 +00:00
= m_app . CommunicationsManager . UserService . GetUserProfile ( firstname , lastname ) ;
2008-10-30 15:24:52 +00:00
2008-12-03 19:19:46 +00:00
if ( null = = userProfile )
throw new Exception ( String . Format ( "avatar {0} {1} does not exist" , firstname , lastname ) ) ;
2008-07-04 11:13:25 +00:00
2009-06-09 12:11:22 +00:00
if ( ! String . IsNullOrEmpty ( passwd ) )
2008-12-03 19:19:46 +00:00
{
2009-06-09 12:11:22 +00:00
m_log . DebugFormat ( "[RADMIN]: UpdateUserAccount: updating password for avatar {0} {1}" , firstname , lastname ) ;
2008-12-03 19:19:46 +00:00
string md5PasswdHash = Util . Md5Hash ( Util . Md5Hash ( passwd ) + ":" + String . Empty ) ;
userProfile . PasswordHash = md5PasswdHash ;
}
2008-07-04 11:13:25 +00:00
2009-03-10 20:06:25 +00:00
if ( null ! = regX ) userProfile . HomeRegionX = ( uint ) regX ;
if ( null ! = regY ) userProfile . HomeRegionY = ( uint ) regY ;
if ( null ! = usaX ) userProfile . HomeLocationX = ( uint ) usaX ;
if ( null ! = usaY ) userProfile . HomeLocationY = ( uint ) usaY ;
if ( null ! = usaZ ) userProfile . HomeLocationZ = ( uint ) usaZ ;
if ( null ! = ulaX ) userProfile . HomeLookAtX = ( uint ) ulaX ;
if ( null ! = ulaY ) userProfile . HomeLookAtY = ( uint ) ulaY ;
if ( null ! = ulaZ ) userProfile . HomeLookAtZ = ( uint ) ulaZ ;
2009-03-12 16:50:44 +00:00
if ( String . Empty ! = aboutFirstLive ) userProfile . FirstLifeAboutText = aboutFirstLive ;
if ( String . Empty ! = aboutAvatar ) userProfile . AboutText = aboutAvatar ;
2009-04-29 09:35:35 +00:00
// User has been created. Now establish gender and appearance.
2009-05-12 15:12:21 +00:00
updateUserAppearance ( responseData , requestData , userProfile . ID ) ;
2009-04-29 09:35:35 +00:00
2008-12-03 19:19:46 +00:00
if ( ! m_app . CommunicationsManager . UserService . UpdateUserProfile ( userProfile ) )
throw new Exception ( "did not manage to update user profile" ) ;
2008-07-04 11:13:25 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2008-07-04 11:13:25 +00:00
2008-12-03 19:19:46 +00:00
response . Value = responseData ;
2008-07-04 11:13:25 +00:00
2009-03-10 20:06:25 +00:00
m_log . InfoFormat ( "[RADMIN]: UpdateUserAccount: account for user {0} {1} updated, UUID {2}" ,
firstname , lastname ,
2008-12-03 19:19:46 +00:00
userProfile . ID ) ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[RADMIN] UpdateUserAccount: failed: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] UpdateUserAccount: failed: {0}" , e . ToString ( ) ) ;
2008-07-04 11:13:25 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2009-01-10 04:16:06 +00:00
responseData [ "error" ] = e . Message ;
2008-07-04 11:13:25 +00:00
2008-12-03 19:19:46 +00:00
response . Value = responseData ;
}
2008-07-04 11:13:25 +00:00
}
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: UpdateUserAccount: request complete" ) ;
2008-07-04 11:13:25 +00:00
return response ;
}
2009-05-07 12:33:53 +00:00
/// <summary>
/// This method is called by the user-create and user-modify methods to establish
/// or change, the user's appearance. Default avatar names can be specified via
2009-09-30 16:00:09 +00:00
/// the config file, but must correspond to avatars in the default appearance
2009-05-07 12:33:53 +00:00
/// file, or pre-existing in the user database.
/// This should probably get moved into somewhere more core eventually.
/// </summary>
private void updateUserAppearance ( Hashtable responseData , Hashtable requestData , UUID userid )
{
m_log . DebugFormat ( "[RADMIN] updateUserAppearance" ) ;
2009-05-12 13:09:16 +00:00
string dmale = m_config . GetString ( "default_male" , "Default Male" ) ;
string dfemale = m_config . GetString ( "default_female" , "Default Female" ) ;
string dneut = m_config . GetString ( "default_female" , "Default Default" ) ;
2009-05-12 11:51:19 +00:00
string model = String . Empty ;
2009-05-07 12:33:53 +00:00
// Has a gender preference been supplied?
2009-05-12 13:09:16 +00:00
if ( requestData . Contains ( "gender" ) )
{
2009-05-20 01:32:06 +00:00
switch ( ( string ) requestData [ "gender" ] )
2009-05-12 13:09:16 +00:00
{
case "m" :
model = dmale ;
break ;
case "f" :
model = dfemale ;
break ;
case "n" :
default :
model = dneut ;
break ;
}
}
2009-09-30 16:00:09 +00:00
2009-05-07 12:33:53 +00:00
// Has an explicit model been specified?
2009-05-12 13:09:16 +00:00
if ( requestData . Contains ( "model" ) )
2009-05-12 15:12:21 +00:00
{
2009-05-12 13:09:16 +00:00
model = ( string ) requestData [ "model" ] ;
2009-05-12 15:12:21 +00:00
}
2009-05-12 13:09:16 +00:00
// No appearance attributes were set
2009-05-20 01:32:06 +00:00
if ( model = = String . Empty )
2009-05-12 15:12:21 +00:00
{
m_log . DebugFormat ( "[RADMIN] Appearance update not requested" ) ;
2009-05-12 11:51:19 +00:00
return ;
2009-05-12 15:12:21 +00:00
}
2009-05-07 12:33:53 +00:00
m_log . DebugFormat ( "[RADMIN] Setting appearance for avatar {0}, using model {1}" , userid , model ) ;
string [ ] nomens = model . Split ( ) ;
if ( nomens . Length ! = 2 )
{
2009-05-12 11:51:19 +00:00
m_log . WarnFormat ( "[RADMIN] User appearance not set for {0}. Invalid model name : <{1}>" , userid , model ) ;
// nomens = dmodel.Split();
return ;
2009-05-07 12:33:53 +00:00
}
UserProfileData mprof = m_app . CommunicationsManager . UserService . GetUserProfile ( nomens [ 0 ] , nomens [ 1 ] ) ;
// Is this the first time one of the default models has been used? Create it if that is the case
// otherwise default to male.
if ( mprof = = null )
{
2009-05-12 13:09:16 +00:00
m_log . WarnFormat ( "[RADMIN] Requested model ({0}) not found. Appearance unchanged" , model ) ;
2009-05-12 11:51:19 +00:00
return ;
2009-05-07 12:33:53 +00:00
}
2009-09-30 16:00:09 +00:00
// Set current user's appearance. This bit is easy. The appearance structure is populated with
2009-05-12 11:51:19 +00:00
// actual asset ids, however to complete the magic we need to populate the inventory with the
// assets in question.
2009-05-12 15:12:21 +00:00
2009-05-12 11:51:19 +00:00
establishAppearance ( userid , mprof . ID ) ;
2009-05-12 15:12:21 +00:00
2009-05-07 12:33:53 +00:00
m_log . DebugFormat ( "[RADMIN] Finished setting appearance for avatar {0}, using model {1}" ,
2009-05-12 11:51:19 +00:00
userid , model ) ;
2009-05-07 12:33:53 +00:00
}
2009-09-30 16:00:09 +00:00
2009-05-07 12:33:53 +00:00
/// <summary>
/// This method is called by updateAvatarAppearance once any specified model has been
/// ratified, or an appropriate default value has been adopted. The intended prototype
/// is known to exist, as is the target avatar.
/// </summary>
2009-05-12 11:51:19 +00:00
private void establishAppearance ( UUID dest , UUID srca )
2009-05-07 12:33:53 +00:00
{
m_log . DebugFormat ( "[RADMIN] Initializing inventory for {0} from {1}" , dest , srca ) ;
AvatarAppearance ava = m_app . CommunicationsManager . AvatarService . GetUserAppearance ( srca ) ;
// If the model has no associated appearance we're done.
2009-09-30 16:00:09 +00:00
// if (ava == null)
2009-05-12 11:51:19 +00:00
// {
// return new AvatarAppearance();
// }
2009-09-30 16:00:09 +00:00
if ( ava = = null )
2009-05-12 11:51:19 +00:00
return ;
2009-05-07 12:33:53 +00:00
UICallback sic = new UICallback ( ) ;
UICallback dic = new UICallback ( ) ;
2009-06-10 13:18:32 +00:00
IInventoryService iserv = m_app . SceneManager . CurrentOrFirstScene . InventoryService ;
2009-05-07 12:33:53 +00:00
try
{
Dictionary < UUID , UUID > imap = new Dictionary < UUID , UUID > ( ) ;
2009-06-10 13:18:32 +00:00
iserv . GetUserInventory ( dest , dic . callback ) ;
iserv . GetUserInventory ( srca , sic . callback ) ;
2009-05-07 12:33:53 +00:00
dic . GetInventory ( ) ;
sic . GetInventory ( ) ;
if ( sic . OK & & dic . OK )
{
InventoryFolderImpl efolder ;
InventoryFolderImpl srcf = sic . root . FindFolderForType ( 5 ) ;
InventoryFolderImpl dstf = dic . root . FindFolderForType ( 5 ) ;
if ( srcf = = null | | dstf = = null )
throw new Exception ( "Cannot locate clothing folder(s)" ) ;
foreach ( InventoryFolderImpl folder in sic . folders )
{
if ( folder . ParentID = = srcf . ID )
{
efolder = new InventoryFolderImpl ( ) ;
efolder . ID = UUID . Random ( ) ;
efolder . Name = folder . Name ;
efolder . Type = folder . Type ;
efolder . Version = folder . Version ;
efolder . Owner = dest ;
dstf . AddChildFolder ( efolder ) ;
iserv . AddFolder ( efolder ) ;
m_log . DebugFormat ( "[RADMIN] Added outfile folder {0} to folder {1}" , efolder . ID , srcf . ID ) ;
foreach ( InventoryItemBase item in sic . items )
{
if ( item . Folder = = folder . ID )
{
InventoryItemBase dsti = new InventoryItemBase ( ) ;
2009-09-30 16:00:09 +00:00
dsti . ID = UUID . Random ( ) ;
2009-05-07 12:33:53 +00:00
dsti . Name = item . Name ;
dsti . Description = item . Description ;
dsti . InvType = item . InvType ;
dsti . AssetType = item . AssetType ;
dsti . Flags = item . Flags ;
dsti . AssetID = item . AssetID ;
dsti . Folder = efolder . ID ;
dsti . Owner = dest ;
dsti . BasePermissions = item . BasePermissions ;
dsti . NextPermissions = item . NextPermissions ;
dsti . CurrentPermissions = item . CurrentPermissions ;
dsti . GroupPermissions = item . GroupPermissions ;
dsti . EveryOnePermissions = item . EveryOnePermissions ;
iserv . AddItem ( dsti ) ;
imap . Add ( item . ID , dsti . ID ) ;
m_log . DebugFormat ( "[RADMIN] Added item {0} to folder {1}" , dsti . ID , efolder . ID ) ;
}
}
}
}
// Update appearance tables
AvatarWearable [ ] wearables = ava . Wearables ;
for ( int i = 0 ; i < wearables . Length ; i + + )
{
if ( imap . ContainsKey ( wearables [ i ] . ItemID ) )
{
AvatarWearable dw = new AvatarWearable ( ) ;
dw . AssetID = wearables [ i ] . AssetID ;
dw . ItemID = imap [ wearables [ i ] . ItemID ] ;
ava . SetWearable ( i , dw ) ;
}
}
}
else
{
throw new Exception ( "Unable to load both inventories" ) ;
}
2009-05-12 13:09:16 +00:00
m_app . CommunicationsManager . AvatarService . UpdateUserAppearance ( dest , ava ) ;
2009-05-07 12:33:53 +00:00
}
2009-05-12 13:09:16 +00:00
catch ( Exception e )
2009-05-07 12:33:53 +00:00
{
m_log . WarnFormat ( "[RADMIN] Error transferring inventory for {0} : {1}" ,
2009-05-12 11:51:19 +00:00
dest , e . Message ) ;
return ;
2009-05-07 12:33:53 +00:00
}
2009-09-30 16:00:09 +00:00
return ;
2009-05-07 12:33:53 +00:00
}
///<summary>
/// This method is called if a given model avatar name can not be found. If the external
2009-09-30 16:00:09 +00:00
/// file has already been loaded once, then control returns immediately. If not, then it
2009-05-07 12:33:53 +00:00
/// looks for a default appearance file. This file contains XML definitions of zero or more named
2009-09-30 16:00:09 +00:00
/// avatars, each avatar can specify zero or more "outfits". Each outfit is a collection
2009-05-07 12:33:53 +00:00
/// of items that together, define a particular ensemble for the avatar. Each avatar should
/// indicate which outfit is the default, and this outfit will be automatically worn. The
/// other outfits are provided to allow "real" avatars a way to easily change their outfits.
/// </summary>
private bool createDefaultAvatars ( )
{
// Only load once
if ( daload )
{
return false ;
}
2009-05-12 15:12:21 +00:00
m_log . DebugFormat ( "[RADMIN] Creating default avatar entries" ) ;
2009-05-07 12:33:53 +00:00
daload = true ;
// Load processing starts here...
try
{
2009-07-12 17:00:58 +00:00
string dafn = null ;
2009-09-30 16:00:09 +00:00
2009-07-12 17:00:58 +00:00
//m_config may be null if RemoteAdmin configuration secition is missing or disabled in OpenSim.ini
if ( m_config ! = null )
{
dafn = m_config . GetString ( "default_appearance" , "default_appearance.xml" ) ;
}
2009-05-07 12:33:53 +00:00
if ( File . Exists ( dafn ) )
{
XmlDocument doc = new XmlDocument ( ) ;
string name = "*unknown*" ;
string email = "anon@anon" ;
uint regX = 1000 ;
uint regY = 1000 ;
string passwd = UUID . Random ( ) . ToString ( ) ; // No requirement to sign-in.
CachedUserInfo UI ;
UUID ID = UUID . Zero ;
AvatarAppearance mava ;
XmlNodeList avatars ;
XmlNodeList assets ;
XmlNode perms = null ;
bool include = false ;
bool select = false ;
UICallback uic ;
2009-06-10 13:18:32 +00:00
IInventoryService iserv = m_app . SceneManager . CurrentOrFirstScene . InventoryService ;
IAssetService aserv = m_app . SceneManager . CurrentOrFirstScene . AssetService ;
2009-05-07 12:33:53 +00:00
doc . LoadXml ( File . ReadAllText ( dafn ) ) ;
// Load up any included assets. Duplicates will be ignored
assets = doc . GetElementsByTagName ( "RequiredAsset" ) ;
2009-05-20 01:32:06 +00:00
foreach ( XmlNode asset in assets )
2009-05-07 12:33:53 +00:00
{
2009-11-05 21:10:58 +00:00
AssetBase rass = new AssetBase ( UUID . Random ( ) , GetStringAttribute ( asset , "name" , "" ) , SByte . Parse ( GetStringAttribute ( asset , "type" , "" ) ) ) ;
2009-05-07 12:33:53 +00:00
rass . Description = GetStringAttribute ( asset , "desc" , "" ) ;
rass . Local = Boolean . Parse ( GetStringAttribute ( asset , "local" , "" ) ) ;
rass . Temporary = Boolean . Parse ( GetStringAttribute ( asset , "temporary" , "" ) ) ;
rass . Data = Convert . FromBase64String ( asset . InnerText ) ;
2009-05-15 05:00:25 +00:00
aserv . Store ( rass ) ;
2009-05-07 12:33:53 +00:00
}
avatars = doc . GetElementsByTagName ( "Avatar" ) ;
// The document may contain multiple avatars
foreach ( XmlElement avatar in avatars )
{
m_log . DebugFormat ( "[RADMIN] Loading appearance for {0}, gender = {1}" ,
GetStringAttribute ( avatar , "name" , "?" ) , GetStringAttribute ( avatar , "gender" , "?" ) ) ;
// Create the user identified by the avatar entry
try
{
// Only the name value is mandatory
name = GetStringAttribute ( avatar , "name" , name ) ;
email = GetStringAttribute ( avatar , "email" , email ) ;
regX = GetUnsignedAttribute ( avatar , "regx" , regX ) ;
regY = GetUnsignedAttribute ( avatar , "regy" , regY ) ;
passwd = GetStringAttribute ( avatar , "password" , passwd ) ;
string [ ] nomens = name . Split ( ) ;
UI = m_app . CommunicationsManager . UserProfileCacheService . GetUserDetails ( nomens [ 0 ] , nomens [ 1 ] ) ;
if ( null = = UI )
{
ID = m_app . CommunicationsManager . UserAdminService . AddUser ( nomens [ 0 ] , nomens [ 1 ] ,
passwd , email , regX , regY ) ;
if ( ID = = UUID . Zero )
{
m_log . ErrorFormat ( "[RADMIN] Avatar {0} {1} was not created" , nomens [ 0 ] , nomens [ 1 ] ) ;
return false ;
}
}
else
{
ID = UI . UserProfile . ID ;
}
m_log . DebugFormat ( "[RADMIN] User {0}[{1}] created or retrieved" , name , ID ) ;
2009-09-30 16:00:09 +00:00
include = true ;
2009-05-07 12:33:53 +00:00
}
catch ( Exception e )
{
m_log . DebugFormat ( "[RADMIN] Error creating user {0} : {1}" , name , e . Message ) ;
2009-09-30 16:00:09 +00:00
include = false ;
2009-05-07 12:33:53 +00:00
}
// OK, User has been created OK, now we can install the inventory.
// First retrieve the current inventory (the user may already exist)
// Note that althought he inventory is retrieved, the hierarchy has
// not been interpreted at all.
if ( include )
{
uic = new UICallback ( ) ;
// Request the inventory
2009-06-10 13:18:32 +00:00
iserv . GetUserInventory ( ID , uic . callback ) ;
2009-05-07 12:33:53 +00:00
// While the inventory is being fetched, setup for appearance processing
if ( ( mava = m_app . CommunicationsManager . AvatarService . GetUserAppearance ( ID ) ) = = null )
{
mava = new AvatarAppearance ( ) ;
}
2009-09-30 16:00:09 +00:00
2009-05-07 12:33:53 +00:00
{
AvatarWearable [ ] wearables = mava . Wearables ;
for ( int i = 0 ; i < wearables . Length ; i + + )
{
wearables [ i ] = new AvatarWearable ( ) ;
}
}
// Wait for the inventory to arrive
uic . GetInventory ( ) ;
// We can only get dresssed if an inventory is forthcoming
if ( uic . OK )
try
{
2009-09-30 16:00:09 +00:00
m_log . DebugFormat ( "[RADMIN] {0} folders, {1} items in inventory" ,
2009-05-07 12:33:53 +00:00
uic . folders . Count , uic . items . Count ) ;
InventoryFolderImpl cfolder = uic . root . FindFolderForType ( 5 ) ;
// This should *never* be the case
if ( cfolder = = null )
{
cfolder = new InventoryFolderImpl ( ) ;
cfolder . Name = "Clothing" ;
cfolder . Type = 5 ;
cfolder . Version = 1 ;
cfolder . Owner = ID ;
uic . root . AddChildFolder ( cfolder ) ; // make connection
iserv . AddFolder ( cfolder ) ; // store base record
m_log . ErrorFormat ( "[RADMIN] Created clothing folder for {0}/{1}" , name , ID ) ;
}
// OK, now we have an inventory for the user, read in the outfits from the
// default appearance XMl file.
XmlNodeList outfits = avatar . GetElementsByTagName ( "Ensemble" ) ;
InventoryFolderImpl efolder ;
string oname ;
UUID assetid ;
foreach ( XmlElement outfit in outfits )
{
m_log . DebugFormat ( "[RADMIN] Loading outfit {0} for {1}" ,
GetStringAttribute ( outfit , "name" , "?" ) , GetStringAttribute ( avatar , "name" , "?" ) ) ;
oname = GetStringAttribute ( outfit , "name" , "" ) ;
select = ( GetStringAttribute ( outfit , "default" , "no" ) = = "yes" ) ;
efolder = null ;
2009-09-30 16:00:09 +00:00
// If the folder already exists, re-use it. The defaults may
2009-05-07 12:33:53 +00:00
// change over time. Augment only.
foreach ( InventoryFolderImpl folder in uic . folders )
{
if ( folder . Name = = oname & & folder . ParentID = = cfolder . ID )
{
efolder = folder ;
break ;
}
}
// Otherwise, we must create the folder.
if ( efolder = = null )
{
m_log . DebugFormat ( "[RADMIN] Creating outfit folder {0} for {1}" , oname , name ) ;
efolder = new InventoryFolderImpl ( ) ;
efolder . ID = UUID . Random ( ) ;
efolder . Name = oname ;
efolder . Type = 5 ;
efolder . Version = 1 ;
efolder . Owner = ID ;
cfolder . AddChildFolder ( efolder ) ; // make connection
iserv . AddFolder ( efolder ) ; // store base record
m_log . DebugFormat ( "[RADMIN] Adding outfile folder {0} to folder {1}" , efolder . ID , cfolder . ID ) ;
}
// Now get the pieces that make up the outfit
XmlNodeList items = outfit . GetElementsByTagName ( "Item" ) ;
foreach ( XmlElement item in items )
{
assetid = UUID . Zero ;
XmlNodeList children = item . ChildNodes ;
foreach ( XmlNode child in children )
{
switch ( child . Name )
{
case "Permissions" :
m_log . DebugFormat ( "[RADMIN] Permissions specified" ) ;
perms = child ;
break ;
case "Asset" :
assetid = new UUID ( child . InnerText ) ;
break ;
}
}
InventoryItemBase iitem = null ;
2009-09-30 16:00:09 +00:00
if ( ( iitem = efolder . FindAsset ( assetid ) ) = = null )
2009-05-07 12:33:53 +00:00
{
iitem = new InventoryItemBase ( ) ;
2009-09-30 16:00:09 +00:00
iitem . ID = UUID . Random ( ) ;
2009-05-07 12:33:53 +00:00
iitem . Name = GetStringAttribute ( item , "name" , "" ) ;
iitem . Description = GetStringAttribute ( item , "desc" , "" ) ;
iitem . InvType = GetIntegerAttribute ( item , "invtype" , - 1 ) ;
iitem . AssetType = GetIntegerAttribute ( item , "assettype" , - 1 ) ;
iitem . Flags = GetUnsignedAttribute ( item , "flags" , 0 ) ;
iitem . AssetID = assetid ; // associated asset
iitem . Folder = efolder . ID ; // Parent folder
iitem . Owner = ID ; // Agent ID
iitem . BasePermissions = GetUnsignedAttribute ( perms , "base" , 0x7fffffff ) ;
iitem . NextPermissions = GetUnsignedAttribute ( perms , "next" , 0x7fffffff ) ;
iitem . CurrentPermissions = GetUnsignedAttribute ( perms , "current" , 0x7fffffff ) ;
iitem . GroupPermissions = GetUnsignedAttribute ( perms , "group" , 0x7fffffff ) ;
iitem . EveryOnePermissions = GetUnsignedAttribute ( perms , "everyone" , 0x7fffffff ) ;
m_log . DebugFormat ( "[RADMIN] Adding item {0} to folder {1}" , iitem . ID , efolder . ID ) ;
iserv . AddItem ( iitem ) ;
}
// Record whether or not the item is to be initially worn
try
{
if ( select & & ( GetStringAttribute ( item , "wear" , "false" ) = = "true" ) )
{
mava . Wearables [ iitem . Flags ] . ItemID = iitem . ID ;
mava . Wearables [ iitem . Flags ] . AssetID = iitem . AssetID ;
}
}
catch { }
} // foreach item in outfit
m_log . DebugFormat ( "[RADMIN] Outfit {0} load completed" , oname ) ;
} // foreach outfit
m_log . DebugFormat ( "[RADMIN] Inventory update complete for {0}" , name ) ;
m_app . CommunicationsManager . AvatarService . UpdateUserAppearance ( ID , mava ) ;
}
catch ( Exception e )
{
m_log . WarnFormat ( "[RADMIN] Inventory processing incomplete for user {0} : {1}" ,
name , e . Message ) ;
}
else
{
m_log . WarnFormat ( "[RADMIN] Unable to retrieve inventory for {0}[{1}]" ,
name , ID ) ;
// continue to next avatar
}
} // End of include
}
m_log . DebugFormat ( "[RADMIN] Default avatar loading complete" ) ;
}
else
{
m_log . DebugFormat ( "[RADMIN] No default avatar information available" ) ;
return false ;
}
}
catch ( Exception e )
{
m_log . WarnFormat ( "[RADMIN] Exception whilst loading default avatars ; {0}" , e . Message ) ;
return false ;
}
return true ;
}
2009-09-30 16:00:09 +00:00
2008-08-28 09:34:47 +00:00
/// <summary>
/// Load an OAR file into a region..
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcLoadOARMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>filename</term>
/// <description>file name of the OAR file</description></item>
/// <item><term>region_uuid</term>
/// <description>UUID of the region</description></item>
/// <item><term>region_name</term>
/// <description>region name</description></item>
/// </list>
///
/// <code>region_uuid</code> takes precedence over
/// <code>region_name</code> if both are present; one of both
/// must be present.
///
/// XmlRpcLoadOARMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcLoadOARMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-08-28 09:34:47 +00:00
{
m_log . Info ( "[RADMIN]: Received Load OAR Administrator Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Load OAR" ) ;
2009-09-30 16:00:09 +00:00
2008-08-28 09:34:47 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2009-03-27 12:49:27 +00:00
lock ( rslock )
2009-03-10 20:06:25 +00:00
{
2008-12-03 19:19:46 +00:00
try
2008-08-28 09:34:47 +00:00
{
2008-12-03 19:19:46 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2008-08-28 09:34:47 +00:00
2008-12-03 19:19:46 +00:00
// check completeness
2009-03-10 20:06:25 +00:00
foreach ( string p in new string [ ] { "password" , "filename" } )
2008-12-03 19:19:46 +00:00
{
if ( ! requestData . Contains ( p ) )
throw new Exception ( String . Format ( "missing parameter {0}" , p ) ) ;
2009-03-10 20:06:25 +00:00
if ( String . IsNullOrEmpty ( ( string ) requestData [ p ] ) )
2008-12-03 19:19:46 +00:00
throw new Exception ( String . Format ( "parameter {0} is empty" ) ) ;
}
2008-08-28 09:34:47 +00:00
2008-12-03 19:19:46 +00:00
// check password
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2008-12-03 19:19:46 +00:00
2009-03-10 20:06:25 +00:00
string filename = ( string ) requestData [ "filename" ] ;
2008-12-03 19:19:46 +00:00
Scene scene = null ;
if ( requestData . Contains ( "region_uuid" ) )
{
2009-03-10 20:06:25 +00:00
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2008-12-03 19:19:46 +00:00
if ( ! m_app . SceneManager . TryGetScene ( region_uuid , out scene ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
2009-03-10 20:06:25 +00:00
string region_name = ( string ) requestData [ "region_name" ] ;
2008-12-03 19:19:46 +00:00
if ( ! m_app . SceneManager . TryGetScene ( region_name , out scene ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2008-12-19 18:33:03 +00:00
IRegionArchiverModule archiver = scene . RequestModuleInterface < IRegionArchiverModule > ( ) ;
2009-03-10 20:06:25 +00:00
if ( archiver ! = null )
2008-12-19 18:33:03 +00:00
archiver . DearchiveRegion ( filename ) ;
2009-03-10 20:06:25 +00:00
else
2008-12-19 18:33:03 +00:00
throw new Exception ( "Archiver module not present for scene" ) ;
2009-03-10 20:06:25 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "loaded" ] = true ;
2009-03-10 20:06:25 +00:00
2009-01-10 04:16:06 +00:00
response . Value = responseData ;
2008-08-28 09:34:47 +00:00
}
2008-12-03 19:19:46 +00:00
catch ( Exception e )
2008-08-28 09:34:47 +00:00
{
2008-12-03 19:19:46 +00:00
m_log . InfoFormat ( "[RADMIN] LoadOAR: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] LoadOAR: {0}" , e . ToString ( ) ) ;
2008-08-28 09:34:47 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "loaded" ] = false ;
2009-01-10 04:16:06 +00:00
responseData [ "error" ] = e . Message ;
2008-08-28 09:34:47 +00:00
2009-01-10 04:16:06 +00:00
response . Value = responseData ;
2008-12-03 19:19:46 +00:00
}
2008-10-20 17:53:15 +00:00
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Load OAR Administrator Request complete" ) ;
2008-12-03 19:19:46 +00:00
return response ;
2008-10-20 17:53:15 +00:00
}
}
/// <summary>
/// Save a region to an OAR file
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcSaveOARMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>filename</term>
/// <description>file name for the OAR file</description></item>
/// <item><term>region_uuid</term>
/// <description>UUID of the region</description></item>
/// <item><term>region_name</term>
/// <description>region name</description></item>
/// </list>
///
/// <code>region_uuid</code> takes precedence over
/// <code>region_name</code> if both are present; one of both
/// must be present.
///
/// XmlRpcLoadOARMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcSaveOARMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-10-20 17:53:15 +00:00
{
m_log . Info ( "[RADMIN]: Received Save OAR Administrator Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Save OAR" ) ;
2009-09-30 16:00:09 +00:00
2008-10-20 17:53:15 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
// check completeness
2009-03-10 20:06:25 +00:00
foreach ( string p in new string [ ] { "password" , "filename" } )
2008-10-20 17:53:15 +00:00
{
if ( ! requestData . Contains ( p ) )
throw new Exception ( String . Format ( "missing parameter {0}" , p ) ) ;
2009-03-10 20:06:25 +00:00
if ( String . IsNullOrEmpty ( ( string ) requestData [ p ] ) )
2008-10-20 17:53:15 +00:00
throw new Exception ( String . Format ( "parameter {0} is empty" ) ) ;
}
// check password
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2008-10-20 17:53:15 +00:00
2009-03-10 20:06:25 +00:00
string filename = ( string ) requestData [ "filename" ] ;
2008-10-20 17:53:15 +00:00
Scene scene = null ;
if ( requestData . Contains ( "region_uuid" ) )
{
2009-03-10 20:06:25 +00:00
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2008-10-20 17:53:15 +00:00
if ( ! m_app . SceneManager . TryGetScene ( region_uuid , out scene ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
2009-03-10 20:06:25 +00:00
string region_name = ( string ) requestData [ "region_name" ] ;
2008-10-20 17:53:15 +00:00
if ( ! m_app . SceneManager . TryGetScene ( region_name , out scene ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2008-12-19 18:33:03 +00:00
IRegionArchiverModule archiver = scene . RequestModuleInterface < IRegionArchiverModule > ( ) ;
2009-05-18 10:04:28 +00:00
2008-12-19 18:33:03 +00:00
if ( archiver ! = null )
2009-05-18 10:04:28 +00:00
{
scene . EventManager . OnOarFileSaved + = RemoteAdminOarSaveCompleted ;
2008-12-19 18:33:03 +00:00
archiver . ArchiveRegion ( filename ) ;
2009-05-20 01:32:06 +00:00
lock ( SOLock ) Monitor . Wait ( SOLock , 5000 ) ;
2009-05-18 10:04:28 +00:00
scene . EventManager . OnOarFileSaved - = RemoteAdminOarSaveCompleted ;
}
2009-03-10 20:06:25 +00:00
else
throw new Exception ( "Archiver module not present for scene" ) ;
2008-10-20 17:53:15 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "saved" ] = true ;
2008-10-20 17:53:15 +00:00
2009-01-10 04:16:06 +00:00
response . Value = responseData ;
2008-10-20 17:53:15 +00:00
}
catch ( Exception e )
{
m_log . InfoFormat ( "[RADMIN] SaveOAR: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] SaveOAR: {0}" , e . ToString ( ) ) ;
2009-05-07 15:54:13 +00:00
responseData [ "saved" ] = false ;
2009-01-10 04:16:06 +00:00
responseData [ "error" ] = e . Message ;
2008-08-28 09:34:47 +00:00
2009-01-10 04:16:06 +00:00
response . Value = responseData ;
2008-08-28 09:34:47 +00:00
}
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Save OAR Administrator Request complete" ) ;
2008-08-28 09:34:47 +00:00
return response ;
}
2009-05-18 10:04:28 +00:00
private void RemoteAdminOarSaveCompleted ( Guid uuid , string name )
{
m_log . DebugFormat ( "[RADMIN] File processing complete for {0}" , name ) ;
2009-05-20 01:32:06 +00:00
lock ( SOLock ) Monitor . Pulse ( SOLock ) ;
2009-05-18 10:04:28 +00:00
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcLoadXMLMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-02-11 12:58:01 +00:00
{
m_log . Info ( "[RADMIN]: Received Load XML Administrator Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Load XML" ) ;
2008-02-11 12:58:01 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2009-03-10 20:06:25 +00:00
2009-03-27 12:49:27 +00:00
lock ( rslock )
2008-12-05 15:28:03 +00:00
{
2008-12-03 19:19:46 +00:00
try
2008-02-11 12:58:01 +00:00
{
2008-12-03 19:19:46 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2008-05-16 01:22:11 +00:00
2008-12-03 19:19:46 +00:00
// check completeness
2009-03-10 20:06:25 +00:00
foreach ( string p in new string [ ] { "password" , "filename" } )
2008-12-03 19:19:46 +00:00
{
if ( ! requestData . Contains ( p ) )
throw new Exception ( String . Format ( "missing parameter {0}" , p ) ) ;
2009-03-10 20:06:25 +00:00
if ( String . IsNullOrEmpty ( ( string ) requestData [ p ] ) )
2008-12-03 19:19:46 +00:00
throw new Exception ( String . Format ( "parameter {0} is empty" ) ) ;
}
2008-05-16 01:22:11 +00:00
2008-12-03 19:19:46 +00:00
// check password
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2008-04-04 11:48:27 +00:00
2009-03-10 20:06:25 +00:00
string filename = ( string ) requestData [ "filename" ] ;
2008-12-03 19:19:46 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
2009-03-10 20:06:25 +00:00
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2008-12-03 19:19:46 +00:00
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_uuid ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_uuid . ToString ( ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
2009-03-10 20:06:25 +00:00
string region_name = ( string ) requestData [ "region_name" ] ;
2008-12-03 19:19:46 +00:00
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_name ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_name ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2008-04-04 11:48:27 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "switched" ] = true ;
2008-07-14 14:40:39 +00:00
2008-12-03 19:19:46 +00:00
string xml_version = "1" ;
if ( requestData . Contains ( "xml_version" ) )
{
2009-03-10 20:06:25 +00:00
xml_version = ( string ) requestData [ "xml_version" ] ;
2008-12-03 19:19:46 +00:00
}
2008-07-14 14:40:39 +00:00
2008-12-03 19:19:46 +00:00
switch ( xml_version )
{
case "1" :
m_app . SceneManager . LoadCurrentSceneFromXml ( filename , true , new Vector3 ( 0 , 0 , 0 ) ) ;
break ;
case "2" :
m_app . SceneManager . LoadCurrentSceneFromXml2 ( filename ) ;
break ;
default :
throw new Exception ( String . Format ( "unknown Xml{0} format" , xml_version ) ) ;
}
2008-07-14 14:40:39 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "loaded" ] = true ;
2009-01-10 04:16:06 +00:00
response . Value = responseData ;
2008-07-14 14:40:39 +00:00
}
2008-12-03 19:19:46 +00:00
catch ( Exception e )
{
m_log . InfoFormat ( "[RADMIN] LoadXml: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] LoadXml: {0}" , e . ToString ( ) ) ;
2008-07-14 14:40:39 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "loaded" ] = false ;
responseData [ "switched" ] = false ;
2009-01-10 04:16:06 +00:00
responseData [ "error" ] = e . Message ;
2008-04-04 11:48:27 +00:00
2009-01-10 04:16:06 +00:00
response . Value = responseData ;
2008-12-03 19:19:46 +00:00
}
2008-05-16 01:22:11 +00:00
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Load XML Administrator Request complete" ) ;
2008-12-03 19:19:46 +00:00
return response ;
2008-02-11 12:58:01 +00:00
}
2008-01-29 14:43:45 +00:00
}
2008-05-01 18:04:42 +00:00
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcSaveXMLMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-09-12 21:00:05 +00:00
{
m_log . Info ( "[RADMIN]: Received Save XML Administrator Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Save XML" ) ;
2008-09-12 21:00:05 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
2009-03-10 20:06:25 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2008-09-12 21:00:05 +00:00
// check completeness
2009-03-10 20:06:25 +00:00
foreach ( string p in new string [ ] { "password" , "filename" } )
2008-09-12 21:00:05 +00:00
{
if ( ! requestData . Contains ( p ) )
throw new Exception ( String . Format ( "missing parameter {0}" , p ) ) ;
2009-03-10 20:06:25 +00:00
if ( String . IsNullOrEmpty ( ( string ) requestData [ p ] ) )
2008-09-12 21:00:05 +00:00
throw new Exception ( String . Format ( "parameter {0} is empty" ) ) ;
}
// check password
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2008-09-12 21:00:05 +00:00
2009-03-10 20:06:25 +00:00
string filename = ( string ) requestData [ "filename" ] ;
2008-09-12 21:00:05 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
2009-03-10 20:06:25 +00:00
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2008-09-12 21:00:05 +00:00
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_uuid ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_uuid . ToString ( ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
2009-03-10 20:06:25 +00:00
string region_name = ( string ) requestData [ "region_name" ] ;
2008-09-12 21:00:05 +00:00
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_name ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_name ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2009-05-07 15:54:13 +00:00
responseData [ "switched" ] = true ;
2008-09-12 21:00:05 +00:00
string xml_version = "1" ;
if ( requestData . Contains ( "xml_version" ) )
{
2009-03-10 20:06:25 +00:00
xml_version = ( string ) requestData [ "xml_version" ] ;
2008-09-12 21:00:05 +00:00
}
switch ( xml_version )
{
case "1" :
m_app . SceneManager . SaveCurrentSceneToXml ( filename ) ;
break ;
case "2" :
m_app . SceneManager . SaveCurrentSceneToXml2 ( filename ) ;
break ;
default :
throw new Exception ( String . Format ( "unknown Xml{0} format" , xml_version ) ) ;
}
2009-05-07 15:54:13 +00:00
responseData [ "saved" ] = true ;
2008-09-12 21:00:05 +00:00
response . Value = responseData ;
}
catch ( Exception e )
{
2009-01-10 04:16:06 +00:00
m_log . InfoFormat ( "[RADMIN] SaveXml: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN] SaveXml: {0}" , e . ToString ( ) ) ;
2008-09-12 21:00:05 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "saved" ] = false ;
responseData [ "switched" ] = false ;
2008-09-12 21:00:05 +00:00
responseData [ "error" ] = e . Message ;
response . Value = responseData ;
}
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Save XML Administrator Request complete" ) ;
2008-09-12 21:00:05 +00:00
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcRegionQueryMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2008-10-10 01:10:33 +00:00
{
2008-10-20 17:53:15 +00:00
m_log . Info ( "[RADMIN]: Received Query XML Administrator Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Query XML" ) ;
2008-10-10 01:10:33 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2008-10-10 01:10:33 +00:00
2009-03-10 20:06:25 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2008-10-10 01:10:33 +00:00
// check completeness
if ( ! requestData . Contains ( "password" ) )
throw new Exception ( String . Format ( "missing required parameter" ) ) ;
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2008-10-10 01:10:33 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
2009-03-10 20:06:25 +00:00
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2008-10-10 01:10:33 +00:00
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_uuid ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_uuid . ToString ( ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
2009-03-10 20:06:25 +00:00
string region_name = ( string ) requestData [ "region_name" ] ;
2008-10-10 01:10:33 +00:00
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_name ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_name ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
Scene s = m_app . SceneManager . CurrentScene ;
int health = s . GetHealth ( ) ;
responseData [ "health" ] = health ;
response . Value = responseData ;
}
catch ( Exception e )
{
m_log . InfoFormat ( "[RADMIN] RegionQuery: {0}" , e . Message ) ;
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2008-10-10 01:10:33 +00:00
responseData [ "error" ] = e . Message ;
response . Value = responseData ;
}
2009-03-27 12:49:27 +00:00
m_log . Info ( "[RADMIN]: Query XML Administrator Request complete" ) ;
2008-10-10 01:10:33 +00:00
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcConsoleCommandMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
2009-04-15 19:50:14 +00:00
{
m_log . Info ( "[RADMIN]: Received Command XML Administrator Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Command XML" ) ;
2009-04-15 19:50:14 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2009-04-15 19:50:14 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
// check completeness
if ( ! requestData . Contains ( "password" ) )
throw new Exception ( String . Format ( "missing required parameter" ) ) ;
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2009-04-15 19:50:14 +00:00
if ( ! requestData . Contains ( "command" ) )
throw new Exception ( String . Format ( "missing required parameter" ) ) ;
MainConsole . Instance . RunCommand ( requestData [ "command" ] . ToString ( ) ) ;
response . Value = responseData ;
}
catch ( Exception e )
{
m_log . InfoFormat ( "[RADMIN] ConsoleCommand: {0}" , e . Message ) ;
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2009-04-15 19:50:14 +00:00
responseData [ "error" ] = e . Message ;
response . Value = responseData ;
}
m_log . Info ( "[RADMIN]: Command XML Administrator Request complete" ) ;
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcAccessListClear ( XmlRpcRequest request , IPEndPoint remoteClient )
2009-04-27 11:51:25 +00:00
{
m_log . Info ( "[RADMIN]: Received Access List Clear Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Access List Clear" ) ;
2009-09-30 16:00:09 +00:00
2009-04-27 11:51:25 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2009-04-27 11:51:25 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
if ( ! requestData . Contains ( "password" ) )
throw new Exception ( String . Format ( "missing required parameter" ) ) ;
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2009-04-27 11:51:25 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_uuid ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_uuid . ToString ( ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
string region_name = ( string ) requestData [ "region_name" ] ;
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_name ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_name ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
Scene s = m_app . SceneManager . CurrentScene ;
s . RegionInfo . EstateSettings . EstateAccess = new UUID [ ] { } ;
2009-07-03 15:36:47 +00:00
if ( s . RegionInfo . Persistent )
s . RegionInfo . EstateSettings . Save ( ) ;
2009-04-27 11:51:25 +00:00
}
catch ( Exception e )
{
m_log . InfoFormat ( "[RADMIN] Access List Clear Request: {0}" , e . Message ) ;
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2009-04-27 11:51:25 +00:00
responseData [ "error" ] = e . Message ;
}
finally
{
response . Value = responseData ;
}
m_log . Info ( "[RADMIN]: Access List Clear Request complete" ) ;
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcAccessListAdd ( XmlRpcRequest request , IPEndPoint remoteClient )
2009-04-27 11:51:25 +00:00
{
m_log . Info ( "[RADMIN]: Received Access List Add Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Access List Add" ) ;
2009-09-30 16:00:09 +00:00
2009-04-27 11:51:25 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2009-04-27 11:51:25 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
if ( ! requestData . Contains ( "password" ) )
throw new Exception ( String . Format ( "missing required parameter" ) ) ;
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2009-04-27 11:51:25 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_uuid ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_uuid . ToString ( ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
string region_name = ( string ) requestData [ "region_name" ] ;
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_name ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_name ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
int addk = 0 ;
2009-09-30 16:00:09 +00:00
if ( requestData . Contains ( "users" ) )
2009-04-27 11:51:25 +00:00
{
UserProfileCacheService ups = m_app . CommunicationsManager . UserProfileCacheService ;
Scene s = m_app . SceneManager . CurrentScene ;
Hashtable users = ( Hashtable ) requestData [ "users" ] ;
List < UUID > uuids = new List < UUID > ( ) ;
2009-05-07 12:33:53 +00:00
foreach ( string name in users . Values )
2009-04-27 11:51:25 +00:00
{
string [ ] parts = name . Split ( ) ;
2009-05-07 12:33:53 +00:00
CachedUserInfo udata = ups . GetUserDetails ( parts [ 0 ] , parts [ 1 ] ) ;
2009-05-18 15:50:14 +00:00
if ( udata ! = null )
2009-05-07 12:33:53 +00:00
{
uuids . Add ( udata . UserProfile . ID ) ;
2009-05-18 15:50:14 +00:00
m_log . DebugFormat ( "[RADMIN] adding \"{0}\" to ACL for \"{1}\"" , name , s . RegionInfo . RegionName ) ;
2009-05-07 12:33:53 +00:00
}
2009-04-27 11:51:25 +00:00
}
List < UUID > acl = new List < UUID > ( s . RegionInfo . EstateSettings . EstateAccess ) ;
2009-05-07 12:33:53 +00:00
foreach ( UUID uuid in uuids )
2009-04-27 11:51:25 +00:00
{
2009-04-29 09:35:35 +00:00
if ( ! acl . Contains ( uuid ) )
2009-04-27 11:51:25 +00:00
{
acl . Add ( uuid ) ;
addk + + ;
}
}
s . RegionInfo . EstateSettings . EstateAccess = acl . ToArray ( ) ;
2009-07-03 15:36:47 +00:00
if ( s . RegionInfo . Persistent )
s . RegionInfo . EstateSettings . Save ( ) ;
2009-04-27 11:51:25 +00:00
}
responseData [ "added" ] = addk ;
}
catch ( Exception e )
{
m_log . InfoFormat ( "[RADMIN] Access List Add Request: {0}" , e . Message ) ;
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2009-04-27 11:51:25 +00:00
responseData [ "error" ] = e . Message ;
}
finally
{
response . Value = responseData ;
}
m_log . Info ( "[RADMIN]: Access List Add Request complete" ) ;
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcAccessListRemove ( XmlRpcRequest request , IPEndPoint remoteClient )
2009-04-27 11:51:25 +00:00
{
m_log . Info ( "[RADMIN]: Received Access List Remove Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Access List Remove" ) ;
2009-09-30 16:00:09 +00:00
2009-04-27 11:51:25 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2009-04-27 11:51:25 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
if ( ! requestData . Contains ( "password" ) )
throw new Exception ( String . Format ( "missing required parameter" ) ) ;
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2009-04-27 11:51:25 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_uuid ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_uuid . ToString ( ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
string region_name = ( string ) requestData [ "region_name" ] ;
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_name ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_name ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
int remk = 0 ;
2009-09-30 16:00:09 +00:00
if ( requestData . Contains ( "users" ) )
2009-04-27 11:51:25 +00:00
{
UserProfileCacheService ups = m_app . CommunicationsManager . UserProfileCacheService ;
Scene s = m_app . SceneManager . CurrentScene ;
Hashtable users = ( Hashtable ) requestData [ "users" ] ;
List < UUID > uuids = new List < UUID > ( ) ;
2009-04-29 09:35:35 +00:00
foreach ( string name in users . Values )
2009-04-27 11:51:25 +00:00
{
string [ ] parts = name . Split ( ) ;
2009-05-07 12:33:53 +00:00
CachedUserInfo udata = ups . GetUserDetails ( parts [ 0 ] , parts [ 1 ] ) ;
if ( udata ! = null )
{
uuids . Add ( udata . UserProfile . ID ) ;
}
2009-04-27 11:51:25 +00:00
}
List < UUID > acl = new List < UUID > ( s . RegionInfo . EstateSettings . EstateAccess ) ;
2009-04-29 09:35:35 +00:00
foreach ( UUID uuid in uuids )
2009-04-27 11:51:25 +00:00
{
2009-04-29 09:35:35 +00:00
if ( acl . Contains ( uuid ) )
2009-04-27 11:51:25 +00:00
{
acl . Remove ( uuid ) ;
remk + + ;
}
}
s . RegionInfo . EstateSettings . EstateAccess = acl . ToArray ( ) ;
2009-07-03 15:36:47 +00:00
if ( s . RegionInfo . Persistent )
s . RegionInfo . EstateSettings . Save ( ) ;
2009-04-27 11:51:25 +00:00
}
2009-05-22 15:21:49 +00:00
responseData [ "removed" ] = remk ;
2009-04-27 11:51:25 +00:00
}
catch ( Exception e )
{
m_log . InfoFormat ( "[RADMIN] Access List Remove Request: {0}" , e . Message ) ;
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2009-04-27 11:51:25 +00:00
responseData [ "error" ] = e . Message ;
}
finally
{
response . Value = responseData ;
}
m_log . Info ( "[RADMIN]: Access List Remove Request complete" ) ;
return response ;
}
2009-05-23 06:05:20 +00:00
public XmlRpcResponse XmlRpcAccessListList ( XmlRpcRequest request , IPEndPoint remoteClient )
2009-04-27 11:51:25 +00:00
{
m_log . Info ( "[RADMIN]: Received Access List List Request" ) ;
2009-07-12 17:00:58 +00:00
FailIfRemoteAdminDisabled ( "Access List List" ) ;
2009-09-30 16:00:09 +00:00
2009-04-27 11:51:25 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
try
{
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2009-04-27 11:51:25 +00:00
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
if ( ! requestData . Contains ( "password" ) )
throw new Exception ( String . Format ( "missing required parameter" ) ) ;
2009-04-29 09:05:01 +00:00
if ( ! String . IsNullOrEmpty ( m_requiredPassword ) & &
( string ) requestData [ "password" ] ! = m_requiredPassword ) throw new Exception ( "wrong password" ) ;
2009-04-27 11:51:25 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_uuid ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_uuid . ToString ( ) ) ;
}
else if ( requestData . Contains ( "region_name" ) )
{
string region_name = ( string ) requestData [ "region_name" ] ;
if ( ! m_app . SceneManager . TrySetCurrentScene ( region_name ) )
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
m_log . InfoFormat ( "[RADMIN] Switched to region {0}" , region_name ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
Scene s = m_app . SceneManager . CurrentScene ;
UUID [ ] acl = s . RegionInfo . EstateSettings . EstateAccess ;
Hashtable users = new Hashtable ( ) ;
2009-05-07 12:33:53 +00:00
foreach ( UUID user in acl )
2009-04-27 11:51:25 +00:00
{
2009-05-07 12:33:53 +00:00
CachedUserInfo udata = m_app . CommunicationsManager . UserProfileCacheService . GetUserDetails ( user ) ;
if ( udata ! = null )
{
users [ user . ToString ( ) ] = udata . UserProfile . Name ;
}
2009-04-27 11:51:25 +00:00
}
2009-09-30 16:00:09 +00:00
responseData [ "users" ] = users ;
2009-04-27 11:51:25 +00:00
}
catch ( Exception e )
{
m_log . InfoFormat ( "[RADMIN] Acces List List: {0}" , e . Message ) ;
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = false ;
2009-04-27 11:51:25 +00:00
responseData [ "error" ] = e . Message ;
}
finally
{
response . Value = responseData ;
}
m_log . Info ( "[RADMIN]: Access List List Request complete" ) ;
return response ;
}
2009-05-07 12:33:53 +00:00
private static void checkStringParameters ( XmlRpcRequest request , string [ ] param )
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
foreach ( string p in param )
{
if ( ! requestData . Contains ( p ) )
throw new Exception ( String . Format ( "missing string parameter {0}" , p ) ) ;
if ( String . IsNullOrEmpty ( ( string ) requestData [ p ] ) )
throw new Exception ( String . Format ( "parameter {0} is empty" , p ) ) ;
}
}
private static void checkIntegerParams ( XmlRpcRequest request , string [ ] param )
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
foreach ( string p in param )
{
if ( ! requestData . Contains ( p ) )
throw new Exception ( String . Format ( "missing integer parameter {0}" , p ) ) ;
}
}
private bool getBoolean ( Hashtable requestData , string tag , bool defv )
{
// If an access value has been provided, apply it.
if ( requestData . Contains ( tag ) )
{
switch ( ( ( string ) requestData [ tag ] ) . ToLower ( ) )
{
case "true" :
case "t" :
case "1" :
return true ;
case "false" :
case "f" :
case "0" :
return false ;
default :
return defv ;
}
}
else
return defv ;
}
private int GetIntegerAttribute ( XmlNode node , string attr , int dv )
{
try { return Convert . ToInt32 ( node . Attributes [ attr ] . Value ) ; } catch { }
return dv ;
}
private uint GetUnsignedAttribute ( XmlNode node , string attr , uint dv )
{
try { return Convert . ToUInt32 ( node . Attributes [ attr ] . Value ) ; } catch { }
return dv ;
}
private string GetStringAttribute ( XmlNode node , string attr , string dv )
{
try { return node . Attributes [ attr ] . Value ; } catch { }
return dv ;
}
2008-06-27 02:15:57 +00:00
public void Dispose ( )
2008-05-01 18:04:42 +00:00
{
}
2009-05-07 12:33:53 +00:00
}
class UICallback
{
private Object uilock = new Object ( ) ;
internal InventoryFolderImpl root = null ;
internal List < InventoryFolderImpl > folders ;
internal List < InventoryItemBase > items ;
internal bool OK = false ;
public void callback ( ICollection < InventoryFolderImpl > p_folders , ICollection < InventoryItemBase > p_items )
{
lock ( uilock )
{
folders = ( List < InventoryFolderImpl > ) p_folders ;
items = ( List < InventoryItemBase > ) p_items ;
OK = true ;
System . Threading . Monitor . Pulse ( uilock ) ;
}
}
public void GetInventory ( )
{
Dictionary < UUID , InventoryFolderImpl > fmap = new Dictionary < UUID , InventoryFolderImpl > ( ) ;
if ( OK = = false )
{
lock ( uilock )
{
if ( OK = = false )
System . Threading . Monitor . Wait ( uilock ) ;
2009-09-30 16:00:09 +00:00
}
2009-05-07 12:33:53 +00:00
}
// Got the inventory OK. So now merge the content of the default appearance
// file with whatever we already have in-world. For convenience we initialize
// the inventory hierarchy.
// Find root and build an index
foreach ( InventoryFolderImpl folder in folders )
{
if ( folder . ParentID = = UUID . Zero )
{
if ( root = = null )
{
root = folder ;
}
else
{
throw new Exception ( "Multiple root folders found" ) ;
}
}
fmap . Add ( folder . ID , folder ) ;
}
// Hard to continue if the root folder is not there
if ( root = = null )
{
throw new Exception ( "Root folder not found" ) ;
}
// Construct the folder hierarchy
foreach ( InventoryFolderImpl folder in folders )
{
if ( folder . ID ! = root . ID )
{
fmap [ folder . ParentID ] . AddChildFolder ( folder ) ;
}
}
// Find a home for every pre-existing item
foreach ( InventoryItemBase item in items )
{
fmap [ item . Folder ] . Items . Add ( item . ID , item ) ;
}
}
2007-12-03 07:10:08 +00:00
}
2009-03-27 12:49:27 +00:00
}