+
+{$this->method}
+
+
+EOD;
+ foreach ($this->args as $arg) {
+ $this->xml .= '';
+ $v = new IXR_Value($arg);
+ $this->xml .= $v->getXml();
+ $this->xml .= "";
+ }
+ $this->xml .= '';
+ }
+ function getLength() {
+ return strlen($this->xml);
+ }
+ function getXml() {
+ return $this->xml;
+ }
+}
+
+
+class IXR_Client {
+ var $server;
+ var $port;
+ var $path;
+ var $useragent;
+ var $response;
+ var $message = false;
+ var $debug = false;
+ // Storage place for an error message
+ var $error = false;
+ function IXR_Client($server, $path = false, $port = 80) {
+ if (!$path) {
+ // Assume we have been given a URL instead
+ $bits = parse_url($server);
+ $this->server = $bits['host'];
+ $this->port = isset($bits['port']) ? $bits['port'] : 80;
+ $this->path = isset($bits['path']) ? $bits['path'] : '/';
+ // Make absolutely sure we have a path
+ if (!$this->path) {
+ $this->path = '/';
+ }
+ } else {
+ $this->server = $server;
+ $this->path = $path;
+ $this->port = $port;
+ }
+ $this->useragent = 'The Incutio XML-RPC PHP Library';
+ }
+ function query() {
+ $args = func_get_args();
+ $method = array_shift($args);
+ $request = new IXR_Request($method, $args);
+ $length = $request->getLength();
+ $xml = $request->getXml();
+ $r = "\r\n";
+ $request = "POST {$this->path} HTTP/1.0$r";
+ $request .= "Host: {$this->server}$r";
+ $request .= "Content-Type: text/xml$r";
+ $request .= "User-Agent: {$this->useragent}$r";
+ $request .= "Content-length: {$length}$r$r";
+ $request .= $xml;
+ // Now send the request
+ if ($this->debug) {
+ echo ''.htmlspecialchars($request)."\n
\n\n";
+ }
+ $fp = @fsockopen($this->server, $this->port);
+ if (!$fp) {
+ $this->error = new IXR_Error(-32300, 'transport error - could not open socket');
+ return false;
+ }
+ fputs($fp, $request);
+ $contents = '';
+ $gotFirstLine = false;
+ $gettingHeaders = true;
+ while (!feof($fp)) {
+ $line = fgets($fp, 4096);
+ if (!$gotFirstLine) {
+ // Check line for '200'
+ if (strstr($line, '200') === false) {
+ $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200');
+ return false;
+ }
+ $gotFirstLine = true;
+ }
+ if (trim($line) == '') {
+ $gettingHeaders = false;
+ }
+ if (!$gettingHeaders) {
+ $contents .= trim($line)."\n";
+ }
+ }
+ if ($this->debug) {
+ echo ''.htmlspecialchars($contents)."\n
\n\n";
+ }
+ // Now parse what we've got back
+ $this->message = new IXR_Message($contents);
+ if (!$this->message->parse()) {
+ // XML error
+ $this->error = new IXR_Error(-32700, 'parse error. not well formed');
+ return false;
+ }
+ // Is the message a fault?
+ if ($this->message->messageType == 'fault') {
+ $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);
+ return false;
+ }
+ // Message must be OK
+ return true;
+ }
+ function getResponse() {
+ // methodResponses can only have one param - return that
+ return $this->message->params[0];
+ }
+ function isError() {
+ return (is_object($this->error));
+ }
+ function getErrorCode() {
+ return $this->error->code;
+ }
+ function getErrorMessage() {
+ return $this->error->message;
+ }
+}
+
+
+class IXR_Error {
+ var $code;
+ var $message;
+ function IXR_Error($code, $message) {
+ $this->code = $code;
+ $this->message = $message;
+ }
+ function getXml() {
+ $xml = <<
+
+
+
+
+ faultCode
+ {$this->code}
+
+
+ faultString
+ {$this->message}
+
+
+
+
+
+
+EOD;
+ return $xml;
+ }
+}
+
+
+class IXR_Date {
+ var $year;
+ var $month;
+ var $day;
+ var $hour;
+ var $minute;
+ var $second;
+ function IXR_Date($time) {
+ // $time can be a PHP timestamp or an ISO one
+ if (is_numeric($time)) {
+ $this->parseTimestamp($time);
+ } else {
+ $this->parseIso($time);
+ }
+ }
+ function parseTimestamp($timestamp) {
+ $this->year = date('Y', $timestamp);
+ $this->month = date('Y', $timestamp);
+ $this->day = date('Y', $timestamp);
+ $this->hour = date('H', $timestamp);
+ $this->minute = date('i', $timestamp);
+ $this->second = date('s', $timestamp);
+ }
+ function parseIso($iso) {
+ $this->year = substr($iso, 0, 4);
+ $this->month = substr($iso, 4, 2);
+ $this->day = substr($iso, 6, 2);
+ $this->hour = substr($iso, 9, 2);
+ $this->minute = substr($iso, 12, 2);
+ $this->second = substr($iso, 15, 2);
+ }
+ function getIso() {
+ return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second;
+ }
+ function getXml() {
+ return ''.$this->getIso().'';
+ }
+ function getTimestamp() {
+ return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);
+ }
+}
+
+class LLBlock {
+ var $data;
+ var $xml;
+
+ function LLBlock($data) {
+ $this->data = $data;
+ }
+
+ function getXml() {
+ if(count($this->data)>0) {
+ $this->xml="";
+ foreach($this->data as $name => $value) {
+ $this->xml=$this->xml."".$name."".$value."";
+ }
+ $this->xml=$this->xml."";
+ return $this->xml;
+ }
+ }
+}
+
+class IXR_Base64 {
+ var $data;
+ function IXR_Base64($data) {
+ $this->data = $data;
+ }
+ function getXml() {
+ return ''.base64_encode($this->data).'';
+ }
+}
+
+
+class IXR_IntrospectionServer extends IXR_Server {
+ var $signatures;
+ var $help;
+ function IXR_IntrospectionServer() {
+ $this->setCallbacks();
+ $this->setCapabilities();
+ $this->capabilities['introspection'] = array(
+ 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html',
+ 'specVersion' => 1
+ );
+ $this->addCallback(
+ 'system.methodSignature',
+ 'this:methodSignature',
+ array('array', 'string'),
+ 'Returns an array describing the return type and required parameters of a method'
+ );
+ $this->addCallback(
+ 'system.getCapabilities',
+ 'this:getCapabilities',
+ array('struct'),
+ 'Returns a struct describing the XML-RPC specifications supported by this server'
+ );
+ $this->addCallback(
+ 'system.listMethods',
+ 'this:listMethods',
+ array('array'),
+ 'Returns an array of available methods on this server'
+ );
+ $this->addCallback(
+ 'system.methodHelp',
+ 'this:methodHelp',
+ array('string', 'string'),
+ 'Returns a documentation string for the specified method'
+ );
+ }
+ function addCallback($method, $callback, $args, $help) {
+ $this->callbacks[$method] = $callback;
+ $this->signatures[$method] = $args;
+ $this->help[$method] = $help;
+ }
+ function call($methodname, $args) {
+ // Make sure it's in an array
+ if ($args && !is_array($args)) {
+ $args = array($args);
+ }
+ // Over-rides default call method, adds signature check
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.');
+ }
+ $method = $this->callbacks[$methodname];
+ $signature = $this->signatures[$methodname];
+ $returnType = array_shift($signature);
+ // Check the number of arguments
+ if (count($args) != count($signature)) {
+ // print 'Num of args: '.count($args).' Num in signature: '.count($signature);
+ return new IXR_Error(-32602, 'server error. wrong number of method parameters');
+ }
+ // Check the argument types
+ $ok = true;
+ $argsbackup = $args;
+ for ($i = 0, $j = count($args); $i < $j; $i++) {
+ $arg = array_shift($args);
+ $type = array_shift($signature);
+ switch ($type) {
+ case 'int':
+ case 'i4':
+ if (is_array($arg) || !is_int($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'base64':
+ case 'string':
+ if (!is_string($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'boolean':
+ if ($arg !== false && $arg !== true) {
+ $ok = false;
+ }
+ break;
+ case 'float':
+ case 'double':
+ if (!is_float($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'date':
+ case 'dateTime.iso8601':
+ if (!is_a($arg, 'IXR_Date')) {
+ $ok = false;
+ }
+ break;
+ }
+ if (!$ok) {
+ return new IXR_Error(-32602, 'server error. invalid method parameters');
+ }
+ }
+ // It passed the test - run the "real" method call
+ return parent::call($methodname, $argsbackup);
+ }
+ function methodSignature($method) {
+ if (!$this->hasMethod($method)) {
+ return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.');
+ }
+ // We should be returning an array of types
+ $types = $this->signatures[$method];
+ $return = array();
+ foreach ($types as $type) {
+ switch ($type) {
+ case 'string':
+ $return[] = 'string';
+ break;
+ case 'int':
+ case 'i4':
+ $return[] = 42;
+ break;
+ case 'double':
+ $return[] = 3.1415;
+ break;
+ case 'dateTime.iso8601':
+ $return[] = new IXR_Date(time());
+ break;
+ case 'boolean':
+ $return[] = true;
+ break;
+ case 'base64':
+ $return[] = new IXR_Base64('base64');
+ break;
+ case 'array':
+ $return[] = array('array');
+ break;
+ case 'struct':
+ $return[] = array('struct' => 'struct');
+ break;
+ }
+ }
+ return $return;
+ }
+ function methodHelp($method) {
+ return $this->help[$method];
+ }
+}
+
+
+class IXR_ClientMulticall extends IXR_Client {
+ var $calls = array();
+ function IXR_ClientMulticall($server, $path = false, $port = 80) {
+ parent::IXR_Client($server, $path, $port);
+ $this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';
+ }
+ function addCall() {
+ $args = func_get_args();
+ $methodName = array_shift($args);
+ $struct = array(
+ 'methodName' => $methodName,
+ 'params' => $args
+ );
+ $this->calls[] = $struct;
+ }
+ function query() {
+ // Prepare multicall, then call the parent::query() method
+ return parent::query('system.multicall', $this->calls);
+ }
+}
+
+?>
diff --git a/ogs/gridserver/gridserver_config.inc.php b/ogs/gridserver/gridserver_config.inc.php
new file mode 100644
index 0000000000..98ebed360e
--- /dev/null
+++ b/ogs/gridserver/gridserver_config.inc.php
@@ -0,0 +1,14 @@
+
+// All the grid server specific stuff lives here
+
+// What we send to authenticate to the user/login server
+$userserver_sendkey="1234";
+
+// What we expect to get back from the user/login server
+$userserver_recvkey="1234";
+
+$sim_recvkey = "1234";
+$sim_sendkey = "1234";
+
+$grid_home = "/ogs/gridserver/";
+?>
diff --git a/ogs/gridserver/index.php b/ogs/gridserver/index.php
new file mode 100644
index 0000000000..f7754c687b
--- /dev/null
+++ b/ogs/gridserver/index.php
@@ -0,0 +1,176 @@
+
+error_reporting(E_ALL); // yes, we remember this from the login server, don't we boys and girls? don't kill innocent XML-RPC!
+
+// these files are soooo common..... (to the grid)
+include("../common/xmlrpc.inc.php");
+include("../common/database.inc.php");
+include("../common/grid_config.inc.php");
+include("../common/util.inc.php");
+
+include("gridserver_config.inc.php"); // grid server specific config stuff
+
+function get_sim_info($args) {
+ global $dbhost,$dbuser,$dbpasswd,$dbname;
+ global $userserver_sendkey, $userserver_recvkey;
+
+ // First see who's talking to us, if key is invalid then send an invalid one back and nothing more
+ if($args['authkey']!=$userserver_recvkey) {
+ return Array(
+ 'authkey' => 'I can play the bad key trick too you know',
+ 'login' => 'false'
+ );
+ }
+
+ // if we get to here, the key is valid, give that login server what it wants!
+
+ $link = mysql_connect($dbhost,$dbuser,$dbpasswd)
+ OR die("Unable to connect to database");
+
+ mysql_select_db($dbname)
+ or die("Unable to select database");
+
+ $region_handle = $args['region_handle'];
+ $query = "SELECT * FROM region_profiles WHERE region_handle='$region_handle'";
+ $result = mysql_query($query);
+
+ return mysql_fetch_assoc($result);
+}
+
+function get_session_info($args) {
+ global $dbhost,$dbuser,$dbpasswd,$dbname;
+ global $sim_sendkey, $sim_recvkey;
+
+ // authkey, session-id, agent-id
+
+ // First see who's talking to us, if key is invalid then send an invalid one back and nothing more
+ if($args[0]!=$sim_recvkey) {
+ return Array(
+ 'authkey' => "I can play the bad key trick too you know"
+ );
+ }
+
+ $link = mysql_connect($dbhost,$dbuser,$dbpasswd)
+ OR die("Unable to connect to database");
+
+ mysql_select_db($dbname)
+ or die("Unable to select database");
+
+ $session_id = $args[1];
+ $agent_id = $args[2];
+
+ $query = "SELECT * FROM sessions WHERE session_id = '$session_id' AND agent_id='$agent_id' AND session_active=1";
+ $result = mysql_query($query);
+ if(mysql_num_rows($result)>0) {
+ $info=mysql_fetch_assoc($result);
+ $circuit_code = $info['circuit_code'];
+ $secure_session_id=$info['secure_session_id'];
+
+ $query = "SELECT * FROM local_user_profiles WHERE userprofile_LLUUID='$agent_id'";
+ $result=mysql_query($query);
+ $userinfo=mysql_fetch_assoc($result);
+ $firstname=$userinfo['profile_firstname'];
+ $lastname=$userinfo['profile_lastname'];
+ $agent_id=$userinfo['userprofile_LLUUID'];
+ return Array(
+ 'authkey' => $sim_sendkey,
+ 'circuit_code' => $circuit_code,
+ 'agent_id' => $agent_id,
+ 'session_id' => $session_id,
+ 'secure_session_id' => $secure_session_id,
+ 'firstname' => $firstname,
+ 'lastname' => $lastname
+ );
+ }
+}
+
+function check_loggedin($args) {
+ global $dbhost,$dbuser,$dbpasswd,$dbname;
+ global $userserver_sendkey, $userserver_recvkey;
+
+ // First see who's talking to us, if key is invalid then send an invalid one back and nothing more
+ if($args['authkey']!=$userserver_recvkey) {
+ return Array(
+ 'authkey' => "I can play the bad key trick too you know"
+ );
+ }
+
+ // if we get to here, the key is valid, give that login server what it wants!
+
+ $link = mysql_connect($dbhost,$dbuser,$dbpasswd)
+ OR die("Unable to connect to database");
+
+ mysql_select_db($dbname)
+ or die("Unable to select database");
+
+ $userprofile_LLUUID = $args['userprofile_LLUUID'];
+ $query = "SELECT * FROM sessions WHERE agent_id='$userprofile_LLUUID' AND session_active=1";
+ $result = mysql_query($query);
+
+ if(mysql_num_rows($result)>1) {
+ return Array(
+ 'authkey' => $userserver_sendkey,
+ 'logged_in' => 1
+ );
+ } else {
+ return Array(
+ 'authkey' => $userserver_sendkey,
+ 'logged_in' => 0
+ );
+ }
+}
+
+function create_session($args) {
+ global $dbhost,$dbuser,$dbpasswd,$dbname;
+ global $userserver_sendkey, $userserver_recvkey;
+
+ // First see who's talking to us, if key is invalid then send an invalid one back and nothing more
+ if($args['authkey']!=$userserver_recvkey) {
+ return Array(
+ 'authkey' => "I can play the bad key trick too you know"
+ );
+ }
+
+ // if we get to here, the key is valid, give that login server what it wants!
+
+ $link = mysql_connect($dbhost,$dbuser,$dbpasswd)
+ OR die("Unable to connect to database");
+
+ mysql_select_db($dbname)
+ or die("Unable to select database");
+
+ // yes, secure_sessionid should be different, i know...
+ $query = "SELECT value FROM Grid_settings WHERE setting='highest_LLUUID'";
+ $result = mysql_query($query);
+ $row = mysql_fetch_array($result);
+ $highest_LLUUID = $row['value'];
+ $newsession_id=inc_lluuid($highest_LLUUID);
+ $secure_session_id=inc_lluuid($newsession_id);
+
+ $query="UPDATE Grid_settings SET value='$secure_session_id' WHERE setting='highest_LLUUID' LIMIT 1";
+ $result=mysql_query($query);
+
+ $userprofile_LLUUID=$args['userprofile_LLUUID'];
+ $current_location=$args['current_location'];
+ $remote_ip=$args['remote_ip'];
+ $query="INSERT INTO sessions(session_id,secure_session_id,agent_id,session_start,session_active,current_location,remote_ip) VALUES('$newsession_id','$secure_session_id','$userprofile_LLUUID',NOW(),1,'$current_location','$remote_ip')";
+ $result=mysql_query($query);
+ if(!isset($result)) {
+ die();
+ }
+ return Array(
+ 'authkey' => $userserver_sendkey,
+ 'session_id' => $newsession_id,
+ 'secure_session_id' => $secure_session_id
+ );
+}
+
+$server=new IXR_Server(
+ Array(
+ 'check_session_loggedin' => 'check_loggedin',
+ 'create_session' => 'create_session',
+ 'get_sim_info' => 'get_sim_info',
+ 'get_session_info' => 'get_session_info'
+ )
+);
+
+?>
\ No newline at end of file
diff --git a/ogs/gridserver/usersessions/.htaccess b/ogs/gridserver/usersessions/.htaccess
new file mode 100644
index 0000000000..3b76a74ec4
--- /dev/null
+++ b/ogs/gridserver/usersessions/.htaccess
@@ -0,0 +1,5 @@
+Options +FollowSymlinks
+
+RewriteEngine on
+RewriteOptions MaxRedirects=1
+RewriteRule .* index.php [L]
diff --git a/ogs/gridserver/usersessions/index.php b/ogs/gridserver/usersessions/index.php
new file mode 100644
index 0000000000..3c189325de
--- /dev/null
+++ b/ogs/gridserver/usersessions/index.php
@@ -0,0 +1,81 @@
+
+// DIRTY HACK ALERT!!!!!!!!!!!!!
+// The following code shows the vital importance of the r69 revision of the original gareth/ branch
+
+
+// This file parses URLs of the format:
+// usersessions/key/userid/data
+// where key is the key to authenticate with the grid, userid is the user's LLUUID and data is the data about the user's session being requested
+// if the data requested is left out, an XML response will be sent
+
+error_reporting(E_ALL); // Remember kids, PHP errors kill XML-RPC responses and REST too! will the slaughter ever end?
+
+include("../gridserver_config.inc.php");
+include("../../common/database.inc.php");
+include("../../common/util.inc.php");
+
+// Parse out the parameters from the URL
+$params = str_replace($grid_home,'', $_SERVER['REQUEST_URI']);
+$params = str_replace("index.php/","",$params);
+$params = split('/',$params);
+
+// Die if the key doesn't match
+if($params[1]!=$sim_recvkey) {
+ die();
+}
+
+$link = mysql_connect($dbhost,$dbuser,$dbpasswd)
+ OR die("Unable to connect to database");
+
+mysql_select_db($dbname)
+ or die("Unable to select database");
+
+$agent_id = strtolower($params[2]);
+$query = "SELECT * FROM sessions WHERE agent_id='$agent_id' AND session_active=1";
+
+// if we have 4 params, then param 4 is the command
+if(count($params)==4) {
+ $cmd=$params['3'];
+} else if(count($params)==5) {
+ $circuit_code=$params[3];
+ $cmd=$params[4]; // otherwise, 5 is the command and 4 is the circuit code
+}
+
+$result = mysql_query($query);
+if(mysql_num_rows($result)>0) {
+ $info=mysql_fetch_assoc($result);
+ $circuit_code = $info['circuit_code'];
+ if($circuit_code == 0) $circuit_code=$params['4'];
+ $secure_session_id=$info['secure_session_id'];
+ $session_id=$info['session_id'];
+
+ $query = "SELECT * FROM local_user_profiles WHERE userprofile_LLUUID='$agent_id'";
+ $result=mysql_query($query);
+ $userinfo=mysql_fetch_assoc($result);
+ $firstname=$userinfo['profile_firstname'];
+ $lastname=$userinfo['profile_lastname'];
+ $agent_id=$userinfo['userprofile_LLUUID'];
+ $exists=1;
+} else {
+ $exists=0;
+}
+
+// if only 3 params, assume we are sending an XML response
+if(count($params)==3) {
+ output_xml_block("usersession",Array(
+ 'authkey' => $sim_sendkey,
+ 'circuit_code' => $circuit_code,
+ 'agent_id' => $agent_id,
+ 'session_id' => $session_id,
+ 'secure_session_id' => $secure_session_id,
+ 'firstname' => $firstname,
+ 'lastname' => $lastname
+ ));
+}
+
+switch($cmd) {
+ case 'exists':
+ echo $exists;
+ break;
+}
+?>
diff --git a/ogs/login/index.php b/ogs/login/index.php
new file mode 100644
index 0000000000..4f53c11e46
--- /dev/null
+++ b/ogs/login/index.php
@@ -0,0 +1,170 @@
+
+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'));
+?>
diff --git a/ogs/login/login_config.inc.php b/ogs/login/login_config.inc.php
new file mode 100644
index 0000000000..4cce696522
--- /dev/null
+++ b/ogs/login/login_config.inc.php
@@ -0,0 +1,11 @@
+
+// All the user/login server specific stuff lives here
+
+// What we send to authenticate to the grid server
+$gridserver_sendkey="1234";
+
+// What we expect to get back from the grid server
+$gridserver_recvkey="1234";
+
+$gridserver_url="http://www.osgrid.org/ogs/gridserver/index.php";
+?>