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 ;
2010-01-11 15:51:33 +00:00
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 ;
2010-01-08 18:43:34 +00:00
using PresenceInfo = OpenSim . Services . Interfaces . PresenceInfo ;
using GridRegion = OpenSim . Services . Interfaces . GridRegion ;
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
2010-08-01 16:21:54 +00:00
private static bool m_defaultAvatarsLoaded = false ;
private static Object m_requestLock = new Object ( ) ;
private static Object m_saveOarLock = new Object ( ) ;
2009-03-27 12:49:27 +00:00
2010-08-01 16:21:54 +00:00
private OpenSimBase m_application ;
private IHttpServer m_httpServer ;
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 ;
2011-10-08 00:23:26 +00:00
private List < string > m_accessIP ;
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-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 ( )
{
2011-04-15 22:54:30 +00:00
m_log . Error ( "[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" ] ;
2011-04-15 22:54:30 +00:00
m_log . Debug ( "[RADMIN]: Remote Admin Plugin Enabled" ) ;
2009-04-29 09:05:01 +00:00
m_requiredPassword = m_config . GetString ( "access_password" , String . Empty ) ;
2010-05-18 17:25:40 +00:00
int port = m_config . GetInt ( "port" , 0 ) ;
2007-12-03 07:10:08 +00:00
2011-10-08 00:23:26 +00:00
string accessIP = m_config . GetString ( "access_ip_addresses" , String . Empty ) ;
m_accessIP = new List < string > ( ) ;
if ( accessIP ! = String . Empty )
{
string [ ] ips = accessIP . Split ( new char [ ] { ',' } ) ;
foreach ( string ip in ips )
{
string current = ip . Trim ( ) ;
if ( current ! = String . Empty )
m_accessIP . Add ( current ) ;
}
}
2010-08-01 16:21:54 +00:00
m_application = openSim ;
2010-11-03 01:11:04 +00:00
string bind_ip_address = m_config . GetString ( "bind_ip_address" , "0.0.0.0" ) ;
2010-11-08 12:48:35 +00:00
IPAddress ipaddr = IPAddress . Parse ( bind_ip_address ) ;
2010-11-03 01:46:45 +00:00
m_httpServer = MainServer . GetHttpServer ( ( uint ) port , ipaddr ) ;
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 ;
2011-04-17 20:43:16 +00:00
availableMethods [ "admin_save_heightmap" ] = XmlRpcSaveHeightmapMethod ;
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 )
{
2010-08-01 16:21:54 +00:00
m_httpServer . AddXmlRPCHandler ( method , availableMethods [ method ] , false ) ;
2009-01-10 04:16:06 +00:00
}
}
else
{
foreach ( string enabledMethod in enabledMethods . Split ( '|' ) )
{
2011-10-04 22:43:41 +00:00
m_httpServer . AddXmlRPCHandler ( enabledMethod , availableMethods [ enabledMethod ] , false ) ;
2009-01-10 04:16:06 +00:00
}
}
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 ( )
{
2010-08-01 16:21:54 +00:00
if ( ! CreateDefaultAvatars ( ) )
2009-05-12 15:12:21 +00:00
{
m_log . Info ( "[RADMIN]: Default avatars not loaded" ) ;
}
2009-02-26 15:21:06 +00:00
}
2011-10-08 00:23:26 +00:00
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 ) ;
}
}
private void FailIfRemoteAdminNotAllowed ( string password , string check_ip_address )
{
if ( m_accessIP . Count > 0 & & ! m_accessIP . Contains ( check_ip_address ) )
{
m_log . WarnFormat ( "[RADMIN]: Unauthorized acess blocked from IP {0}" , check_ip_address ) ;
throw new Exception ( "not authorized" ) ;
}
if ( m_requiredPassword ! = String . Empty & & password ! = m_requiredPassword )
{
m_log . WarnFormat ( "[RADMIN]: Wrong password, blocked access from IP {0}" , check_ip_address ) ;
throw new Exception ( "wrong password" ) ;
}
}
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." ) ;
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ] { "password" , "regionID" } ) ;
2008-04-28 14:08:38 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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
2008-04-28 14:08:38 +00:00
Scene rebootedScene ;
2007-12-21 03:34:51 +00:00
2010-11-25 03:16:52 +00:00
responseData [ "success" ] = false ;
responseData [ "accepted" ] = true ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( regionID , out rebootedScene ) )
2008-04-28 14:08:38 +00:00
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 ;
2010-11-25 03:16:52 +00:00
IRestartModule restartModule = rebootedScene . RequestModuleInterface < IRestartModule > ( ) ;
if ( restartModule ! = null )
{
List < int > times = new List < int > { 30 , 15 } ;
restartModule . ScheduleRestart ( UUID . Zero , "Region will restart in {0}" , times . ToArray ( ) , true ) ;
responseData [ "success" ] = true ;
}
2008-10-09 20:27:41 +00:00
response . Value = responseData ;
2010-11-25 03:16:52 +00:00
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
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Restart region: failed: {0} {1}" , e . Message , e . StackTrace ) ;
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 ] ;
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ] { "password" , "message" } ) ;
2008-04-21 12:42:56 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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
2010-08-01 16:21:54 +00:00
m_application . SceneManager . ForEachScene (
2009-02-13 19:03:18 +00:00
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
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Broadcasting: failed: {0}" , e . Message , e . StackTrace ) ;
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
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Load Terrain: XmlRpc {0}" , request ) ;
2008-07-01 08:50:22 +00:00
// foreach (string k in requestData.Keys)
// {
// m_log.DebugFormat("[RADMIN]: Load Terrain: XmlRpc {0}: >{1}< {2}",
// k, (string)requestData[k], ((string)requestData[k]).Length);
// }
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ] { "password" , "filename" , "regionid" } ) ;
2008-04-21 12:42:56 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2008-04-21 12:42:56 +00:00
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 ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( regionID , out region ) )
2008-04-21 12:42:56 +00:00
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
2010-01-03 21:10:45 +00:00
string fileType = file . Substring ( file . LastIndexOf ( '/' ) + 1 ) ;
terrainModule . LoadFromStream ( fileType , result ) ;
2009-12-04 18:26:58 +00:00
}
}
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
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Terrain Loading: failed: {0} {1}" , e . Message , e . StackTrace ) ;
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 ;
}
2011-04-17 20:43:16 +00:00
public XmlRpcResponse XmlRpcSaveHeightmapMethod ( XmlRpcRequest request , IPEndPoint remoteClient )
{
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
m_log . Info ( "[RADMIN]: Save height maps request started" ) ;
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
m_log . DebugFormat ( "[RADMIN]: Save Terrain: XmlRpc {0}" , request . ToString ( ) ) ;
CheckStringParameters ( request , new string [ ] { "password" , "filename" , "regionid" } ) ;
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2011-04-17 20:43:16 +00:00
string file = ( string ) requestData [ "filename" ] ;
UUID regionID = ( UUID ) ( string ) requestData [ "regionid" ] ;
m_log . InfoFormat ( "[RADMIN]: Terrain Saving: {0}" , file ) ;
responseData [ "accepted" ] = true ;
Scene region = null ;
if ( ! m_application . 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" ) ;
terrainModule . SaveToFile ( file ) ;
responseData [ "success" ] = false ;
response . Value = responseData ;
}
catch ( Exception e )
{
m_log . ErrorFormat ( "[RADMIN]: Terrain Saving: failed: {0}" , e . Message ) ;
m_log . DebugFormat ( "[RADMIN]: Terrain Saving: failed: {0}" , e . ToString ( ) ) ;
responseData [ "success" ] = false ;
responseData [ "error" ] = e . Message ;
}
m_log . Info ( "[RADMIN]: Save height maps request complete" ) ;
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 ] ;
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2008-04-21 12:42:56 +00:00
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
2010-08-01 16:21:54 +00:00
m_application . SceneManager . ForEachScene (
2009-02-13 19:03:18 +00:00
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
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Shutdown: failed: {0} {1}" , e . Message , e . StackTrace ) ;
2008-04-21 12:42:56 +00:00
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 ;
}
2011-04-15 22:54:30 +00:00
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 )
{
2010-08-01 16:21:54 +00:00
m_application . Shutdown ( ) ;
2007-12-03 07:10:08 +00:00
}
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>
2010-08-13 15:08:43 +00:00
/// <item><term>estate_owner_first</term>
/// <description>firstname of estate owner (formerly region master)
/// (required if new estate is being created, optional otherwise)</description></item>
/// <item><term>estate_owner_last</term>
/// <description>lastname of estate owner (formerly region master)
/// (required if new estate is being created, optional otherwise)</description></item>
/// <item><term>estate_owner_uuid</term>
/// <description>explicit UUID to use for estate owner (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>
2010-08-13 15:08:43 +00:00
/// <item><term>estate_name</term>
/// <description>the name of the estate to join (or to create if it doesn't
/// already exist)</description></item>
2010-09-03 21:38:40 +00:00
/// <item><term>region_file</term>
/// <description>The name of the file to persist the region specifications to.
/// If omitted, the region_file_template setting from OpenSim.ini will be used. (optional)</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
2010-08-01 16:21:54 +00:00
lock ( m_requestLock )
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
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ]
2009-03-10 20:06:25 +00:00
{
"password" ,
"region_name" ,
2010-08-13 15:08:43 +00:00
"listen_ip" , "external_address" ,
"estate_name"
2009-03-10 20:06:25 +00:00
} ) ;
2010-08-01 12:09:33 +00:00
CheckIntegerParams ( request , new string [ ] { "region_x" , "region_y" , "listen_port" } ) ;
2007-12-03 07:10:08 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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)
2010-08-01 16:21:54 +00:00
if ( m_regionLimit ! = 0 & & m_application . 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" ] ;
2010-08-01 16:21:54 +00:00
if ( m_application . 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
2010-08-01 16:21:54 +00:00
if ( m_application . 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
2010-08-01 16:21:54 +00:00
if ( m_application . 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" ) ;
2010-08-01 16:21:54 +00:00
if ( m_application . 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
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
{
2010-09-03 21:38:40 +00:00
// default place for region configuration files is in the
2008-12-03 19:19:46 +00:00
// 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.
}
2010-09-03 21:38:40 +00:00
string regionIniPath ;
if ( requestData . Contains ( "region_file" ) )
{
// Make sure that the file to be created is in a subdirectory of the region storage directory.
string requestedFilePath = Path . Combine ( regionConfigPath , ( string ) requestData [ "region_file" ] ) ;
string requestedDirectory = Path . GetDirectoryName ( Path . GetFullPath ( requestedFilePath ) ) ;
if ( requestedDirectory . StartsWith ( Path . GetFullPath ( regionConfigPath ) ) )
regionIniPath = requestedFilePath ;
else
throw new Exception ( "Invalid location for region file." ) ;
}
else
{
regionIniPath = Path . Combine ( regionConfigPath ,
2009-03-10 20:06:25 +00:00
String . Format (
m_config . GetString ( "region_file_template" ,
2010-09-03 21:38:40 +00:00
"{0}x{1}-{2}.ini" ) ,
2009-03-10 20:06:25 +00:00
region . RegionLocX . ToString ( ) ,
region . RegionLocY . ToString ( ) ,
regionID . ToString ( ) ,
region . InternalEndPoint . Port . ToString ( ) ,
region . RegionName . Replace ( " " , "_" ) . Replace ( ":" , "_" ) .
Replace ( "/" , "_" ) ) ) ;
2010-09-03 21:38:40 +00:00
}
2008-12-03 19:19:46 +00:00
m_log . DebugFormat ( "[RADMIN] CreateRegion: persisting region {0} to {1}" ,
2010-09-03 21:38:40 +00:00
region . RegionID , regionIniPath ) ;
region . SaveRegionToFile ( "dynamic region" , regionIniPath ) ;
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
}
2010-08-13 15:08:43 +00:00
// Set the estate
// Check for an existing estate
2010-09-12 21:20:26 +00:00
List < int > estateIDs = m_application . EstateDataService . GetEstates ( ( string ) requestData [ "estate_name" ] ) ;
2010-08-13 15:08:43 +00:00
if ( estateIDs . Count < 1 )
{
UUID userID = UUID . Zero ;
if ( requestData . ContainsKey ( "estate_owner_uuid" ) )
{
// ok, client wants us to use an explicit UUID
// regardless of what the avatar name provided
userID = new UUID ( ( string ) requestData [ "estate_owner_uuid" ] ) ;
2011-09-04 13:46:52 +00:00
// Check that the specified user exists
Scene currentOrFirst = m_application . SceneManager . CurrentOrFirstScene ;
IUserAccountService accountService = currentOrFirst . UserAccountService ;
UserAccount user = accountService . GetUserAccount ( currentOrFirst . RegionInfo . ScopeID , userID ) ;
if ( user = = null )
throw new Exception ( "Specified user was not found." ) ;
2010-08-13 15:08:43 +00:00
}
else if ( requestData . ContainsKey ( "estate_owner_first" ) & requestData . ContainsKey ( "estate_owner_last" ) )
{
// We need to look up the UUID for the avatar with the provided name.
string ownerFirst = ( string ) requestData [ "estate_owner_first" ] ;
string ownerLast = ( string ) requestData [ "estate_owner_last" ] ;
Scene currentOrFirst = m_application . SceneManager . CurrentOrFirstScene ;
IUserAccountService accountService = currentOrFirst . UserAccountService ;
UserAccount user = accountService . GetUserAccount ( currentOrFirst . RegionInfo . ScopeID ,
ownerFirst , ownerLast ) ;
2011-09-04 13:46:52 +00:00
// Check that the specified user exists
if ( user = = null )
throw new Exception ( "Specified user was not found." ) ;
2010-08-13 15:08:43 +00:00
userID = user . PrincipalID ;
}
else
{
throw new Exception ( "Estate owner details not provided." ) ;
}
// Create a new estate with the name provided
2011-09-12 22:08:16 +00:00
region . EstateSettings = m_application . EstateDataService . CreateNewEstate ( ) ;
2010-08-13 15:08:43 +00:00
region . EstateSettings . EstateName = ( string ) requestData [ "estate_name" ] ;
region . EstateSettings . EstateOwner = userID ;
// Persistence does not seem to effect the need to save a new estate
region . EstateSettings . Save ( ) ;
2011-09-12 22:08:16 +00:00
if ( ! m_application . EstateDataService . LinkRegion ( region . RegionID , ( int ) region . EstateSettings . EstateID ) )
throw new Exception ( "Failed to join estate." ) ;
2010-08-13 15:08:43 +00:00
}
else
{
int estateID = estateIDs [ 0 ] ;
2010-09-12 21:20:26 +00:00
2011-09-12 22:08:16 +00:00
region . EstateSettings = m_application . EstateDataService . LoadEstateSettings ( region . RegionID , false ) ;
2010-09-12 21:20:26 +00:00
2011-09-12 22:08:16 +00:00
if ( region . EstateSettings . EstateID ! = estateID )
{
// The region is already part of an estate, but not the one we want.
region . EstateSettings = m_application . EstateDataService . LoadEstateSettings ( estateID ) ;
if ( ! m_application . EstateDataService . LinkRegion ( region . RegionID , estateID ) )
throw new Exception ( "Failed to join estate." ) ;
}
2010-08-13 15:08:43 +00:00
}
2009-04-29 09:05:01 +00:00
// Create the region and perform any initial initialization
2010-08-01 16:21:54 +00:00
IScene newScene ;
m_application . 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.
2010-08-01 16:21:54 +00:00
newScene . RegionInfo . EstateSettings . PublicAccess = GetBoolean ( requestData , "public" , m_publicAccess ) ;
2010-08-13 15:08:43 +00:00
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
2010-08-01 12:09:33 +00:00
if ( GetBoolean ( requestData , "enable_voice" , m_enableVoiceForNewRegions ) )
2009-04-29 09:05:01 +00:00
{
2010-08-01 16:21:54 +00:00
List < ILandObject > parcels = ( ( Scene ) newScene ) . LandChannel . AllParcels ( ) ;
2009-04-29 09:05:01 +00:00
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 ;
2010-08-01 16:21:54 +00:00
( ( 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 )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN] CreateRegion: failed {0} {1}" , e . Message , e . StackTrace ) ;
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" ) ;
2011-10-08 00:23:26 +00:00
2008-09-18 15:44:05 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2010-08-01 16:21:54 +00:00
lock ( m_requestLock )
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 ] ;
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ] { "password" , "region_name" } ) ;
2008-09-18 15:44:05 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( regionName , out scene ) )
2008-12-03 19:19:46 +00:00
throw new Exception ( String . Format ( "region \"{0}\" does not exist" , regionName ) ) ;
2009-03-10 20:06:25 +00:00
2010-08-01 16:21:54 +00:00
m_application . 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 )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN] DeleteRegion: failed {0} {1}" , e . Message , e . StackTrace ) ;
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 ;
2010-08-01 16:21:54 +00:00
lock ( m_requestLock )
2009-07-08 20:53:22 +00:00
{
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ] { "password" } ) ;
2009-09-30 16:00:09 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( regionID , out scene ) )
2009-07-08 20:53:22 +00:00
throw new Exception ( String . Format ( "region \"{0}\" does not exist" , regionID ) ) ;
2010-08-01 16:21:54 +00:00
m_application . CloseRegion ( scene ) ;
2009-07-08 20:53:22 +00:00
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( regionName , out scene ) )
2009-07-08 20:53:22 +00:00
throw new Exception ( String . Format ( "region \"{0}\" does not exist" , regionName ) ) ;
2010-08-01 16:21:54 +00:00
m_application . CloseRegion ( scene ) ;
2009-07-08 20:53:22 +00:00
responseData [ "success" ] = true ;
responseData [ "region_name" ] = regionName ;
response . Value = responseData ;
}
else
throw new Exception ( "no region specified" ) ;
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: CloseRegion: failed {0} {1}" , e . Message , e . StackTrace ) ;
2009-07-08 20:53:22 +00:00
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 ( ) ;
2010-08-01 16:21:54 +00:00
lock ( m_requestLock )
2009-04-29 09:05:01 +00:00
{
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ] { "password" , "region_name" } ) ;
2009-04-29 09:05:01 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2009-04-29 09:05:01 +00:00
Scene scene = null ;
string regionName = ( string ) requestData [ "region_name" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( regionName , out scene ) )
2009-04-29 09:05:01 +00:00
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 =
2010-08-01 12:09:33 +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" ) )
{
2010-08-01 12:09:33 +00:00
bool enableVoice = GetBoolean ( requestData , "enable_voice" , true ) ;
2009-04-29 09:05:01 +00:00
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 )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN] ModifyRegion: failed {0} {1}" , e . Message , e . StackTrace ) ;
2009-04-29 09:05:01 +00:00
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
2010-08-01 16:21:54 +00:00
lock ( m_requestLock )
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
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ]
2009-03-10 20:06:25 +00:00
{
"password" , "user_firstname" ,
"user_lastname" , "user_password" ,
} ) ;
2010-08-01 12:09:33 +00:00
CheckIntegerParams ( request , new string [ ] { "start_region_x" , "start_region_y" } ) ;
2008-04-04 11:48:27 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2008-04-04 11:48:27 +00:00
2008-12-03 19:19:46 +00:00
// do the job
2010-08-01 16:21:54 +00:00
string firstName = ( string ) requestData [ "user_firstname" ] ;
string lastName = ( string ) requestData [ "user_lastname" ] ;
string password = ( string ) requestData [ "user_password" ] ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
uint regionXLocation = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_region_x" ] ) ;
uint regionYLocation = 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
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentOrFirstScene ;
2010-06-13 20:45:39 +00:00
UUID scopeID = scene . RegionInfo . ScopeID ;
2008-11-23 03:38:40 +00:00
2010-08-01 16:21:54 +00:00
UserAccount account = CreateUser ( scopeID , firstName , lastName , password , email ) ;
2010-01-08 18:43:34 +00:00
2010-06-13 20:45:39 +00:00
if ( null = = account )
2009-03-10 20:06:25 +00:00
throw new Exception ( String . Format ( "failed to create new user {0} {1}" ,
2010-08-01 16:21:54 +00:00
firstName , lastName ) ) ;
2008-11-23 03:38:40 +00:00
2010-06-13 20:45:39 +00:00
// Set home position
2010-04-06 02:56:03 +00:00
2010-06-13 20:45:39 +00:00
GridRegion home = scene . GridService . GetRegionByPosition ( scopeID ,
2010-08-01 16:21:54 +00:00
( int ) ( regionXLocation * Constants . RegionSize ) , ( int ) ( regionYLocation * Constants . RegionSize ) ) ;
2010-06-13 20:45:39 +00:00
if ( null = = home ) {
2010-08-01 16:21:54 +00:00
m_log . WarnFormat ( "[RADMIN]: Unable to set home region for newly created user account {0} {1}" , firstName , lastName ) ;
2010-06-13 20:45:39 +00:00
} else {
scene . GridUserService . SetHome ( account . PrincipalID . ToString ( ) , home . RegionID , new Vector3 ( 128 , 128 , 0 ) , new Vector3 ( 0 , 1 , 0 ) ) ;
2010-08-01 16:21:54 +00:00
m_log . DebugFormat ( "[RADMIN]: Set home region {0} for updated user account {1} {2}" , home . RegionID , firstName , lastName ) ;
2010-06-13 20:45:39 +00:00
}
2010-01-08 18:43:34 +00:00
2009-05-07 12:33:53 +00:00
// Establish the avatar's initial appearance
2009-05-12 15:12:21 +00:00
2010-08-01 12:09:33 +00:00
UpdateUserAppearance ( responseData , requestData , account . PrincipalID ) ;
2009-04-29 09:35:35 +00:00
2009-05-07 15:54:13 +00:00
responseData [ "success" ] = true ;
2010-01-08 18:43:34 +00:00
responseData [ "avatar_uuid" ] = account . PrincipalID . 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
2010-08-01 16:21:54 +00:00
m_log . InfoFormat ( "[RADMIN]: CreateUser: User {0} {1} created, UUID {2}" , firstName , lastName , account . PrincipalID ) ;
2008-12-03 19:19:46 +00:00
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: CreateUser: failed: {0} {1}" , e . Message , e . StackTrace ) ;
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
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ] { "password" , "user_firstname" , "user_lastname" } ) ;
2009-03-10 20:06:25 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2010-08-01 16:21:54 +00:00
string firstName = ( string ) requestData [ "user_firstname" ] ;
string lastName = ( string ) requestData [ "user_lastname" ] ;
2009-03-10 20:06:25 +00:00
2010-08-01 16:21:54 +00:00
responseData [ "user_firstname" ] = firstName ;
responseData [ "user_lastname" ] = lastName ;
2008-10-06 09:42:31 +00:00
2010-08-01 16:21:54 +00:00
UUID scopeID = m_application . SceneManager . CurrentOrFirstScene . RegionInfo . ScopeID ;
2010-01-08 18:43:34 +00:00
2010-08-01 16:21:54 +00:00
UserAccount account = m_application . SceneManager . CurrentOrFirstScene . UserAccountService . GetUserAccount ( scopeID , firstName , lastName ) ;
2010-01-08 18:43:34 +00:00
if ( null = = account )
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
{
2010-08-01 16:21:54 +00:00
GridUserInfo userInfo = m_application . SceneManager . CurrentOrFirstScene . GridUserService . GetGridUserInfo ( account . PrincipalID . ToString ( ) ) ;
if ( userInfo ! = null )
responseData [ "lastlogin" ] = userInfo . Login ;
2010-01-08 18:43:34 +00:00
else
responseData [ "lastlogin" ] = 0 ;
2008-10-06 09:42:31 +00:00
responseData [ "success" ] = true ;
2009-06-10 10:59:56 +00:00
}
2008-10-06 09:42:31 +00:00
response . Value = responseData ;
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: UserExists: failed: {0} {1}" , e . Message , e . StackTrace ) ;
2008-10-06 09:42:31 +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-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>
2010-06-13 20:45:39 +00:00
/// <item><term>about_real_world (not implemented yet)</term>
2009-03-12 16:50:44 +00:00
/// <description>"about" text of avatar owner (changeable)</description></item>
2010-06-13 20:45:39 +00:00
/// <item><term>about_virtual_world (not implemented yet)</term>
2009-03-12 16:50:44 +00:00
/// <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>
2010-06-13 20:45:39 +00:00
/// <item><term>avatar_uuid</term>
/// <description>UUID of the updated avatar
/// account; UUID.Zero if failed.
/// </description></item>
2008-07-04 11:13:25 +00:00
/// </list>
/// </remarks>
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" ) ;
2010-01-08 18:43:34 +00:00
m_log . Warn ( "[RADMIN]: This method needs update for 0.7" ) ;
2010-06-13 20:45:39 +00:00
FailIfRemoteAdminDisabled ( "UpdateUserAccount" ) ;
2008-07-04 11:13:25 +00:00
XmlRpcResponse response = new XmlRpcResponse ( ) ;
Hashtable responseData = new Hashtable ( ) ;
2010-08-01 16:21:54 +00:00
lock ( m_requestLock )
2010-06-13 20:45:39 +00:00
{
try
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2010-01-08 18:43:34 +00:00
2010-06-13 20:45:39 +00:00
// check completeness
2010-08-01 12:09:33 +00:00
CheckStringParameters ( request , new string [ ] {
2010-06-13 20:45:39 +00:00
"password" , "user_firstname" ,
"user_lastname" } ) ;
2010-01-08 18:43:34 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2010-01-08 18:43:34 +00:00
2010-06-13 20:45:39 +00:00
// do the job
2010-08-01 16:21:54 +00:00
string firstName = ( string ) requestData [ "user_firstname" ] ;
string lastName = ( string ) requestData [ "user_lastname" ] ;
2010-01-08 18:43:34 +00:00
2010-08-01 16:21:54 +00:00
string password = String . Empty ;
uint? regionXLocation = null ;
uint? regionYLocation = null ;
2010-01-08 18:43:34 +00:00
// uint? ulaX = null;
// uint? ulaY = null;
// uint? ulaZ = null;
// uint? usaX = null;
// uint? usaY = null;
// uint? usaZ = null;
// string aboutFirstLive = String.Empty;
// string aboutAvatar = String.Empty;
2010-08-01 16:21:54 +00:00
if ( requestData . ContainsKey ( "user_password" ) ) password = ( string ) requestData [ "user_password" ] ;
2010-06-13 20:45:39 +00:00
if ( requestData . ContainsKey ( "start_region_x" ) )
2010-08-01 16:21:54 +00:00
regionXLocation = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_region_x" ] ) ;
2010-06-13 20:45:39 +00:00
if ( requestData . ContainsKey ( "start_region_y" ) )
2010-08-01 16:21:54 +00:00
regionYLocation = Convert . ToUInt32 ( ( Int32 ) requestData [ "start_region_y" ] ) ;
2010-01-08 18:43:34 +00:00
// 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"]);
// if (requestData.ContainsKey("about_real_world"))
// aboutFirstLive = (string)requestData["about_real_world"];
// if (requestData.ContainsKey("about_virtual_world"))
// aboutAvatar = (string)requestData["about_virtual_world"];
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentOrFirstScene ;
2010-06-13 20:45:39 +00:00
UUID scopeID = scene . RegionInfo . ScopeID ;
2010-08-01 16:21:54 +00:00
UserAccount account = scene . UserAccountService . GetUserAccount ( scopeID , firstName , lastName ) ;
2010-01-08 18:43:34 +00:00
2010-06-13 20:45:39 +00:00
if ( null = = account )
2010-08-01 16:21:54 +00:00
throw new Exception ( String . Format ( "avatar {0} {1} does not exist" , firstName , lastName ) ) ;
2010-01-08 18:43:34 +00:00
2010-08-01 16:21:54 +00:00
if ( ! String . IsNullOrEmpty ( password ) )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
m_log . DebugFormat ( "[RADMIN]: UpdateUserAccount: updating password for avatar {0} {1}" , firstName , lastName ) ;
ChangeUserPassword ( firstName , lastName , password ) ;
2010-06-13 20:45:39 +00:00
}
2010-01-08 18:43:34 +00:00
// 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;
// if (String.Empty != aboutFirstLive) userProfile.FirstLifeAboutText = aboutFirstLive;
// if (String.Empty != aboutAvatar) userProfile.AboutText = aboutAvatar;
2010-06-13 20:45:39 +00:00
// Set home position
2010-01-08 18:43:34 +00:00
2010-08-01 16:21:54 +00:00
if ( ( null ! = regionXLocation ) & & ( null ! = regionYLocation ) )
2010-06-13 20:45:39 +00:00
{
GridRegion home = scene . GridService . GetRegionByPosition ( scopeID ,
2010-08-01 16:21:54 +00:00
( int ) ( regionXLocation * Constants . RegionSize ) , ( int ) ( regionYLocation * Constants . RegionSize ) ) ;
2010-06-13 20:45:39 +00:00
if ( null = = home ) {
2010-08-01 16:21:54 +00:00
m_log . WarnFormat ( "[RADMIN]: Unable to set home region for updated user account {0} {1}" , firstName , lastName ) ;
2010-06-13 20:45:39 +00:00
} else {
scene . GridUserService . SetHome ( account . PrincipalID . ToString ( ) , home . RegionID , new Vector3 ( 128 , 128 , 0 ) , new Vector3 ( 0 , 1 , 0 ) ) ;
2010-08-01 16:21:54 +00:00
m_log . DebugFormat ( "[RADMIN]: Set home region {0} for updated user account {1} {2}" , home . RegionID , firstName , lastName ) ;
2010-06-13 20:45:39 +00:00
}
}
2010-01-08 18:43:34 +00:00
2010-06-13 20:45:39 +00:00
// User has been created. Now establish gender and appearance.
2010-01-08 18:43:34 +00:00
2010-08-01 12:09:33 +00:00
UpdateUserAppearance ( responseData , requestData , account . PrincipalID ) ;
2010-01-08 18:43:34 +00:00
2010-06-13 20:45:39 +00:00
responseData [ "success" ] = true ;
responseData [ "avatar_uuid" ] = account . PrincipalID . ToString ( ) ;
2010-01-08 18:43:34 +00:00
2010-06-13 20:45:39 +00:00
response . Value = responseData ;
2010-01-08 18:43:34 +00:00
2010-06-13 20:45:39 +00:00
m_log . InfoFormat ( "[RADMIN]: UpdateUserAccount: account for user {0} {1} updated, UUID {2}" ,
2010-08-01 16:21:54 +00:00
firstName , lastName ,
2010-06-13 20:45:39 +00:00
account . PrincipalID ) ;
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN] UpdateUserAccount: failed: {0} {1}" , e . Message , e . StackTrace ) ;
2008-07-04 11:13:25 +00:00
2010-06-13 20:45:39 +00:00
responseData [ "success" ] = false ;
responseData [ "avatar_uuid" ] = UUID . Zero . ToString ( ) ;
responseData [ "error" ] = e . Message ;
response . Value = responseData ;
}
2011-04-15 22:54:30 +00:00
2010-06-13 20:45:39 +00:00
m_log . Info ( "[RADMIN]: UpdateUserAccount: request complete" ) ;
return response ;
}
2008-07-04 11:13:25 +00:00
}
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>
2010-08-01 12:09:33 +00:00
private void UpdateUserAppearance ( Hashtable responseData , Hashtable requestData , UUID userid )
2009-05-07 12:33:53 +00:00
{
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: updateUserAppearance" ) ;
2009-05-07 12:33:53 +00:00
2010-08-01 16:21:54 +00:00
string defaultMale = m_config . GetString ( "default_male" , "Default Male" ) ;
string defaultFemale = m_config . GetString ( "default_female" , "Default Female" ) ;
string defaultNeutral = 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
2010-06-13 20:45:39 +00:00
// Has a gender preference been supplied?
if ( requestData . Contains ( "gender" ) )
{
switch ( ( string ) requestData [ "gender" ] )
{
case "m" :
case "male" :
2010-08-01 16:21:54 +00:00
model = defaultMale ;
2010-06-13 20:45:39 +00:00
break ;
case "f" :
case "female" :
2010-08-01 16:21:54 +00:00
model = defaultFemale ;
2010-06-13 20:45:39 +00:00
break ;
case "n" :
case "neutral" :
default :
2010-08-01 16:21:54 +00:00
model = defaultNeutral ;
2010-06-13 20:45:39 +00:00
break ;
}
}
// Has an explicit model been specified?
if ( requestData . Contains ( "model" ) & & ( String . IsNullOrEmpty ( ( string ) requestData [ "gender" ] ) ) )
{
model = ( string ) requestData [ "model" ] ;
}
// No appearance attributes were set
if ( String . IsNullOrEmpty ( model ) )
{
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Appearance update not requested" ) ;
2010-06-13 20:45:39 +00:00
return ;
}
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Setting appearance for avatar {0}, using model <{1}>" , userid , model ) ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
string [ ] modelSpecifiers = model . Split ( ) ;
if ( modelSpecifiers . Length ! = 2 )
2010-06-13 20:45:39 +00:00
{
2011-04-15 22:54:30 +00:00
m_log . WarnFormat ( "[RADMIN]: User appearance not set for {0}. Invalid model name : <{1}>" , userid , model ) ;
2010-08-01 16:21:54 +00:00
// modelSpecifiers = dmodel.Split();
2010-06-13 20:45:39 +00:00
return ;
}
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentOrFirstScene ;
2010-06-13 20:45:39 +00:00
UUID scopeID = scene . RegionInfo . ScopeID ;
2010-08-01 16:21:54 +00:00
UserAccount modelProfile = scene . UserAccountService . GetUserAccount ( scopeID , modelSpecifiers [ 0 ] , modelSpecifiers [ 1 ] ) ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
if ( modelProfile = = null )
2010-06-13 20:45:39 +00:00
{
2011-04-15 22:54:30 +00:00
m_log . WarnFormat ( "[RADMIN]: Requested model ({0}) not found. Appearance unchanged" , model ) ;
2010-06-13 20:45:39 +00:00
return ;
}
// Set current user's appearance. This bit is easy. The appearance structure is populated with
// actual asset ids, however to complete the magic we need to populate the inventory with the
// assets in question.
2010-08-01 16:21:54 +00:00
EstablishAppearance ( userid , modelProfile . PrincipalID ) ;
2009-05-12 15:12:21 +00:00
2011-04-15 22:54:30 +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>
2010-08-01 16:21:54 +00:00
private void EstablishAppearance ( UUID destination , UUID source )
2009-05-07 12:33:53 +00:00
{
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Initializing inventory for {0} from {1}" , destination , source ) ;
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentOrFirstScene ;
2009-05-07 12:33:53 +00:00
// If the model has no associated appearance we're done.
2010-10-20 23:17:54 +00:00
AvatarAppearance avatarAppearance = scene . AvatarService . GetAppearance ( source ) ;
2010-08-01 16:21:54 +00:00
if ( avatarAppearance = = null )
2009-05-12 11:51:19 +00:00
return ;
2009-05-07 12:33:53 +00:00
2010-06-13 20:45:39 +00:00
// Simple appearance copy or copy Clothing and Bodyparts folders?
bool copyFolders = m_config . GetBoolean ( "copy_folders" , false ) ;
if ( ! copyFolders )
{
// Simple copy of wearables and appearance update
try
{
2010-08-01 16:21:54 +00:00
CopyWearablesAndAttachments ( destination , source , avatarAppearance ) ;
2009-05-07 12:33:53 +00:00
2010-10-20 23:17:54 +00:00
scene . AvatarService . SetAppearance ( destination , avatarAppearance ) ;
2010-06-13 20:45:39 +00:00
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . WarnFormat ( "[RADMIN]: Error transferring appearance for {0} : {1}" ,
2010-08-01 16:21:54 +00:00
destination , e . Message ) ;
2010-06-13 20:45:39 +00:00
}
return ;
}
// Copy Clothing and Bodypart folders and appearance update
2009-05-07 12:33:53 +00:00
try
{
2010-08-01 16:21:54 +00:00
Dictionary < UUID , UUID > inventoryMap = new Dictionary < UUID , UUID > ( ) ;
CopyInventoryFolders ( destination , source , AssetType . Clothing , inventoryMap , avatarAppearance ) ;
CopyInventoryFolders ( destination , source , AssetType . Bodypart , inventoryMap , avatarAppearance ) ;
2009-05-07 12:33:53 +00:00
2010-08-01 16:21:54 +00:00
AvatarWearable [ ] wearables = avatarAppearance . Wearables ;
2009-05-07 12:33:53 +00:00
2010-06-13 20:45:39 +00:00
for ( int i = 0 ; i < wearables . Length ; i + + )
2009-05-07 12:33:53 +00:00
{
2010-10-29 23:41:36 +00:00
if ( inventoryMap . ContainsKey ( wearables [ i ] [ 0 ] . ItemID ) )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
AvatarWearable wearable = new AvatarWearable ( ) ;
2010-10-29 23:41:36 +00:00
wearable . Wear ( inventoryMap [ wearables [ i ] [ 0 ] . ItemID ] ,
wearables [ i ] [ 0 ] . AssetID ) ;
2010-08-01 16:21:54 +00:00
avatarAppearance . SetWearable ( i , wearable ) ;
2010-06-13 20:45:39 +00:00
}
}
2010-10-20 23:17:54 +00:00
scene . AvatarService . SetAppearance ( destination , avatarAppearance ) ;
2010-06-13 20:45:39 +00:00
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . WarnFormat ( "[RADMIN]: Error transferring appearance for {0} : {1}" ,
2010-08-01 16:21:54 +00:00
destination , e . Message ) ;
2010-06-13 20:45:39 +00:00
}
2009-05-07 12:33:53 +00:00
2010-06-13 20:45:39 +00:00
return ;
}
/// <summary>
/// This method is called by establishAppearance to do a copy all inventory items
/// worn or attached to the Clothing inventory folder of the receiving avatar.
/// In parallel the avatar wearables and attachments are updated.
/// </summary>
2010-08-01 16:21:54 +00:00
private void CopyWearablesAndAttachments ( UUID destination , UUID source , AvatarAppearance avatarAppearance )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
IInventoryService inventoryService = m_application . SceneManager . CurrentOrFirstScene . InventoryService ;
2009-05-07 12:33:53 +00:00
2010-06-13 20:45:39 +00:00
// Get Clothing folder of receiver
2010-08-01 16:21:54 +00:00
InventoryFolderBase destinationFolder = inventoryService . GetFolderForType ( destination , AssetType . Clothing ) ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
if ( destinationFolder = = null )
2010-06-13 20:45:39 +00:00
throw new Exception ( "Cannot locate folder(s)" ) ;
// Missing destination folder? This should *never* be the case
2010-08-01 16:21:54 +00:00
if ( destinationFolder . Type ! = ( short ) AssetType . Clothing )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
destinationFolder = new InventoryFolderBase ( ) ;
2010-08-13 15:08:43 +00:00
2010-08-01 16:21:54 +00:00
destinationFolder . ID = UUID . Random ( ) ;
destinationFolder . Name = "Clothing" ;
destinationFolder . Owner = destination ;
destinationFolder . Type = ( short ) AssetType . Clothing ;
destinationFolder . ParentID = inventoryService . GetRootFolder ( destination ) . ID ;
destinationFolder . Version = 1 ;
inventoryService . AddFolder ( destinationFolder ) ; // store base record
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Created folder for destination {0}" , source ) ;
2010-06-13 20:45:39 +00:00
}
// Wearables
2010-08-01 16:21:54 +00:00
AvatarWearable [ ] wearables = avatarAppearance . Wearables ;
2010-06-13 20:45:39 +00:00
AvatarWearable wearable ;
2011-10-08 00:23:26 +00:00
for ( int i = 0 ; i < wearables . Length ; i + + )
2010-06-13 20:45:39 +00:00
{
wearable = wearables [ i ] ;
2010-10-29 23:41:36 +00:00
if ( wearable [ 0 ] . ItemID ! = UUID . Zero )
2010-06-13 20:45:39 +00:00
{
// Get inventory item and copy it
2010-10-29 23:41:36 +00:00
InventoryItemBase item = new InventoryItemBase ( wearable [ 0 ] . ItemID , source ) ;
2010-08-01 16:21:54 +00:00
item = inventoryService . GetItem ( item ) ;
2010-06-13 20:45:39 +00:00
if ( item ! = null )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
InventoryItemBase destinationItem = new InventoryItemBase ( UUID . Random ( ) , destination ) ;
destinationItem . Name = item . Name ;
2011-04-15 22:23:37 +00:00
destinationItem . Owner = destination ;
2010-08-01 16:21:54 +00:00
destinationItem . Description = item . Description ;
destinationItem . InvType = item . InvType ;
destinationItem . CreatorId = item . CreatorId ;
destinationItem . CreatorIdAsUuid = item . CreatorIdAsUuid ;
2010-11-22 01:19:24 +00:00
destinationItem . CreatorData = item . CreatorData ;
2010-08-01 16:21:54 +00:00
destinationItem . NextPermissions = item . NextPermissions ;
destinationItem . CurrentPermissions = item . CurrentPermissions ;
destinationItem . BasePermissions = item . BasePermissions ;
destinationItem . EveryOnePermissions = item . EveryOnePermissions ;
destinationItem . GroupPermissions = item . GroupPermissions ;
destinationItem . AssetType = item . AssetType ;
destinationItem . AssetID = item . AssetID ;
destinationItem . GroupID = item . GroupID ;
destinationItem . GroupOwned = item . GroupOwned ;
destinationItem . SalePrice = item . SalePrice ;
destinationItem . SaleType = item . SaleType ;
destinationItem . Flags = item . Flags ;
destinationItem . CreationDate = item . CreationDate ;
destinationItem . Folder = destinationFolder . ID ;
2011-04-15 22:23:37 +00:00
ApplyNextOwnerPermissions ( destinationItem ) ;
2010-08-01 16:21:54 +00:00
2010-09-04 00:36:26 +00:00
m_application . SceneManager . CurrentOrFirstScene . AddInventoryItem ( destinationItem ) ;
m_log . DebugFormat ( "[RADMIN]: Added item {0} to folder {1}" , destinationItem . ID , destinationFolder . ID ) ;
2010-06-13 20:45:39 +00:00
// Wear item
2010-08-01 16:21:54 +00:00
AvatarWearable newWearable = new AvatarWearable ( ) ;
2010-10-29 23:41:36 +00:00
newWearable . Wear ( destinationItem . ID , wearable [ 0 ] . AssetID ) ;
2010-08-01 16:21:54 +00:00
avatarAppearance . SetWearable ( i , newWearable ) ;
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
else
2009-05-07 12:33:53 +00:00
{
2010-10-29 23:41:36 +00:00
m_log . WarnFormat ( "[RADMIN]: Error transferring {0} to folder {1}" , wearable [ 0 ] . ItemID , destinationFolder . ID ) ;
2009-05-07 12:33:53 +00:00
}
}
2010-06-13 20:45:39 +00:00
}
// Attachments
2010-10-21 23:48:58 +00:00
List < AvatarAttachment > attachments = avatarAppearance . GetAttachments ( ) ;
2010-06-13 20:45:39 +00:00
2010-10-21 23:48:58 +00:00
foreach ( AvatarAttachment attachment in attachments )
2010-06-13 20:45:39 +00:00
{
2010-10-21 23:48:58 +00:00
int attachpoint = attachment . AttachPoint ;
UUID itemID = attachment . ItemID ;
2010-06-13 20:45:39 +00:00
if ( itemID ! = UUID . Zero )
2009-05-07 12:33:53 +00:00
{
2010-06-13 20:45:39 +00:00
// Get inventory item and copy it
2010-08-01 16:21:54 +00:00
InventoryItemBase item = new InventoryItemBase ( itemID , source ) ;
item = inventoryService . GetItem ( item ) ;
2010-06-13 20:45:39 +00:00
if ( item ! = null )
{
2010-08-01 16:21:54 +00:00
InventoryItemBase destinationItem = new InventoryItemBase ( UUID . Random ( ) , destination ) ;
destinationItem . Name = item . Name ;
2011-04-15 22:23:37 +00:00
destinationItem . Owner = destination ;
2010-08-01 16:21:54 +00:00
destinationItem . Description = item . Description ;
destinationItem . InvType = item . InvType ;
destinationItem . CreatorId = item . CreatorId ;
destinationItem . CreatorIdAsUuid = item . CreatorIdAsUuid ;
2010-11-22 01:19:24 +00:00
destinationItem . CreatorData = item . CreatorData ;
2010-08-01 16:21:54 +00:00
destinationItem . NextPermissions = item . NextPermissions ;
destinationItem . CurrentPermissions = item . CurrentPermissions ;
destinationItem . BasePermissions = item . BasePermissions ;
destinationItem . EveryOnePermissions = item . EveryOnePermissions ;
destinationItem . GroupPermissions = item . GroupPermissions ;
destinationItem . AssetType = item . AssetType ;
destinationItem . AssetID = item . AssetID ;
destinationItem . GroupID = item . GroupID ;
destinationItem . GroupOwned = item . GroupOwned ;
destinationItem . SalePrice = item . SalePrice ;
destinationItem . SaleType = item . SaleType ;
destinationItem . Flags = item . Flags ;
destinationItem . CreationDate = item . CreationDate ;
destinationItem . Folder = destinationFolder . ID ;
2011-04-15 22:23:37 +00:00
ApplyNextOwnerPermissions ( destinationItem ) ;
2010-08-01 16:21:54 +00:00
2010-09-04 00:36:26 +00:00
m_application . SceneManager . CurrentOrFirstScene . AddInventoryItem ( destinationItem ) ;
m_log . DebugFormat ( "[RADMIN]: Added item {0} to folder {1}" , destinationItem . ID , destinationFolder . ID ) ;
2010-06-13 20:45:39 +00:00
// Attach item
2010-08-01 16:21:54 +00:00
avatarAppearance . SetAttachment ( attachpoint , destinationItem . ID , destinationItem . AssetID ) ;
2010-09-04 00:36:26 +00:00
m_log . DebugFormat ( "[RADMIN]: Attached {0}" , destinationItem . ID ) ;
2010-06-13 20:45:39 +00:00
}
else
{
2010-09-04 00:36:26 +00:00
m_log . WarnFormat ( "[RADMIN]: Error transferring {0} to folder {1}" , itemID , destinationFolder . ID ) ;
2010-06-13 20:45:39 +00:00
}
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
}
}
/// <summary>
/// This method is called by establishAppearance to copy inventory folders to make
/// copies of Clothing and Bodyparts inventory folders and attaches worn attachments
/// </summary>
2010-08-01 16:21:54 +00:00
private void CopyInventoryFolders ( UUID destination , UUID source , AssetType assetType , Dictionary < UUID , UUID > inventoryMap ,
AvatarAppearance avatarAppearance )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
IInventoryService inventoryService = m_application . SceneManager . CurrentOrFirstScene . InventoryService ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
InventoryFolderBase sourceFolder = inventoryService . GetFolderForType ( source , assetType ) ;
InventoryFolderBase destinationFolder = inventoryService . GetFolderForType ( destination , assetType ) ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
if ( sourceFolder = = null | | destinationFolder = = null )
2010-06-13 20:45:39 +00:00
throw new Exception ( "Cannot locate folder(s)" ) ;
// Missing source folder? This should *never* be the case
2010-08-01 16:21:54 +00:00
if ( sourceFolder . Type ! = ( short ) assetType )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
sourceFolder = new InventoryFolderBase ( ) ;
sourceFolder . ID = UUID . Random ( ) ;
if ( assetType = = AssetType . Clothing ) {
sourceFolder . Name = "Clothing" ;
2010-06-13 20:45:39 +00:00
} else {
2010-08-01 16:21:54 +00:00
sourceFolder . Name = "Body Parts" ;
2010-06-13 20:45:39 +00:00
}
2010-08-01 16:21:54 +00:00
sourceFolder . Owner = source ;
sourceFolder . Type = ( short ) assetType ;
sourceFolder . ParentID = inventoryService . GetRootFolder ( source ) . ID ;
sourceFolder . Version = 1 ;
inventoryService . AddFolder ( sourceFolder ) ; // store base record
m_log . ErrorFormat ( "[RADMIN] Created folder for source {0}" , source ) ;
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
// Missing destination folder? This should *never* be the case
2010-08-01 16:21:54 +00:00
if ( destinationFolder . Type ! = ( short ) assetType )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
destinationFolder = new InventoryFolderBase ( ) ;
destinationFolder . ID = UUID . Random ( ) ;
2011-10-08 00:23:26 +00:00
if ( assetType = = AssetType . Clothing )
{
2011-04-15 22:23:37 +00:00
destinationFolder . Name = "Clothing" ;
2011-10-08 00:23:26 +00:00
}
else
{
2011-04-15 22:23:37 +00:00
destinationFolder . Name = "Body Parts" ;
}
2010-08-01 16:21:54 +00:00
destinationFolder . Owner = destination ;
destinationFolder . Type = ( short ) assetType ;
destinationFolder . ParentID = inventoryService . GetRootFolder ( destination ) . ID ;
destinationFolder . Version = 1 ;
inventoryService . AddFolder ( destinationFolder ) ; // store base record
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Created folder for destination {0}" , source ) ;
2009-05-07 12:33:53 +00:00
}
2010-08-01 16:21:54 +00:00
InventoryFolderBase extraFolder ;
List < InventoryFolderBase > folders = inventoryService . GetFolderContent ( source , sourceFolder . ID ) . Folders ;
2010-06-13 20:45:39 +00:00
foreach ( InventoryFolderBase folder in folders )
{
2010-08-01 16:21:54 +00:00
extraFolder = new InventoryFolderBase ( ) ;
extraFolder . ID = UUID . Random ( ) ;
extraFolder . Name = folder . Name ;
extraFolder . Owner = destination ;
extraFolder . Type = folder . Type ;
extraFolder . Version = folder . Version ;
extraFolder . ParentID = destinationFolder . ID ;
inventoryService . AddFolder ( extraFolder ) ;
2010-06-13 20:45:39 +00:00
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Added folder {0} to folder {1}" , extraFolder . ID , sourceFolder . ID ) ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
List < InventoryItemBase > items = inventoryService . GetFolderContent ( source , folder . ID ) . Items ;
2010-06-13 20:45:39 +00:00
foreach ( InventoryItemBase item in items )
{
2010-08-01 16:21:54 +00:00
InventoryItemBase destinationItem = new InventoryItemBase ( UUID . Random ( ) , destination ) ;
destinationItem . Name = item . Name ;
2011-04-15 22:23:37 +00:00
destinationItem . Owner = destination ;
2010-08-01 16:21:54 +00:00
destinationItem . Description = item . Description ;
destinationItem . InvType = item . InvType ;
destinationItem . CreatorId = item . CreatorId ;
destinationItem . CreatorIdAsUuid = item . CreatorIdAsUuid ;
2010-11-22 01:19:24 +00:00
destinationItem . CreatorData = item . CreatorData ;
2010-08-01 16:21:54 +00:00
destinationItem . NextPermissions = item . NextPermissions ;
destinationItem . CurrentPermissions = item . CurrentPermissions ;
destinationItem . BasePermissions = item . BasePermissions ;
destinationItem . EveryOnePermissions = item . EveryOnePermissions ;
destinationItem . GroupPermissions = item . GroupPermissions ;
destinationItem . AssetType = item . AssetType ;
destinationItem . AssetID = item . AssetID ;
destinationItem . GroupID = item . GroupID ;
destinationItem . GroupOwned = item . GroupOwned ;
destinationItem . SalePrice = item . SalePrice ;
destinationItem . SaleType = item . SaleType ;
destinationItem . Flags = item . Flags ;
destinationItem . CreationDate = item . CreationDate ;
destinationItem . Folder = extraFolder . ID ;
2011-04-15 22:23:37 +00:00
ApplyNextOwnerPermissions ( destinationItem ) ;
2010-08-01 16:21:54 +00:00
2010-09-04 00:36:26 +00:00
m_application . SceneManager . CurrentOrFirstScene . AddInventoryItem ( destinationItem ) ;
2010-08-01 16:21:54 +00:00
inventoryMap . Add ( item . ID , destinationItem . ID ) ;
2010-09-04 00:36:26 +00:00
m_log . DebugFormat ( "[RADMIN]: Added item {0} to folder {1}" , destinationItem . ID , extraFolder . ID ) ;
2010-06-13 20:45:39 +00:00
// Attach item, if original is attached
2010-08-01 16:21:54 +00:00
int attachpoint = avatarAppearance . GetAttachpoint ( item . ID ) ;
2010-06-13 20:45:39 +00:00
if ( attachpoint ! = 0 )
{
2010-08-01 16:21:54 +00:00
avatarAppearance . SetAttachment ( attachpoint , destinationItem . ID , destinationItem . AssetID ) ;
2010-09-04 00:36:26 +00:00
m_log . DebugFormat ( "[RADMIN]: Attached {0}" , destinationItem . ID ) ;
2010-06-13 20:45:39 +00:00
}
}
}
2009-05-07 12:33:53 +00:00
}
2011-04-15 22:23:37 +00:00
/// <summary>
/// Apply next owner permissions.
/// </summary>
private void ApplyNextOwnerPermissions ( InventoryItemBase item )
{
if ( item . InvType = = ( int ) InventoryType . Object & & ( item . CurrentPermissions & 7 ) ! = 0 )
{
if ( ( item . CurrentPermissions & ( ( uint ) PermissionMask . Copy > > 13 ) ) = = 0 )
item . CurrentPermissions & = ~ ( uint ) PermissionMask . Copy ;
if ( ( item . CurrentPermissions & ( ( uint ) PermissionMask . Transfer > > 13 ) ) = = 0 )
item . CurrentPermissions & = ~ ( uint ) PermissionMask . Transfer ;
if ( ( item . CurrentPermissions & ( ( uint ) PermissionMask . Modify > > 13 ) ) = = 0 )
item . CurrentPermissions & = ~ ( uint ) PermissionMask . Modify ;
}
item . CurrentPermissions & = item . NextPermissions ;
item . BasePermissions & = item . NextPermissions ;
item . EveryOnePermissions & = item . NextPermissions ;
// item.OwnerChanged = true;
// item.PermsMask = 0;
// item.PermsGranter = UUID.Zero;
}
2010-06-13 20:45:39 +00:00
/// <summary>
2009-05-07 12:33:53 +00:00
/// 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>
2010-08-01 12:09:33 +00:00
private bool CreateDefaultAvatars ( )
2009-05-07 12:33:53 +00:00
{
// Only load once
2010-08-01 16:21:54 +00:00
if ( m_defaultAvatarsLoaded )
2009-05-07 12:33:53 +00:00
{
return false ;
}
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Creating default avatar entries" ) ;
2009-05-12 15:12:21 +00:00
2010-08-01 16:21:54 +00:00
m_defaultAvatarsLoaded = true ;
2009-05-07 12:33:53 +00:00
// Load processing starts here...
try
{
2010-08-01 16:21:54 +00:00
string defaultAppearanceFileName = 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 )
{
2010-08-01 16:21:54 +00:00
defaultAppearanceFileName = m_config . GetString ( "default_appearance" , "default_appearance.xml" ) ;
2009-07-12 17:00:58 +00:00
}
2009-05-07 12:33:53 +00:00
2010-08-01 16:21:54 +00:00
if ( File . Exists ( defaultAppearanceFileName ) )
2009-05-07 12:33:53 +00:00
{
XmlDocument doc = new XmlDocument ( ) ;
string name = "*unknown*" ;
string email = "anon@anon" ;
2010-08-01 16:21:54 +00:00
uint regionXLocation = 1000 ;
uint regionYLocation = 1000 ;
string password = UUID . Random ( ) . ToString ( ) ; // No requirement to sign-in.
2009-05-07 12:33:53 +00:00
UUID ID = UUID . Zero ;
2010-08-01 16:21:54 +00:00
AvatarAppearance avatarAppearance ;
2009-05-07 12:33:53 +00:00
XmlNodeList avatars ;
XmlNodeList assets ;
XmlNode perms = null ;
bool include = false ;
bool select = false ;
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentOrFirstScene ;
IInventoryService inventoryService = scene . InventoryService ;
IAssetService assetService = scene . AssetService ;
2009-05-07 12:33:53 +00:00
2010-08-01 16:21:54 +00:00
doc . LoadXml ( File . ReadAllText ( defaultAppearanceFileName ) ) ;
2009-05-07 12:33:53 +00:00
// Load up any included assets. Duplicates will be ignored
assets = doc . GetElementsByTagName ( "RequiredAsset" ) ;
2010-08-01 16:21:54 +00:00
foreach ( XmlNode assetNode in assets )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
AssetBase asset = new AssetBase ( UUID . Random ( ) , GetStringAttribute ( assetNode , "name" , "" ) , SByte . Parse ( GetStringAttribute ( assetNode , "type" , "" ) ) , UUID . Zero . ToString ( ) ) ;
asset . Description = GetStringAttribute ( assetNode , "desc" , "" ) ;
asset . Local = Boolean . Parse ( GetStringAttribute ( assetNode , "local" , "" ) ) ;
asset . Temporary = Boolean . Parse ( GetStringAttribute ( assetNode , "temporary" , "" ) ) ;
asset . Data = Convert . FromBase64String ( assetNode . InnerText ) ;
assetService . Store ( asset ) ;
2009-05-07 12:33:53 +00:00
}
avatars = doc . GetElementsByTagName ( "Avatar" ) ;
// The document may contain multiple avatars
foreach ( XmlElement avatar in avatars )
{
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Loading appearance for {0}, gender = {1}" ,
2009-05-07 12:33:53 +00:00
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 ) ;
2010-08-01 16:21:54 +00:00
regionXLocation = GetUnsignedAttribute ( avatar , "regx" , regionXLocation ) ;
regionYLocation = GetUnsignedAttribute ( avatar , "regy" , regionYLocation ) ;
password = GetStringAttribute ( avatar , "password" , password ) ;
2009-05-07 12:33:53 +00:00
2010-08-01 16:21:54 +00:00
string [ ] names = name . Split ( ) ;
2010-06-13 20:45:39 +00:00
UUID scopeID = scene . RegionInfo . ScopeID ;
2010-08-01 16:21:54 +00:00
UserAccount account = scene . UserAccountService . GetUserAccount ( scopeID , names [ 0 ] , names [ 1 ] ) ;
2010-01-08 18:43:34 +00:00
if ( null = = account )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
account = CreateUser ( scopeID , names [ 0 ] , names [ 1 ] , password , email ) ;
2010-06-13 20:45:39 +00:00
if ( null = = account )
2009-05-07 12:33:53 +00:00
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Avatar {0} {1} was not created" , names [ 0 ] , names [ 1 ] ) ;
2009-05-07 12:33:53 +00:00
return false ;
}
}
2010-06-13 20:45:39 +00:00
// Set home position
GridRegion home = scene . GridService . GetRegionByPosition ( scopeID ,
2010-08-01 16:21:54 +00:00
( int ) ( regionXLocation * Constants . RegionSize ) , ( int ) ( regionYLocation * Constants . RegionSize ) ) ;
2010-06-13 20:45:39 +00:00
if ( null = = home ) {
2010-08-01 16:21:54 +00:00
m_log . WarnFormat ( "[RADMIN]: Unable to set home region for newly created user account {0} {1}" , names [ 0 ] , names [ 1 ] ) ;
2010-06-13 20:45:39 +00:00
} else {
scene . GridUserService . SetHome ( account . PrincipalID . ToString ( ) , home . RegionID , new Vector3 ( 128 , 128 , 0 ) , new Vector3 ( 0 , 1 , 0 ) ) ;
2010-08-01 16:21:54 +00:00
m_log . DebugFormat ( "[RADMIN]: Set home region {0} for updated user account {1} {2}" , home . RegionID , names [ 0 ] , names [ 1 ] ) ;
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
ID = account . PrincipalID ;
2011-04-15 22:54:30 +00:00
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 )
{
2011-04-15 22:54:30 +00:00
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 )
{
2010-06-13 20:45:39 +00:00
// Setup for appearance processing
2010-10-20 23:17:54 +00:00
avatarAppearance = scene . AvatarService . GetAppearance ( ID ) ;
if ( avatarAppearance = = null )
2010-08-01 16:21:54 +00:00
avatarAppearance = new AvatarAppearance ( ) ;
2009-09-30 16:00:09 +00:00
2010-08-01 16:21:54 +00:00
AvatarWearable [ ] wearables = avatarAppearance . Wearables ;
2010-06-13 20:45:39 +00:00
for ( int i = 0 ; i < wearables . Length ; i + + )
2009-05-07 12:33:53 +00:00
{
2010-06-13 20:45:39 +00:00
wearables [ i ] = new AvatarWearable ( ) ;
2009-05-07 12:33:53 +00:00
}
try
{
2010-06-13 20:45:39 +00:00
// m_log.DebugFormat("[RADMIN] {0} folders, {1} items in inventory",
// uic.folders.Count, uic.items.Count);
2009-05-07 12:33:53 +00:00
2010-08-01 16:21:54 +00:00
InventoryFolderBase clothingFolder = inventoryService . GetFolderForType ( ID , AssetType . Clothing ) ;
2009-05-07 12:33:53 +00:00
// This should *never* be the case
2010-08-01 16:21:54 +00:00
if ( clothingFolder = = null | | clothingFolder . Type ! = ( short ) AssetType . Clothing )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
clothingFolder = new InventoryFolderBase ( ) ;
clothingFolder . ID = UUID . Random ( ) ;
clothingFolder . Name = "Clothing" ;
clothingFolder . Owner = ID ;
clothingFolder . Type = ( short ) AssetType . Clothing ;
clothingFolder . ParentID = inventoryService . GetRootFolder ( ID ) . ID ;
clothingFolder . Version = 1 ;
inventoryService . AddFolder ( clothingFolder ) ; // store base record
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Created clothing folder for {0}/{1}" , name , ID ) ;
2009-05-07 12:33:53 +00:00
}
// OK, now we have an inventory for the user, read in the outfits from the
// default appearance XMl file.
XmlNodeList outfits = avatar . GetElementsByTagName ( "Ensemble" ) ;
2010-08-01 16:21:54 +00:00
InventoryFolderBase extraFolder ;
string outfitName ;
2009-05-07 12:33:53 +00:00
UUID assetid ;
foreach ( XmlElement outfit in outfits )
{
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Loading outfit {0} for {1}" ,
2009-05-07 12:33:53 +00:00
GetStringAttribute ( outfit , "name" , "?" ) , GetStringAttribute ( avatar , "name" , "?" ) ) ;
2010-08-01 16:21:54 +00:00
outfitName = GetStringAttribute ( outfit , "name" , "" ) ;
2009-05-07 12:33:53 +00:00
select = ( GetStringAttribute ( outfit , "default" , "no" ) = = "yes" ) ;
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.
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
List < InventoryFolderBase > folders = inventoryService . GetFolderContent ( ID , clothingFolder . ID ) . Folders ;
extraFolder = null ;
2010-06-13 20:45:39 +00:00
foreach ( InventoryFolderBase folder in folders )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
if ( folder . Name = = outfitName )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
extraFolder = folder ;
2009-05-07 12:33:53 +00:00
break ;
}
}
// Otherwise, we must create the folder.
2010-08-01 16:21:54 +00:00
if ( extraFolder = = null )
2009-05-07 12:33:53 +00:00
{
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Creating outfit folder {0} for {1}" , outfitName , name ) ;
2010-08-01 16:21:54 +00:00
extraFolder = new InventoryFolderBase ( ) ;
extraFolder . ID = UUID . Random ( ) ;
extraFolder . Name = outfitName ;
extraFolder . Owner = ID ;
extraFolder . Type = ( short ) AssetType . Clothing ;
extraFolder . Version = 1 ;
extraFolder . ParentID = clothingFolder . ID ;
inventoryService . AddFolder ( extraFolder ) ;
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Adding outfile folder {0} to folder {1}" , extraFolder . ID , clothingFolder . ID ) ;
2009-05-07 12:33:53 +00:00
}
// 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" :
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Permissions specified" ) ;
2009-05-07 12:33:53 +00:00
perms = child ;
break ;
case "Asset" :
assetid = new UUID ( child . InnerText ) ;
break ;
}
}
2010-08-01 16:21:54 +00:00
InventoryItemBase inventoryItem = null ;
2009-05-07 12:33:53 +00:00
2010-06-13 20:45:39 +00:00
// Check if asset is in inventory already
2010-08-01 16:21:54 +00:00
inventoryItem = null ;
List < InventoryItemBase > inventoryItems = inventoryService . GetFolderContent ( ID , extraFolder . ID ) . Items ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
foreach ( InventoryItemBase listItem in inventoryItems )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
if ( listItem . AssetID = = assetid )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
inventoryItem = listItem ;
2010-06-13 20:45:39 +00:00
break ;
}
}
// Create inventory item
2010-08-01 16:21:54 +00:00
if ( inventoryItem = = null )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
inventoryItem = new InventoryItemBase ( UUID . Random ( ) , ID ) ;
inventoryItem . Name = GetStringAttribute ( item , "name" , "" ) ;
inventoryItem . Description = GetStringAttribute ( item , "desc" , "" ) ;
inventoryItem . InvType = GetIntegerAttribute ( item , "invtype" , - 1 ) ;
inventoryItem . CreatorId = GetStringAttribute ( item , "creatorid" , "" ) ;
inventoryItem . CreatorIdAsUuid = ( UUID ) GetStringAttribute ( item , "creatoruuid" , "" ) ;
2010-11-22 01:19:24 +00:00
inventoryItem . CreatorData = GetStringAttribute ( item , "creatordata" , "" ) ;
inventoryItem . NextPermissions = GetUnsignedAttribute ( perms , "next" , 0x7fffffff ) ;
2010-08-01 16:21:54 +00:00
inventoryItem . CurrentPermissions = GetUnsignedAttribute ( perms , "current" , 0x7fffffff ) ;
inventoryItem . BasePermissions = GetUnsignedAttribute ( perms , "base" , 0x7fffffff ) ;
inventoryItem . EveryOnePermissions = GetUnsignedAttribute ( perms , "everyone" , 0x7fffffff ) ;
inventoryItem . GroupPermissions = GetUnsignedAttribute ( perms , "group" , 0x7fffffff ) ;
inventoryItem . AssetType = GetIntegerAttribute ( item , "assettype" , - 1 ) ;
inventoryItem . AssetID = assetid ; // associated asset
inventoryItem . GroupID = ( UUID ) GetStringAttribute ( item , "groupid" , "" ) ;
inventoryItem . GroupOwned = ( GetStringAttribute ( item , "groupowned" , "false" ) = = "true" ) ;
inventoryItem . SalePrice = GetIntegerAttribute ( item , "saleprice" , 0 ) ;
inventoryItem . SaleType = ( byte ) GetIntegerAttribute ( item , "saletype" , 0 ) ;
inventoryItem . Flags = GetUnsignedAttribute ( item , "flags" , 0 ) ;
inventoryItem . CreationDate = GetIntegerAttribute ( item , "creationdate" , Util . UnixTimeSinceEpoch ( ) ) ;
inventoryItem . Folder = extraFolder . ID ; // Parent folder
2010-09-04 00:36:26 +00:00
m_application . SceneManager . CurrentOrFirstScene . AddInventoryItem ( inventoryItem ) ;
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Added item {0} to folder {1}" , inventoryItem . ID , extraFolder . ID ) ;
2010-06-13 20:45:39 +00:00
}
// Attach item, if attachpoint is specified
int attachpoint = GetIntegerAttribute ( item , "attachpoint" , 0 ) ;
if ( attachpoint ! = 0 )
{
2010-08-01 16:21:54 +00:00
avatarAppearance . SetAttachment ( attachpoint , inventoryItem . ID , inventoryItem . AssetID ) ;
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Attached {0}" , inventoryItem . ID ) ;
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
2009-05-07 12:33:53 +00:00
// Record whether or not the item is to be initially worn
try
{
if ( select & & ( GetStringAttribute ( item , "wear" , "false" ) = = "true" ) )
{
2010-10-29 23:41:36 +00:00
avatarAppearance . Wearables [ inventoryItem . Flags ] . Wear ( inventoryItem . ID , inventoryItem . AssetID ) ;
2009-05-07 12:33:53 +00:00
}
}
2010-06-13 20:45:39 +00:00
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . WarnFormat ( "[RADMIN]: Error wearing item {0} : {1}" , inventoryItem . ID , e . Message ) ;
2010-06-13 20:45:39 +00:00
}
2009-05-07 12:33:53 +00:00
} // foreach item in outfit
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Outfit {0} load completed" , outfitName ) ;
2009-05-07 12:33:53 +00:00
} // foreach outfit
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Inventory update complete for {0}" , name ) ;
2010-10-20 23:17:54 +00:00
scene . AvatarService . SetAppearance ( ID , avatarAppearance ) ;
2009-05-07 12:33:53 +00:00
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . WarnFormat ( "[RADMIN]: Inventory processing incomplete for user {0} : {1}" ,
2009-05-07 12:33:53 +00:00
name , e . Message ) ;
}
} // End of include
}
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: Default avatar loading complete" ) ;
2009-05-07 12:33:53 +00:00
}
else
{
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: No default avatar information available" ) ;
2009-05-07 12:33:53 +00:00
return false ;
}
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . WarnFormat ( "[RADMIN]: Exception whilst loading default avatars ; {0}" , e . Message ) ;
2009-05-07 12:33:53 +00:00
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>
2011-07-02 00:05:03 +00:00
/// <item><term>merge</term>
/// <description>true if oar should be merged</description></item>
/// <item><term>skip-assets</term>
/// <description>true if assets should be skiped</description></item>
2008-08-28 09:34:47 +00:00
/// </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 ( ) ;
2010-08-01 16:21:54 +00:00
lock ( m_requestLock )
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
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" , "filename" } ) ;
2008-08-28 09:34:47 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( region_uuid , out scene ) )
2008-12-03 19:19:46 +00:00
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( region_name , out scene ) )
2008-12-03 19:19:46 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2011-07-02 00:05:03 +00:00
bool mergeOar = false ;
bool skipAssets = false ;
if ( ( string ) requestData [ "merge" ] = = "true" )
{
mergeOar = true ;
}
if ( ( string ) requestData [ "skip-assets" ] = = "true" )
{
skipAssets = true ;
}
2008-12-03 19:19:46 +00:00
2008-12-19 18:33:03 +00:00
IRegionArchiverModule archiver = scene . RequestModuleInterface < IRegionArchiverModule > ( ) ;
2009-03-10 20:06:25 +00:00
if ( archiver ! = null )
2011-07-02 00:05:03 +00:00
archiver . DearchiveRegion ( filename , mergeOar , skipAssets , Guid . Empty ) ;
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
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: LoadOAR: {0} {1}" , e . Message , e . StackTrace ) ;
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>
2011-09-30 23:19:09 +00:00
/// <item><term>profile</term>
2011-07-02 00:05:03 +00:00
/// <description>profile url</description></item>
/// <item><term>noassets</term>
/// <description>true if no assets should be saved</description></item>
2011-09-30 23:19:09 +00:00
/// <item><term>perm</term>
/// <description>C and/or T</description></item>
2008-10-20 17:53:15 +00:00
/// </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 ] ;
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" , "filename" } ) ;
2008-10-20 17:53:15 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( region_uuid , out scene ) )
2008-10-20 17:53:15 +00:00
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TryGetScene ( region_name , out scene ) )
2008-10-20 17:53:15 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2011-07-02 00:05:03 +00:00
Dictionary < string , object > options = new Dictionary < string , object > ( ) ;
//if (requestData.Contains("version"))
//{
// options["version"] = (string)requestData["version"];
//}
if ( requestData . Contains ( "profile" ) )
{
options [ "profile" ] = ( string ) requestData [ "profile" ] ;
}
if ( requestData [ "noassets" ] = = "true" )
{
options [ "noassets" ] = ( string ) requestData [ "noassets" ] ;
}
2011-09-30 23:19:09 +00:00
if ( requestData . Contains ( "perm" ) )
{
options [ "checkPermissions" ] = ( string ) requestData [ "perm" ] ;
}
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 ;
2011-07-02 00:05:03 +00:00
archiver . ArchiveRegion ( filename , options ) ;
2011-10-08 00:23:26 +00:00
lock ( m_saveOarLock )
Monitor . Wait ( m_saveOarLock , 5000 ) ;
2009-05-18 10:04:28 +00:00
scene . EventManager . OnOarFileSaved - = RemoteAdminOarSaveCompleted ;
}
2009-03-10 20:06:25 +00:00
else
2011-10-08 00:23:26 +00:00
{
2009-03-10 20:06:25 +00:00
throw new Exception ( "Archiver module not present for scene" ) ;
2011-10-08 00:23:26 +00:00
}
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 )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: SaveOAR: {0} {1}" , e . Message , e . StackTrace ) ;
2008-10-20 17:53:15 +00:00
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 )
{
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: File processing complete for {0}" , name ) ;
2010-08-01 16:21:54 +00:00
lock ( m_saveOarLock ) Monitor . Pulse ( m_saveOarLock ) ;
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
2010-08-01 16:21:54 +00:00
lock ( m_requestLock )
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
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" , "filename" } ) ;
2008-05-16 01:22:11 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_uuid ) )
2008-12-03 19:19:46 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
2011-10-08 00:23:26 +00:00
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_uuid . ToString ( ) ) ;
2008-12-03 19:19:46 +00:00
}
else if ( requestData . Contains ( "region_name" ) )
{
2009-03-10 20:06:25 +00:00
string region_name = ( string ) requestData [ "region_name" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_name ) )
2008-12-03 19:19:46 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
2011-10-08 00:23:26 +00:00
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_name ) ;
2008-12-03 19:19:46 +00:00
}
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" :
2010-08-01 16:21:54 +00:00
m_application . SceneManager . LoadCurrentSceneFromXml ( filename , true , new Vector3 ( 0 , 0 , 0 ) ) ;
2008-12-03 19:19:46 +00:00
break ;
case "2" :
2010-08-01 16:21:54 +00:00
m_application . SceneManager . LoadCurrentSceneFromXml2 ( filename ) ;
2008-12-03 19:19:46 +00:00
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 )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN] LoadXml: {0} {1}" , e . Message , e . StackTrace ) ;
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
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" , "filename" } ) ;
2008-09-12 21:00:05 +00:00
2011-10-08 00:23:26 +00:00
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_uuid ) )
2008-09-12 21:00:05 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_uuid . ToString ( ) ) ;
2008-09-12 21:00:05 +00:00
}
else if ( requestData . Contains ( "region_name" ) )
{
2009-03-10 20:06:25 +00:00
string region_name = ( string ) requestData [ "region_name" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_name ) )
2008-09-12 21:00:05 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_name ) ;
2008-09-12 21:00:05 +00:00
}
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" :
2010-08-01 16:21:54 +00:00
m_application . SceneManager . SaveCurrentSceneToXml ( filename ) ;
2008-09-12 21:00:05 +00:00
break ;
case "2" :
2010-08-01 16:21:54 +00:00
m_application . SceneManager . SaveCurrentSceneToXml2 ( filename ) ;
2008-09-12 21:00:05 +00:00
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 )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: SaveXml: {0} {1}" , e . Message , e . StackTrace ) ;
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
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" } ) ;
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
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" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_uuid ) )
2008-10-10 01:10:33 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
2011-10-08 00:23:26 +00:00
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_uuid . ToString ( ) ) ;
2008-10-10 01:10:33 +00:00
}
else if ( requestData . Contains ( "region_name" ) )
{
2009-03-10 20:06:25 +00:00
string region_name = ( string ) requestData [ "region_name" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_name ) )
2008-10-10 01:10:33 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
2011-10-08 00:23:26 +00:00
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_name ) ;
2008-10-10 01:10:33 +00:00
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentScene ;
int health = scene . GetHealth ( ) ;
2008-10-10 01:10:33 +00:00
responseData [ "health" ] = health ;
response . Value = responseData ;
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: RegionQuery: {0}" , e . Message ) ;
2008-10-10 01:10:33 +00:00
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" ) ;
2011-10-08 00:23:26 +00:00
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 ] ;
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" , "command" } ) ;
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2009-04-15 19:50:14 +00:00
MainConsole . Instance . RunCommand ( requestData [ "command" ] . ToString ( ) ) ;
response . Value = responseData ;
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: ConsoleCommand: {0}" , e . Message ) ;
2009-04-15 19:50:14 +00:00
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 ] ;
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" } ) ;
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2009-04-27 11:51:25 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_uuid ) )
2009-04-27 11:51:25 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_uuid . ToString ( ) ) ;
2009-04-27 11:51:25 +00:00
}
else if ( requestData . Contains ( "region_name" ) )
{
string region_name = ( string ) requestData [ "region_name" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_name ) )
2009-04-27 11:51:25 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
2011-10-08 00:23:26 +00:00
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_name ) ;
2009-04-27 11:51:25 +00:00
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentScene ;
scene . RegionInfo . EstateSettings . EstateAccess = new UUID [ ] { } ;
2011-10-08 00:23:26 +00:00
2010-08-01 16:21:54 +00:00
if ( scene . RegionInfo . Persistent )
scene . RegionInfo . EstateSettings . Save ( ) ;
2009-04-27 11:51:25 +00:00
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Access List Clear Request: {0} {1}" , e . Message , e . StackTrace ) ;
2009-04-27 11:51:25 +00:00
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 ] ;
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" } ) ;
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2009-04-27 11:51:25 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_uuid ) )
2009-04-27 11:51:25 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_uuid . ToString ( ) ) ;
2009-04-27 11:51:25 +00:00
}
else if ( requestData . Contains ( "region_name" ) )
{
string region_name = ( string ) requestData [ "region_name" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_name ) )
2009-04-27 11:51:25 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_name ) ;
2009-04-27 11:51:25 +00:00
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2010-08-01 16:21:54 +00:00
int addedUsers = 0 ;
2009-04-27 11:51:25 +00:00
2009-09-30 16:00:09 +00:00
if ( requestData . Contains ( "users" ) )
2009-04-27 11:51:25 +00:00
{
2010-08-01 16:21:54 +00:00
UUID scopeID = m_application . SceneManager . CurrentOrFirstScene . RegionInfo . ScopeID ;
IUserAccountService userService = m_application . SceneManager . CurrentOrFirstScene . UserAccountService ;
Scene scene = m_application . SceneManager . CurrentScene ;
2009-04-27 11:51:25 +00:00
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 ( ) ;
2010-01-08 18:43:34 +00:00
UserAccount account = userService . GetUserAccount ( scopeID , parts [ 0 ] , parts [ 1 ] ) ;
if ( account ! = null )
2009-05-07 12:33:53 +00:00
{
2010-01-08 18:43:34 +00:00
uuids . Add ( account . PrincipalID ) ;
2011-04-15 22:54:30 +00:00
m_log . DebugFormat ( "[RADMIN]: adding \"{0}\" to ACL for \"{1}\"" , name , scene . RegionInfo . RegionName ) ;
2009-05-07 12:33:53 +00:00
}
2009-04-27 11:51:25 +00:00
}
2010-08-01 16:21:54 +00:00
List < UUID > accessControlList = new List < UUID > ( scene . RegionInfo . EstateSettings . EstateAccess ) ;
2009-05-07 12:33:53 +00:00
foreach ( UUID uuid in uuids )
2009-04-27 11:51:25 +00:00
{
2010-08-01 16:21:54 +00:00
if ( ! accessControlList . Contains ( uuid ) )
2009-04-27 11:51:25 +00:00
{
2010-08-01 16:21:54 +00:00
accessControlList . Add ( uuid ) ;
addedUsers + + ;
2009-04-27 11:51:25 +00:00
}
}
2010-08-01 16:21:54 +00:00
scene . RegionInfo . EstateSettings . EstateAccess = accessControlList . ToArray ( ) ;
if ( scene . RegionInfo . Persistent )
scene . RegionInfo . EstateSettings . Save ( ) ;
2009-04-27 11:51:25 +00:00
}
2010-08-01 16:21:54 +00:00
responseData [ "added" ] = addedUsers ;
2009-04-27 11:51:25 +00:00
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Access List Add Request: {0} {1}" , e . Message , e . StackTrace ) ;
2009-04-27 11:51:25 +00:00
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 ] ;
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" } ) ;
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2009-04-27 11:51:25 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_uuid ) )
2009-04-27 11:51:25 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_uuid . ToString ( ) ) ;
2009-04-27 11:51:25 +00:00
}
else if ( requestData . Contains ( "region_name" ) )
{
string region_name = ( string ) requestData [ "region_name" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_name ) )
2009-04-27 11:51:25 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_name ) ;
2009-04-27 11:51:25 +00:00
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2010-08-01 16:21:54 +00:00
int removedUsers = 0 ;
2009-04-27 11:51:25 +00:00
2009-09-30 16:00:09 +00:00
if ( requestData . Contains ( "users" ) )
2009-04-27 11:51:25 +00:00
{
2010-08-01 16:21:54 +00:00
UUID scopeID = m_application . SceneManager . CurrentOrFirstScene . RegionInfo . ScopeID ;
IUserAccountService userService = m_application . SceneManager . CurrentOrFirstScene . UserAccountService ;
//UserProfileCacheService ups = m_application.CommunicationsManager.UserProfileCacheService;
Scene scene = m_application . SceneManager . CurrentScene ;
2009-04-27 11:51:25 +00:00
Hashtable users = ( Hashtable ) requestData [ "users" ] ;
List < UUID > uuids = new List < UUID > ( ) ;
2010-01-08 18:43:34 +00:00
foreach ( string name in users . Values )
2009-04-27 11:51:25 +00:00
{
string [ ] parts = name . Split ( ) ;
2010-01-08 18:43:34 +00:00
UserAccount account = userService . GetUserAccount ( scopeID , parts [ 0 ] , parts [ 1 ] ) ;
if ( account ! = null )
2009-05-07 12:33:53 +00:00
{
2010-01-08 18:43:34 +00:00
uuids . Add ( account . PrincipalID ) ;
2009-05-07 12:33:53 +00:00
}
2009-04-27 11:51:25 +00:00
}
2010-08-01 16:21:54 +00:00
List < UUID > accessControlList = new List < UUID > ( scene . RegionInfo . EstateSettings . EstateAccess ) ;
2010-01-08 18:43:34 +00:00
foreach ( UUID uuid in uuids )
2009-04-27 11:51:25 +00:00
{
2010-08-01 16:21:54 +00:00
if ( accessControlList . Contains ( uuid ) )
2009-04-27 11:51:25 +00:00
{
2010-08-01 16:21:54 +00:00
accessControlList . Remove ( uuid ) ;
removedUsers + + ;
2009-04-27 11:51:25 +00:00
}
}
2010-08-01 16:21:54 +00:00
scene . RegionInfo . EstateSettings . EstateAccess = accessControlList . ToArray ( ) ;
if ( scene . RegionInfo . Persistent )
scene . RegionInfo . EstateSettings . Save ( ) ;
2009-04-27 11:51:25 +00:00
}
2010-08-01 16:21:54 +00:00
responseData [ "removed" ] = removedUsers ;
2009-04-27 11:51:25 +00:00
}
catch ( Exception e )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Access List Remove Request: {0} {1}" , e . Message , e . StackTrace ) ;
2009-04-27 11:51:25 +00:00
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 ] ;
2011-10-08 00:23:26 +00:00
CheckStringParameters ( request , new string [ ] {
"password" } ) ;
FailIfRemoteAdminNotAllowed ( ( string ) requestData [ "password" ] , remoteClient . Address . ToString ( ) ) ;
2009-04-27 11:51:25 +00:00
if ( requestData . Contains ( "region_uuid" ) )
{
UUID region_uuid = ( UUID ) ( string ) requestData [ "region_uuid" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_uuid ) )
2009-04-27 11:51:25 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_uuid . ToString ( ) ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_uuid . ToString ( ) ) ;
2009-04-27 11:51:25 +00:00
}
else if ( requestData . Contains ( "region_name" ) )
{
string region_name = ( string ) requestData [ "region_name" ] ;
2010-08-01 16:21:54 +00:00
if ( ! m_application . SceneManager . TrySetCurrentScene ( region_name ) )
2009-04-27 11:51:25 +00:00
throw new Exception ( String . Format ( "failed to switch to region {0}" , region_name ) ) ;
2011-04-15 22:54:30 +00:00
m_log . InfoFormat ( "[RADMIN]: Switched to region {0}" , region_name ) ;
2009-04-27 11:51:25 +00:00
}
else throw new Exception ( "neither region_name nor region_uuid given" ) ;
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentScene ;
UUID [ ] accessControlList = scene . RegionInfo . EstateSettings . EstateAccess ;
2009-04-27 11:51:25 +00:00
Hashtable users = new Hashtable ( ) ;
2010-08-01 16:21:54 +00:00
foreach ( UUID user in accessControlList )
2009-04-27 11:51:25 +00:00
{
2010-08-01 16:21:54 +00:00
UUID scopeID = m_application . SceneManager . CurrentOrFirstScene . RegionInfo . ScopeID ;
UserAccount account = m_application . SceneManager . CurrentOrFirstScene . UserAccountService . GetUserAccount ( scopeID , user ) ;
2010-01-09 04:31:29 +00:00
if ( account ! = null )
2009-05-07 12:33:53 +00:00
{
2010-01-09 04:31:29 +00:00
users [ user . ToString ( ) ] = account . FirstName + " " + account . LastName ;
2009-05-07 12:33:53 +00:00
}
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 )
{
2011-04-15 22:54:30 +00:00
m_log . ErrorFormat ( "[RADMIN]: Access List List: {0} {1}" , e . Message , e . StackTrace ) ;
2009-04-27 11:51:25 +00:00
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 ;
}
2010-08-01 12:09:33 +00:00
private static void CheckStringParameters ( XmlRpcRequest request , string [ ] param )
2009-05-07 12:33:53 +00:00
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2010-08-01 16:21:54 +00:00
foreach ( string parameter in param )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
if ( ! requestData . Contains ( parameter ) )
throw new Exception ( String . Format ( "missing string parameter {0}" , parameter ) ) ;
if ( String . IsNullOrEmpty ( ( string ) requestData [ parameter ] ) )
throw new Exception ( String . Format ( "parameter {0} is empty" , parameter ) ) ;
2009-05-07 12:33:53 +00:00
}
}
2010-08-01 12:09:33 +00:00
private static void CheckIntegerParams ( XmlRpcRequest request , string [ ] param )
2009-05-07 12:33:53 +00:00
{
Hashtable requestData = ( Hashtable ) request . Params [ 0 ] ;
2010-08-01 16:21:54 +00:00
foreach ( string parameter in param )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
if ( ! requestData . Contains ( parameter ) )
throw new Exception ( String . Format ( "missing integer parameter {0}" , parameter ) ) ;
2009-05-07 12:33:53 +00:00
}
}
2010-08-01 16:21:54 +00:00
private bool GetBoolean ( Hashtable requestData , string tag , bool defaultValue )
2009-05-07 12:33:53 +00:00
{
// 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 :
2010-08-01 16:21:54 +00:00
return defaultValue ;
2009-05-07 12:33:53 +00:00
}
}
else
2010-08-01 16:21:54 +00:00
return defaultValue ;
2009-05-07 12:33:53 +00:00
}
2010-08-01 16:21:54 +00:00
private int GetIntegerAttribute ( XmlNode node , string attribute , int defaultValue )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
try { return Convert . ToInt32 ( node . Attributes [ attribute ] . Value ) ; } catch { }
return defaultValue ;
2009-05-07 12:33:53 +00:00
}
2010-08-01 16:21:54 +00:00
private uint GetUnsignedAttribute ( XmlNode node , string attribute , uint defaultValue )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
try { return Convert . ToUInt32 ( node . Attributes [ attribute ] . Value ) ; } catch { }
return defaultValue ;
2009-05-07 12:33:53 +00:00
}
2010-08-01 16:21:54 +00:00
private string GetStringAttribute ( XmlNode node , string attribute , string defaultValue )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
try { return node . Attributes [ attribute ] . Value ; } catch { }
return defaultValue ;
2009-05-07 12:33:53 +00:00
}
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
2010-06-13 20:45:39 +00:00
/// <summary>
/// Create a user
/// </summary>
/// <param name="scopeID"></param>
/// <param name="firstName"></param>
/// <param name="lastName"></param>
/// <param name="password"></param>
/// <param name="email"></param>
private UserAccount CreateUser ( UUID scopeID , string firstName , string lastName , string password , string email )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
Scene scene = m_application . SceneManager . CurrentOrFirstScene ;
IUserAccountService userAccountService = scene . UserAccountService ;
IGridService gridService = scene . GridService ;
IAuthenticationService authenticationService = scene . AuthenticationService ;
IGridUserService gridUserService = scene . GridUserService ;
IInventoryService inventoryService = scene . InventoryService ;
UserAccount account = userAccountService . GetUserAccount ( scopeID , firstName , lastName ) ;
2010-06-13 20:45:39 +00:00
if ( null = = account )
2009-05-07 12:33:53 +00:00
{
2011-10-04 22:48:35 +00:00
account = new UserAccount ( scopeID , UUID . Random ( ) , firstName , lastName , email ) ;
2010-06-13 20:45:39 +00:00
if ( account . ServiceURLs = = null | | ( account . ServiceURLs ! = null & & account . ServiceURLs . Count = = 0 ) )
2009-05-07 12:33:53 +00:00
{
2010-06-13 20:45:39 +00:00
account . ServiceURLs = new Dictionary < string , object > ( ) ;
account . ServiceURLs [ "HomeURI" ] = string . Empty ;
account . ServiceURLs [ "GatekeeperURI" ] = string . Empty ;
account . ServiceURLs [ "InventoryServerURI" ] = string . Empty ;
account . ServiceURLs [ "AssetServerURI" ] = string . Empty ;
2009-09-30 16:00:09 +00:00
}
2009-05-07 12:33:53 +00:00
2010-08-01 16:21:54 +00:00
if ( userAccountService . StoreUserAccount ( account ) )
2009-05-07 12:33:53 +00:00
{
2010-06-13 20:45:39 +00:00
bool success ;
2010-08-01 16:21:54 +00:00
if ( authenticationService ! = null )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
success = authenticationService . SetPassword ( account . PrincipalID , password ) ;
2010-06-13 20:45:39 +00:00
if ( ! success )
m_log . WarnFormat ( "[RADMIN]: Unable to set password for account {0} {1}." ,
firstName , lastName ) ;
}
GridRegion home = null ;
2010-08-01 16:21:54 +00:00
if ( gridService ! = null )
2010-06-13 20:45:39 +00:00
{
2010-08-01 16:21:54 +00:00
List < GridRegion > defaultRegions = gridService . GetDefaultRegions ( UUID . Zero ) ;
2010-06-13 20:45:39 +00:00
if ( defaultRegions ! = null & & defaultRegions . Count > = 1 )
home = defaultRegions [ 0 ] ;
2010-08-01 16:21:54 +00:00
if ( gridUserService ! = null & & home ! = null )
gridUserService . SetHome ( account . PrincipalID . ToString ( ) , home . RegionID , new Vector3 ( 128 , 128 , 0 ) , new Vector3 ( 0 , 1 , 0 ) ) ;
2010-06-13 20:45:39 +00:00
else
m_log . WarnFormat ( "[RADMIN]: Unable to set home for account {0} {1}." ,
firstName , lastName ) ;
2009-05-07 12:33:53 +00:00
}
else
2010-06-13 20:45:39 +00:00
m_log . WarnFormat ( "[RADMIN]: Unable to retrieve home region for account {0} {1}." ,
firstName , lastName ) ;
2010-08-01 16:21:54 +00:00
if ( inventoryService ! = null )
2009-05-07 12:33:53 +00:00
{
2010-08-01 16:21:54 +00:00
success = inventoryService . CreateUserInventory ( account . PrincipalID ) ;
2010-06-13 20:45:39 +00:00
if ( ! success )
m_log . WarnFormat ( "[RADMIN]: Unable to create inventory for account {0} {1}." ,
firstName , lastName ) ;
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
m_log . InfoFormat ( "[RADMIN]: Account {0} {1} created successfully" , firstName , lastName ) ;
return account ;
} else {
m_log . ErrorFormat ( "[RADMIN]: Account creation failed for account {0} {1}" , firstName , lastName ) ;
2009-05-07 12:33:53 +00:00
}
}
2010-06-13 20:45:39 +00:00
else
2009-05-07 12:33:53 +00:00
{
2010-06-13 20:45:39 +00:00
m_log . ErrorFormat ( "[RADMIN]: A user with the name {0} {1} already exists!" , firstName , lastName ) ;
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
return null ;
}
2009-05-07 12:33:53 +00:00
2010-06-13 20:45:39 +00:00
/// <summary>
/// Change password
/// </summary>
/// <param name="firstName"></param>
/// <param name="lastName"></param>
/// <param name="password"></param>
private bool ChangeUserPassword ( string firstName , string lastName , string password )
{
2010-08-13 15:08:43 +00:00
Scene scene = m_application . SceneManager . CurrentOrFirstScene ;
2010-08-01 16:21:54 +00:00
IUserAccountService userAccountService = scene . UserAccountService ;
IAuthenticationService authenticationService = scene . AuthenticationService ;
2010-06-13 20:45:39 +00:00
2010-08-01 16:21:54 +00:00
UserAccount account = userAccountService . GetUserAccount ( UUID . Zero , firstName , lastName ) ;
2010-06-13 20:45:39 +00:00
if ( null ! = account )
2009-05-07 12:33:53 +00:00
{
2010-06-13 20:45:39 +00:00
bool success = false ;
2010-08-01 16:21:54 +00:00
if ( authenticationService ! = null )
success = authenticationService . SetPassword ( account . PrincipalID , password ) ;
2011-10-08 00:23:26 +00:00
if ( ! success )
{
2010-06-13 20:45:39 +00:00
m_log . WarnFormat ( "[RADMIN]: Unable to set password for account {0} {1}." ,
firstName , lastName ) ;
return false ;
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
return true ;
2009-05-07 12:33:53 +00:00
}
2010-06-13 20:45:39 +00:00
else
2009-05-07 12:33:53 +00:00
{
2010-06-13 20:45:39 +00:00
m_log . ErrorFormat ( "[RADMIN]: No such user" ) ;
return false ;
2009-05-07 12:33:53 +00:00
}
}
2007-12-03 07:10:08 +00:00
}
2011-10-08 00:23:26 +00:00
}