示例#1
0
    /**
     * 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;
    }
示例#2
0
 /**
  * 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;
     }
 }