moodle/mnet/peer.php
mjollnir_ 2520258128 Merged Donal's changes to MNET to allow moodle to also network with mahara.
changelog follows

    [MNET-manual] added version.php, install.xml and upgrade.php patches
    Route remote users back to their home server without going through jump.php and land.php
    Display app-specific strings in the user view
    Display the application icon in the Remote Host block
    Hide the 'logs' tab if the application under review is not Moodle
    Hide the 'logs' tab if the application under review is not Moodle
    Update user record to note that picture == 1 once a picture has been
    transferred.
    Change 2 to uri - is this fluid?
    Add application paramter to bootstrap function
    Find the application
    Workaround for PHP5.2.2 bug: http://bugs.php.net/bug.php?id=41293
    $HTTP_RAW_POST_DATA was not being populated
    Ensure we get an application for our Peer
    Update the URI to use for MNET
    The default 'wantsurl' should be empty
    Use the appropriate 'land' url for the remote application
    Add hidden form elements for 'application'
    Add awareness of new Application concept
    Add awareness of new Application concept
    Add awareness of new Application concept
    Add awareness of new Application concept
    Add awareness of new Application concept
    Add awareness of new Application concept
    Add awareness of new Application concept
2007-07-14 03:00:12 +00:00

264 lines
8.7 KiB
PHP

