OpenSimMirror/login/index.php

171 lines
6.5 KiB
PHP

<?
error_reporting(0); // Remember kids, PHP errors kill XML-RPC responses!
// include all the common stuff
include("../common/xmlrpc.inc.php");
include("../common/database.inc.php");
include("../common/grid_config.inc.php");
include("../common/util.inc.php");
include("login_config.inc.php"); // include login/user specific config stuff (authentication keys etc)
function login($args) {
global $dbhost,$dbuser,$dbpasswd,$dbname;
global $grid_owner, $gridserver_sendkey, $gridserver_recvkey, $gridserver_url;
if(get_magic_quotes_gpc()) {
$firstname=addslashes($args['first']);
$lastname=addslashes($args['last']);
$passwd=addslashes($args['passwd']);
} else {
$firstname=$args['first'];
$lastname=$args['last'];
$passwd=$args['passwd'];
}
$link = mysql_connect($dbhost,$dbuser,$dbpasswd)
OR die("Unable to connect to database");
mysql_select_db($dbname)
or die("Unable to select database");
$query = "SELECT userprofile_LLUUID, profile_firstname, profile_lastname, profile_passwdmd5, homesim_ip, homesim_port, homeasset_url, look_at, region_handle, position FROM local_user_profiles WHERE profile_firstname='".$firstname."' AND profile_lastname='".$lastname."' AND profile_passwdmd5='" .$passwd."'";
$profile_lookup_result=mysql_query($query);
if(mysql_num_rows($profile_lookup_result) >0) {
$profiledata = mysql_fetch_assoc($profile_lookup_result);
// if we get here, the username/password is valid, but still need to check there's not an already existing session
$client = new IXR_Client($gridserver_url);
if (!$client->query('check_session_loggedin', Array('userprofile_LLUUID' => $profiledata['userprofile_LLUUID'], 'authkey' => $gridserver_sendkey, 'server_type' => 'login'))) { // if this doesn't work, grid server is down - that's bad
return Array (
'reason' => 'key',
'message' => "Could not connect to grid server. Please try again later or contact the grid owner ". $grid_owner,
'login' => "false"
);
}
$response=$client->getResponse();
if($response['authkey'] != $gridserver_recvkey) { // if this doesn't match up, it's a fake grid server
return Array (
'reason' => 'key',
'message' => "Could not connect to grid server due to possible security issues. It is possible that the grid has been compromised. Please contact the grid owner " . $grid_owner . " and report this issue",
'login' => "false"
);
}
if($response['logged_in'] == 1) { // if the user is already logged in, tell them
return Array (
'reason' => 'presence',
'message' => "You appear to already be logged into this grid, if your client has recently crashed then please try again later",
'login' => "false"
);
}
// now we start a new session on the grid
$remote_ip=$_SERVER['REMOTE_ADDR'];
$region_handle=$profiledata['region_handle'];
$client->query('create_session',Array('userprofile_LLUUID' => $profiledata['userprofile_LLUUID'], 'authkey' => $gridserver_sendkey, 'remote_ip' => $remote_ip, 'current_location' => $region_handle));
$response = $client->getResponse();
$session_id = $response['session_id'];
$secure_session_id = $response['secure_session_id'];
// ask the grid server what the IP address and port of the sim we want to connect to is
$client->query('get_sim_info', Array('region_handle' => $region_handle, 'authkey' => $gridserver_sendkey) );
$siminfo = $client->getResponse();
// send the final response!
$position=$profiledata['position'];
$look_at=$profiledata['look_at'];
$LocX=intval($siminfo['GridLocX'])*256;
$LocY=intval($siminfo['GridLocY'])*256;
$home="{'region_handle':'$region_handle', 'position':'$position', 'look_at':'$look_at'}";
$globaltextures = new LLBlock(
Array(
'sun_texture_id' => "cce0f112-878f-4586-a2e2-a8f104bba271",
'cloud_texture_id' => "fc4b9f0b-d008-45c6-96a4-01dd947ac621",
'moon_texture_id' => "d07f6eed-b96a-47cd-b51d-400ad4a1c428"
));
$login_flags = new LLBlock(
Array(
'stipend_since_login' => "N",
'ever_logged_in' => "Y",
'gendered' => "Y",
'daylight_savings' => "N"
));
$ui_config = new LLBlock(
Array(
'allow_first_life' => "Y"
));
$inventory_skeleton = new LLBlock(Array(
Array(
'name' => 'My inventory',
'parent_id' => '00000000-0000-0000-0000-000000000000',
'version' => 4,
'type_default' => 8,
'folder_id' => 'f798e114-c10f-409b-a90d-a11577ff1de8'
),
Array(
'name' => 'Textures',
'parent_id' => 'f798e114-c10f-409b-a90d-a11577ff1de8',
'version' => 1,
'type_default' => 0,
'folder_id' => 'fc8b4059-30bb-43a8-a042-46f5b431ad82'
)));
$inventory_root = new LLBlock(
Array(
'folder_id' => "f798e114-c10f-409b-a90d-a11577ff1de8"
));
$initial_outfit = new LLBlock(
Array(
'folder_name' => "Nightclub Female",
'gender' => "female"
));
return Array (
'message' => "Welcome to OGS!",
'session_id' => format_lluuid($session_id),
'sim_port' => intval($siminfo['port']),
'agent_access' => "M",
'start_location' => "last",
'global-textures' => $globaltextures,
'seconds_since_epoch' => time(),
'first_name' => $profiledata['profile_firstname'],
'circuit_code' => 50633318,
'login_flags' => $login_flags,
'seed_capability' => '',
'home' => $home,
'secure_session_id' => format_lluuid($secure_session_id),
'last_name' => $profiledata['profile_lastname'],
'ui-config' => $ui_config,
'region_x' => $LocX,
'inventory_skeleton' => $inventory_skeleton,
'sim_ip' => $siminfo['ip_addr'],
'region_y' => $LocY,
'inventory-root' => $inventory_root,
'login' => "true",
'look_at' => $look_at,
'agent_id' => format_lluuid($profiledata['userprofile_LLUUID']),
'initial-outfit' => $initial_outfit
);
} else {
// this is the default invalid username/password error
return Array (
'reason' => 'key',
'message' => "You have entered an invalid name/password combination or are using an incompatible client. Please check with the grid owner " .$grid_owner . " if you are sure your login details are accurate.",
'login' => "false",
);
}
}
$server=new IXR_Server(array('login_to_simulator' => 'login'));
?>