Merge branch 'master' into file_download2

This commit is contained in:
Jaap Jansma 2020-11-30 11:07:37 +01:00 committed by GitHub
commit 46deca697d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 328 additions and 89 deletions

View File

@ -105,9 +105,9 @@ class CRM_Admin_Form_Setting_ProxySettings extends CRM_Admin_Form_Setting
if($response === FALSE) { if($response === FALSE) {
return array('is_error' => 1, 'message' => sprintf(ts('Error: cannot access "%s"'), $url)); return array('is_error' => 1, 'message' => sprintf(ts('Error: cannot access "%s"'), $url));
}else{ }else{
$result = preg_match("/<p id=\"version\">CiviProxy Version ([0-9]+\.[0-9]+|[0-9]+\.[0-9]+\.[0-9]+)<\/p>/", $response, $output_array); $result = preg_match("/<p id=\"version\">CiviProxy Version (([0-9]+\.[0-9]+|[0-9]+\.[0-9]+\.[0-9]+)(?:-[0-9A-Za-z-]+)?)<\/p>/", $response, $output_array);
if ($result === FALSE || $result === 0){ if ($result === FALSE || $result === 0){
return array('is_error' => 1, 'message' => sprintf(ts('Error: failed to parse version information'), $url)); return array('is_error' => 1, 'message' => sprintf(ts('Error: failed to parse version information: (%s)'), $url));
}else{ }else{
return array('is_error' => 0, 'version' => $output_array[1]); return array('is_error' => 0, 'version' => $output_array[1]);
} }

View File

@ -53,7 +53,9 @@ class CRM_Civiproxy_Mailer {
$proxy_base = CRM_Core_BAO_Setting::getItem('CiviProxy Settings', 'proxy_url'); $proxy_base = CRM_Core_BAO_Setting::getItem('CiviProxy Settings', 'proxy_url');
// General external functions // General external functions
$value = preg_replace("#{$system_base}civicrm/mailing/url#i", $proxy_base.'/url.php', $value);
$value = preg_replace("#{$system_base}sites/all/modules/civicrm/extern/url.php#i", $proxy_base.'/url.php', $value); $value = preg_replace("#{$system_base}sites/all/modules/civicrm/extern/url.php#i", $proxy_base.'/url.php', $value);
$value = preg_replace("#{$system_base}civicrm/mailing/open#i", $proxy_base.'/open.php', $value);
$value = preg_replace("#{$system_base}sites/all/modules/civicrm/extern/open.php#i", $proxy_base.'/open.php', $value); $value = preg_replace("#{$system_base}sites/all/modules/civicrm/extern/open.php#i", $proxy_base.'/open.php', $value);
$value = preg_replace("#{$system_base}sites/default/files/civicrm/persist/#i", $proxy_base.'/file.php?id=', $value); $value = preg_replace("#{$system_base}sites/default/files/civicrm/persist/#i", $proxy_base.'/file.php?id=', $value);
$value = preg_replace("#{$system_base}civicrm/mosaico/img\?src=#i", $proxy_base.'/mosaico.php?id=', $value); $value = preg_replace("#{$system_base}civicrm/mosaico/img\?src=#i", $proxy_base.'/mosaico.php?id=', $value);

View File

@ -3,32 +3,116 @@
// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file // AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
/** /**
* (Delegated) Implementation of hook_civicrm_config * The ExtensionUtil class provides small stubs for accessing resources of this
* extension.
*/
class CRM_Civiproxy_ExtensionUtil {
const SHORT_NAME = "civiproxy";
const LONG_NAME = "de.systopia.civiproxy";
const CLASS_PREFIX = "CRM_Civiproxy";
/**
* Translate a string using the extension's domain.
*
* If the extension doesn't have a specific translation
* for the string, fallback to the default translations.
*
* @param string $text
* Canonical message text (generally en_US).
* @param array $params
* @return string
* Translated text.
* @see ts
*/
public static function ts($text, $params = []) {
if (!array_key_exists('domain', $params)) {
$params['domain'] = [self::LONG_NAME, NULL];
}
return ts($text, $params);
}
/**
* Get the URL of a resource file (in this extension).
*
* @param string|NULL $file
* Ex: NULL.
* Ex: 'css/foo.css'.
* @return string
* Ex: 'http://example.org/sites/default/ext/org.example.foo'.
* Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'.
*/
public static function url($file = NULL) {
if ($file === NULL) {
return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/');
}
return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file);
}
/**
* Get the path of a resource file (in this extension).
*
* @param string|NULL $file
* Ex: NULL.
* Ex: 'css/foo.css'.
* @return string
* Ex: '/var/www/example.org/sites/default/ext/org.example.foo'.
* Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'.
*/
public static function path($file = NULL) {
// return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file);
return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file));
}
/**
* Get the name of a class within this extension.
*
* @param string $suffix
* Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'.
* @return string
* Ex: 'CRM_Foo_Page_HelloWorld'.
*/
public static function findClass($suffix) {
return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix);
}
}
use CRM_Civiproxy_ExtensionUtil as E;
/**
* (Delegated) Implements hook_civicrm_config().
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config
*/ */
function _civiproxy_civix_civicrm_config(&$config = NULL) { function _civiproxy_civix_civicrm_config(&$config = NULL) {
static $configured = FALSE; static $configured = FALSE;
if ($configured) return; if ($configured) {
return;
}
$configured = TRUE; $configured = TRUE;
$template =& CRM_Core_Smarty::singleton(); $template =& CRM_Core_Smarty::singleton();
$extRoot = dirname( __FILE__ ) . DIRECTORY_SEPARATOR; $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
$extDir = $extRoot . 'templates'; $extDir = $extRoot . 'templates';
if ( is_array( $template->template_dir ) ) { if (is_array($template->template_dir)) {
array_unshift( $template->template_dir, $extDir ); array_unshift($template->template_dir, $extDir);
} else { }
$template->template_dir = array( $extDir, $template->template_dir ); else {
$template->template_dir = [$extDir, $template->template_dir];
} }
$include_path = $extRoot . PATH_SEPARATOR . get_include_path( ); $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
set_include_path( $include_path ); set_include_path($include_path);
} }
/** /**
* (Delegated) Implementation of hook_civicrm_xmlMenu * (Delegated) Implements hook_civicrm_xmlMenu().
* *
* @param $files array(string) * @param $files array(string)
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
*/ */
function _civiproxy_civix_civicrm_xmlMenu(&$files) { function _civiproxy_civix_civicrm_xmlMenu(&$files) {
foreach (_civiproxy_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) { foreach (_civiproxy_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) {
@ -37,57 +121,83 @@ function _civiproxy_civix_civicrm_xmlMenu(&$files) {
} }
/** /**
* Implementation of hook_civicrm_install * Implements hook_civicrm_install().
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
*/ */
function _civiproxy_civix_civicrm_install() { function _civiproxy_civix_civicrm_install() {
_civiproxy_civix_civicrm_config(); _civiproxy_civix_civicrm_config();
if ($upgrader = _civiproxy_civix_upgrader()) { if ($upgrader = _civiproxy_civix_upgrader()) {
return $upgrader->onInstall(); $upgrader->onInstall();
} }
} }
/** /**
* Implementation of hook_civicrm_uninstall * Implements hook_civicrm_postInstall().
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
*/
function _civiproxy_civix_civicrm_postInstall() {
_civiproxy_civix_civicrm_config();
if ($upgrader = _civiproxy_civix_upgrader()) {
if (is_callable([$upgrader, 'onPostInstall'])) {
$upgrader->onPostInstall();
}
}
}
/**
* Implements hook_civicrm_uninstall().
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
*/ */
function _civiproxy_civix_civicrm_uninstall() { function _civiproxy_civix_civicrm_uninstall() {
_civiproxy_civix_civicrm_config(); _civiproxy_civix_civicrm_config();
if ($upgrader = _civiproxy_civix_upgrader()) { if ($upgrader = _civiproxy_civix_upgrader()) {
return $upgrader->onUninstall(); $upgrader->onUninstall();
} }
} }
/** /**
* (Delegated) Implementation of hook_civicrm_enable * (Delegated) Implements hook_civicrm_enable().
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
*/ */
function _civiproxy_civix_civicrm_enable() { function _civiproxy_civix_civicrm_enable() {
_civiproxy_civix_civicrm_config(); _civiproxy_civix_civicrm_config();
if ($upgrader = _civiproxy_civix_upgrader()) { if ($upgrader = _civiproxy_civix_upgrader()) {
if (is_callable(array($upgrader, 'onEnable'))) { if (is_callable([$upgrader, 'onEnable'])) {
return $upgrader->onEnable(); $upgrader->onEnable();
} }
} }
} }
/** /**
* (Delegated) Implementation of hook_civicrm_disable * (Delegated) Implements hook_civicrm_disable().
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
* @return mixed
*/ */
function _civiproxy_civix_civicrm_disable() { function _civiproxy_civix_civicrm_disable() {
_civiproxy_civix_civicrm_config(); _civiproxy_civix_civicrm_config();
if ($upgrader = _civiproxy_civix_upgrader()) { if ($upgrader = _civiproxy_civix_upgrader()) {
if (is_callable(array($upgrader, 'onDisable'))) { if (is_callable([$upgrader, 'onDisable'])) {
return $upgrader->onDisable(); $upgrader->onDisable();
} }
} }
} }
/** /**
* (Delegated) Implementation of hook_civicrm_upgrade * (Delegated) Implements hook_civicrm_upgrade().
* *
* @param $op string, the type of operation being performed; 'check' or 'enqueue' * @param $op string, the type of operation being performed; 'check' or 'enqueue'
* @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks * @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks
* *
* @return mixed based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending) * @return mixed
* for 'enqueue', returns void * based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending)
* for 'enqueue', returns void
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade
*/ */
function _civiproxy_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) { function _civiproxy_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
if ($upgrader = _civiproxy_civix_upgrader()) { if ($upgrader = _civiproxy_civix_upgrader()) {
@ -95,31 +205,36 @@ function _civiproxy_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
} }
} }
/**
* @return CRM_Civiproxy_Upgrader
*/
function _civiproxy_civix_upgrader() { function _civiproxy_civix_upgrader() {
if (!file_exists(__DIR__.'/CRM/Civiproxy/Upgrader.php')) { if (!file_exists(__DIR__ . '/CRM/Civiproxy/Upgrader.php')) {
return NULL; return NULL;
} else { }
else {
return CRM_Civiproxy_Upgrader_Base::instance(); return CRM_Civiproxy_Upgrader_Base::instance();
} }
} }
/** /**
* Search directory tree for files which match a glob pattern * Search directory tree for files which match a glob pattern.
* *
* Note: Dot-directories (like "..", ".git", or ".svn") will be ignored. * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
* Note: In Civi 4.3+, delegate to CRM_Utils_File::findFiles() * Note: In Civi 4.3+, delegate to CRM_Utils_File::findFiles()
* *
* @param $dir string, base dir * @param string $dir base dir
* @param $pattern string, glob pattern, eg "*.txt" * @param string $pattern , glob pattern, eg "*.txt"
* @return array(string) *
* @return array
*/ */
function _civiproxy_civix_find_files($dir, $pattern) { function _civiproxy_civix_find_files($dir, $pattern) {
if (is_callable(array('CRM_Utils_File', 'findFiles'))) { if (is_callable(['CRM_Utils_File', 'findFiles'])) {
return CRM_Utils_File::findFiles($dir, $pattern); return CRM_Utils_File::findFiles($dir, $pattern);
} }
$todos = array($dir); $todos = [$dir];
$result = array(); $result = [];
while (!empty($todos)) { while (!empty($todos)) {
$subdir = array_shift($todos); $subdir = array_shift($todos);
foreach (_civiproxy_civix_glob("$subdir/$pattern") as $match) { foreach (_civiproxy_civix_glob("$subdir/$pattern") as $match) {
@ -130,8 +245,9 @@ function _civiproxy_civix_find_files($dir, $pattern) {
if ($dh = opendir($subdir)) { if ($dh = opendir($subdir)) {
while (FALSE !== ($entry = readdir($dh))) { while (FALSE !== ($entry = readdir($dh))) {
$path = $subdir . DIRECTORY_SEPARATOR . $entry; $path = $subdir . DIRECTORY_SEPARATOR . $entry;
if ($entry{0} == '.') { if ($entry[0] == '.') {
} elseif (is_dir($path)) { }
elseif (is_dir($path)) {
$todos[] = $path; $todos[] = $path;
} }
} }
@ -140,18 +256,25 @@ function _civiproxy_civix_find_files($dir, $pattern) {
} }
return $result; return $result;
} }
/** /**
* (Delegated) Implementation of hook_civicrm_managed * (Delegated) Implements hook_civicrm_managed().
* *
* Find any *.mgd.php files, merge their content, and return. * Find any *.mgd.php files, merge their content, and return.
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed
*/ */
function _civiproxy_civix_civicrm_managed(&$entities) { function _civiproxy_civix_civicrm_managed(&$entities) {
$mgdFiles = _civiproxy_civix_find_files(__DIR__, '*.mgd.php'); $mgdFiles = _civiproxy_civix_find_files(__DIR__, '*.mgd.php');
sort($mgdFiles);
foreach ($mgdFiles as $file) { foreach ($mgdFiles as $file) {
$es = include $file; $es = include $file;
foreach ($es as $e) { foreach ($es as $e) {
if (empty($e['module'])) { if (empty($e['module'])) {
$e['module'] = 'de.systopia.civiproxy'; $e['module'] = E::LONG_NAME;
}
if (empty($e['params']['version'])) {
$e['params']['version'] = '3';
} }
$entities[] = $e; $entities[] = $e;
} }
@ -159,11 +282,13 @@ function _civiproxy_civix_civicrm_managed(&$entities) {
} }
/** /**
* (Delegated) Implementation of hook_civicrm_caseTypes * (Delegated) Implements hook_civicrm_caseTypes().
* *
* Find any and return any files matching "xml/case/*.xml" * Find any and return any files matching "xml/case/*.xml"
* *
* Note: This hook only runs in CiviCRM 4.4+. * Note: This hook only runs in CiviCRM 4.4+.
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes
*/ */
function _civiproxy_civix_civicrm_caseTypes(&$caseTypes) { function _civiproxy_civix_civicrm_caseTypes(&$caseTypes) {
if (!is_dir(__DIR__ . '/xml/case')) { if (!is_dir(__DIR__ . '/xml/case')) {
@ -174,14 +299,57 @@ function _civiproxy_civix_civicrm_caseTypes(&$caseTypes) {
$name = preg_replace('/\.xml$/', '', basename($file)); $name = preg_replace('/\.xml$/', '', basename($file));
if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) { if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) {
$errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name)); $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name));
CRM_Core_Error::fatal($errorMessage); throw new CRM_Core_Exception($errorMessage);
// throw new CRM_Core_Exception($errorMessage);
} }
$caseTypes[$name] = array( $caseTypes[$name] = [
'module' => 'de.systopia.civiproxy', 'module' => E::LONG_NAME,
'name' => $name, 'name' => $name,
'file' => $file, 'file' => $file,
); ];
}
}
/**
* (Delegated) Implements hook_civicrm_angularModules().
*
* Find any and return any files matching "ang/*.ang.php"
*
* Note: This hook only runs in CiviCRM 4.5+.
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules
*/
function _civiproxy_civix_civicrm_angularModules(&$angularModules) {
if (!is_dir(__DIR__ . '/ang')) {
return;
}
$files = _civiproxy_civix_glob(__DIR__ . '/ang/*.ang.php');
foreach ($files as $file) {
$name = preg_replace(':\.ang\.php$:', '', basename($file));
$module = include $file;
if (empty($module['ext'])) {
$module['ext'] = E::LONG_NAME;
}
$angularModules[$name] = $module;
}
}
/**
* (Delegated) Implements hook_civicrm_themes().
*
* Find any and return any files matching "*.theme.php"
*/
function _civiproxy_civix_civicrm_themes(&$themes) {
$files = _civiproxy_civix_glob(__DIR__ . '/*.theme.php');
foreach ($files as $file) {
$themeMeta = include $file;
if (empty($themeMeta['name'])) {
$themeMeta['name'] = preg_replace(':\.theme\.php$:', '', basename($file));
}
if (empty($themeMeta['ext'])) {
$themeMeta['ext'] = E::LONG_NAME;
}
$themes[$themeMeta['name']] = $themeMeta;
} }
} }
@ -193,50 +361,117 @@ function _civiproxy_civix_civicrm_caseTypes(&$caseTypes) {
* result for an empty match is sometimes array() and sometimes FALSE. * result for an empty match is sometimes array() and sometimes FALSE.
* This wrapper provides consistency. * This wrapper provides consistency.
* *
* @see http://php.net/glob * @link http://php.net/glob
* @param string $pattern * @param string $pattern
* @return array, possibly empty *
* @return array
*/ */
function _civiproxy_civix_glob($pattern) { function _civiproxy_civix_glob($pattern) {
$result = glob($pattern); $result = glob($pattern);
return is_array($result) ? $result : array(); return is_array($result) ? $result : [];
} }
/** /**
* Inserts a navigation menu item at a given place in the hierarchy * Inserts a navigation menu item at a given place in the hierarchy.
* *
* $menu - menu hierarchy * @param array $menu - menu hierarchy
* $path - path where insertion should happen (ie. Administer/System Settings) * @param string $path - path to parent of this item, e.g. 'my_extension/submenu'
* $item - menu you need to insert (parent/child attributes will be filled for you) * 'Mailing', or 'Administer/System Settings'
* $parentId - used internally to recurse in the menu structure * @param array $item - the item to insert (parent/child attributes will be
* filled for you)
*
* @return bool
*/ */
function _civiproxy_civix_insert_navigation_menu(&$menu, $path, $item, $parentId = NULL) { function _civiproxy_civix_insert_navigation_menu(&$menu, $path, $item) {
static $navId;
// If we are done going down the path, insert menu // If we are done going down the path, insert menu
if (empty($path)) { if (empty($path)) {
if (!$navId) $navId = CRM_Core_DAO::singleValueQuery("SELECT max(id) FROM civicrm_navigation"); $menu[] = [
$navId ++; 'attributes' => array_merge([
$menu[$navId] = array (
'attributes' => array_merge($item, array(
'label' => CRM_Utils_Array::value('name', $item), 'label' => CRM_Utils_Array::value('name', $item),
'active' => 1, 'active' => 1,
'parentID' => $parentId, ], $item),
'navID' => $navId, ];
)) return TRUE;
); }
return true; else {
} else {
// Find an recurse into the next level down // Find an recurse into the next level down
$found = false; $found = FALSE;
$path = explode('/', $path); $path = explode('/', $path);
$first = array_shift($path); $first = array_shift($path);
foreach ($menu as $key => &$entry) { foreach ($menu as $key => &$entry) {
if ($entry['attributes']['name'] == $first) { if ($entry['attributes']['name'] == $first) {
if (!$entry['child']) $entry['child'] = array(); if (!isset($entry['child'])) {
$found = _civiproxy_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item, $key); $entry['child'] = [];
}
$found = _civiproxy_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item);
} }
} }
return $found; return $found;
} }
} }
/**
* (Delegated) Implements hook_civicrm_navigationMenu().
*/
function _civiproxy_civix_navigationMenu(&$nodes) {
if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) {
_civiproxy_civix_fixNavigationMenu($nodes);
}
}
/**
* Given a navigation menu, generate navIDs for any items which are
* missing them.
*/
function _civiproxy_civix_fixNavigationMenu(&$nodes) {
$maxNavID = 1;
array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) {
if ($key === 'navID') {
$maxNavID = max($maxNavID, $item);
}
});
_civiproxy_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL);
}
function _civiproxy_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) {
$origKeys = array_keys($nodes);
foreach ($origKeys as $origKey) {
if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) {
$nodes[$origKey]['attributes']['parentID'] = $parentID;
}
// If no navID, then assign navID and fix key.
if (!isset($nodes[$origKey]['attributes']['navID'])) {
$newKey = ++$maxNavID;
$nodes[$origKey]['attributes']['navID'] = $newKey;
$nodes[$newKey] = $nodes[$origKey];
unset($nodes[$origKey]);
$origKey = $newKey;
}
if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) {
_civiproxy_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']);
}
}
}
/**
* (Delegated) Implements hook_civicrm_alterSettingsFolders().
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
*/
function _civiproxy_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
$settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings';
if (!in_array($settingsDir, $metaDataFolders) && is_dir($settingsDir)) {
$metaDataFolders[] = $settingsDir;
}
}
/**
* (Delegated) Implements hook_civicrm_entityTypes().
*
* Find any *.entityType.php files, merge their content, and return.
*
* @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
*/
function _civiproxy_civix_civicrm_entityTypes(&$entityTypes) {
$entityTypes = array_merge($entityTypes, []);
}

