<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.4 |
+ | CiviCRM version 4.5 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2013 |
+ | Copyright CiviCRM LLC (c) 2004-2014 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
* This class handles all REST client requests.
*
* @package CRM
- * @copyright CiviCRM LLC (c) 2004-2013
+ * @copyright CiviCRM LLC (c) 2004-2014
*
*/
class CRM_Utils_REST {
* Class constructor. This caches the real user framework class locally,
* so we can use it for authentication and validation.
*
- * @param string $uf The userframework class
+ * @internal param string $uf The userframework class
*/
public function __construct() {
// any external program which call Rest Server is responsible for
}
// Generates values needed for error messages
+ /**
+ * @param string $message
+ *
+ * @return array
+ */
static function error($message = 'Unknown Error') {
$values = array(
'error_message' => $message,
}
// Generates values needed for non-error responses.
+ /**
+ * @param $params
+ *
+ * @return array
+ */
static function simple($params) {
$values = array('is_error' => 0);
$values += $params;
return $values;
}
+ /**
+ * @return string
+ */
function run() {
$result = self::handle();
return self::output($result);
}
+ /**
+ * @return string
+ */
function bootAndRun() {
$response = $this->loadCMSBootstrap();
if (is_array($response)) {
return $this->run();
}
+ /**
+ * @param $result
+ *
+ * @return string
+ */
static function output(&$result) {
$requestParams = CRM_Utils_Request::exportValues();
if (CRM_Utils_Array::value('json', $requestParams)) {
header('Content-Type: text/javascript');
$json = json_encode(array_merge($result));
- if (CRM_Utils_Array::value('debug', $requestParams)) {
+ if (CRM_Utils_Array::value('prettyprint', $requestParams)) {
return self::jsonFormated($json);
}
return $json;
return $xml;
}
+ /**
+ * @param $json
+ *
+ * @return string
+ */
static function jsonFormated($json) {
$tabcount = 0;
$result = '';
return $result;
}
+ /**
+ * @return array|int
+ */
static function handle() {
$requestParams = CRM_Utils_Request::exportValues();
if (!empty($r)) {
$q = $r;
}
- if (!empty($q)) {
+ $entity = CRM_Utils_array::value('entity', $requestParams);
+ if ( empty($entity) && !empty($q)) {
$args = explode('/', $q);
// If the function isn't in the civicrm namespace, reject the request.
if ($args[0] != 'civicrm') {
return self::process($args, self::buildParamList());
}
+ /**
+ * @param $args
+ * @param $params
+ *
+ * @return array|int
+ */
static function process(&$args, $params) {
$params['check_permissions'] = TRUE;
$fnName = $apiFile = NULL;
}
// trap all fatal errors
- CRM_Core_Error::setCallback(array('CRM_Utils_REST', 'fatal'));
+ $errorScope = CRM_Core_TemporaryErrorScope::create(array('CRM_Utils_REST', 'fatal'));
$result = civicrm_api($args[1], $args[2], $params);
- CRM_Core_Error::setCallback();
+ unset($errorScope);
if ($result === FALSE) {
return self::error('Unknown error.');
return $result;
}
+ /**
+ * @return array|mixed|null
+ */
static function &buildParamList() {
$requestParams = CRM_Utils_Request::exportValues();
$params = array();
if (array_key_exists('json', $requestParams) && $requestParams['json'][0] == "{") {
$params = json_decode($requestParams['json'], TRUE);
if($params === NULL) {
- echo json_encode(array('is_error' => 1, 'error_message', 'Unable to decode supplied JSON.'));
- CRM_Utils_System::civiExit();
+ CRM_Utils_JSON::output(array('is_error' => 1, 'error_message', 'Unable to decode supplied JSON.'));
}
}
foreach ($requestParams as $n => $v) {
return $params;
}
+ /**
+ * @param $pearError
+ */
static function fatal($pearError) {
header('Content-Type: text/xml');
$error = array();
if (!$config->debug && (!array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) ||
$_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest"
)) {
- $error = civicrm_api3_create_error("SECURITY ALERT: Ajax requests can only be issued by javascript clients, eg. CRM.api().",
+ $error = civicrm_api3_create_error("SECURITY ALERT: Ajax requests can only be issued by javascript clients, eg. CRM.api3().",
array(
'IP' => $_SERVER['REMOTE_ADDR'],
'level' => 'security',
'reason' => 'CSRF suspected',
)
);
- echo json_encode($error);
- CRM_Utils_System::civiExit();
+ CRM_Utils_JSON::output($error);
}
if (empty($requestParams['entity'])) {
- echo json_encode(civicrm_api3_create_error('missing entity param'));
- CRM_Utils_System::civiExit();
+ CRM_Utils_JSON::output(civicrm_api3_create_error('missing entity param'));
}
if (empty($requestParams['entity'])) {
- echo json_encode(civicrm_api3_create_error('missing entity entity'));
- CRM_Utils_System::civiExit();
+ CRM_Utils_JSON::output(civicrm_api3_create_error('missing entity entity'));
}
if (!empty($requestParams['json'])) {
$params = json_decode($requestParams['json'], TRUE);
$entity = CRM_Utils_String::munge(CRM_Utils_Array::value('entity', $requestParams));
$action = CRM_Utils_String::munge(CRM_Utils_Array::value('action', $requestParams));
if (!is_array($params)) {
- echo json_encode(array('is_error' => 1, 'error_message', 'invalid json format: ?{"param_with_double_quote":"value"}'));
- CRM_Utils_System::civiExit();
+ CRM_Utils_JSON::output(array('is_error' => 1, 'error_message', 'invalid json format: ?{"param_with_double_quote":"value"}'));
}
$params['check_permissions'] = TRUE;
if (!$params['sequential']) {
$params['sequential'] = 1;
}
+
// trap all fatal errors
- CRM_Core_Error::setCallback(array('CRM_Utils_REST', 'fatal'));
+ $errorScope = CRM_Core_TemporaryErrorScope::create(array('CRM_Utils_REST', 'fatal'));
$result = civicrm_api($entity, $action, $params);
-
- CRM_Core_Error::setCallback();
+ unset($errorScope);
echo self::output($result);
'reason' => 'CSRF suspected',
)
);
- echo json_encode($error);
- CRM_Utils_System::civiExit();
+ CRM_Utils_JSON::output($error);
}
$q = CRM_Utils_Array::value('fnName', $requestParams);