PageRenderTime 43ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/common/tool_consumer_outcome.php

https://github.com/arwhyte/tsugi
PHP | 134 lines | 108 code | 18 blank | 8 comment | 25 complexity | 8cce424e74e27ef5de3b07f8322a250a MD5 | raw file
Possible License(s): Apache-2.0
  1. <?php
  2. require_once('../lib/vendor/Tsugi/Util/Net.php');
  3. require_once("../lib/oauth.classes.php");
  4. require_once("../lib/vendor/Tsugi/Util/LTI.php");
  5. use Tsugi\OAuth\OAuthUtil;
  6. use Tsugi\Util\LTI;
  7. $old_error_handler = set_error_handler("myErrorHandler");
  8. function myErrorHandler($errno, $errstr, $errfile, $errline)
  9. {
  10. // echo("YO ". $errorno . $errstr . "\n");
  11. if ( strpos($errstr, 'deprecated') !== false ) return true;
  12. return false;
  13. }
  14. ini_set("display_errors", 1);
  15. if ( !isset ( $_REQUEST['b64'] ) ) {
  16. die("Missing b64 parameter");
  17. }
  18. // Make sure to add the file to the session id in case
  19. // multiple people are running this on the same server
  20. $b64 = $_REQUEST['b64'];
  21. session_id(md5($b64 . __FILE__));
  22. session_start();
  23. // For my application, We only allow application/xml
  24. $request_headers = OAuthUtil::get_headers();
  25. $hct = $request_headers['Content-Type'];
  26. if ( ! isset($hct) ) $hct = $request_headers['Content-type'];
  27. if (strpos($hct,'application/xml') === false ) {
  28. header('Content-Type: text/plain');
  29. // print_r($request_headers);
  30. die("Must be content type xml, found ".$hct);
  31. }
  32. header('Content-Type: application/xml; charset=utf-8');
  33. // Get skeleton response
  34. $response = LTI::getPOXResponse();
  35. // Pull out the key and secret from the parameter
  36. $b64dec = base64_decode($b64);
  37. $b64 = explode(":::", $b64dec);
  38. $oauth_consumer_key = $b64[0];
  39. $oauth_consumer_secret = $b64[1];
  40. $operation = "unknown";
  41. if ( strlen($oauth_consumer_key) < 1 || strlen($oauth_consumer_secret) < 1 ) {
  42. echo(sprintf($response,uniqid(),'failure', "Missing key/secret B64=$b64dec B64key=$oauth_consumer_key secret=$oauth_consumer_secret",$message_ref,$operation,""));
  43. exit();
  44. }
  45. $header_key = LTI::getOAuthKeyFromHeaders();
  46. if ( strlen($header_key) < 1 ) {
  47. echo(sprintf($response,uniqid(),'failure', "Empty header key. Note that some proxy configurations do not pass the Authorization header.",$message_ref,$operation,""));
  48. exit();
  49. } else if ( $header_key != $oauth_consumer_key ) {
  50. echo(sprintf($response,uniqid(),'failure', "B64key=$oauth_consumer_key HDR=$header_key",$message_ref,$operation,""));
  51. exit();
  52. }
  53. try {
  54. $body = LTI::handleOAuthBodyPOST($oauth_consumer_key, $oauth_consumer_secret);
  55. $xml = new SimpleXMLElement($body);
  56. $imsx_header = $xml->imsx_POXHeader->children();
  57. $parms = $imsx_header->children();
  58. $message_ref = (string) $parms->imsx_messageIdentifier;
  59. $imsx_body = $xml->imsx_POXBody->children();
  60. $operation = $imsx_body->getName();
  61. $parms = $imsx_body->children();
  62. } catch (Exception $e) {
  63. global $LastOAuthBodyBaseString;
  64. global $LastOAuthBodyHashInfo;
  65. $retval = sprintf($response,uniqid(),'failure', $e->getMessage().
  66. " B64key=$oauth_consumer_key HDRkey=$header_key secret=$oauth_consumer_secret",uniqid(),$operation,"") .
  67. "<!--\n".
  68. "Base String:\n".$LastOAuthBodyBaseString."\n".
  69. "Hash Info:\n".$LastOAuthBodyHashInfo."\n-->\n";
  70. echo($retval);
  71. exit();
  72. }
  73. $sourcedid = (string) $parms->resultRecord->sourcedGUID->sourcedId;
  74. if ( !isset($sourcedid) && strlen($sourcedid) > 0 ) {
  75. echo(sprintf($response,uniqid(),'failure', "Missing required lis_result_sourcedid",$message_ref,$operation,""));
  76. exit();
  77. }
  78. $gradebook = isset($_SESSION['cert_gradebook']) ? $_SESSION['cert_gradebook'] : Array();
  79. $top_tag = str_replace("Request","Response",$operation);
  80. $body_tag = "\n<".$top_tag."/>";
  81. if ( $operation == "replaceResultRequest" ) {
  82. $score = (string) $parms->resultRecord->result->resultScore->textString;
  83. $fscore = (float) $score;
  84. if ( ! is_numeric($score) ) {
  85. echo(sprintf($response,uniqid(),'failure', "Score must be numeric",$message_ref,$operation,$body_tag));
  86. exit();
  87. }
  88. $fscore = (float) $score;
  89. if ( $fscore < 0.0 || $fscore > 1.0 ) {
  90. echo(sprintf($response,uniqid(),'failure', "Score not between 0.0 and 1.0",$message_ref,$operation,$body_tag));
  91. exit();
  92. }
  93. echo(sprintf($response,uniqid(),'success', "Score for $sourcedid is now $score",$message_ref,$operation,$body_tag));
  94. $gradebook[$sourcedid] = $score;
  95. } else if ( $operation == "readResultRequest" ) {
  96. $score = $gradebook[$sourcedid];
  97. $body = '
  98. <readResultResponse>
  99. <result>
  100. <resultScore>
  101. <language>en</language>
  102. <textString>%s</textString>
  103. </resultScore>
  104. </result>
  105. </readResultResponse>';
  106. $body = sprintf($body,$score);
  107. echo(sprintf($response,uniqid(),'success', "Score read successfully",$message_ref,$operation,$body));
  108. } else if ( $operation == "deleteResultRequest" ) {
  109. unset( $gradebook[$sourcedid]);
  110. echo(sprintf($response,uniqid(),'success', "Score deleted",$message_ref,$operation,$body_tag));
  111. } else {
  112. echo(sprintf($response,uniqid(),'unsupported', "Operation not supported - $operation",$message_ref,$operation,""));
  113. }
  114. $_SESSION['cert_gradebook'] = $gradebook;
  115. // print_r($gradebook);
  116. ?>