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;
 }
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
 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('&nbsp;&nbsp; <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;
 }
Exemplo n.º 4
0
 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;
 }
Exemplo n.º 5
0
/**
 * 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));
        }
    }
}
Exemplo n.º 6
0
 // 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 '&nbsp;&nbsp; <strong>' . $key . ':</strong> ' . $val . "<br/>\n";
     }
 }
Exemplo n.º 7
0
/**
 * 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];
}
Exemplo n.º 8
0
/**
 * 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;
            }
        }
    }
}
Exemplo n.º 9
0
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;
}
Exemplo n.º 10
0
 // 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 '&nbsp;&nbsp; <strong>' . $key . ':</strong> ' . $val . "<br/>\n";
     }
 }
Exemplo n.º 11
0
 /**
 * 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;
 }
Exemplo n.º 13
0
 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) {
Exemplo n.º 14
0
 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;
 }
Exemplo n.º 15
0
 /**
  * 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;
 }
Exemplo n.º 16
0
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;
 }
Exemplo n.º 19
0
 /**
  * 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;
 }
Exemplo n.º 20
0
     }
     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);
Exemplo n.º 21
0
 /**
  * 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}', ";
Exemplo n.º 23
0
 /**
  * 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;
 }
Exemplo n.º 24
0
 /**
  * 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;
 }