123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- <?php
- /**
- * A library for building an API client
- *
- * Load the library 'elgg:ws:client' to use the functions in this library
- */
- /**
- * Send a raw API call to an elgg api endpoint.
- *
- * @param array $keys The api keys.
- * @param string $url URL of the endpoint.
- * @param array $call Associated array of "variable" => "value"
- * @param string $method GET or POST
- * @param string $post_data The post data
- * @param string $content_type The content type
- *
- * @return string
- */
- function send_api_call(array $keys, $url, array $call, $method = 'GET', $post_data = '',
- $content_type = 'application/octet-stream') {
- global $CONFIG;
- $headers = array();
- $encoded_params = array();
- $method = strtoupper($method);
- switch (strtoupper($method)) {
- case 'GET' :
- case 'POST' :
- break;
- default:
- $msg = elgg_echo('NotImplementedException:CallMethodNotImplemented', array($method));
- throw new NotImplementedException($msg);
- }
- // Time
- $time = time();
- // Nonce
- $nonce = uniqid('');
- // URL encode all the parameters
- foreach ($call as $k => $v) {
- $encoded_params[] = urlencode($k) . '=' . urlencode($v);
- }
- $params = implode('&', $encoded_params);
- // Put together the query string
- $url = $url . "?" . $params;
- // Construct headers
- $posthash = "";
- if ($method == 'POST') {
- $posthash = calculate_posthash($post_data, 'md5');
- }
- if ((isset($keys['public'])) && (isset($keys['private']))) {
- $headers['X-Elgg-apikey'] = $keys['public'];
- $headers['X-Elgg-time'] = $time;
- $headers['X-Elgg-nonce'] = $nonce;
- $headers['X-Elgg-hmac-algo'] = 'sha1';
- $headers['X-Elgg-hmac'] = calculate_hmac('sha1',
- $time,
- $nonce,
- $keys['public'],
- $keys['private'],
- $params,
- $posthash
- );
- }
- if ($method == 'POST') {
- $headers['X-Elgg-posthash'] = $posthash;
- $headers['X-Elgg-posthash-algo'] = 'md5';
- $headers['Content-type'] = $content_type;
- $headers['Content-Length'] = strlen($post_data);
- }
- // Opt array
- $http_opts = array(
- 'method' => $method,
- 'header' => serialise_api_headers($headers)
- );
- if ($method == 'POST') {
- $http_opts['content'] = $post_data;
- }
- $opts = array('http' => $http_opts);
- // Send context
- $context = stream_context_create($opts);
- // Send the query and get the result and decode.
- elgg_log("APICALL: $url");
- $results = file_get_contents($url, false, $context);
- return $results;
- }
- /**
- * Send a GET call
- *
- * @param string $url URL of the endpoint.
- * @param array $call Associated array of "variable" => "value"
- * @param array $keys The keys dependant on chosen authentication method
- *
- * @return string
- */
- function send_api_get_call($url, array $call, array $keys) {
- return send_api_call($keys, $url, $call);
- }
- /**
- * Send a GET call
- *
- * @param string $url URL of the endpoint.
- * @param array $call Associated array of "variable" => "value"
- * @param array $keys The keys dependant on chosen authentication method
- * @param string $post_data The post data
- * @param string $content_type The content type
- *
- * @return string
- */
- function send_api_post_call($url, array $call, array $keys, $post_data,
- $content_type = 'application/octet-stream') {
- return send_api_call($keys, $url, $call, 'POST', $post_data, $content_type);
- }
- /**
- * Return a key array suitable for the API client using the standard
- * authentication method based on api-keys and secret keys.
- *
- * @param string $secret_key Your secret key
- * @param string $api_key Your api key
- *
- * @return array
- */
- function get_standard_api_key_array($secret_key, $api_key) {
- return array('public' => $api_key, 'private' => $secret_key);
- }
- /**
- * Utility function to serialise a header array into its text representation.
- *
- * @param array $headers The array of headers "key" => "value"
- *
- * @return string
- * @access private
- */
- function serialise_api_headers(array $headers) {
- $headers_str = "";
- foreach ($headers as $k => $v) {
- $headers_str .= trim($k) . ": " . trim($v) . "\r\n";
- }
- return trim($headers_str);
- }
|