drupal-civicrm/sites/all/modules/civicrm/api/v3/Cxn.php

324 lines
9.7 KiB
PHP
Raw Permalink Normal View History

2018-01-14 15:10:16 +02:00
<?php
/*
+--------------------------------------------------------------------+
| CiviCRM version 4.7 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2017 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
| CiviCRM is free software; you can copy, modify, and distribute it |
| under the terms of the GNU Affero General Public License |
| Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
| |
| CiviCRM is distributed in the hope that it will be useful, but |
| WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| See the GNU Affero General Public License for more details. |
| |
| You should have received a copy of the GNU Affero General Public |
| License and the CiviCRM Licensing Exception along |
| with this program; if not, contact CiviCRM LLC |
| at info[AT]civicrm[DOT]org. If you have questions about the |
| GNU Affero General Public License or the licensing of CiviCRM, |
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
+--------------------------------------------------------------------+
*/
/**
* The Cxn API allows a Civi site to initiate a connection to a
* remote application. There are three primary actions:
*
* - register: Establish a new connection.
* - unregister: Destroy an existing connection.
* - get: Get a list of existing connections.
*/
/**
* Adjust metadata for "register" action.
*
* @param array $spec
* List of fields.
*/
function _civicrm_api3_cxn_register_spec(&$spec) {
$daoFields = CRM_Cxn_DAO_Cxn::fields();
$spec['app_guid'] = $daoFields['app_guid'];
$spec['app_meta_url'] = array(
'name' => 'app_meta_url',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Application Metadata URL'),
'description' => 'Application Metadata URL',
'maxlength' => 255,
'size' => CRM_Utils_Type::HUGE,
);
}
/**
* Register with a remote application and create a new connection.
*
* One should generally identify an application using the app_guid.
* However, if you need to test a new/experimental application, then
* disable CIVICRM_CXN_CA and specify app_meta_url.
*
* @param array $params
* Array with keys:
* - app_guid: The unique identifer of the target application.
* - app_meta_url: The URL for the application's metadata.
* @return array
* @throws Exception
*/
function civicrm_api3_cxn_register($params) {
if (!empty($params['app_meta_url'])) {
list ($status, $json) = CRM_Utils_HttpClient::singleton()->get($params['app_meta_url']);
if (CRM_Utils_HttpClient::STATUS_OK != $status) {
throw new API_Exception("Failed to download appMeta. (Bad HTTP response)");
}
$appMeta = json_decode($json, TRUE);
if (empty($appMeta)) {
throw new API_Exception("Failed to download appMeta. (Malformed)");
}
}
elseif (!empty($params['app_guid'])) {
$appMeta = civicrm_api3('CxnApp', 'getsingle', array(
'appId' => $params['app_guid'],
));
}
if (empty($appMeta) || !is_array($appMeta)) {
throw new API_Exception("Missing expected parameter: app_guid");
}
\Civi\Cxn\Rpc\AppMeta::validate($appMeta);
try {
/** @var \Civi\Cxn\Rpc\RegistrationClient $client */
$client = \Civi::service('cxn_reg_client');
list($cxnId, $result) = $client->register($appMeta);
CRM_Cxn_BAO_Cxn::updateAppMeta($appMeta);
}
catch (Exception $e) {
CRM_Cxn_BAO_Cxn::updateAppMeta($appMeta);
throw $e;
}
return $result;
}
/**
* Adjust metadata for cxn unregister.
*
* @param array $spec
*/
function _civicrm_api3_cxn_unregister_spec(&$spec) {
$daoFields = CRM_Cxn_DAO_Cxn::fields();
$spec['cxn_guid'] = $daoFields['cxn_guid'];
$spec['app_guid'] = $daoFields['app_guid'];
$spec['force'] = array(
'name' => 'force',
'type' => CRM_Utils_Type::T_BOOLEAN,
'title' => ts('Force'),
'description' => 'Destroy connection even if the remote application is non-responsive.',
'default' => '0',
);
}
/**
* Unregister with a remote application; destroy an existing connection.
*
* Specify app_guid XOR cxn_guid.
*
* @param array $params
* Array with keys:
* - cxn_guid: string
* - app_guid: string
* - force: bool
* @return array
*/
function civicrm_api3_cxn_unregister($params) {
$cxnId = _civicrm_api3_cxn_parseCxnId($params);
$appMeta = CRM_Cxn_BAO_Cxn::getAppMeta($cxnId);
/** @var \Civi\Cxn\Rpc\RegistrationClient $client */
$client = \Civi::service('cxn_reg_client');
list($cxnId, $result) = $client->unregister($appMeta, CRM_Utils_Array::value('force', $params, FALSE));
return $result;
}
/**
* @param array $params
* An array with cxn_guid and/or app_guid.
* @return string
* The CxnId. (If not available, then an exception is thrown.)
*
* @throws API_Exception
*/
function _civicrm_api3_cxn_parseCxnId($params) {
$cxnId = NULL;
if (!empty($params['cxn_guid'])) {
$cxnId = $params['cxn_guid'];
}
elseif (!empty($params['app_guid'])) {
$cxnId = CRM_Core_DAO::singleValueQuery('SELECT cxn_guid FROM civicrm_cxn WHERE app_guid = %1', array(
1 => array($params['app_guid'], 'String'),
));
if (!$cxnId) {
throw new API_Exception("The app_guid does not correspond to an active connection.");
}
}
if (!$cxnId) {
throw new API_Exception('Missing required parameter: cxn_guid');
}
return $cxnId;
}
/**
* Adjust metadata for cxn get action.
*
* @param array $spec
*/
function _civicrm_api3_cxn_get_spec(&$spec) {
// Don't trust AJAX callers or other external code to modify, filter, or return the secret.
unset($spec['secret']);
}
/**
* Returns an array of Cxn records.
*
* @param array $params
* Array of one or more valid property_name=>value pairs.
*
* @return array
* API result array.
*/
function civicrm_api3_cxn_get($params) {
// Don't trust AJAX callers or other external code to modify, filter, or return the secret.
unset($params['secret']);
$result = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params);
if (is_array($result['values'])) {
foreach (array_keys($result['values']) as $i) {
if (!empty($result['values'][$i]['app_meta'])) {
$result['values'][$i]['app_meta'] = json_decode($result['values'][$i]['app_meta'], TRUE);
}
if (!empty($result['values'][$i]['perm'])) {
$result['values'][$i]['perm'] = json_decode($result['values'][$i]['perm'], TRUE);
}
// Don't trust AJAX callers or other external code to modify, filter, or return the secret.
unset($result['values'][$i]['secret']);
}
}
return $result;
}
/**
* Adjust metadata for "getlink" action.
*
* @param array $spec
* List of fields.
*/
function _civicrm_api3_cxn_getlink_spec(&$spec) {
$daoFields = CRM_Cxn_DAO_Cxn::fields();
$spec['app_guid'] = $daoFields['app_guid'];
$spec['cxn_guid'] = $daoFields['cxn_guid'];
$spec['page_name'] = array(
'name' => 'page_name',
'type' => CRM_Utils_Type::T_STRING,
'title' => ts('Page Type'),
'description' => 'The type of page (eg "settings")',
'maxlength' => 63,
'size' => CRM_Utils_Type::HUGE,
'api.aliases' => array('page'),
);
}
/**
*
* @param array $params
* Array with keys:
* - cxn_guid OR app_guid: string.
* - page: string.
* @return array
* @throws Exception
*/
function civicrm_api3_cxn_getlink($params) {
$cxnId = _civicrm_api3_cxn_parseCxnId($params);
$appMeta = CRM_Cxn_BAO_Cxn::getAppMeta($cxnId);
if (empty($params['page_name']) || !is_string($params['page_name'])) {
throw new API_Exception("Invalid page");
}
/** @var \Civi\Cxn\Rpc\RegistrationClient $client */
$client = \Civi::service('cxn_reg_client');
return $client->call($appMeta, 'Cxn', 'getlink', array(
'page' => $params['page_name'],
));
}
/**
*
* @param array $params
* @return array
* @throws Exception
*/
function civicrm_api3_cxn_getcfg($params) {
$result = array(
'CIVICRM_CXN_CA' => defined('CIVICRM_CXN_CA') ? CIVICRM_CXN_CA : NULL,
'CIVICRM_CXN_VIA' => defined('CIVICRM_CXN_VIA') ? CIVICRM_CXN_VIA : NULL,
'CIVICRM_CXN_APPS_URL' => defined('CIVICRM_CXN_APPS_URL') ? CIVICRM_CXN_APPS_URL : NULL,
'siteCallbackUrl' => CRM_Cxn_BAO_Cxn::getSiteCallbackUrl(),
);
return civicrm_api3_create_success($result);
}
/**
* Creates or modifies a Cxn row.
*
* @param array $params
* Array with keys:
* - id, cxn_guid OR app_guid: string.
* - is_active: boolean.
* - options: JSON
* @return page
* @throws Exception
*/
function civicrm_api3_cxn_create($params) {
$result = "";
try {
// get the ID
if (!empty($params['id'])) {
$cxnId = $params['id'];
}
else {
$cxnId = _civicrm_api3_cxn_parseCxnId($params);
}
// see if it's sth to update
if (isset($params['options']) || isset($params['is_active'])) {
$dao = new CRM_Cxn_DAO_Cxn();
$dao->id = $cxnId;
if ($dao->find()) {
if (isset($params['is_active'])) {
$dao->is_active = (int) $params['is_active'];
}
if (isset($params['options'])) {
$dao->options = $params['options'];
}
$result = $dao->save();
}
}
return civicrm_api3_create_success($result, $params, 'Cxn', 'create');
}
catch(Exception $ex){
throw $ex;
}
}