function refresh_key() { global $CFG; // set up an RPC request require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; $mnetrequest = new mnet_xmlrpc_client(); // Use any method - listServices is pretty lightweight. $mnetrequest->set_method('system/listServices'); // Do RPC call and store response if ($mnetrequest->send($this) === true) { // Ok - we actually don't care about the result $temp = new mnet_peer(); $temp->set_id($this->id); if ($this->public_key != $temp->public_key) { $newkey = clean_param($temp->public_key, PARAM_PEM); if (!empty($newkey)) { $this->public_key = $newkey; $this->updateparams->public_key = $newkey; $this->commit(); return true; } } } return false; }
function mnet_get_externalprofilefields($hostid) { /// Setup MNET environment global $MNET, $CFG; if (empty($MNET)) { $MNET = new mnet_environment(); $MNET->init(); } /// Setup the server $host = get_record('mnet_host', 'id', $hostid); //we retrieve the server(host) from the 'mnet_host' table if (empty($host)) { error('Invalid Hostid'); } $mnet_peer = new mnet_peer(); //we create a new mnet_peer (server/host) $mnet_peer->set_wwwroot($host->wwwroot); //we set this mnet_peer with the host http address $client = new mnet_xmlrpc_client(); //create a new client $client->set_method('auth/mnet/auth.php/get_user_profile_fields'); //tell it which method we're going to call $client->send($mnet_peer); //Call the server if (!empty($client->response['faultString'])) { error("Mnet error:" . $client->response['faultString']); } return $client->response; }
function call($paramArray = null) { global $CFG; // For the demo, our 'remote' host is actually our local host. $wwwroot = $CFG->wwwroot; // mnet_peer pulls information about a remote host from the database. $mnet_peer = new mnet_peer(); $mnet_peer->set_wwwroot($wwwroot); //$mnethostid = 1010000003; //$mnethostid = 1010000001; //$mnet_peer->set_id($mnethostid); $method = 'synch/mnet/synch.php/testResponse'; //$paramArray = array(); // Create a new request object $mnet_request = new mnet_xmlrpc_client(); // Tell it the path to the method that we want to execute $mnet_request->set_method($method); global $Out; //$Out->print_r($paramArray, '$paramArray = '); if (!empty($paramArray)) { // Add parameters for your function. The mnet_concatenate_strings takes three // parameters, like mnet_concatenate_strings($string1, $string2, $string3) // PHP is weakly typed, so you can get away with calling most things strings, // unless it's non-scalar (i.e. an array or object or something). foreach ($paramArray as $param) { $mnet_request->add_param($param[0], $param[1]); } } //$Out->print_r($mnet_request->params, '$mnet_request->params = '); if (false && count($mnet_request->params)) { $Out->append('Your parameters are:<br />'); while (list($key, $val) = each($mnet_request->params)) { $Out->append(' <strong>' . $key . ':</strong> ' . $val . "<br/>\n"); } } // We send the request: $mnet_request->send($mnet_peer); //$Out->append('$mnet_request->response = '.$mnet_request->response); //$Out->flush(); return $mnet_request->response; }
function refresh_key() { // set up an RPC request $mnetrequest = new mnet_xmlrpc_client(); // Use any method - listServices is pretty lightweight. $mnetrequest->set_method('system/listServices'); // Do RPC call and store response if ($mnetrequest->send($this) === true) { // Ok - we actually don't care about the result $temp = new mnet_peer(); $temp->set_id($this->id); if ($this->public_key != $temp->public_key) { $newkey = param_clean($temp->public_key, PARAM_PEM); if (!empty($newkey)) { $this->public_key = $newkey; return true; } } } return false; }
/** * fetches remotely a configuration value * @param object $mnethost a mnet host record. * @param string $configkey the configuration key * @param string $module the module (frankenstyle). If empty, will fetch into the global config scope. */ function vmoodle_get_remote_config($mnethost, $configkey, $module = '') { global $CFG, $USER, $DB, $OUTPUT; if (empty($mnethost)) { return ''; } if (!isset($USER)) { $user = $DB->get_record('user', array('username' => 'guest')); } else { if (empty($USER->id)) { $user = $DB->get_record('user', array('username' => 'guest')); } else { $user = $DB->get_record('user', array('id' => $USER->id)); } } if (!($userhost = $DB->get_record('mnet_host', array('id' => $user->mnethostid)))) { return ''; } $user->remoteuserhostroot = $userhost->wwwroot; $user->remotehostroot = $CFG->wwwroot; // get the sessions for each vmoodle that have same ID Number $rpcclient = new mnet_xmlrpc_client(); $rpcclient->set_method('local/vmoodle/plugins/generic/rpclib.php/dataexchange_rpc_fetch_config'); $rpcclient->add_param($user, 'struct'); $rpcclient->add_param($configkey, 'string'); $rpcclient->add_param($module, 'string'); $mnet_host = new mnet_peer(); if (empty($mnet_host)) { return; } $mnet_host->set_wwwroot($mnethost->wwwroot); if ($rpcclient->send($mnet_host)) { $response = json_decode($rpcclient->response); if ($response->status == 200) { return $response->value; } else { if (debugging()) { echo $OUTPUT->notification('Remote RPC error ' . implode('<br/>', $response->errors)); } } } else { if (debugging()) { echo $OUTPUT->notification('Remote RPC failure ' . implode('<br/', $rpcclient->error)); } } }
// RPC_HTTPS_VERIFIED 1 // RPC_HTTPS_SELF_SIGNED 2 // RPC_HTTP_VERIFIED 3 // RPC_HTTP_SELF_SIGNED 4 if (!$mnet_peer->transport) { exit('No transport method is approved for this host in your DB table. Please enable a transport method and try again.'); } $t[1] = 'http2 (port 443 encrypted) with a verified certificate.'; $t[2] = 'https (port 443 encrypted) with a self-signed certificate.'; $t[4] = 'http (port 80 unencrypted) with a verified certificate.'; $t[8] = 'http (port 80 unencrypted) with a self-signed certificate.'; $t[16] = 'http (port 80 unencrypted) unencrypted with no certificate.'; echo 'Your transportid is <strong>' . $mnet_peer->transport . '</strong> which represents <em>' . $t[$mnet_peer->transport] . "</em><br /><br />\n"; flush(); // Create a new request object $mnet_request = new mnet_xmlrpc_client(); // Tell it the path to the method that we want to execute $mnet_request->set_method($path_to_function[$func]); // Add parameters for your function. The mnet_concatenate_strings takes three // parameters, like mnet_concatenate_strings($string1, $string2, $string3) // PHP is weakly typed, so you can get away with calling most things strings, // unless it's non-scalar (i.e. an array or object or something). foreach ($paramArray[$func] as $param) { $mnet_request->add_param($param[0], $param[1]); } if (count($mnet_request->params)) { echo 'Your parameters are:<br />'; while (list($key, $val) = each($mnet_request->params)) { echo ' <strong>' . $key . ':</strong> ' . $val . "<br/>\n"; } }
/** * return an array information about services enabled for the given peer. * in two modes, fulldata or very basic data. * * @param mnet_peer $mnet_peer the peer to get information abut * @param boolean $fulldata whether to just return which services are published/subscribed, or more information (defaults to full) * * @return array If $fulldata is false, an array is returned like: * publish => array( * serviceid => boolean, * serviceid => boolean, * ), * subscribe => array( * serviceid => boolean, * serviceid => boolean, * ) * If $fulldata is true, an array is returned like: * servicename => array( * apiversion => array( * name => string * offer => boolean * apiversion => int * plugintype => string * pluginname => string * hostsubscribes => boolean * hostpublishes => boolean * ), * ) */ function mnet_get_service_info(mnet_peer $mnet_peer, $fulldata=true) { global $CFG, $DB; $requestkey = (!empty($fulldata) ? 'fulldata' : 'mydata'); static $cache = array(); if (array_key_exists($mnet_peer->id, $cache)) { return $cache[$mnet_peer->id][$requestkey]; } $id_list = $mnet_peer->id; if (!empty($CFG->mnet_all_hosts_id)) { $id_list .= ', '.$CFG->mnet_all_hosts_id; } $concat = $DB->sql_concat('COALESCE(h2s.id,0) ', ' \'-\' ', ' svc.id', '\'-\'', 'r.plugintype', '\'-\'', 'r.pluginname'); $query = " SELECT DISTINCT $concat as id, svc.id as serviceid, svc.name, svc.offer, svc.apiversion, r.plugintype, r.pluginname, h2s.hostid, h2s.publish, h2s.subscribe FROM {mnet_service2rpc} s2r, {mnet_rpc} r, {mnet_service} svc LEFT JOIN {mnet_host2service} h2s ON h2s.hostid in ($id_list) AND h2s.serviceid = svc.id WHERE svc.offer = '1' AND s2r.serviceid = svc.id AND s2r.rpcid = r.id ORDER BY svc.name ASC"; $resultset = $DB->get_records_sql($query); if (is_array($resultset)) { $resultset = array_values($resultset); } else { $resultset = array(); } require_once $CFG->dirroot.'/mnet/xmlrpc/client.php'; $remoteservices = array(); if ($mnet_peer->id != $CFG->mnet_all_hosts_id) { // Create a new request object $mnet_request = new mnet_xmlrpc_client(); // Tell it the path to the method that we want to execute $mnet_request->set_method('system/listServices'); $mnet_request->send($mnet_peer); if (is_array($mnet_request->response)) { foreach($mnet_request->response as $service) { $remoteservices[$service['name']][$service['apiversion']] = $service; } } } $myservices = array(); $mydata = array(); foreach($resultset as $result) { $result->hostpublishes = false; $result->hostsubscribes = false; if (isset($remoteservices[$result->name][$result->apiversion])) { if ($remoteservices[$result->name][$result->apiversion]['publish'] == 1) { $result->hostpublishes = true; } if ($remoteservices[$result->name][$result->apiversion]['subscribe'] == 1) { $result->hostsubscribes = true; } } if (empty($myservices[$result->name][$result->apiversion])) { $myservices[$result->name][$result->apiversion] = array('serviceid' => $result->serviceid, 'name' => $result->name, 'offer' => $result->offer, 'apiversion' => $result->apiversion, 'plugintype' => $result->plugintype, 'pluginname' => $result->pluginname, 'hostsubscribes' => $result->hostsubscribes, 'hostpublishes' => $result->hostpublishes ); } // allhosts_publish allows us to tell the admin that even though he // is disabling a service, it's still available to the host because // he's also publishing it to 'all hosts' if ($result->hostid == $CFG->mnet_all_hosts_id && $CFG->mnet_all_hosts_id != $mnet_peer->id) { $myservices[$result->name][$result->apiversion]['allhosts_publish'] = $result->publish; $myservices[$result->name][$result->apiversion]['allhosts_subscribe'] = $result->subscribe; } elseif (!empty($result->hostid)) { $myservices[$result->name][$result->apiversion]['I_publish'] = $result->publish; $myservices[$result->name][$result->apiversion]['I_subscribe'] = $result->subscribe; } $mydata['publish'][$result->serviceid] = $result->publish; $mydata['subscribe'][$result->serviceid] = $result->subscribe; } $cache[$mnet_peer->id]['fulldata'] = $myservices; $cache[$mnet_peer->id]['mydata'] = $mydata; return $cache[$mnet_peer->id][$requestkey]; }
/** * require remote enrollement on a MNET satellite. * This XML-RPC call fetches for a remotely known course and enroll the user inside * This is essentially intended to use by foreign systems to slave the user management * in a MNET network. * @param string $callinguser The calling user. * @param string $targetuser The username or user identifier of the user to assign a role remotely. * @param string $useridfield The field used for identifying the user (id, idnumber or username). * @param string $courseidfield The identifying value of the remote course * @param string $courseidentifier The identifying value of the remote course * @param string $rolename The remote role name to be assigned as * @param string $starttime The starting date * @param string $endtime The enrollement ending date * */ function mnetadmin_rpc_remote_enrol($callinguser, $targetuser, $rolename, $whereroot, $courseidfield, $courseidentifier, $starttime = 0, $endtime = 0, $json_response = true) { global $CFG, $USER, $DB; if (function_exists('debug_trace')) { debug_trace($CFG->wwwroot . ' >> mnetadmin_rpc_remote_enrol(' . json_encode($callinguser) . ", {$targetuser}, {$rolename}, {$whereroot}, {$courseidfield}, {$courseidentifier}, {$starttime} = 0, {$endtime} = 0, {$json_response} = true) "); } $extresponse = new stdclass(); $extresponse->status = RPC_SUCCESS; $extresponse->errors = array(); $extresponse->error = ''; // Invoke local user and check his rights. if ($auth_response = invoke_local_user((array) $callinguser, 'local/vmoodle:execute')) { if ($json_response) { return $auth_response; } else { return json_decode($auth_response); } } if ($whereroot == $CFG->wwwroot) { if (function_exists('debug_trace')) { debug_trace("local enrol process for {$targetuser} as {$rolename} in {$courseidentifier} by {$courseidfield} from {$starttime} to {$endtime}"); } // Getting remote_course definition. switch ($courseidfield) { case 'id': $course = $DB->get_record('course', array('id' => $courseidentifier)); break; case 'shortname': $course = $DB->get_record('course', array('shortname' => $courseidentifier)); break; case 'idnumber': $course = $DB->get_record('course', array('idnumber' => $courseidentifier)); break; } if (!$course) { $extresponse->status = RPC_FAILURE_RECORD; $extresponse->errors[] = "Unkown course {$courseidentifier} based on {$courseidfield}."; $extresponse->error = "Unkown course {$courseidentifier} based on {$courseidfield}."; if (function_exists('debug_trace')) { debug_trace("Unkown course based on {$courseidfield} with {$courseidentifier} "); } if ($json_response) { return json_encode($extresponse); } else { return $extresponse; } } // Getting role if default. if (empty($rolename)) { $rolename = $course->defaultrolename; } if (function_exists('debug_trace')) { debug_trace("Bounce to mnetadmin_rpc_assignrole"); } $extresponse = mnetadmin_rpc_assign_role($callinguser, $targetuser, $rolename, 'id', CONTEXT_COURSE, $course->id, $starttime, $endtime, $json_response); if (!$json_response) { return json_decode($extresponse); } else { return $extresponse; } } else { if (function_exists('debug_trace')) { debug_trace('remote source process'); } // Make remote call. $userhostroot = $DB->get_field_select('mnet_host', 'wwwroot', " id = {$USER->mnethostid} AND deleted = 0 "); if (!$userhostroot) { $extresponse->error = 'Unkown user host root (or deleted).'; if ($json_response) { return json_encode($extresponse); } else { return $extresponse; } } if (!$DB->record_exists('mnet_host', array('wwwroot' => $whereroot, 'deleted' => 0))) { $extresponse->error = '$whereroot is unknown host or deleted.'; if ($json_response) { return json_encode($extresponse); } else { return $extresponse; } } $rpcclient = new mnet_xmlrpc_client(); $rpcclient->set_method('local/vmoodle/plugins/roles/rpclib.php/mnetadmin_rpc_remote_enrol'); $caller = new StdClass(); $caller->username = $USER->username; $caller->remoteuserhostroot = $userhostroot; $caller->remotehostroot = $CFG->wwwroot; $rpcclient->add_param($caller, 'struct'); // caller user $rpcclient->add_param($targetuser, 'string'); $rpcclient->add_param($rolename, 'string'); $rpcclient->add_param($whereroot, 'string'); $rpcclient->add_param($courseidfield, 'string'); $rpcclient->add_param($courseidentifier, 'string'); $rpcclient->add_param($starttime, 'int'); $rpcclient->add_param($endtime, 'int'); $mnet_host = new mnet_peer(); $mnet_host->set_wwwroot($whereroot); if (!$rpcclient->send($mnet_host)) { $extresponse->status = RPC_FAILURE; $extresponse->errors[] = 'REMOTE : ' . implode("<br/>\n", @$rpcclient->errors); $extresponse->error = 'REMOTE : ' . implode("<br/>\n", @$rpcclient->errors); if ($json_response) { return json_encode($extresponse); } else { return $extresponse; } } $response = json_decode($rpcclient->response); if ($response->status == 200) { $extresponse->message = 'remote enrol success'; if ($json_response) { return json_encode($extresponse); } else { return $extresponse; } } else { $extresponse->status = RPC_FAILURE; $extresponse->errors = array(); $extresponse->errors[] = 'Remote application errors : '; $extresponse->errors = array_merge($extresponse->errors, $response->errors); $extresponse->error = 'Remote application error.'; if ($json_response) { return json_encode($extresponse); } else { return $extresponse; } } } }
function taoview_call_mnet($viewtype) { /// Setup MNET environment global $MNET, $CFG; if (empty($MNET)) { $MNET = new mnet_environment(); $MNET->init(); } /// Setup the server $host = get_record('mnet_host', 'name', 'localmahara'); //we retrieve the server(host) from the 'mnet_host' table if (empty($host)) { error('Mahara not configured'); } $a = new stdclass(); $a->link = $CFG->wwwroot . '/auth/mnet/jump.php?hostid=' . $host->id . '&wantsurl=local/taoview.php?view=' . $viewtype; echo '<div class="taoviwdesc">'; print_string('toaddartefacts', 'local', $a); echo '</div>'; $mnet_peer = new mnet_peer(); //we create a new mnet_peer (server/host) $mnet_peer->set_wwwroot($host->wwwroot); //we set this mnet_peer with the host http address $client = new mnet_xmlrpc_client(); //create a new client $client->set_method('local/mahara/rpclib.php/get_artefacts_by_viewtype'); //tell it which method we're going to call $client->add_param($viewtype); $client->send($mnet_peer); //Call the server if (!empty($client->response['faultString'])) { error("Mahara error:" . $artefacts['faultString']); } return $client->response; }
// RPC_HTTPS_SELF_SIGNED 2 // RPC_HTTP_VERIFIED 3 // RPC_HTTP_SELF_SIGNED 4 if (!$mnet_peer->transport) exit('No transport method is approved for this host in your DB table. Please enable a transport method and try again.'); $t[1] = 'http2 (port 443 encrypted) with a verified certificate.'; $t[2] = 'https (port 443 encrypted) with a self-signed certificate.'; $t[4] = 'http (port 80 unencrypted) with a verified certificate.'; $t[8] = 'http (port 80 unencrypted) with a self-signed certificate.'; $t[16] = 'http (port 80 unencrypted) unencrypted with no certificate.'; echo 'Your transportid is <strong>'.$mnet_peer->transport.'</strong> which represents <em>'.$t[$mnet_peer->transport]."</em><br /><br />\n"; flush(); */ // Create a new request object $mnet_request = new mnet_xmlrpc_client(); // Tell it the path to the method that we want to execute $mnet_request->set_method($path_to_function[$func]); // Add parameters for your function. The mnet_concatenate_strings takes three // parameters, like mnet_concatenate_strings($string1, $string2, $string3) // PHP is weakly typed, so you can get away with calling most things strings, // unless it's non-scalar (i.e. an array or object or something). foreach ($paramArray[$func] as $param) { $mnet_request->add_param($param[0], $param[1]); } if (count($mnet_request->params)) { echo 'Your parameters are:<br />'; while (list($key, $val) = each($mnet_request->params)) { echo ' <strong>' . $key . ':</strong> ' . $val . "<br/>\n"; } }
/** * sends the 'content_intent' ping to mahara * if all goes well, this will set the 'token' and 'sendtype' member variables. */ public function send_intent() { global $CFG, $DB; require_once($CFG->dirroot . '/mnet/xmlrpc/client.php'); $client = new mnet_xmlrpc_client(); $client->set_method('portfolio/mahara/lib.php/send_content_intent'); $client->add_param($this->get('user')->username); $this->ensure_mnethost(); if (!$client->send($this->mnethost)) { foreach ($client->error as $errormessage) { list($code, $message) = array_map('trim',explode(':', $errormessage, 2)); $message .= "ERROR $code:<br/>$errormessage<br/>"; } throw new portfolio_export_exception($this->get('exporter'), 'failedtoping', 'portfolio_mahara', '', $message); } // we should get back... the send type and a shared token $response = (object)$client->response; if (empty($response->sendtype) || empty($response->token)) { throw new portfolio_export_exception($this->get('exporter'), 'senddisallowed', 'portfolio_mahara'); } switch ($response->sendtype) { case 'immediate': $this->sendtype = PORTFOLIO_MAHARA_IMMEDIATE; break; case 'queue': $this->sendtype = PORTFOLIO_MAHARA_QUEUE; break; case 'none': default: throw new portfolio_export_exception($this->get('exporter'), 'senddisallowed', 'portfolio_mahara'); } $this->token = $response->token; $this->get('exporter')->save(); // put the entry in the mahara queue table now too $q = new stdClass; $q->token = $this->token; $q->transferid = $this->get('exporter')->get('id'); $DB->insert_record('portfolio_mahara_queue', $q); }
/** * Send the request to the server or execute function if is a local call. * @param $host mnet_peer A mnet_peer object with details of the remote host we're connecting to. * @return boolean True if the request is successfull, False otherwise. */ public function send($host) { global $CFG; // Defining result $return = false; $this->error = array(); // Checking if is a local call if ($host->wwwroot == $CFG->wwwroot) { // Getting method $uri = explode('/', $this->method); $method = array_pop($uri); $file = implode('/', $uri); // Adding librairie if (!(include_once $CFG->dirroot . '/' . $file)) { $this->error[] = 'No such file.'; } else { if (!function_exists($method)) { $this->error[] = 'No such function.'; } else { $this->response = call_user_func_array($method, $this->params); $result = true; } } } else { // Make the default remote call $result = parent::send($host); } // Capturing host errors $this->host_errors[$host->wwwroot] = $this->error; // Reseting errors for next send $this->error = array(); // Returning result return $result; }
if (!empty($CFG->mnet_all_hosts_id)) { $id_list .= ', ' . $CFG->mnet_all_hosts_id; } $concat = sql_concat('COALESCE(h2s.id,0) ', ' \'-\' ', ' svc.id'); $query = "\n SELECT DISTINCT\n {$concat} as id,\n svc.id as serviceid,\n svc.name,\n svc.offer,\n svc.apiversion,\n r.parent_type,\n r.parent,\n h2s.hostid,\n h2s.publish,\n h2s.subscribe\n FROM\n {$CFG->prefix}mnet_service2rpc s2r,\n {$CFG->prefix}mnet_rpc r,\n {$CFG->prefix}mnet_service svc\n LEFT JOIN\n {$CFG->prefix}mnet_host2service h2s\n ON\n h2s.hostid in ({$id_list}) AND\n h2s.serviceid = svc.id\n WHERE\n svc.offer = '1' AND\n s2r.serviceid = svc.id AND\n s2r.rpcid = r.id\n ORDER BY\n svc.name ASC"; $resultset = get_records_sql($query); if (is_array($resultset)) { $resultset = array_values($resultset); } else { $resultset = array(); } require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; $remoteservices = array(); if ($hostid != $CFG->mnet_all_hosts_id) { // Create a new request object $mnet_request = new mnet_xmlrpc_client(); // Tell it the path to the method that we want to execute $mnet_request->set_method('system/listServices'); $mnet_request->send($mnet_peer); if (is_array($mnet_request->response)) { foreach ($mnet_request->response as $service) { $remoteservices[$service['name']][$service['apiversion']] = $service; } } } $myservices = array(); foreach ($resultset as $result) { $result->hostpublishes = false; $result->hostsubscribes = false; if (isset($remoteservices[$result->name][$result->apiversion])) { if ($remoteservices[$result->name][$result->apiversion]['publish'] == 1) {
public function callRemoteMethod($method, $parameters, $server = null) { global $CFG, $SynchServerController; require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; // For the demo, our 'remote' host is actually our local host. $wwwroot = $CFG->wwwroot; //$method = 'synch/mnet/synch.php/getBackupById'; // Get local server. $localServer = $SynchServerController->checkAndCreateLocalServer(); global $Out; //$Out->print_r($localServer, '$localServer = '); // Cannot continue without a local server if (empty($localServer)) { return null; } if (empty($server)) { //$Out->append('Generating default remote server'); //$server = new synch_modal_Server(); //$server->mnetHostId = 1020000003; $server = $SynchServerController->getRemoteServer(); } //$Out->print_r($server, '$server = '); // Cannot continue without a remote server to call if (empty($server) || synch_empty($server->mnetHostId)) { return null; } // mnet_peer pulls information about a remote host from the database. $mnet_peer = new mnet_peer(); $mnet_peer->set_wwwroot($wwwroot); $mnethostid = $server->mnetHostId; $mnet_peer->set_id($mnethostid); // Create a new request object $mnet_request = new mnet_xmlrpc_client(); // Tell it the path to the method that we want to execute $mnet_request->set_method($method); // Set the time out to something decent in seconds //$mnet_request->set_timeout(600); //set_time_limit(120); // Add parameters for your function. The mnet_concatenate_strings takes three // parameters, like mnet_concatenate_strings($string1, $string2, $string3) // PHP is weakly typed, so you can get away with calling most things strings, // unless it's non-scalar (i.e. an array or object or something). foreach ($parameters as $param) { $mnet_request->add_param($param[0], $param[1]); } // We send the request: $mnet_request->send($mnet_peer); return $mnet_request->response; }
/** * Does Foo * * @param int $mnethostid The id of the remote mnethost * @return array Whether the user can login from the remote host */ function req_unenrol_user($userid, $courseid) { global $CFG; global $USER; global $MNET; require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; // in case the remote host doesn't have it $username = get_field('user', 'username', 'id', $userid); $course = get_record('mnet_enrol_course', 'id', $courseid); // get the Service Provider info $mnet_sp = new mnet_peer(); $mnet_sp->set_id($course->hostid); // set up the RPC request $mnetrequest = new mnet_xmlrpc_client(); $mnetrequest->set_method('enrol/mnet/enrol.php/unenrol_user'); $mnetrequest->add_param($username); $mnetrequest->add_param($course->remoteid); // TODO - prevent removal of enrolments that are not of // type mnet... // Thunderbirds are go! Do RPC call and store response if ($mnetrequest->send($mnet_sp) === true) { if ($mnetrequest->response == true) { // remove enrolment cached in mnet_enrol_assignments delete_records_select('mnet_enrol_assignments', "userid={$userid} AND courseid={$course->id}"); return true; } } return false; }
function local_mahara_mnet_call() { global $CFG, $MNET; if ($CFG->mnet_dispatcher_mode != 'strict') { return; } if (!($host = get_record('mnet_host', 'name', 'localmahara'))) { return; } require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; if (empty($MNET)) { $MNET = new mnet_environment(); $MNET->init(); } $args = func_get_args(); $method = array_shift($args); $mnet_peer = new mnet_peer(); $mnet_peer->set_wwwroot($host->wwwroot); $client = new mnet_xmlrpc_client(); $client->set_method($method); foreach ($args as $a) { $client->add_param($a); } $client->send($mnet_peer); return $client->response; }
// insert a backlink header in the content $olddescription = $issue->description; $issue->description = tracker_add_cascade_backlink($cm, $issue) . $issue->description; include_once $CFG->libdir . "/pear/HTML/AJAX/JSON.php"; include_once $CFG->dirroot . '/mod/tracker/rpclib.php'; if (is_numeric($tracker->parent)) { // tracker is local, use the rpc entry point anyway // emulate response $result = tracker_rpc_post_issue($USER->username, $CFG->wwwroot, $tracker->parent, json_encode($issue)); } else { // tracker is remote, make an RPC call list($remoteid, $mnet_host) = explode('@', $tracker->parent); // get network tracker properties include_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; $userroot = get_field('mnet_host', 'wwwroot', 'id', $USER->mnethostid); $rpcclient = new mnet_xmlrpc_client(); $rpcclient->set_method('mod/tracker/rpclib.php/tracker_rpc_post_issue'); $rpcclient->add_param($USER->username, 'string'); $rpcclient->add_param($userroot, 'string'); $rpcclient->add_param($remoteid, 'int'); $rpcclient->add_param(json_encode($issue), 'string'); $parent_mnet = new mnet_peer(); $parent_mnet->set_wwwroot($mnet_host); if ($rpcclient->send($parent_mnet)) { $result = $rpcclient->response; } else { $result = null; } } if ($result) { $response = json_decode($result);
/** * The IdP uses this function to kill child sessions on other hosts * * @param string $username Username for session to kill * @param string $useragent SHA1 hash of user agent to look for * @return string A plaintext report of what has happened */ function kill_children($username, $useragent) { global $CFG, $USER, $DB; $remoteclient = null; if (defined('MNET_SERVER')) { $remoteclient = get_mnet_remote_client(); } require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; $userid = $DB->get_field('user', 'id', array('mnethostid' => $CFG->mnet_localhost_id, 'username' => $username)); $returnstring = ''; $mnetsessions = $DB->get_records('mnet_session', array('userid' => $userid, 'useragent' => $useragent)); if (false == $mnetsessions) { $returnstring .= "Could find no remote sessions\n"; $mnetsessions = array(); } foreach ($mnetsessions as $mnetsession) { // If this script is being executed by a remote peer, that means the user has clicked // logout on that peer, and the session on that peer can be deleted natively. // Skip over it. if (isset($remoteclient->id) && $mnetsession->mnethostid == $remoteclient->id) { continue; } $returnstring .= "Deleting session\n"; $mnet_peer = new mnet_peer(); $mnet_peer->set_id($mnetsession->mnethostid); $mnet_request = new mnet_xmlrpc_client(); $mnet_request->set_method('auth/mnet/auth.php/kill_child'); // set $token and $useragent parameters $mnet_request->add_param($username); $mnet_request->add_param($useragent); if ($mnet_request->send($mnet_peer) === false) { debugging("Server side error has occured on host {$mnetsession->mnethostid}: " . join("\n", $mnet_request->error)); } } $ignore = $DB->delete_records('mnet_session', array('useragent' => $useragent, 'userid' => $userid)); if (isset($remoteclient) && isset($remoteclient->id)) { session_kill_user($userid); } return $returnstring; }
/** * The IdP uses this function to kill child sessions on other hosts * * @param string $username Username for session to kill * @param string $useragent SHA1 hash of user agent to look for * @return string A plaintext report of what has happened */ function kill_children($username, $useragent) { global $CFG, $USER, $MNET_REMOTE_CLIENT; require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; $userid = get_field('user', 'id', 'mnethostid', $CFG->mnet_localhost_id, 'username', addslashes($username)); $returnstring = ''; $sql = "\n select\n *\n from\n {$CFG->prefix}mnet_session s\n where\n s.userid = '{$userid}' AND\n s.useragent = '{$useragent}'"; // If we are being executed from a remote machine (client) we don't have // to kill the moodle session on that machine. if (isset($MNET_REMOTE_CLIENT) && isset($MNET_REMOTE_CLIENT->id)) { $excludeid = $MNET_REMOTE_CLIENT->id; } else { $excludeid = -1; } $mnetsessions = get_records_sql($sql); if (false == $mnetsessions) { $returnstring .= "Could find no remote sessions\n{$sql}\n"; $mnetsessions = array(); } foreach ($mnetsessions as $mnetsession) { $returnstring .= "Deleting session\n"; if ($mnetsession->mnethostid == $excludeid) { continue; } $mnet_peer = new mnet_peer(); $mnet_peer->set_id($mnetsession->mnethostid); $mnet_request = new mnet_xmlrpc_client(); $mnet_request->set_method('auth/mnet/auth.php/kill_child'); // set $token and $useragent parameters $mnet_request->add_param($username); $mnet_request->add_param($useragent); if ($mnet_request->send($mnet_peer) === false) { debugging("Server side error has occured on host {$mnetsession->mnethostid}: " . join("\n", $mnet_request->error)); } } $ignore = delete_records('mnet_session', 'useragent', $useragent, 'userid', $userid); if (isset($MNET_REMOTE_CLIENT) && isset($MNET_REMOTE_CLIENT->id)) { $start = ob_start(); $uc = ini_get('session.use_cookies'); ini_set('session.use_cookies', false); $sesscache = clone $_SESSION; $sessidcache = session_id(); session_write_close(); unset($_SESSION); session_id($mnetsession->session_id); session_start(); session_unregister("USER"); session_unregister("SESSION"); unset($_SESSION); $_SESSION = array(); session_write_close(); ini_set('session.use_cookies', $uc); session_name('MoodleSession' . $CFG->sessioncookie); session_id($sessidcache); session_start(); $_SESSION = clone $sesscache; session_write_close(); $end = ob_end_clean(); } else { $_SESSION = array(); } return $returnstring; }
} echo '</table>'; } else { // Tell it the path to the method that we want to execute $mnet_request->set_method('system/listMethods'); $mnet_request->send($mnet_peer); $methods = $mnet_request->response; echo '<hr /><br /><h3>Methods ' . $host->wwwroot . '</h3><table><th>Method</th><th colspan="2">Options</th>'; foreach ($methods as $id => $method) { echo '<tr><td>' . $method . '</td><td> <a href="testclient.php?hostid=' . $host->id . '&method=' . $id . '&show=sig">Inspect</a></td></tr>' . "\n"; } echo '</table>'; } if (isset($_GET['method']) && array_key_exists($_GET['method'], $methods)) { $method = $methods[$_GET['method']]; $mnet_request = new mnet_xmlrpc_client(); // Tell it the path to the method that we want to execute $mnet_request->set_method('system/methodSignature'); $mnet_request->add_param($method, 'string'); $mnet_request->send($mnet_peer); $signature = $mnet_request->response; echo '<hr /><br /><h3>Method signature for ' . $method . ':</h3><table border="1"><th>Position</th><th>Type</th><th>Description</th>'; $params = array_pop($signature); foreach ($params as $pos => $details) { echo '<tr><td>' . $pos . '</td><td>' . $details['type'] . '</td><td>' . $details['description'] . '</td></tr>'; } echo '</table>'; // Tell it the path to the method that we want to execute $mnet_request->set_method('system/methodHelp'); $mnet_request->add_param($method, 'string'); $mnet_request->send($mnet_peer);
/** * The IdP uses this function to kill child sessions on other hosts * * @param string $username Username for session to kill * @param string $useragent SHA1 hash of user agent to look for * @return string A plaintext report of what has happened */ function kill_children($username, $useragent) { global $CFG, $USER, $MNET_REMOTE_CLIENT, $DB; require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; $userid = $DB->get_field('user', 'id', array('mnethostid' => $CFG->mnet_localhost_id, 'username' => $username)); $returnstring = ''; $mnetsessions = $DB->get_records('mnet_session', array('userid' => $userid, 'useragent' => $useragent)); if (false == $mnetsessions) { $returnstring .= "Could find no remote sessions\n"; $mnetsessions = array(); } foreach ($mnetsessions as $mnetsession) { // If this script is being executed by a remote peer, that means the user has clicked // logout on that peer, and the session on that peer can be deleted natively. // Skip over it. if (isset($MNET_REMOTE_CLIENT->id) && $mnetsession->mnethostid == $MNET_REMOTE_CLIENT->id) { continue; } $returnstring .= "Deleting session\n"; $mnet_peer = new mnet_peer(); $mnet_peer->set_id($mnetsession->mnethostid); $mnet_request = new mnet_xmlrpc_client(); $mnet_request->set_method('auth/mnet/auth.php/kill_child'); // set $token and $useragent parameters $mnet_request->add_param($username); $mnet_request->add_param($useragent); if ($mnet_request->send($mnet_peer) === false) { debugging("Server side error has occured on host {$mnetsession->mnethostid}: " . join("\n", $mnet_request->error)); } } $ignore = $DB->delete_records('mnet_session', array('useragent' => $useragent, 'userid' => $userid)); if (isset($MNET_REMOTE_CLIENT) && isset($MNET_REMOTE_CLIENT->id)) { $start = ob_start(); // Save current session and cookie-use status $cookieuse = ini_get('session.use_cookies'); ini_set('session.use_cookies', false); $sesscache = $_SESSION; $sessidcache = session_id(); // Replace existing mnet session with user session & unset session_write_close(); unset($_SESSION); session_id($mnetsession->session_id); session_start(); session_unregister("USER"); session_unregister("SESSION"); unset($_SESSION); $_SESSION = array(); session_write_close(); // Restore previous info ini_set('session.use_cookies', $cookieuse); session_name('MoodleSession' . $CFG->sessioncookie); session_id($sessidcache); session_start(); $_SESSION = $sesscache; session_write_close(); $end = ob_end_clean(); } else { $_SESSION = array(); } return $returnstring; }
$removeuser = clean_param($removeuser, PARAM_INT); if (!$enrolment->req_unenrol_user($removeuser, $course->id)) { $errors[] = "Could not remove user with id {$removeuser} from course {$course->id}!"; } } } else { if ($showall) { $searchtext = ''; $previoussearch = 0; } } } } /// Prepare data for users / enrolled users panes /// Create a new request object $mnet_request = new mnet_xmlrpc_client(); /// Pass it the path to the method that we want to execute $mnet_request->set_method('enrol/mnet/enrol.php/course_enrolments'); $mnet_request->add_param($course->remoteid, 'int'); $mnet_request->send($mnet_peer); $all_enrolled_users = $mnet_request->response; unset($mnet_request); $select = ''; $all_enrolled_usernames = ''; $timemodified = array(); /// List all the users (homed on this server) who are enrolled on the course /// This will include mnet-enrolled users, and those who have enrolled /// themselves, etc. if (is_array($all_enrolled_users) && count($all_enrolled_users)) { foreach ($all_enrolled_users as $username => $data) { $all_enrolled_usernames .= "'{$username}', ";
/** * Download a file * @global object $CFG * @param string $url the url of file * @param string $file save location * @return string the location of the file * @see curl package */ public function get_file($url, $file = '') { global $CFG, $DB, $USER; ///set mnet environment and set the mnet host require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; $this->ensure_environment(); $host = $DB->get_record('mnet_host', array('id' => $this->options['peer'])); //retrieve the host url $mnet_peer = new mnet_peer(); $mnet_peer->set_wwwroot($host->wwwroot); ///create the client and set the method to call $client = new mnet_xmlrpc_client(); $client->set_method('repository/remotemoodle/repository.class.php/retrieveFile'); $client->add_param($USER->username); $client->add_param($url); ///call the method and manage host error if (!$client->send($mnet_peer)) { $message = " "; foreach ($client->error as $errormessage) { $message .= "ERROR: {$errormessage} . "; } echo json_encode(array('e' => $message)); exit; } $services = $client->response; //service contains the file content in the first case of the array, //and the filename in the second //the content has been encoded in base64, need to decode it $content = base64_decode($services[0]); $file = $services[1]; //filename ///create a temporary folder with a file $path = $this->prepare_file($file); ///fill the file with the content $fp = fopen($path, 'w'); fwrite($fp, $content); fclose($fp); return $path; }
/** * Send request to unenrol our user from the remote course * * Updates our remote enrolments cache if the unenrolment was successful. * * @uses mnet_xmlrpc_client Invokes XML-RPC request * @param object $user our user * @param object $remotecourse record from mnetservice_enrol_courses table * @return true|string true if success, error message from the remote host otherwise */ public function req_unenrol_user(stdclass $user, stdclass $remotecourse) { global $CFG, $DB; require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; $peer = new mnet_peer(); $peer->set_id($remotecourse->hostid); $request = new mnet_xmlrpc_client(); $request->set_method('enrol/mnet/enrol.php/unenrol_user'); $request->add_param($user->username); $request->add_param($remotecourse->remoteid); if ($request->send($peer) === true) { if ($request->response === true) { // clear the cached information $DB->delete_records('mnetservice_enrol_enrolments', array('hostid' => $peer->id, 'userid' => $user->id, 'remotecourseid' => $remotecourse->remoteid, 'enroltype' => 'mnet')); return true; } else { return serialize(array('invalid response: ' . print_r($request->response, true))); } } else { return serialize($request->error); } }
/** * Send Mnet request to Mahara portfolio. * * @global stdClass $CFG * @param string $methodname name of remote method to call * @param array $parameters list of method parameters * @return mixed $responsedata Mnet response */ private function mnet_send_request($methodname, $parameters) { global $CFG; $error = false; $responsedata = false; if (!is_enabled_auth('mnet')) { $error = get_string('authmnetdisabled', 'mnet'); } else { if (!has_capability('moodle/site:mnetlogintoremote', context_system::instance())) { $error = get_string('notpermittedtojump', 'mnet'); } else { // Set up the RPC request. require_once $CFG->dirroot . '/mnet/xmlrpc/client.php'; require_once $CFG->dirroot . '/mnet/peer.php'; $mnetpeer = new mnet_peer(); $mnetpeer->set_id($this->get_config('mnethostid')); $mnetrequest = new mnet_xmlrpc_client(); $mnetrequest->set_method('mod/mahara/rpclib.php/' . $methodname); foreach ($parameters as $parameter) { $mnetrequest->add_param($parameter); } if ($mnetrequest->send($mnetpeer) === true) { $responsedata = $mnetrequest->response; } else { $error = "RPC mod/mahara/rpclib.php/" . $methodname . ":<br/>"; foreach ($mnetrequest->error as $errormessage) { list($code, $errormessage) = array_map('trim', explode(':', $errormessage, 2)); $error .= "ERROR {$code}:<br/>{$errormessage}<br/>"; } } } } if ($error) { $this->set_error($error); } return $responsedata; }