clockwerk-www – Rev 5
?pathlinks?
<?php
/*********************************************************************************
* opensim.mysql.php v1.0.0 for OpenSim by Fumi.Iseki 2010 5/13
*
* Copyright (c) 2009,2010,2011 http://www.nsl.tuis.ac.jp/
*
* supported versions of OpenSim are 0.6.7, 0.6.8, 0.6.9, 0.7 and 0.7.1Dev
* tools.func.php is needed
* mysql.func.php is needed
*
*********************************************************************************/
/*********************************************************************************
* Function List
// for DB
function opensim_new_db($timeout=60)
function opensim_get_db_version(&$db=null)
function opensim_users_update_time(&$db=null)
function opensim_get_update_time($table, &$db=null)
function opensim_check_db(&$db=null)
// for Avatar
function opensim_get_avatars_num(&$db=null)
function opensim_get_avatar_name($uuid, &$db=null)
function opensim_get_avatar_uuid($name, &$db=null)
function opensim_get_avatar_session($uuid, &$db=null)
function opensim_get_avatar_info($uuid, &$db=null)
function opensim_get_avatars_infos($condition='', &$db=null)
function opensim_get_avatars_profiles_from_users($condition='', &$db=null)
function opensim_get_avatar_online($uuid, &$db=null)
function opensim_get_avatar_flags($uuid, &$db=null)
function opensim_set_avatar_flags($uuid, $flags=0, &$db=null)
function opensim_create_avatar($UUID, $firstname, $lastname, $passwd, $homeregion, &$db=null)
function opensim_delete_avatar($uuid, &$db=null)
// for Region
function opensim_get_regions_num(&$db=null)
function opensim_get_region_uuid($name, &$db=null)
function opensim_get_region_name($id, &$db=null)
function opensim_get_regions_names($condition='', &$db=null)
function opensim_get_region_info($region, &$db=null)
function opensim_get_regions_infos($condition='', &$db=null)
function opensim_set_current_region($uuid, $regionid, &$db=null)
// for Home Region
function opensim_get_home_region($uuid, &$db=null)
function opensim_set_home_region($uuid, $hmregion, $pos_x='128', $pos_y='128', $pos_z='0', &$db=null)
// for Estate Owner
function opensim_get_estate_owner($region, &$db=null)
function opensim_set_estate_owner($region, $owner, &$db=null)
// for Parcel
function opensim_get_parcel_name($parcel, &$db=null)
function opensim_get_parcel_info($parcel, &$db=null)
// for Assets
function opensim_get_asset_data($uuid, &$db=null)
function opensim_display_texture_data($uuid, $prog, $xsize='0', $ysize='0', $cachedir='', $use_tga=false)
// for Inventory
function opensim_create_inventory_folders($uuid, &$db=null)
// for Password
function opensim_get_password($uuid, $tbl='', &$db=null)
function opensim_set_password($uuid, $passwdhash, $passwdsalt='', $tbl='', &$db=null)
// for Update Data Base
//function opensim_supply_passwordSalt(&$db=null)
function opensim_succession_agents_to_griduser($region_id, &$db=null)
function opensim_succession_useraccounts_to_griduser($region_id, &$db=null)
function opensim_succession_data($region_name, &$db=null)
// for Voice (VoIP)
function opensim_get_voice_mode($region, &$db=null)
function opensim_set_voice_mode($region, $mode, &$db=null)
// for Currency
function opensim_set_currency_transaction($sourceId, $destId, $amount, $type, $flags, $description, $userip, &$db=null)
function opensim_set_currency_balance($uuid, $userip, $amount, &$db=null)
function opensim_get_currency_balance($uuid, $userip, &$db=null)
// Tools
function opensim_get_servers_ip(&$db=null)
function opensim_get_server_info($uuid, &$db=null)
function opensim_is_access_from_region_server()
function opensim_check_secure_session($uuid, $regionid, $secure, &$db=null)
function opensim_check_region_secret($uuid, $secret, &$db=null)
function opensim_clear_login_table(&$db=null)
**********************************************************************************/
define('OPENSIM_V06', 'opnesim_0.6');
define('OPENSIM_V07', 'opnesim_0.7');
define('AURORASIM', 'aurora-sim');
$OpenSimVersion = null;
/////////////////////////////////////////////////////////////////////////////////////
//
// Load Function
//
require_once(ENV_HELPER_PATH.'/../include/tools.func.php');
require_once(ENV_HELPER_PATH.'/../include/mysql.func.php');
/////////////////////////////////////////////////////////////////////////////////////
//
// for DB
//
function opensim_new_db($timeout=60)
{
$db = new DB(OPENSIM_DB_HOST, OPENSIM_DB_NAME, OPENSIM_DB_USER, OPENSIM_DB_PASS, $timeout);
return $db;
}
function opensim_get_db_version(&$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
$ver = null;
if ($db->exist_table('GridUser')) {
$ver = OPENSIM_V07;
}
else if ($db->exist_table('users')) {
$ver = OPENSIM_V06;
}
else if ($db->exist_field('userinfo', 'UserID')) {
$ver = AURORASIM;
}
$OpenSimVersion = $ver;
return $ver;
}
function opensim_users_update_time(&$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
if ($db->exist_table('GridUser')) $table = 'GridUser';
else if ($db->exist_table('users')) $table = 'users';
else return 0;
$utime = $db->get_update_time($table);
return $utime;
}
function opensim_get_update_time($table, &$db=null)
{
if ($table=="") return 0;
if (!is_object($db)) $db = & opensim_new_db();
$utime = $db->get_update_time($table);
return $utime;
}
function opensim_check_db(&$db=null)
{
global $OpenSimVersion;
$ret['grid_status'] = false;
$ret['now_online'] = 0;
$ret['lastmonth_online'] = 0;
$ret['user_count'] = 0;
$ret['region_count'] = 0;
if (!is_object($db)) $db = & opensim_new_db(3);
if ($db==null) return $ret;
if ($OpenSimVersion==null) opensim_get_db_version($db);
if ($db->exist_table('regions')) {
$db->query('SELECT COUNT(*) FROM regions');
if ($db->Errno==0) {
list($ret['region_count']) = $db->next_record();
}
}
if ($db->exist_table('GridUser')) { // 0.7
$db->query('SELECT COUNT(*) FROM UserAccounts');
list($ret['user_count']) = $db->next_record();
if ($db->exist_table('Presence')) { // 0.7
$db->query("SELECT COUNT(DISTINCT Presence.UserID) FROM GridUser,Presence ".
"WHERE Online='True' and GridUser.UserID=Presence.UserID and RegionID!='00000000-0000-0000-0000-000000000000'");
}
else { // 0.7 StandAlone mode
$db->query("SELECT COUNT(*) FROM GridUser WHERE Online='True'");
}
list($ret['now_online']) = $db->next_record();
$db->query('SELECT COUNT(*) FROM GridUser WHERE Login>unix_timestamp(from_unixtime(unix_timestamp(now())-2419200))');
list($ret['lastmonth_online']) = $db->next_record();
$ret['grid_status'] = true;
}
else if ($db->exist_table('users')) { // 0.6.x
$db->query('SELECT COUNT(*) FROM users');
list($ret['user_count']) = $db->next_record();
$db->query("SELECT COUNT(*) FROM agents WHERE agentOnline='1'");
list($ret['now_online']) = $db->next_record();
$db->query('SELECT COUNT(*) FROM agents WHERE logintime>unix_timestamp(from_unixtime(unix_timestamp(now())-2419200))');
list($ret['lastmonth_online']) = $db->next_record();
$ret['grid_status'] = true;
}
return $ret;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Avatar
//
function opensim_get_avatars_num(&$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$num = 0;
if ($db->exist_table('UserAccounts')) {
$db->query('SELECT COUNT(*) FROM UserAccounts');
list($num) = $db->next_record();
}
else if ($db->exist_table('users')) {
$db->query('SELECT COUNT(*) FROM users');
list($num) = $db->next_record();
}
else {
$num = -1;
}
return $num;
}
function opensim_get_avatar_name($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$firstname = null;
$lastname = null;
$fullname = null;
if ($db->exist_table('UserAccounts')) {
$db->query("SELECT FirstName,LastName FROM UserAccounts WHERE PrincipalID='$uuid'");
list($firstname, $lastname) = $db->next_record();
}
else if ($db->exist_table('users')) {
$db->query("SELECT username,lastname FROM users WHERE UUID='$uuid'");
list($firstname, $lastname) = $db->next_record();
}
$fullname = $firstname.' '.$lastname;
if ($fullname==' ') $fullname = null;
$name['firstname'] = $firstname;
$name['lastname'] = $lastname;
$name['fullname'] = $fullname;
return $name;
}
function opensim_get_avatar_uuid($name, &$db=null)
{
global $OpenSimVersion;
if (!isAlphabetNumericSpecial($name)) return false;
//$avatar_name = explode(' ', $name);
$avatar_name = preg_split("/ /", $name, 0, PREG_SPLIT_NO_EMPTY);
$firstname = $avatar_name[0];
$lastname = $avatar_name[1];
if ($firstname=='' or $lastname=='') return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$uuid = null;
if ($db->exist_table('UserAccounts')) {
$db->query("SELECT PrincipalID FROM UserAccounts WHERE FirstName='$firstname' and LastName='$lastname'");
list($uuid) = $db->next_record();
}
else if ($db->exist_table('users')) {
$db->query("SELECT UUID FROM users WHERE username='$firstname' and lastname='$lastname'");
list($uuid) = $db->next_record();
}
return $uuid;
}
function opensim_get_avatar_session($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$avssn = array();
//
if ($OpenSimVersion==OPENSIM_V07) {
$sql = "SELECT RegionID,SessionID,SecureSessionID FROM Presence WHERE UserID='".$uuid."'";
$db->query($sql);
if ($db->Errno==0) list($RegionID, $SessionID, $SecureSessionID) = $db->next_record();
}
else if ($OpenSimVersion==OPENSIM_V06) {
$sql = "SELECT currentRegion,sessionID,secureSessionID FROM agents WHERE UUID='".$uuid."'";
$db->query($sql);
if ($db->Errno==0) list($RegionID, $SessionID, $SecureSessionID) = $db->next_record();
}
else if ($OpenSimVersion==AURORASIM) {
$sql = "SELECT CurrentRegionID,token FROM tokens,userinfo WHERE UUID='".$uuid."' AND UUID=UserID AND IsOnline='1'";
$db->query($sql);
if ($db->Errno==0) {
while (list($rg, $ss) = $db->next_record()) { // Get Last Record
$RegionID = $rg;
$SessionID = null;
$SecureSessionID = $ss;
}
}
}
else return $avssn;
if ($db->Errno==0) {
$avssn['regionID'] = $RegionID;
$avssn['sessionID'] = $SessionID;
$avssn['secureID'] = $SecureSessionID;
}
return $avssn;
}
function opensim_get_avatar_info($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
//$online = false;
$profileText = '';
$profileImage = '';
$firstText = '';
$firstImage = '';
$partner = '';
if ($db->exist_table('GridUser')) {
$db->query('SELECT PrincipalID,FirstName,LastName,HomeRegionID,Created,Login FROM UserAccounts'.
" LEFT JOIN GridUser ON PrincipalID=UserID WHERE PrincipalID='$uuid'");
list($UUID, $firstname, $lastname, $regionUUID, $created, $lastlogin) = $db->next_record();
$db->query("SELECT regionName,serverIP,serverHttpPort,serverURI FROM regions WHERE uuid='$regionUUID'");
list($regionName, $serverIP, $serverHttpPort, $serverURI) = $db->next_record();
}
else if ($db->exist_table('users')) {
$db->query("SELECT UUID,username,lastname,homeRegion,created,lastLogin,profileAboutText,profileFirstText,profileImage,profileFirstImage,partner".
" FROM users WHERE uuid='$uuid'");
list($UUID, $firstname, $lastname, $rgnHandle, $created, $lastlogin, $profileText, $firstText, $profileImage, $firstImage, $partner) = $db->next_record();
$db->query("SELECT uuid,regionName,serverIP,serverHttpPort,serverURI FROM regions WHERE regionHandle='$rgnHandle'");
list($regionUUID, $regionName, $serverIP, $serverHttpPort, $serverURI) = $db->next_record();
}
else {
return null;
}
$fullname = $firstname.' '.$lastname;
if ($fullname==' ') $fullname = null;
$avinfo['UUID'] = $UUID;
$avinfo['firstname'] = $firstname;
$avinfo['lastname'] = $lastname;
$avinfo['fullname'] = $fullname;
$avinfo['created'] = $created;
$avinfo['lastlogin'] = $lastlogin;
$avinfo['regionUUID'] = $regionUUID;
$avinfo['regionName'] = $regionName;
$avinfo['serverIP'] = $serverIP;
$avinfo['serverHttpPort'] = $serverHttpPort;
$avinfo['serverURI'] = $serverURI;
$avinfo['profileText'] = $profileText;
$avinfo['profileImage'] = $profileImage;
$avinfo['firstText'] = $firstText;
$avinfo['firstImage'] = $firstImage;
$avinfo['partner'] = $partner;
//$avinfo['online'] = $online;
return $avinfo;
}
//
// Attention: When call this function, please check $condition for prevention of SQL Injection.
//
// return:
// $avinfos[$UUID]['UUID'] ... UUID
// $avinfos[$UUID]['firstname'] ... first name
// $avinfos[$UUID]['lastname'] ... lasti name
// $avinfos[$UUID]['created'] ... created time
// $avinfos[$UUID]['lastlogin'] ... lastlogin time
// $avinfos[$UUID]['hmregion'] ... uuid of home region
//
function opensim_get_avatars_infos($condition='', &$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$avinfos = array();
if ($db->exist_table('GridUser')) {
$db->query('SELECT PrincipalID,FirstName,LastName,Created,Login,homeRegionID FROM UserAccounts '.
'LEFT JOIN GridUser ON PrincipalID=UserID '.$condition);
}
else if ($db->exist_table('users')) {
$db->query('SELECT users.UUID,username,lastname,created,lastLogin,regions.uuid FROM users '.
'LEFT JOIN regions ON homeRegion=regionHandle '.$condition);
}
else {
return null;
}
if ($db->Errno==0) {
while (list($UUID,$firstname,$lastname,$created,$lastlogin,$hmregion) = $db->next_record()) {
$avinfos[$UUID]['UUID'] = $UUID;
$avinfos[$UUID]['firstname'] = $firstname;
$avinfos[$UUID]['lastname'] = $lastname;
$avinfos[$UUID]['created'] = $created;
$avinfos[$UUID]['lastlogin'] = $lastlogin;
$avinfos[$UUID]['hmregion'] = $hmregion;
}
}
return $avinfos;
}
//
// Attention: When call this function, please check $condition for prevention of SQL Injection.
//
function opensim_get_avatars_profiles_from_users($condition='', &$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$profs = null;
if ($db->exist_table('users')) {
$db->query('SELECT UUID,profileCanDoMask,profileWantDoMask,profileAboutText,'.
'profileFirstText,profileImage,profileFirstImage,partner,email FROM users '.$condition);
if ($db->Errno==0) {
$profs = array();
while (list($UUID,$skilmask,$wantmask,$abouttext,$firsttext,$image,$firstimage,$partnar,$email) = $db->next_record()) {
$profs[$UUID]['UUID'] = $UUID;
$profs[$UUID]['SkillsMask'] = $skilmask;
$profs[$UUID]['WantToMask'] = $wantmask;
$profs[$UUID]['AboutText'] = $abouttext;
$profs[$UUID]['FirstAboutText'] = $firsttext;
$profs[$UUID]['Image'] = $image;
$profs[$UUID]['FirstImage'] = $firstimage;
$profs[$UUID]['Partnar'] = $partnar;
$profs[$UUID]['Email'] = $email;
}
}
}
return $profs;
}
function opensim_get_avatar_online($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$online = false;
$null_region = '00000000-0000-0000-0000-000000000000';
$region = '00000000-0000-0000-0000-000000000000';
$rgn_name = '';
/*
if ($db->exist_field('Presence', 'Online')) { // old 0.7Dev
$db->query("SELECT Online,RegionID FROM Presence WHERE UserID='$uuid' and RegionID!='$null_region'");
if ($db->Errno==0) {
list($onln, $region) = $db->next_record();
if ($onln=='true') {
$rgn_name = opensim_get_region_name($region);
if ($rgn_name!='') $online = true;
}
}
}
*/
if ($db->exist_table('Presence')) { // 0.7
$db->query("SELECT RegionID FROM Presence,GridUser WHERE Presence.UserID='$uuid'".
" and RegionID!='$null_region' and Presence.UserID=GridUser.UserID and GridUser.Online='True'");
if ($db->Errno==0) {
list($region) = $db->next_record();
$rgn_name = opensim_get_region_name($region);
if ($rgn_name!='') $online = true;
}
}
else if ($db->exist_table('GridUser')) { // 0.7 StandAlone mode
$db->query("SELECT Online,LastRegionID FROM GridUser WHERE UserID='$uuid'");
if ($db->Errno==0) {
list($onln, $region) = $db->next_record();
if ($onln=='True') {
$rgn_name = opensim_get_region_name_by_i($region);
if ($rgn_name!='') $online = true;
}
}
}
else if ($db->exist_table('agents')) { // 0.6.x
$db->query("SELECT agentOnline,currentRegion FROM agents WHERE UUID='$uuid' AND logoutTime='0'");
if ($db->Errno==0) {
list($onln, $region) = $db->next_record();
if ($onln=='1') {
$rgn_name = opensim_get_region_name($region);
if ($rgn_name!='') $online = true;
}
}
}
$ret['online'] = $online;
$ret['region_id'] = $region;
$ret['region_name'] = $rgn_name;
return $ret;
}
function opensim_get_avatar_flags($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
// for 0.7
if ($db->exist_table('UserAccounts')) {
$db->query("SELECT UserFlags FROM UserAccounts WHERE PrincipalID='$uuid'");
if ($db->Errno==0) {
list($flags) = $db->next_record();
return $flags;
}
}
// for 0.6
else if ($db->exist_table('users')) {
$db->query("SELECT userFlags FROM users WHERE UUID='$uuid'");
if ($db->Errno==0) {
list($flags) = $db->next_record();
return $flags;
}
}
return 0;
}
function opensim_set_avatar_flags($uuid, $flags=0, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return false;
if (!isNumeric($flags)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
// for 0.7
if ($db->exist_table('UserAccounts')) {
$query_str = "UPDATE UserAccounts SET UserFlags='$flags' WHERE PrincipalID='$uuid'";
$db->query($query_str);
if ($db->Errno==0) return true;
}
// for 0.6
else if ($db->exist_table('users')) {
$query_str = "UPDATE users SET userFlags='$flags' WHERE UUID='$uuid'";
$db->query($query_str);
if ($db->Errno==0) return true;
}
return false;
}
function opensim_create_avatar($UUID, $firstname, $lastname, $passwd, $homeregion, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($UUID)) return false;
if (!isAlphabetNumericSpecial($firstname)) return false;
if (!isAlphabetNumericSpecial($lastname)) return false;
if (!isAlphabetNumericSpecial($passwd)) return false;
if (!isAlphabetNumericSpecial($homeregion)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$nulluuid = '00000000-0000-0000-0000-000000000000';
$passwdsalt = make_random_hash();
$passwdhash = md5(md5($passwd).":".$passwdsalt);
$db->query("SELECT uuid,regionHandle FROM regions WHERE regionName='$homeregion'");
$errno = $db->Errno;
if ($errno==0) {
list($regionID,$regionHandle) = $db->next_record();
// for 0.7
if ($db->exist_table('UserAccounts')) {
$serviceURLs = 'HomeURI= GatekeeperURI= InventoryServerURI= AssetServerURI=';
$db->query('INSERT INTO UserAccounts (PrincipalID,ScopeID,FirstName,LastName,Email,ServiceURLs,Created,UserLevel,UserFlags,UserTitle) '.
"VALUES ('$UUID','$nulluuid','$firstname','$lastname','','$serviceURLs','".time()."','0','0','')");
$errno = $db->Errno;
if ($errno==0) {
if ($db->exist_table('GridUser')) {
$db->query('INSERT INTO GridUser (UserID,HomeRegionID,HomePosition,HomeLookAt,'.
'LastRegionID,LastPosition,LastLookAt,Online,Login,Logout) '.
"VALUES ('$UUID','$regionID','<128,128,0>','<0,0,0>',".
"'$regionID','<128,128,0>','<0,0,0>','false','0','0')");
}
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO auth (UUID,passwordHash,passwordSalt,webLoginKey,accountType) '.
"VALUES ('$UUID','$passwdhash','$passwdsalt','$nulluuid','UserAccount')");
$errno = $db->Errno;
}
if ($errno==0) {
$errno = opensim_create_inventory_folders($UUID, $db);
}
if ($errno!=0) {
$db->query("DELETE FROM UserAccounts WHERE PrincipalID='$UUID'");
$db->query("DELETE FROM auth WHERE UUID='$UUID'");
$db->query("DELETE FROM inventoryfolders WHERE agentID='$UUID'");
if ($db->exist_table('GridUser')) $db->query("DELETE FROM GridUser WHERE UserID='$UUID'");
}
}
// for 0.6
else if ($db->exist_table('users')) {
$db->query('INSERT INTO users (UUID,username,lastname,passwordHash,passwordSalt,homeRegion,'.
'homeLocationX,homeLocationY,homeLocationZ,homeLookAtX,homeLookAtY,homeLookAtZ,'.
'created,lastLogin,userInventoryURI,userAssetURI,profileCanDoMask,profileWantDoMask,'.
'profileAboutText,profileFirstText,profileImage,profileFirstImage,homeRegionID) '.
"VALUES ('$UUID','$firstname','$lastname','$passwdhash','$passwdsalt','$regionHandle',".
"'128','128','128','100','100','100',".
"'".time()."','0','','','0','0','','','$nulluuid','$nulluuid','$regionID')");
if ($db->Errno!=0) {
$db->query("DELETE FROM users WHERE UUID='$UUID'");
if (!$db->exist_table('UserAccounts')) $errno = 99;
}
}
}
if ($errno!=0) return false;
return true;
}
//
// データベースからアバタ情報を削除する.
//
function opensim_delete_avatar($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
if ($db->exist_table('UserAccounts')) {
$db->query("DELETE FROM UserAccounts WHERE PrincipalID='$uuid'");
$db->query("DELETE FROM auth WHERE UUID='$uuid'");
$db->query("DELETE FROM Avatars WHERE PrincipalID='$uuid'");
$db->query("DELETE FROM Friends WHERE PrincipalID='$uuid'");
$db->query("DELETE FROM tokens WHERE UUID='$uuid'");
if ($db->exist_table('Presence')) $db->query("DELETE FROM Presence WHERE UserID='$uuid'");
if ($db->exist_table('GridUser')) $db->query("DELETE FROM GridUser WHERE UserID='$uuid'");
}
if ($db->exist_table('users')) {
$db->query("DELETE FROM users WHERE UUID='$uuid'");
$db->query("DELETE FROM agents WHERE UUID='$uuid'");
$db->query("DELETE FROM avatarappearance WHERE Owner='$uuid'");
$db->query("DELETE FROM avatarattachments WHERE UUID='$uuid'");
$db->query("DELETE FROM userfriends WHERE ownerID='$uuid'");
}
$db->query("DELETE FROM estate_managers WHERE uuid='$uuid'");
$db->query("DELETE FROM estate_users WHERE uuid='$uuid'");
$db->query("DELETE FROM estateban WHERE bannedUUID='$uuid'");
$db->query("DELETE FROM inventoryfolders WHERE agentID='$uuid'");
$db->query("DELETE FROM inventoryitems WHERE avatarID='$uuid'");
$db->query("DELETE FROM landaccesslist WHERE AccessUUID='$uuid'");
$db->query("DELETE FROM regionban WHERE bannedUUID='$uuid'");
// for DTL Money Server
if ($db->exist_table('balances')) {
//$db->query("DELETE FROM transactions WHERE UUID='$uuid'");
$db->query("DELETE FROM balances WHERE user LIKE '".$uuid."@%'");
$db->query("DELETE FROM userinfo WHERE user LIKE '".$uuid."@%'");
}
return true;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Region
//
function opensim_get_regions_num(&$db=null)
{
global $OpenSimVersion;
$num = 0;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$db->query('SELECT COUNT(*) FROM regions');
list($num) = $db->next_record();
return $num;
}
function opensim_get_region_uuid($name, &$db=null)
{
global $OpenSimVersion;
if (!isAlphabetNumericSpecial($name)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$uuid = '';
if ($name!='') {
$db->query("SELECT uuid FROM regions WHERE regionName='$name'");
list($uuid) = $db->next_record();
}
return $uuid;
}
function opensim_get_region_name($id, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($id) and !isNumeric($id)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
if (isGUID($id)) {
$db->query("SELECT regionName FROM regions WHERE uuid='$id'");
list($regionName) = $db->next_record();
}
else {
$db->query("SELECT regionName FROM regions WHERE regionHandle='$id'");
list($regionName) = $db->next_record();
}
return $regionName;
}
//
// Attention: When call this function, please check $condition for prevention of SQL Injection.
//
function opensim_get_regions_names($condition='', &$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$regions = array();
$db->query("SELECT regionName FROM regions ".$condition);
while ($db->Errno==0 and list($region)=$db->next_record()) {
$regions[] = $region;
}
return $regions;
}
function opensim_get_region_info($region, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($region)) return null;
if ($region=='00000000-0000-0000-0000-000000000000') return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$sql = "SELECT regionHandle,regionName,regionSecret,serverIP,serverHttpPort,serverURI,locX,locY FROM regions WHERE uuid='$region'";
$db->query($sql);
list($regionHandle, $regionName, $regionSecret, $serverIP, $serverHttpPort, $serverURI, $locX, $locY) = $db->next_record();
$rginfo = opensim_get_estate_owner($region, $db);
$rginfo['regionHandle'] = $regionHandle;
$rginfo['regionName'] = $regionName;
$rginfo['regionSecret'] = $regionSecret;
$rginfo['serverIP'] = $serverIP;
$rginfo['serverHttpPort'] = $serverHttpPort;
$rginfo['serverURI'] = $serverURI;
$rginfo['locX'] = $locX;
$rginfo['locY'] = $locY;
return $rginfo;
}
//
// Attention: When call this function, please check $condition for prevention of SQL Injection.
//
// return:
// $rginfos[$UUID]['UUID'] ... UUID
// $rginfos[$UUID]['regionName'] ... name of region
// $rginfos[$UUID]['locX'] ... location X
// $rginfos[$UUID]['locY'] ... location Y
// $rginfos[$UUID]['serverIP'] ... IP address of server
// $rginfos[$UUID]['serverPort'] ... port num of server
// $rginfos[$UUID]['serverURI'] ... URI of server
// $rginfos[$UUID]['owner_uuid'] ... UUID of region owner
// $rginfos[$UUID]['estate_id'] ... ID of estate
// $rginfos[$UUID]['estate_owner'] ... UUID of estate owner
// $rginfos[$UUID]['est_firstname'] ... first name
// $rginfos[$UUID]['est_lastname'] ... last name
// $rginfos[$UUID]['est_fullname'] ... full name
//
function opensim_get_regions_infos($condition='', &$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$rginfos = array();
$items = ' regions.uuid,regionName,locX,locY,serverIP,serverURI,serverHttpPort,owner_uuid,estate_map.EstateID,EstateOwner,';
$join1 = ' FROM regions LEFT JOIN estate_map ON RegionID=regions.uuid ';
$join2 = ' LEFT JOIN estate_settings ON estate_map.EstateID=estate_settings.EstateID ';
if ($db->exist_table('UserAccounts')) {
$uname = 'firstname,lastname ';
$join3 = ' LEFT JOIN UserAccounts ON EstateOwner=UserAccounts.PrincipalID ';
$frmwh = ' FROM UserAccounts WHERE UserAccounts.PrincipalID=';
}
else if ($db->exist_table('users')) {
$uname = 'username,lastname ';
$join3 = ' LEFT JOIN users ON EstateOwner=users.UUID ';
$frmwh = ' FROM users WHERE users.UUID=';
}
else {
return null;
}
$query_str = 'SELECT '.$items.$uname.$join1.$join2.$join3.$condition;
$db->query($query_str);
if ($db->Errno==0) {
while (list($UUID,$regionName,$locX,$locY,$serverIP,$serverURI,$serverPort,
$owneruuid,$estateid,$estateowner,$firstname,$lastname) = $db->next_record()) {
$rginfos[$UUID]['UUID'] = $UUID;
$rginfos[$UUID]['regionName'] = $regionName;
$rginfos[$UUID]['locX'] = $locX;
$rginfos[$UUID]['locY'] = $locY;
$rginfos[$UUID]['serverIP'] = $serverIP;
$rginfos[$UUID]['serverPort'] = $serverPort;
$rginfos[$UUID]['serverURI'] = $serverURI;
$rginfos[$UUID]['owner_uuid'] = $owneruuid;
$rginfos[$UUID]['estate_id'] = $estateid;
$rginfos[$UUID]['estate_owner'] = $estateowner;
$rginfos[$UUID]['est_firstname']= $firstname;
$rginfos[$UUID]['est_lastname'] = $lastname;
$rginfos[$UUID]['est_fullname'] = null;
$fullname = $firstname.' '.$lastname;
if ($fullname!=' ') $rginfos[$UUID]['est_fullname'] = $fullname;
}
}
// Region Owner
foreach($rginfos as $region) {
$rginfos[$region['UUID']]['rgn_firstname'] = null;
$rginfos[$region['UUID']]['rgn_lastname'] = null;
$rginfos[$region['UUID']]['rgn_fullname'] = null;
if ($region['owner_uuid']!=null) {
$db->query('SELECT '.$uname.$frmwh."'".$region['owner_uuid']."'");
list($firstname,$lastname) = $db->next_record();
$rginfos[$region['UUID']]['rgn_firstname'] = $firstname;
$rginfos[$region['UUID']]['rgn_lastname'] = $lastname;
$fullname = $firstname.' '.$lastname;
if ($fullname!=' ') $rginfos[$region['UUID']]['rgn_fullname'] = $fullname;
}
}
return $rginfos;
}
function opensim_set_current_region($uuid, $regionid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid) or !isGUID($regionid)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
//
if ($OpenSimVersion==OPENSIM_V07) {
$sql = "UPDATE Presence SET RegionID='".$regionid."' WHERE UserID='". $uuid."'";
}
else if ($OpenSimVersion==OPENSIM_V06) {
$sql = "UPDATE agents SET currentRegion='".$regionid."' WHERE UUID='".$uuid."'";
}
else if ($OpenSimVersion==AURORASIM) {
$sql = "UPDATE userinfo SET CurrentRegionID='".$regionid."' WHERE UserID='".$uuid."'";
}
else return false;
$db->query($sql);
if ($db->Errno!=0) return false;
$db->next_record();
return true;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Home Region
//
function opensim_get_home_region($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$region_name = '';
if ($db->exist_table('GridUser')) {
$db->query("SELECT regionName FROM GridUser,regions WHERE HomeRegionID=uuid AND UserID='$uuid'");
list($region_name) = $db->next_record();
}
else if ($db->exist_table('users')) {
$db->query("SELECT regionName FROM users,regions WHERE homeRegionID=regions.uuid AND users.UUID='$uuid'");
list($region_name) = $db->next_record();
}
return $region_name;
}
function opensim_set_home_region($uuid, $hmregion, $pos_x='128', $pos_y='128', $pos_z='0', &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return false;
if (!isAlphabetNumericSpecial($hmregion)) return false;
if (!isNumeric($pos_x) or !isNumeric($pos_y) or !isNumeric($pos_z)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$db->query("SELECT uuid,regionHandle FROM regions WHERE regionName='$hmregion'");
$errno = $db->Errno;
if ($errno==0) {
list($regionID, $regionHandle) = $db->next_record();
if ($db->exist_table('GridUser')) {
$homePosition = "<$pos_x,$pos_y,$pos_z>";
$db->query("UPDATE GridUser SET HomeRegionID='$regionID',HomePosition='$homePosition' WHERE UserID='$uuid'");
$errno = $db->Errno;
}
if ($db->exist_table('users') and $errno==0) {
$homePosition = "homeLocationX='$pos_x',homeLocationY='$pos_y',homeLocationZ='$pos_z' ";
$db->query("UPDATE users SET homeRegion='$regionHandle',homeRegionID='$regionID',$homePosition WHERE UUID='$uuid'");
if ($db->Errno!=0) {
if (!$db->exist_table('auth')) $errno = 99;
}
}
}
if ($errno!=0) return false;
return true;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Estate Owner
//
//
// SIMのリージョンIDからオーナーの情報を返す.
//
function opensim_get_estate_owner($region, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($region)) return null;
$firstname = null;
$lastname = null;
$fullname = null;
$owneruuid = null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
if ($db->exist_table('UserAccounts')) {
$rqdt = 'PrincipalID,FirstName,LastName';
$tbls = 'UserAccounts,estate_map,estate_settings';
$cndn = "RegionID='$region' AND estate_map.EstateID=estate_settings.EstateID AND EstateOwner=PrincipalID";
}
else if ($db->exist_table('users')) {
$rqdt = 'UUID,username,lastname';
$tbls = 'users,estate_map,estate_settings';
$cndn = "RegionID='$region' AND estate_map.EstateID=estate_settings.EstateID AND EstateOwner=UUID";
}
else {
return null;
}
$db->query('SELECT '.$rqdt.' FROM '.$tbls.' WHERE '.$cndn);
list($owneruuid, $firstname, $lastname) = $db->next_record();
$fullname = $firstname.' '.$lastname;
if ($fullname==' ') $fullname = null;
$name['firstname'] = $firstname;
$name['lastname'] = $lastname;
$name['fullname'] = $fullname;
$name['owner_uuid'] = $owneruuid;
return $name;
}
function opensim_set_estate_owner($region, $owner, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($region)) return false;
if (!isGUID($owner)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$db->query("UPDATE estate_settings,estate_map SET EstateOwner='$owner' WHERE estate_settings.EstateID=estate_map.EstateID AND RegionID='$region'");
$errno = $db->Errno;
if ($errno==0) $db->query("UPDATE regions SET owner_uuid='$owner' WHERE uuid='$region'");
if ($errno!=0) return false;
return true;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Parcel
//
function opensim_get_parcel_name($parcel, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($parcel)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$name = null;
$db->query("SELECT name FROM land WHERE UUID='$parcel'");
if ($db->Errno==0) list($name) = $db->next_record();
return $name;
}
function opensim_get_parcel_info($parcel, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($parcel)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$info = array();
$items = "RegionUUID,Name,Description,OwnerUUID,Category,SalePrice,LandStatus,LandFlags,LandingType,Dwell";
$query_str = "SELECT ".$items." FROM land WHERE UUID='".$parcel."'";
$db->query($query_str);
if ($db->Errno==0) $info = $db->next_record();
return $info;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Assets
//
function opensim_get_asset_data($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return $asset;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$asset = array();
$db->query("SELECT name,description,assetType,data,asset_flags,CreatorID FROM assets WHERE id='$uuid'");
list($name, $desc, $type, $data, $flag, $creator) = $db->next_record();
$asset['UUID'] = $uuid;
$asset['name'] = $name;
$asset['desc'] = $desc;
$asset['type'] = $type;
$asset['data'] = $data;
$asset['flag'] = $flag;
$asset['creator'] = $creator;
return $asset;
}
function opensim_display_texture_data($uuid, $prog, $xsize='0', $ysize='0', $cachedir='', $use_tga=false)
{
if (!isGuid($uuid)) return false;
if ($prog==null or $prog=='') return false;
if ($cachedir=='') $cachedir = '/tmp';
$cachefile = $cachedir.'/'.$uuid;
// PHP module
$imagick = null;
if ($prog=='imagick') {
if (class_exists('Imagick')) {
$imagick = new Imagick();
}
else {
echo '<h4>PHP module Imagick is not installed!!</h4>';
return false;
}
}
// Linux Command
else {
if (file_exists('/usr/local/bin/'.$prog)) $path = '/usr/local/bin/';
else if (file_exists('/usr/bin/'.$prog)) $path = '/usr/bin/';
else if (file_exists('/usr/X11R6/bin/'.$prog)) $path = '/usr/X11R6/bin/';
else if (file_exists('/bin/'. $prog)) $path = '/bin/';
else {
echo '<h4>program '.$prog.' is not found!!</h4>';
return false;
}
if ($prog=='jasper') { // JasPer does not support Targa image format.
$use_tga = false;
}
}
// Check j2k to TGA command
if ($use_tga) {
$tga_com = get_j2k_to_tga_command();
if ($tga_com=='') $use_tga = false;
}
// get and save image
if (! ((!$use_tga and file_exists($cachefile)) or ($use_tga and file_exists($cachefile.'.tga')))) {
$imgdata = '';
// from MySQL Server
$asset = opensim_get_asset_data($uuid);
if ($asset) {
if ($asset['type']==0) {
$imgdata = $asset['data'];
}
}
else {
echo '<h4>asset uuid is not found!! ('.htmlspecialchars($uuid).')</h4>';
return false;
}
/* // from Asset Server
//$asset_url = $ASSET_SERVER_URL.'/assets/'.$uuid;
$asset_url = 'http://202.26.159.200:8003/assets/'.$uuid;
$fp = fopen($asset_url, "rb");
stream_set_timeout($fp, 5);
$content = stream_get_contents($fp);
fclose($fp);
if (!$content) {
echo '<h4>asset uuid is not found!! ('.htmlspecialchars($uuid).')</h4>';
return false;
}
$xml = new SimpleXMLElement($content);
$imgdata = base64_decode($xml->Data);
*/
// Save Image Data
$fp = fopen($cachefile, 'wb');
fwrite($fp, $imgdata);
fclose($fp);
if ($use_tga) {
if (!j2k_to_tga($cachefile)) $use_tga = false;
}
}
if ($use_tga && file_exists($cachefile.'.tga')) $cachefile .= '.tga';
//
// program for image processing of jpeg2000
//
// Imagick of PHP
if ($prog=='imagick' and $imagick!=null) {
$ret = $imagick->readImage($cachefile);
if (!$ret) {
echo '<h4>Imagick could not read '.$cachefile.'!!</h4>';
return false;
}
$imagick->setImageFormat('JPEG');
if ($xsize>0 and $ysize>0) {
$imagick->scaleImage($xsize, $ysize);
}
header("Content-Type: image/jpeg");
echo $imagick;
}
// ImageMagic (convert)
else if ($prog=='convert') {
$imgsize = '';
if ($xsize>0 and $ysize>0) $imgsize = ' -resize '.$xsize.'x'.$ysize.'!';
$prog = $path.'convert '. $cachefile.$imgsize.' jpeg:-';
header("Content-Type: image/jpeg");
passthru($prog);
}
// Jasper
else if ($prog=='jasper') {
$conv = '';
if ($xsize>0 and $ysize>0) {
$conv = get_image_size_convert_command($xsize, $ysize);
if ($conv!='') $conv = ' | '.$conv;
}
$prog = $path.'jasper -f '.$cachefile.' -T jpg'.$conv;
header("Content-Type: image/jpeg");
passthru($prog);
}
return true;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Inventory
//
function opensim_create_inventory_folders($uuid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return 999;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$my_inventory = make_random_guid();
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('My Inventory','8','1','$my_inventory','$uuid','00000000-0000-0000-0000-000000000000')");
$errno = $db->Errno;
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Textures','0','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Sounds','1','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Calling Cards','2','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Landmarks','3','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Clothing','5','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Objects','6','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Notecards','7','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Scripts','10','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Body Parts','13','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Trash','14','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Photo Album','15','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Lost And Found','16','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Animations','20','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
if ($errno==0) {
$db->query('INSERT INTO inventoryfolders (folderName,type,version,folderID,agentID,parentFolderID) '.
"VALUES ('Gestures','21','1','".make_random_guid()."','$uuid','$my_inventory')");
$errno = $db->Errno;
}
return $errno;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Password
//
function opensim_get_password($uuid, $tbl='', &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return null;
if (!isAlphabetNumeric($tbl, true)) return null;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$passwdhash = null;
$passwdsalt = null;
if ($tbl=='' or $tbl=='auth') {
if ($db->exist_table('auth')) {
$db->query("SELECT passwordHash,passwordSalt FROM auth WHERE UUID='$uuid'");
list($passwdhash, $passwdsalt) = $db->next_record();
}
}
if ($passwdhash==null and $passwdsalt==null) {
if ($tbl=='' or $tbl=='users') {
if ($db->exist_table('users')) {
$db->query("SELECT passwordHash,passwordSalt FROM users WHERE UUID='$uuid'");
list($passwdhash, $passwdsalt) = $db->next_record();
}
}
}
$ret['passwordHash'] = $passwdhash;
$ret['passwordSalt'] = $passwdsalt;
return $ret;
}
function opensim_set_password($uuid, $passwdhash, $passwdsalt='', $tbl='', &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return false;
if (!isAlphabetNumeric($passwdhash)) return false;
if (!isAlphabetNumeric($passwdsalt, true)) return false;
if (!isAlphabetNumeric($tbl, true)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$setpasswd = "passwordHash='$passwdhash'";
if ($passwdsalt!='') {
$setpasswd .= ",passwordSalt='$passwdsalt'";
}
$errno = 0;
if ($tbl=='' or $tbl=='auth') {
if ($db->exist_table('auth')) {
$db->query("UPDATE auth SET ".$setpasswd." WHERE UUID='$uuid'");
$errno = $db->Errno;
}
}
if (($tbl=='' or $tbl=='users') and $errno==0) {
if ($db->exist_table('users')) {
$db->query("UPDATE users SET ".$setpasswd." WHERE UUID='$uuid'");
if ($db->Errno!=0) {
if (!$db->exist_table('auth')) $errno = 99;
}
}
}
if ($errno!=0) return false;
return true;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Update Data Base
//
/*
function opensim_supply_passwordSalt(&$db=null)
{
if (!is_object($db)) $db = & opensim_new_db();
$dp2 = & opensim_new_db();
if ($db->exist_table('auth')) {
$db->query('SELECT UUID,passwordHash,passwordSalt FROM auth');
while ($data = $db->next_record()) {
if ($data['passwordSalt']=='') {
$passwdSalt = make_random_hash();
$passwdHash = md5($data['passwordHash'].':'.$passwdSalt);
opensim_set_password($data['UUID'], $passwdHash, $passwdSalt, 'auth', $db2);
}
}
}
if ($db->exist_table('users')) {
$db->query('SELECT UUID,passwordHash,passwordSalt FROM users');
while ($data = $db->next_record()) {
if ($data['passwordSalt']=='') {
$passwdSalt = make_random_hash();
$passwdHash = md5($data['passwordHash'].':'.$passwdSalt);
opensim_set_password($data['UUID'], $passwdHash, $passwdSalt, 'users', $db2);
}
}
}
return;
}
*/
function opensim_succession_agents_to_griduser($region_id, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($region_id)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$db->query('SELECT agents.UUID,currentRegion,loginTime,logoutTime,homeRegion,'.
'homeLocationX,homeLocationY,homeLocationZ FROM agents,users WHERE agents.UUID=users.UUID');
$errno = $db->Errno;
if ($errno==0) {
$db2 = & opensim_new_db();
while(list($UUID,$currentRegion,$login,$logout,$homeHandle,$locX,$locY,$locZ) = $db->next_record()) {
$db2->query("SELECT uuid FROM regions WHERE regionHandle='$homeHandle'");
list($homeRegion) = $db2->next_record();
if ($homeRegion==null) {
$homeRegion = $region_id;
$locX = '128';
$locY = '128';
$locZ = '20';
}
$db2->query("SELECT UserID,HomeRegionID FROM GridUser WHERE UserID='$UUID'");
list($userid, $hmregion) = $db2->next_record();
if ($userid==null) {
if ($login!=0 and $logout<$login) $logout = $login;
$db2->query('INSERT INTO GridUser (UserID,HomeRegionID,HomePosition,HomeLookAt,LastRegionID,LastPosition,LastLookAt,Online,Login,Logout) '.
"VALUES ('$UUID','$homeRegion','<$locX,$locY,$locZ>','<0,0,0>','$currentRegion','<128,128,0>','<0,0,0>','False','$login','$logout')");
$errno =$db2->Errno;
if ($errno!=0) {
$db->query("DELETE FROM GridUser WHERE UserID='$UUID'");
}
}
else if ($hmregion=='00000000-0000-0000-0000-000000000000' or $hmregion==null) {
$db2->query("UPDATE GridUser SET HomeRegionID='$homeRegion',HomePosition='<$locX,$locY,$locZ>' WHERE UserID='$UUID'");
}
}
}
if ($errno!=0) return false;
return true;
}
function opensim_succession_useraccounts_to_griduser($region_id, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($region_id)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$db->query('SELECT PrincipalID FROM UserAccounts');
$errno = $db->Errno;
$homeRegion = $region_id;
if ($errno==0) {
$db2 = & opensim_new_db();
while(list($UUID) = $db->next_record()) {
$db2->query("SELECT UserID,HomeRegionID FROM GridUser WHERE UserID='$UUID'");
list($userid, $hmregion) = $db2->next_record();
if ($userid==null) {
$db2->query('INSERT INTO GridUser (UserID,HomeRegionID,HomePosition,HomeLookAt,LastRegionID,LastPosition,LastLookAt,Online,Login,Logout) '.
"VALUES ('$UUID','$homeRegion','<128,128,0>','<0,0,0>','$homeRegion','<128,128,0>','<0,0,0>','False','0','0')");
$errno =$db2->Errno;
if ($errno!=0) {
$db->query("DELETE FROM GridUser WHERE UserID='$UUID'");
}
}
else if ($hmregion=='00000000-0000-0000-0000-000000000000' or $hmregion==null) {
$db2->query("UPDATE GridUser SET HomeRegionID='$homeRegion',HomePosition='<128,128,0>' WHERE UserID='$UUID'");
}
}
}
if ($errno!=0) return false;
return true;
}
//
// agents -> GridUser
// UserAccounts -> GridUser
//
// $region_name is default home region name.
//
function opensim_succession_data($region_name, &$db=null)
{
global $OpenSimVersion;
if (!isAlphabetNumericSpecial($region_name, true)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$exist_agents = $db->exist_table('agents');
$exist_griduser = $db->exist_table('GridUser');
$exist_usracnt = $db->exist_table('UserAccounts');
$region_id = '';
if ($region_name!='') {
$region_id = opensim_get_region_uuid($region_name);
}
if ($region_id=='') $region_id = '00000000-0000-0000-0000-000000000000';
if ($exist_agents and $exist_griduser) {
opensim_succession_agents_to_griduser($region_id);
}
if ($exist_usracnt and $exist_griduser) {
opensim_succession_useraccounts_to_griduser($region_id);
}
return;
}
//
//
function opensim_recreate_presence(&$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
if ($db->exist_field('Presence', 'HomeRegionID')) {
$db->query('DROP TABLE Presence');
$db->query("DELETE FROM migrations WHERE name='Presence'");
}
// Creation is automatic by ROBUST server.
return;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Voice (VoIP)
//
function opensim_get_voice_mode($region, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($region)) return -1;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$voiceflag = 0x60000000;
$db->query("SELECT LandFlags FROM land WHERE RegionUUID='$region'");
while (list($flag) = $db->next_record()) {
$voiceflag &= $flag;
}
if ($voiceflag==0x20000000) return 1;
else if ($voiceflag==0x40000000) return 2;
return 0;
}
function opensim_set_voice_mode($region, $mode, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($region)) false;
if (!preg_match('/^[0-2]$/', $mode)) false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$colum = 0;
$vflags = array();
$db->query("SELECT UUID,LandFlags FROM land WHERE RegionUUID='$region'");
while (list($UUID, $flag) = $db->next_record()) {
$flag &= 0x9fffffff;
if ($mode==1) $flag |= 0x20000000;
else if ($mode==2) $flag |= 0x40000000;
$vflags[$colum]['UUID'] = $UUID;
$vflags[$colum]['flag'] = $flag;
$colum++;
}
foreach($vflags as $vflag) {
$UUID = $vflag['UUID'];
$flag = $vflag['flag'];
$db->query("UPDATE land SET LandFlags='$flag' WHERE UUID='$UUID'");
}
return true;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// for Currency
function opensim_set_currency_transaction($sourceId, $destId, $amount, $type, $flags, $description, $userip, &$db=null)
{
if (!isNumeric($amount)) return;
if (!isGUID($sourceId)) $sourceId = '00000000-0000-0000-0000-000000000000';
if (!isGUID($destId)) $destId = '00000000-0000-0000-0000-000000000000';
if (!is_object($db)) $db = & opensim_new_db();
$handle = 0;
$secure = '00000000-0000-0000-0000-000000000000';
$client = $sourceId;
$UUID = make_random_guid();
$sourceID = $sourceId.'@'.$userip;
$destID = $destId.'@'.$userip;
if ($client=='00000000-0000-0000-0000-000000000000') $client = $destId;
$avt = opensim_get_avatar_session($client);
if ($avt!=null) {
$region = $avt['regionID'];
$secure = $avt['secureID'];
$rgn = opensim_get_region_info($region);
if ($rgn!=null) $handle = $rgn["regionHandle"];
}
$sql = "INSERT INTO ".CURRENCY_TRANSACTION_TBL." (UUID,sender,receiver,amount,objectUUID,".
"regionHandle,type,time,secure,status,description) ".
"VALUES ('".
$UUID."','".
$sourceID."','".
$destID."','".
$amount."','".
"00000000-0000-0000-0000-000000000000','".
$handle."','".
$db->escape($type)."','".
time()."','".
$secure."','".
$db->escape($flags)."','".
$db->escape($description)."')";
$db->query($sql);
}
function opensim_set_currency_balance($agentid, $userip, $amount, &$db=null)
{
if (!isGUID($agentid) or !isNumeric($amount)) return;
if (!is_object($db)) $db = & opensim_new_db();
$userid = $db->escape($agentid.'@'.$userip);
$db->lock_table(CURRENCY_MONEY_TBL);
$db->query("SELECT balance FROM ".CURRENCY_MONEY_TBL." WHERE user='".$userid."'");
if ($db->Errno==0) {
list($cash) = $db->next_record();
$balance = (integer)$cash + (integer)$amount;
$db->query("UPDATE ".CURRENCY_MONEY_TBL." SET balance='".$balance."' WHERE user='".$userid."'");
if ($db->Errno==0) $db->next_record();
}
$db->unlock_table();
}
function opensim_get_currency_balance($agentid, $userip, &$db=null)
{
if (!isGUID($agentid)) return;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$userid = $db->escape($agentid.'@'.$userip);
$db->query("SELECT balance FROM ".CURRENCY_MONEY_TBL." WHERE user='".$userid."'");
$cash = 0;
if ($db->Errno==0) list($cash) = $db->next_record();
return (integer)$cash;
}
/////////////////////////////////////////////////////////////////////////////////////
//
// Tools
//
function opensim_get_servers_ip(&$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$ips = array();
$db->query("SELECT DISTINCT serverIP FROM regions");
if ($db->Errno==0) {
$count = 0;
while (list($serverIP) = $db->next_record()) {
$ips[$count] = $serverIP;
$count++;
}
}
return $ips;
}
function opensim_get_server_info($userid, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($userid)) return $ret;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
$ret = array();
//
if ($OpenSimVersion==OPENSIM_V07) {
$sql = "SELECT serverIP,serverHttpPort,serverURI,regionSecret FROM GridUser ";
$sql.= "INNER JOIN regions ON regions.uuid=GridUser.LastRegionID WHERE GridUser.UserID='".$userid."'";
$db->query($sql);
if ($db->Errno==0) list($serverip, $httpport, $serveruri, $secret) = $db->next_record();
}
else if ($OpenSimVersion==OPENSIM_V06) {
$sql = "SELECT serverIP,serverHttpPort,serverURI,regionSecret FROM agents ";
$sql.= "INNRT JOIN regions ON regions.uuid=agents.currentRegion WHERE agents.UUID='".$userid."'";
$db->query($sql);
if ($db->Errno==0) list($serverip, $httpport, $serveruri, $secret) = $db->next_record();
}
else if ($OpenSimVersion==AURORASIM) {
$sql = "SELECT RegionInfo FROM userinfo,simulator ";
$sql.= "WHERE UserID='".$userid."' AND CurrentRegionID=simulator.RegionID";
$db->query($sql);
if ($db->Errno==0) {
list($regioninfo) = $db->next_record();
$info = split_key_value($regioninfo); // from tools.func.php
$serverip = gethostbyname($info["external_host_name"]);
$httpport = $info["http_port"];
$serveruri = $info["server_uri"];
$secret = null;
}
}
else return $ret;
if ($db->Errno==0) {
$ret["serverIP"] = $serverip;
$ret["serverHttpPort"] = $httpport;
$ret["serverURI"] = $serveruri;
$ret["regionSecret"] = $secret;
}
return $ret;
}
function opensim_is_access_from_region_server()
{
$ip_match = false;
$remote_addr = $_SERVER['REMOTE_ADDR'];
$server_addr = $_SERVER['SERVER_ADDR'];
if ($remote_addr==$server_addr or $remote_addr=="127.0.0.1") return true;
$ips = opensim_get_servers_ip();
foreach($ips as $ip) {
if ($ip == $remote_addr) {
$ip_match = true;
break;
}
}
return $ip_match;
}
//
function opensim_check_secure_session($uuid, $regionid, $secure, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid) or !isGUID($secure)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
//
if ($OpenSimVersion==OPENSIM_V07) {
$sql = "SELECT UserID FROM Presence WHERE UserID='".$uuid."' AND SecureSessionID='".$secure."'";
if (isGUID($regionid)) $sql = $sql." AND RegionID='".$regionid."'";
}
else if ($OpenSimVersion==OPENSIM_V07) {
$sql = "SELECT UUID FROM agents WHERE UUID='".$uuid."' AND secureSessionID='".$secure."' AND agentOnline='1'";
if (isGUID($regionid)) $sql = $sql." AND currentRegion='".$regionid."'";
}
else if ($OpenSimVersion==AURORASIM) {
$sql = "SELECT UUID FROM tokens,userinfo WHERE UUID='".$uuid."' AND UUID=UserID AND token='".$secure."' AND IsOnline='1'";
if (isGUID($regionid)) $sql = $sql." AND CurrentRegionID='".$regionid."'";
}
else return false;
$db->query($sql);
if ($db->Errno!=0) return false;
list($UUID) = $db->next_record();
if ($UUID!=$uuid) return false;
return true;
}
//
function opensim_check_region_secret($uuid, $secret, &$db=null)
{
global $OpenSimVersion;
if (!isGUID($uuid)) return false;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
//
if ($OpenSimVersion==OPENSIM_V07 or $OpenSimVersion==OPENSIM_V06) {
$sql = "SELECT UUID FROM regions WHERE UUID='".$uuid."' AND regionSecret='".$db->escape($secret)."'";
$db->query($sql);
if ($db->Errno==0) {
list($UUID) = $db->next_record();
if ($UUID==$uuid) return true;
}
}
else {
$sql = "SELECT RegionInfo FROM userinfo,simulator ";
$sql.= "WHERE UserID='".$userid."' AND CurrentRegionID=simulator.RegionID";
$db->query($sql);
if ($db->Errno==0) {
list($regioninfo) = $db->next_record();
$info = split_key_value($regioninfo); // from tools.func.php
if ($secret==$info["password"]) return true;
}
}
return false;
}
function opensim_clear_login_table(&$db=null)
{
global $OpenSimVersion;
if (!is_object($db)) $db = & opensim_new_db();
if ($OpenSimVersion==null) opensim_get_db_version($db);
//
if ($OpenSimVersion==OPENSIM_V07) {
$db->query("DELETE FROM Presence");
}
else if ($OpenSimVersion==OPENSIM_V06) {
//$db->query("DELETE FROM agents");
return true;
}
else return false;
return true;
}
?>