aboutsummaryrefslogtreecommitdiff
path: root/mod/apitest/start.php
diff options
context:
space:
mode:
Diffstat (limited to 'mod/apitest/start.php')
-rw-r--r--mod/apitest/start.php242
1 files changed, 242 insertions, 0 deletions
diff --git a/mod/apitest/start.php b/mod/apitest/start.php
new file mode 100644
index 000000000..f197b3e78
--- /dev/null
+++ b/mod/apitest/start.php
@@ -0,0 +1,242 @@
+<?php
+
+ $API_CLIENT = new stdClass;
+
+ // Status variables we can query later
+ $LAST_CALL = null;
+ $LAST_CALL_RAW = "";
+ $LAST_ERROR = null;
+
+
+ function apitest_init($event, $object_type, $object = null) {
+
+ global $CONFIG;
+
+ add_menu("API Test",$CONFIG->wwwroot . "mod/apitest/",array(
+ menu_item("The API Tester plugin",$CONFIG->wwwroot."mod/apitest/"),
+ ));
+ }
+
+ /**
+ * Generate our HMAC.
+ */
+ function apitest_calculate_hmac($algo, $time, $api_key, $secret_key, $get_variables, $post_hash = "")
+ {
+ $ctx = hash_init($algo, HASH_HMAC, $secret_key);
+
+ hash_update($ctx, trim($time));
+ hash_update($ctx, trim($api_key));
+ hash_update($ctx, trim($get_variables));
+ if (trim($post_hash)!="") hash_update($ctx, trim($post_hash));
+
+ return hash_final($ctx);
+ }
+
+ /**
+ * Generate our POST hash.
+ */
+ function apitest_calculate_posthash($postdata, $algo)
+ {
+ $ctx = hash_init($algo);
+
+ hash_update($ctx, $postdata);
+
+ return hash_final($ctx);
+ }
+
+ /**
+ * Serialise HTTP headers.
+ */
+ function apitest_serialise_headers(array $headers)
+ {
+ $headers_str = "";
+
+ foreach ($headers as $k => $v)
+ $headers_str .= trim($k) . ": " . trim($v) . "\r\n";
+
+ return trim($headers_str);
+ }
+
+ /**
+ * Make a raw call.
+ * @param array $method Method call parameters.
+ * @param string $postdata Optional POST data.
+ * @param string $content_type The content type.
+ * @return stdClass
+ */
+ function apitest_call(array $method, $postdata = "", $content_type = 'application/octet-stream')
+ {
+ // Get the config
+ global $API_CLIENT, $LAST_CALL, $LAST_CALL_RAW, $LAST_ERROR;
+
+ $headers = array();
+ $encoded_params = array();
+
+ $time = microtime(true); // Get the current time in microseconds
+ $request = ($postdata!="" ? "POST" : "GET"); // Get the request method, either post or get
+
+ // Hard code the format - we're using PHP, so lets use PHP serialisation.
+ $method['format'] = "php";
+
+ // URL encode all the parameters
+ foreach ($method as $k => $v){
+ if (is_array($v))
+ {
+ foreach ($v as $v2)
+ {
+ $encoded_params[] = urlencode($k).'[]='.urlencode($v2);
+ }
+ }
+ else
+ $encoded_params[] = urlencode($k).'='.urlencode($v);
+ }
+
+ $params = implode('&', $encoded_params);
+
+ // Put together the query string
+ $url = $API_CLIENT->api_endpoint."?". $params;
+
+ // Construct headers
+ $posthash = "";
+ if ($request=='POST')
+ {
+ $posthash = apitest_calculate_posthash($postdata, $API_CLIENT->postdata_hash_algo);
+
+ $headers['X-Elgg-posthash'] = $posthash;
+ $headers['X-Elgg-posthash-algo'] = $API_CLIENT->postdata_hash_algo;
+ $headers['Content-type'] = $content_type;
+ $headers['Content-Length'] = strlen($postdata);
+ }
+
+ $headers['X-Elgg-apikey'] = $API_CLIENT->api_key;
+ $headers['X-Elgg-time'] = $time;
+ $headers['X-Elgg-hmac-algo'] = $API_CLIENT->hmac_algo;
+ $headers['X-Elgg-hmac'] = apitest_calculate_hmac($API_CLIENT->hmac_algo,
+ $time,
+ $API_CLIENT->api_key,
+ $API_CLIENT->secret,
+ $params,
+ $posthash
+ );
+
+ // Configure stream options
+ $opts = array(
+ 'http'=>array(
+ 'method'=> $request,
+ 'header'=> apitest_serialise_headers($headers)
+ )
+ );
+
+ // If this is a post request then set the content
+ if ($request=='POST')
+ $opts['http']['content'] = $postdata;
+
+ // Set stream options
+ $context = stream_context_create($opts);
+
+ // Send the query and get the result and decode.
+ $LAST_CALL_RAW = file_get_contents($url, false, $context);
+ $LAST_CALL = unserialize($LAST_CALL_RAW);
+
+ if (($LAST_CALL) && ($LAST_CALL->status!=0)) // Check to see if this was an error
+ $LAST_ERROR = $LAST_CALL;
+
+ return $LAST_CALL; // Return a stdClass containing the API result
+ }
+
+ function apitest_configure($apikey, $secret, $endpoint = "")
+ {
+ global $CONFIG;
+ global $API_CLIENT;
+
+ $apikey = sanitise_string($apikey);
+ $secret = sanitise_string($secret);
+ $endpoint = sanitise_string($endpoint);
+
+ if ($endpoint=="")
+ $endpoint = $CONFIG->wwwroot . "endpoints/rest.php";
+
+ $API_CLIENT->api_key = $apikey;
+ $API_CLIENT->secret = $secret;
+ $API_CLIENT->api_endpoint = $endpoint;
+ $API_CLIENT->hmac_algo = 'sha1';
+ $API_CLIENT->postdata_hash_algo = 'md5';
+ $API_CLIENT->configured = true;
+ }
+
+ function apitest_draw_command_form($command, $details)
+ {
+ global $API_CLIENT;
+
+ $params = array();
+
+ // If authentication is required then ensure this is prompted for
+ if ($details->require_auth == true)
+ $params['auth_token'] = $_REQUEST['auth_token'];
+
+
+ // Compile a list of parameters
+ foreach ($details['parameters'] as $k => $v)
+ {
+ $params[$k] = $_REQUEST[$k];
+ }
+
+ // Construct list of variables
+ $variables = "";
+ foreach ($params as $k => $v)
+ {
+ $variables .= $k;
+ $variables .= "<input type='text' name='$k' value='$v' />";
+
+ if (isset($details['parameters'][$k]['required']) && ($details['parameters'][$k]['required']!=0))
+ $variables .= " (optional)";
+
+ $variables .= ", ";
+ }
+
+ // Do we need to provide post data?
+ $postdata = "";
+ if ($details->call_method == 'POST')
+ $postdata = "<span onClick=\"showhide('$command')\"><a href=\"#\">add post data...</a></span>";
+
+ $body = <<< END
+ <form method='post'>
+ <p>
+ <input type="hidden" name="action" value="configure" />
+ <input type="hidden" name="apikey" value="{$API_CLIENT->api_key}" /></p>
+ <input type="hidden" name="secret" value="{$API_CLIENT->secret}" /></p>
+ <input type="hidden" name="endpoint" value="{$API_CLIENT->api_endpoint}" /></p>
+
+ <input type='hidden' name='method' value='$command' />
+ <b>$command (<span onClick="showhide('{$command}_desc')"><a href="#">desc</a></span>):</b>
+
+ $variables
+
+ $postdata
+
+ <input type='submit' name='>>' value='>>' />
+ <div id="{$command}_desc" style="display:none">{$details['description']}</div>
+ <div id="$command" style="display:none"><textarea name="post_data" cols="50" rows="10"></textarea></div>
+
+ </p>
+ </form>
+END;
+
+ return $body;
+ }
+
+
+ function apitest_draw_config_panel()
+ {
+ global $API_CLIENT;
+
+ return elgg_view("apitest/configform", array(
+ "apikey" => $API_CLIENT->api_key,
+ "secret" => $API_CLIENT->secret,
+ "endpoint" => $API_CLIENT->api_endpoint
+ ));
+ }
+
+ // Make sure test_init is called on initialisation
+ register_event_handler('init','system','apitest_init');
+?> \ No newline at end of file