mirror of
https://github.com/moodle/moodle.git
synced 2025-08-05 00:46:50 +02:00
126 lines
No EOL
3.8 KiB
PHP
126 lines
No EOL
3.8 KiB
PHP
<?php
|
|
require_once(dirname(__FILE__) . "/../../config.php");
|
|
require_once($CFG->dirroot.'/mod/lti/locallib.php');
|
|
require_once($CFG->dirroot.'/mod/lti/servicelib.php');
|
|
|
|
use moodle\mod\lti as lti;
|
|
|
|
$rawbody = file_get_contents("php://input");
|
|
|
|
foreach(getallheaders() as $name => $value){
|
|
if($name === 'Authorization'){
|
|
$oauthparams = lti\OAuthUtil::split_header($value);
|
|
|
|
$consumerkey = $oauthparams['oauth_consumer_key'];
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(empty($consumerkey)){
|
|
throw new Exception('Consumer key is missing.');
|
|
}
|
|
|
|
$sharedsecret = lti_verify_message($consumerkey, lti_get_shared_secrets_by_key($consumerkey), $rawbody);
|
|
|
|
if($sharedsecret === false){
|
|
throw new Exception('Message signature not valid');
|
|
}
|
|
|
|
$xml = new SimpleXMLElement($rawbody);
|
|
|
|
$body = $xml->imsx_POXBody;
|
|
foreach($body->children() as $child){
|
|
$messagetype = $child->getName();
|
|
}
|
|
|
|
switch($messagetype){
|
|
case 'replaceResultRequest':
|
|
$parsed = lti_parse_grade_replace_message($xml);
|
|
|
|
$ltiinstance = $DB->get_record('lti', array('id' => $parsed->instanceid));
|
|
|
|
lti_verify_sourcedid($ltiinstance, $parsed);
|
|
|
|
$gradestatus = lti_update_grade($ltiinstance, $parsed->userid, $parsed->launchid, $parsed->gradeval);
|
|
|
|
$responsexml = lti_get_response_xml(
|
|
$gradestatus ? 'success' : 'error',
|
|
'Grade replace response',
|
|
$parsed->messageid,
|
|
'replaceResultResponse'
|
|
);
|
|
|
|
echo $responsexml->asXML();
|
|
|
|
break;
|
|
|
|
case 'readResultRequest':
|
|
$parsed = lti_parse_grade_read_message($xml);
|
|
|
|
$ltiinstance = $DB->get_record('lti', array('id' => $parsed->instanceid));
|
|
|
|
//Getting the grade requires the context is set
|
|
$context = get_context_instance(CONTEXT_COURSE, $ltiinstance->course);
|
|
$PAGE->set_context($context);
|
|
|
|
lti_verify_sourcedid($ltiinstance, $parsed);
|
|
|
|
$grade = lti_read_grade($ltiinstance, $parsed->userid);
|
|
|
|
$responsexml = lti_get_response_xml(
|
|
isset($grade) ? 'success' : 'error',
|
|
'Result read',
|
|
$parsed->messageid,
|
|
'readResultResponse'
|
|
);
|
|
|
|
$node = $responsexml->imsx_POXBody->readResultResponse;
|
|
$node->addChild('result')
|
|
->addChild('resultScore')
|
|
->addChild('textString', isset($grade) ? $grade : '');
|
|
|
|
echo $responsexml->asXML();
|
|
|
|
break;
|
|
|
|
case 'deleteResultRequest':
|
|
$parsed = lti_parse_grade_delete_message($xml);
|
|
|
|
$ltiinstance = $DB->get_record('lti', array('id' => $parsed->instanceid));
|
|
|
|
lti_verify_sourcedid($ltiinstance, $parsed);
|
|
|
|
$gradestatus = lti_delete_grade($ltiinstance, $parsed->userid);
|
|
|
|
$responsexml = lti_get_response_xml(
|
|
$gradestatus ? 'success' : 'error',
|
|
'Grade delete request',
|
|
$parsed->messageid,
|
|
'deleteResultResponse'
|
|
);
|
|
|
|
echo $responsexml->asXML();
|
|
|
|
break;
|
|
|
|
default:
|
|
//Fire an event if we get a web service request which we don't support directly.
|
|
//This will allow others to extend the LTI services, which I expect to be a common
|
|
//use case, at least until the spec matures.
|
|
$data = new stdClass();
|
|
$data->body = $rawbody;
|
|
$data->messagetype = $messagetype;
|
|
$data->consumerkey = $consumerkey;
|
|
$data->sharedsecret = $sharedsecret;
|
|
|
|
events_trigger('lti_unknown_service_api_call', $data);
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
//echo print_r(apache_request_headers(), true);
|
|
|
|
//echo '<br />';
|
|
|
|
//echo file_get_contents("php://input");
|