/** * Send a service request to the tool consumer. * * @param string $type Message type value * @param string $url URL to send request to * @param string $xml XML of message request * * @return boolean True if the request successfully obtained a response */ private function doLTI11Service($type, $url, $xml) { $ok = false; $this->extRequest = null; $this->extRequestHeaders = ''; $this->extResponse = null; $this->extResponseHeaders = ''; if (!empty($url)) { $id = uniqid(); $xmlRequest = <<<EOD <?xml version = "1.0" encoding = "UTF-8"?> <imsx_POXEnvelopeRequest xmlns = "http://www.imsglobal.org/services/ltiv1p1/xsd/imsoms_v1p0"> <imsx_POXHeader> <imsx_POXRequestHeaderInfo> <imsx_version>V1.0</imsx_version> <imsx_messageIdentifier>{$id}</imsx_messageIdentifier> </imsx_POXRequestHeaderInfo> </imsx_POXHeader> <imsx_POXBody> <{$type}Request> {$xml} </{$type}Request> </imsx_POXBody> </imsx_POXEnvelopeRequest> EOD; // Calculate body hash $hash = base64_encode(sha1($xmlRequest, true)); $params = array('oauth_body_hash' => $hash); // Add OAuth signature $hmacMethod = new OAuth\OAuthSignatureMethod_HMAC_SHA1(); $consumer = new OAuth\OAuthConsumer($this->getConsumer()->getKey(), $this->getConsumer()->secret, null); $req = OAuth\OAuthRequest::from_consumer_and_token($consumer, null, 'POST', $url, $params); $req->sign_request($hmacMethod, $consumer, null); $params = $req->get_parameters(); $header = $req->to_header(); $header .= "\nContent-Type: application/xml"; // Connect to tool consumer $http = new HTTPMessage($url, 'POST', $xmlRequest, $header); // Parse XML response if ($http->send()) { $this->extResponse = $http->response; $this->extResponseHeaders = $http->responseHeaders; try { $this->extDoc = new DOMDocument(); $this->extDoc->loadXML($http->response); $this->extNodes = $this->domnodeToArray($this->extDoc->documentElement); if (isset($this->extNodes['imsx_POXHeader']['imsx_POXResponseHeaderInfo']['imsx_statusInfo']['imsx_codeMajor']) && $this->extNodes['imsx_POXHeader']['imsx_POXResponseHeaderInfo']['imsx_statusInfo']['imsx_codeMajor'] === 'success') { $ok = true; } } catch (\Exception $e) { } } $this->extRequest = $http->request; $this->extRequestHeaders = $http->requestHeaders; } return $ok; }
/** * Add the OAuth signature to an array of message parameters or to a header string. * * @return mixed Array of signed message parameters or header string */ public static function addSignature($endpoint, $consumerKey, $consumerSecret, $data, $method = 'POST', $type = null) { $params = array(); if (is_array($data)) { $params = $data; } // Check for query parameters which need to be included in the signature $queryParams = array(); $queryString = parse_url($endpoint, PHP_URL_QUERY); if (!is_null($queryString)) { $queryItems = explode('&', $queryString); foreach ($queryItems as $item) { if (strpos($item, '=') !== false) { list($name, $value) = explode('=', $item); $queryParams[urldecode($name)] = urldecode($value); } else { $queryParams[urldecode($item)] = ''; } } $params = $params + $queryParams; } if (!is_array($data)) { // Calculate body hash $hash = base64_encode(sha1($data, true)); $params['oauth_body_hash'] = $hash; } // Add OAuth signature $hmacMethod = new OAuth\OAuthSignatureMethod_HMAC_SHA1(); $oauthConsumer = new OAuth\OAuthConsumer($consumerKey, $consumerSecret, null); $oauthReq = OAuth\OAuthRequest::from_consumer_and_token($oauthConsumer, null, $method, $endpoint, $params); $oauthReq->sign_request($hmacMethod, $oauthConsumer, null); $params = $oauthReq->get_parameters(); // Remove parameters being passed on the query string foreach (array_keys($queryParams) as $name) { unset($params[$name]); } if (!is_array($data)) { $header = $oauthReq->to_header(); if (empty($data)) { if (!empty($type)) { $header .= "\nAccept: {$type}"; } } else { if (isset($type)) { $header .= "\nContent-Type: {$type}"; $header .= "\nContent-Length: " . strlen($data); } } return $header; } else { return $params; } }