<?php
/**
* An object to represent lots of information about an RPC-peer machine
*
* @author Donal McMullan donal@catalyst.net.nz
* @version 0.0.1
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package mnet
*/
class mnet_peer {
var $id = 0;
var $wwwroot = '';
var $ip_address = '';
var $name = '';
var $public_key = '';
var $public_key_expires = 0;
var $last_connect_time = 0;
var $last_log_id = 0;
var $applicationid = 1; // Default of 1 == Moodle
var $keypair = array();
var $error = array();
function mnet_peer() {
return true;
}
function bootstrap($wwwroot, $pubkey = null, $application) {
if (substr($wwwroot, -1, 1) == '/') {
$wwwroot = substr($wwwroot, 0, -1);
}
if ( ! $this->set_wwwroot($wwwroot) ) {
$hostname = mnet_get_hostname_from_uri($wwwroot);
// Get the IP address for that host - if this fails, it will
// return the hostname string
$ip_address = gethostbyname($hostname);
// Couldn't find the IP address?
if ($ip_address === $hostname && !preg_match('/^\d+\.\d+\.\d+.\d+$/',$hostname)) {
$this->error[] = array('code' => 2, 'text' => get_string("noaddressforhost", 'mnet'));
return false;
}
$this->name = $wwwroot;
// TODO: In reality, this will be prohibitively slow... need another
// default - maybe blank string
$homepage = file_get_contents($wwwroot);
if (!empty($homepage)) {
$count = preg_match("@<title>(.*)</title>@siU", $homepage, $matches);
if ($count > 0) {
$this->name = $matches[1];
}
}
$this->wwwroot = $wwwroot;
$this->ip_address = $ip_address;
$this->deleted = 0;
$this->application = get_record('mnet_application', 'name', $application);
if (empty($this->application)) {
$this->application = get_record('mnet_application', 'name', 'moodle');
}
$this->applicationid = $this->application->id;
if(empty($pubkey)) {
$this->public_key = clean_param(mnet_get_public_key($this->wwwroot, $this->application), PARAM_PEM);
} else {
$this->public_key = clean_param($pubkey, PARAM_PEM);
}
$this->public_key_expires = $this->check_common_name($this->public_key);
$this->last_connect_time = 0;
$this->last_log_id = 0;
if ($this->public_key_expires == false) {
$this->public_key == '';
return false;
}
}
return true;
}
function delete() {
if ($this->deleted) return true;
$users = count_records('user','mnethostid', $this->id);
if ($users > 0) {
$this->deleted = 1;
}
$actions = count_records('mnet_log','hostid', $this->id);
if ($actions > 0) {
$this->deleted = 1;
}
$obj = delete_records('mnet_rpc2host', 'host_id', $this->id);
$this->delete_all_sessions();
// If we don't have any activity records for which the mnet_host table
// provides a foreign key, then we can delete the record. Otherwise, we
// just mark it as deleted.
if (0 == $this->deleted) {
delete_records('mnet_host', "id", $this->id);
} else {
$this->commit();
}
}
function count_live_sessions() {
$obj = $this->delete_expired_sessions();
return count_records('mnet_session','mnethostid', $this->id);
}
function delete_expired_sessions() {
$now = time();
return delete_records_select('mnet_session', " mnethostid = '{$this->id}' AND expires < '$now' ");
}
function delete_all_sessions() {
global $CFG;
// TODO: Expires each PHP session individually
// $sessions = get_records('mnet_session', 'mnethostid', $this->id);
$sessions = get_records('mnet_session', 'mnethostid', $this->id);
if (count($sessions) > 0 && file_exists($CFG->dirroot.'/auth/mnet/auth.php')) {
require_once($CFG->dirroot.'/auth/mnet/auth.php');
$auth = new auth_plugin_mnet();
$auth->end_local_sessions($sessions);
}
$deletereturn = delete_records_select('mnet_session', " mnethostid = '{$this->id}'");
return true;
}
function check_common_name($key) {
$credentials = openssl_x509_parse($key);
if ($credentials == false) {
$this->error[] = array('code' => 3, 'text' => get_string("nonmatchingcert", 'mnet', array('','')));
return false;
} elseif ($credentials['subject']['CN'] != $this->wwwroot) {
$a[] = $credentials['subject']['CN'];
$a[] = $this->wwwroot;
$this->error[] = array('code' => 4, 'text' => get_string("nonmatchingcert", 'mnet', $a));
return false;
} else {
return $credentials['validTo_time_t'];
}
}
function commit() {
$obj = new stdClass();
$obj->wwwroot = $this->wwwroot;
$obj->ip_address = $this->ip_address;
$obj->name = $this->name;
$obj->public_key = $this->public_key;
$obj->public_key_expires = $this->public_key_expires;
$obj->deleted = $this->deleted;
$obj->last_connect_time = $this->last_connect_time;
$obj->last_log_id = $this->last_log_id;
$obj->applicationid = $this->applicationid;
if (isset($this->id) && $this->id > 0) {
$obj->id = $this->id;
return update_record('mnet_host', $obj);
} else {
$this->id = insert_record('mnet_host', $obj);
return $this->id > 0;
}
}
function touch() {
$this->last_connect_time = time();
$this->commit();
}
function set_name($newname) {
if (is_string($newname) && strlen($newname <= 80)) {
$this->name = $newname;
return true;
}
return false;
}
function set_applicationid($applicationid) {
if (is_numeric($applicationid) && $applicationid == intval($applicationid)) {
$this->applicationid = $applicationid;
return true;
}
return false;
}
function set_wwwroot($wwwroot) {
global $CFG;
$hostinfo = get_record('mnet_host', 'wwwroot', $wwwroot);
if ($hostinfo != false) {
$this->populate($hostinfo);
return true;
}
return false;
}
function set_id($id) {
global $CFG;
if (clean_param($id, PARAM_INT) != $id) {
$this->errno[] = 1;
$this->errmsg[] = 'Your id ('.$id.') is not legal';
return false;
}
$sql = "
SELECT
h.*
FROM
{$CFG->prefix}mnet_host h
WHERE
h.id = '". $id ."'";
if ($hostinfo = get_record_sql($sql)) {
$this->populate($hostinfo);
return true;
}
return false;
}
/**
* Several methods can be used to get an 'mnet_host' record. They all then
* send it to this private method to populate this object's attributes.
*
* @param object $hostinfo A database record from the mnet_host table
* @return void
*/
function populate($hostinfo) {
$this->id = $hostinfo->id;
$this->wwwroot = $hostinfo->wwwroot;
$this->ip_address = $hostinfo->ip_address;
$this->name = $hostinfo->name;
$this->deleted = $hostinfo->deleted;
$this->public_key = $hostinfo->public_key;
$this->public_key_expires = $hostinfo->public_key_expires;
$this->last_connect_time = $hostinfo->last_connect_time;
$this->last_log_id = $hostinfo->last_log_id;
$this->applicationid = $hostinfo->applicationid;
$this->application = get_record('mnet_application', 'id', $this->applicationid);
}
function get_public_key() {
if (isset($this->public_key_ref)) return $this->public_key_ref;
$this->public_key_ref = openssl_pkey_get_public($this->public_key);
return $this->public_key_ref;
}
}
?>