View File

@ -65,13 +65,13 @@ You can set the URL of the target CiviCRM using the variable `$target_civirm` in
### Setting for the click tracking url ### Setting for the click tracking url
There is a setting in CiviCRM which is used for tracking the clicks in your mailing. On your CiviProxy server this setting is captured in the variable `$target_url` in the `config.php` file: There is a setting in CiviCRM which is used for tracking the clicks in your mailing. On your CiviProxy server this setting is captured in the variable `$target_url` in the `config.php` file:
```php ```php
$target_url = $target_civicrm . '/sites/all/modules/civicrm/extern/url.php'; $target_url = $target_civicrm . '/civicrm/mailing/url';
``` ```
If you set it to the value NULL this functionality will not be available on your CiviProxy server. If you set it to the value NULL this functionality will not be available on your CiviProxy server.
### Setting for the open tracking ### Setting for the open tracking
CiviCRM tracks if a mailing has been opened in a certain way. CiviProxy has this setting in the variable `$target_open` in the `config.php` file: CiviCRM tracks if a mailing has been opened in a certain way. CiviProxy has this setting in the variable `$target_open` in the `config.php` file:
```php ```php
$target_open = $target_civicrm . '/sites/all/modules/civicrm/extern/open.php'; $target_open = $target_civicrm . '/civicrm/mailing/url/open.php';
``` ```
If you set it to the value NULL this functionality will not be available on your CiviProxy server. If you set it to the value NULL this functionality will not be available on your CiviProxy server.
### Setting for the location of images and included files in your mail(ing) ### Setting for the location of images and included files in your mail(ing)

View File

@ -33,12 +33,17 @@ $target_civicrm = 'https://your.civicrm.installation.org';
// default paths, override if you want. Set to NULL to disable // default paths, override if you want. Set to NULL to disable
$target_rest = $target_civicrm . '/sites/all/modules/civicrm/extern/rest.php'; $target_rest = $target_civicrm . '/sites/all/modules/civicrm/extern/rest.php';
$target_url = $target_civicrm . '/sites/all/modules/civicrm/extern/url.php';
$target_open = $target_civicrm . '/sites/all/modules/civicrm/extern/open.php';
$target_download_file = $target_civicrm . '/civicrm/file'; $target_download_file = $target_civicrm . '/civicrm/file';
$target_static_file = $target_civicrm . '/sites/default/files/civicrm/persist/'; $target_static_file = $target_civicrm . '/sites/default/files/civicrm/persist/';
$target_mosaico = NULL; // (disabled by default): $target_civicrm . '/civicrm/mosaico/img?src='; $target_mosaico = NULL; // (disabled by default): $target_civicrm . '/civicrm/mosaico/img?src=';
$target_mail_view = $target_civicrm . '/civicrm/mailing/view'; $target_mail_view = $target_civicrm . '/civicrm/mailing/view';
$target_url = $target_civicrm . '/civicrm/mailing/url';
$target_open = $target_civicrm . '/civicrm/mailing/open';
// CAUTION: use the following for CiviCRM < 5.27
$target_url = $target_civicrm . '/sites/all/modules/civicrm/extern/url.php';
$target_open = $target_civicrm . '/sites/all/modules/civicrm/extern/open.php';
/**************************************************************** /****************************************************************
** GENERAL OPTIONS ** ** GENERAL OPTIONS **
@ -59,7 +64,7 @@ $mail_subscription_user_key = NULL;
$debug = NULL; //'LUXFbiaoz4dVWuAHEcuBAe7YQ4YP96rN4MCDmKj89p.log'; $debug = NULL; //'LUXFbiaoz4dVWuAHEcuBAe7YQ4YP96rN4MCDmKj89p.log';
// Local network interface or IP to be used for the relayed query // Local network interface or IP to be used for the relayed query
// This is usefull in some VPN configurations (see CURLOPT_INTERFACE) // This is useful in some VPN configurations (see CURLOPT_INTERFACE)
$target_interface = NULL; $target_interface = NULL;
/**************************************************************** /****************************************************************

View File

@ -32,7 +32,6 @@ if (!empty($_REQUEST['id']) && isset($webhook2api['configurations'][$_REQUEST['i
// read some input // read some input
$post_input = @file_get_contents('php://input'); $post_input = @file_get_contents('php://input');
error_log("DEBUG: " . json_encode($post_input));
// MAIN: iterate through all (eligible) configurations // MAIN: iterate through all (eligible) configurations
$last_error = ["No handler found", 501]; $last_error = ["No handler found", 501];
@ -85,12 +84,10 @@ function webhook2api_processConfiguration($configuration, $post_input) {
// gather source data // gather source data
$data = []; $data = [];
if (!empty($configuration['data_sources']) && is_array($configuration['data_sources'])) { if (!empty($configuration['data_sources']) && is_array($configuration['data_sources'])) {
error_log(json_encode($configuration));
foreach ($configuration['data_sources'] as $data_source) { foreach ($configuration['data_sources'] as $data_source) {
switch ($data_source) { switch ($data_source) {
case 'POST/json': # JSON data in POST field case 'POST/json': # JSON data in POST field
$more_data = json_decode($post_input, TRUE); $more_data = json_decode($post_input, TRUE);
error_log(json_encode($more_data));
$data = array_merge_recursive($data, $more_data); $data = array_merge_recursive($data, $more_data);
break; break;
case 'REQUEST': # simple request parameters case 'REQUEST': # simple request parameters
@ -109,8 +106,8 @@ function webhook2api_processConfiguration($configuration, $post_input) {
foreach ($data as $d) { foreach ($data as $d) {
$result = webhook2api_callCiviApi($configuration, $d); $result = webhook2api_callCiviApi($configuration, $d);
if(isset($result['internal_error'])) { if(isset($result['internal_error'])) {
// internal communication Error occured. Aborting process // internal communication Error occurred. Aborting process
civiproxy_log("Webhook2API[{$configuration['name']}]: internal error occured: " . json_encode($result['internal_error'])); civiproxy_log("Webhook2API[{$configuration['name']}]: internal error occurred: " . json_encode($result['internal_error']));
return $result['internal_error']; return $result['internal_error'];
} }
if (!empty($result['values']['http_code'])) { if (!empty($result['values']['http_code'])) {
@ -123,8 +120,8 @@ function webhook2api_processConfiguration($configuration, $post_input) {
} else { } else {
$result = webhook2api_callCiviApi($configuration, $data); $result = webhook2api_callCiviApi($configuration, $data);
if(isset($result['internal_error'])) { if(isset($result['internal_error'])) {
// internal communication Error occured. Aborting process // internal communication Error occurred. Aborting process
civiproxy_log("Webhook2API[{$configuration['name']}]: internal error occured: " . json_encode($result['internal_error'])); civiproxy_log("Webhook2API[{$configuration['name']}]: internal error occurred: " . json_encode($result['internal_error']));
return $result['internal_error']; return $result['internal_error'];
} }
if (!empty($result['values']['http_code'])) { if (!empty($result['values']['http_code'])) {
@ -134,20 +131,19 @@ function webhook2api_processConfiguration($configuration, $post_input) {
} }
} }
if ($http_code != '200') { if ($http_code != '200') {
// we received and parsed the webhook event successfully, but an error occured with civicrm: // we received and parsed the webhook event successfully, but an error occurred with civicrm:
civiproxy_log("Webhook2API[{$configuration['name']}]: Internal CiviCRM Error. Error Code: {$http_code}. Full Message: " . json_encode($result)); civiproxy_log("Webhook2API[{$configuration['name']}]: Internal CiviCRM Error. Error Code: {$http_code}. Full Message: " . json_encode($result));
} }
// process result // process result
if (!empty($configuration['response_mapping']) && is_array($configuration['response_mapping'])) { if (!empty($configuration['response_mapping']) && is_array($configuration['response_mapping'])) {
// TODO: implement // TODO: implement
//error_log("Webhook2API.response_mapping: not implemented!");
http_response_code('200'); http_response_code('200');
civiproxy_log("Webhook successfull, response mapped."); civiproxy_log("Webhook successful, response mapped.");
} else { } else {
// default behaviour: // default behaviour:
http_response_code('200'); http_response_code('200');
civiproxy_log("Webhook successfull."); civiproxy_log("Webhook successful.");
} }
// all done // all done
exit(); exit();
@ -178,7 +174,7 @@ function webhook2api_callCiviApi($configuration, $data) {
} else { } else {
echo "Error"; echo "Error";
// unknown instruction // unknown instruction
// //error_log("Webhook2API[{$configuration['name']}]: don't understad sentinel '{$check}'. Ignored."); civiproxy_log("Webhook2API[{$configuration['name']}]: don't understand sentinel '{$check}'. Ignored.");
} }
} }
} }
@ -197,7 +193,8 @@ function webhook2api_callCiviApi($configuration, $data) {
// run modifiers // run modifiers
foreach ($modifiers as $modifier) { foreach ($modifiers as $modifier) {
// TODO: implement // TODO: implement
//error_log("Webhook2API.modifiers: not implemented!");
civiproxy_log("Webhook2API.modifiers: not implemented!");
} }
// set to target // set to target
@ -210,16 +207,16 @@ function webhook2api_callCiviApi($configuration, $data) {
// sanitise data // sanitise data
if (!empty($configuration['parameter_sanitation']) && is_array($configuration['parameter_sanitation'])) { if (!empty($configuration['parameter_sanitation']) && is_array($configuration['parameter_sanitation'])) {
// TODO: implement // TODO: implement
//error_log("Webhook2API.sanitation: not implemented!"); civiproxy_log("Webhook2API.sanitation: not implemented!");
} }
// send to target REST API // send to target REST API
if (empty($configuration['entity']) || empty($configuration['action'])) { if (empty($configuration['entity']) || empty($configuration['action'])) {
//error_log("Webhook2API[{$configuration['name']}]: Missing entity/action."); civiproxy_log("Webhook2API[{$configuration['name']}]: Missing entity/action.");
return ["internal_error" => "Configuration error", 403]; return ["internal_error" => "Configuration error", 403];
} }
if (empty($configuration['api_key'])) { if (empty($configuration['api_key'])) {
//error_log("Webhook2API[{$configuration['name']}]: Missing api_key."); civiproxy_log("Webhook2API[{$configuration['name']}]: Missing api_key.");
return ["internal_error" => "Configuration error", 403]; return ["internal_error" => "Configuration error", 403];
} }
$params['api_key'] = $configuration['api_key']; $params['api_key'] = $configuration['api_key'];