From a88b6217583f9b0fa406a5b66364a37e47c4f444 Mon Sep 17 00:00:00 2001 From: Seamus Lee Date: Fri, 4 Sep 2020 16:41:31 +1000 Subject: [PATCH 1/8] Add in normal url routes for tracked opens and tracking urls to the mend urls function and also make use of the normal routes when quering the target civi --- de.systopia.civiproxy/CRM/Civiproxy/Mailer.php | 2 ++ proxy/config.dist.php | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/de.systopia.civiproxy/CRM/Civiproxy/Mailer.php b/de.systopia.civiproxy/CRM/Civiproxy/Mailer.php index bdff057..6c37379 100644 --- a/de.systopia.civiproxy/CRM/Civiproxy/Mailer.php +++ b/de.systopia.civiproxy/CRM/Civiproxy/Mailer.php @@ -53,7 +53,9 @@ class CRM_Civiproxy_Mailer { $proxy_base = CRM_Core_BAO_Setting::getItem('CiviProxy Settings', 'proxy_url'); // 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}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/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); diff --git a/proxy/config.dist.php b/proxy/config.dist.php index 59510bb..9572a03 100644 --- a/proxy/config.dist.php +++ b/proxy/config.dist.php @@ -33,8 +33,8 @@ $target_civicrm = 'https://your.civicrm.installation.org'; // default paths, override if you want. Set to NULL to disable $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_url = $target_civicrm . '/civicrm/mailing/url'; +$target_open = $target_civicrm . '/civicrm/mailing/open'; $target_file = $target_civicrm . '/sites/default/files/civicrm/persist/'; $target_mosaico = NULL; // (disabled by default): $target_civicrm . '/civicrm/mosaico/img?src='; $target_mail_view = $target_civicrm . '/civicrm/mailing/view'; @@ -155,4 +155,4 @@ $_webhook2api = [ "parameter_sanitation" => [], ] ] -]; \ No newline at end of file +]; From 1f46d5e5da438255eaf5f897a7c0f09d6479c9a2 Mon Sep 17 00:00:00 2001 From: "B. Endres" Date: Mon, 7 Sep 2020 09:32:57 +0200 Subject: [PATCH 2/8] [#44] added warning for CiviCRM < 5.27 --- proxy/config.dist.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/proxy/config.dist.php b/proxy/config.dist.php index 9572a03..631facd 100644 --- a/proxy/config.dist.php +++ b/proxy/config.dist.php @@ -33,11 +33,16 @@ $target_civicrm = 'https://your.civicrm.installation.org'; // default paths, override if you want. Set to NULL to disable $target_rest = $target_civicrm . '/sites/all/modules/civicrm/extern/rest.php'; -$target_url = $target_civicrm . '/civicrm/mailing/url'; -$target_open = $target_civicrm . '/civicrm/mailing/open'; $target_file = $target_civicrm . '/sites/default/files/civicrm/persist/'; $target_mosaico = NULL; // (disabled by default): $target_civicrm . '/civicrm/mosaico/img?src='; $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 ** From c8c5694b52915c7108448d73ab054204ea355ae9 Mon Sep 17 00:00:00 2001 From: "B. Endres" Date: Mon, 7 Sep 2020 09:36:17 +0200 Subject: [PATCH 3/8] [#44] alignment for readability --- de.systopia.civiproxy/CRM/Civiproxy/Mailer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/de.systopia.civiproxy/CRM/Civiproxy/Mailer.php b/de.systopia.civiproxy/CRM/Civiproxy/Mailer.php index 6c37379..1b9c9e1 100644 --- a/de.systopia.civiproxy/CRM/Civiproxy/Mailer.php +++ b/de.systopia.civiproxy/CRM/Civiproxy/Mailer.php @@ -53,9 +53,9 @@ class CRM_Civiproxy_Mailer { $proxy_base = CRM_Core_BAO_Setting::getItem('CiviProxy Settings', 'proxy_url'); // General external functions - $value = preg_replace("#{$system_base}civicrm/mailing/url#i", $proxy_base.'/url.php', $value); + $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}civicrm/mailing/open#i", $proxy_base.'/open.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/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); From 76b5d8f49afdb21fc0f298f4e4bb5547989814c6 Mon Sep 17 00:00:00 2001 From: Seamus Lee Date: Tue, 8 Sep 2020 18:07:47 +1000 Subject: [PATCH 4/8] Update autogenrated civix file to be most recent version --- de.systopia.civiproxy/civiproxy.civix.php | 367 ++++++++++++++++++---- 1 file changed, 301 insertions(+), 66 deletions(-) diff --git a/de.systopia.civiproxy/civiproxy.civix.php b/de.systopia.civiproxy/civiproxy.civix.php index e772b6e..53ba9f8 100644 --- a/de.systopia.civiproxy/civiproxy.civix.php +++ b/de.systopia.civiproxy/civiproxy.civix.php @@ -3,32 +3,116 @@ // 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) { static $configured = FALSE; - if ($configured) return; + if ($configured) { + return; + } $configured = TRUE; $template =& CRM_Core_Smarty::singleton(); - $extRoot = dirname( __FILE__ ) . DIRECTORY_SEPARATOR; + $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR; $extDir = $extRoot . 'templates'; - if ( is_array( $template->template_dir ) ) { - array_unshift( $template->template_dir, $extDir ); - } else { - $template->template_dir = array( $extDir, $template->template_dir ); + if (is_array($template->template_dir)) { + array_unshift($template->template_dir, $extDir); + } + else { + $template->template_dir = [$extDir, $template->template_dir]; } - $include_path = $extRoot . PATH_SEPARATOR . get_include_path( ); - set_include_path( $include_path ); + $include_path = $extRoot . PATH_SEPARATOR . get_include_path(); + set_include_path($include_path); } /** - * (Delegated) Implementation of hook_civicrm_xmlMenu + * (Delegated) Implements hook_civicrm_xmlMenu(). * * @param $files array(string) + * + * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu */ function _civiproxy_civix_civicrm_xmlMenu(&$files) { 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() { _civiproxy_civix_civicrm_config(); 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() { _civiproxy_civix_civicrm_config(); 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() { _civiproxy_civix_civicrm_config(); if ($upgrader = _civiproxy_civix_upgrader()) { - if (is_callable(array($upgrader, 'onEnable'))) { - return $upgrader->onEnable(); + if (is_callable([$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() { _civiproxy_civix_civicrm_config(); if ($upgrader = _civiproxy_civix_upgrader()) { - if (is_callable(array($upgrader, 'onDisable'))) { - return $upgrader->onDisable(); + if (is_callable([$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 $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) - * for 'enqueue', returns void + * @return mixed + * 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) { 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() { - if (!file_exists(__DIR__.'/CRM/Civiproxy/Upgrader.php')) { + if (!file_exists(__DIR__ . '/CRM/Civiproxy/Upgrader.php')) { return NULL; - } else { + } + else { 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: In Civi 4.3+, delegate to CRM_Utils_File::findFiles() * - * @param $dir string, base dir - * @param $pattern string, glob pattern, eg "*.txt" - * @return array(string) + * @param string $dir base dir + * @param string $pattern , glob pattern, eg "*.txt" + * + * @return array */ 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); } - $todos = array($dir); - $result = array(); + $todos = [$dir]; + $result = []; while (!empty($todos)) { $subdir = array_shift($todos); foreach (_civiproxy_civix_glob("$subdir/$pattern") as $match) { @@ -130,8 +245,9 @@ function _civiproxy_civix_find_files($dir, $pattern) { if ($dh = opendir($subdir)) { while (FALSE !== ($entry = readdir($dh))) { $path = $subdir . DIRECTORY_SEPARATOR . $entry; - if ($entry{0} == '.') { - } elseif (is_dir($path)) { + if ($entry[0] == '.') { + } + elseif (is_dir($path)) { $todos[] = $path; } } @@ -140,18 +256,25 @@ function _civiproxy_civix_find_files($dir, $pattern) { } return $result; } + /** - * (Delegated) Implementation of hook_civicrm_managed + * (Delegated) Implements hook_civicrm_managed(). * * 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) { $mgdFiles = _civiproxy_civix_find_files(__DIR__, '*.mgd.php'); + sort($mgdFiles); foreach ($mgdFiles as $file) { $es = include $file; foreach ($es as $e) { 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; } @@ -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" * * 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) { if (!is_dir(__DIR__ . '/xml/case')) { @@ -174,14 +299,57 @@ function _civiproxy_civix_civicrm_caseTypes(&$caseTypes) { $name = preg_replace('/\.xml$/', '', basename($file)); if ($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( - 'module' => 'de.systopia.civiproxy', + $caseTypes[$name] = [ + 'module' => E::LONG_NAME, 'name' => $name, '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. * This wrapper provides consistency. * - * @see http://php.net/glob + * @link http://php.net/glob * @param string $pattern - * @return array, possibly empty + * + * @return array */ function _civiproxy_civix_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 - * $path - path where insertion should happen (ie. Administer/System Settings) - * $item - menu you need to insert (parent/child attributes will be filled for you) - * $parentId - used internally to recurse in the menu structure + * @param array $menu - menu hierarchy + * @param string $path - path to parent of this item, e.g. 'my_extension/submenu' + * 'Mailing', or 'Administer/System Settings' + * @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) { - static $navId; - +function _civiproxy_civix_insert_navigation_menu(&$menu, $path, $item) { // If we are done going down the path, insert menu if (empty($path)) { - if (!$navId) $navId = CRM_Core_DAO::singleValueQuery("SELECT max(id) FROM civicrm_navigation"); - $navId ++; - $menu[$navId] = array ( - 'attributes' => array_merge($item, array( + $menu[] = [ + 'attributes' => array_merge([ 'label' => CRM_Utils_Array::value('name', $item), 'active' => 1, - 'parentID' => $parentId, - 'navID' => $navId, - )) - ); - return true; - } else { + ], $item), + ]; + return TRUE; + } + else { // Find an recurse into the next level down - $found = false; + $found = FALSE; $path = explode('/', $path); $first = array_shift($path); foreach ($menu as $key => &$entry) { if ($entry['attributes']['name'] == $first) { - if (!$entry['child']) $entry['child'] = array(); - $found = _civiproxy_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item, $key); + if (!isset($entry['child'])) { + $entry['child'] = []; + } + $found = _civiproxy_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item); } } 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, []); +} From bbf5c3c9e9c0b3d8e453cc2139d0ab17d84dba59 Mon Sep 17 00:00:00 2001 From: "B. Endres" Date: Wed, 16 Sep 2020 09:14:32 +0200 Subject: [PATCH 5/8] cleaned up logging and typos --- proxy/webhook2api.php | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/proxy/webhook2api.php b/proxy/webhook2api.php index 084d313..5cc4e7f 100644 --- a/proxy/webhook2api.php +++ b/proxy/webhook2api.php @@ -32,7 +32,6 @@ if (!empty($_REQUEST['id']) && isset($webhook2api['configurations'][$_REQUEST['i // read some input $post_input = @file_get_contents('php://input'); -error_log("DEBUG: " . json_encode($post_input)); // MAIN: iterate through all (eligible) configurations $last_error = ["No handler found", 501]; @@ -85,12 +84,10 @@ function webhook2api_processConfiguration($configuration, $post_input) { // gather source data $data = []; if (!empty($configuration['data_sources']) && is_array($configuration['data_sources'])) { - error_log(json_encode($configuration)); foreach ($configuration['data_sources'] as $data_source) { switch ($data_source) { case 'POST/json': # JSON data in POST field $more_data = json_decode($post_input, TRUE); - error_log(json_encode($more_data)); $data = array_merge_recursive($data, $more_data); break; case 'REQUEST': # simple request parameters @@ -109,8 +106,8 @@ function webhook2api_processConfiguration($configuration, $post_input) { foreach ($data as $d) { $result = webhook2api_callCiviApi($configuration, $d); if(isset($result['internal_error'])) { - // internal communication Error occured. Aborting process - civiproxy_log("Webhook2API[{$configuration['name']}]: internal error occured: " . json_encode($result['internal_error'])); + // internal communication Error occurred. Aborting process + civiproxy_log("Webhook2API[{$configuration['name']}]: internal error occurred: " . json_encode($result['internal_error'])); return $result['internal_error']; } if (!empty($result['values']['http_code'])) { @@ -123,8 +120,8 @@ function webhook2api_processConfiguration($configuration, $post_input) { } else { $result = webhook2api_callCiviApi($configuration, $data); if(isset($result['internal_error'])) { - // internal communication Error occured. Aborting process - civiproxy_log("Webhook2API[{$configuration['name']}]: internal error occured: " . json_encode($result['internal_error'])); + // internal communication Error occurred. Aborting process + civiproxy_log("Webhook2API[{$configuration['name']}]: internal error occurred: " . json_encode($result['internal_error'])); return $result['internal_error']; } if (!empty($result['values']['http_code'])) { @@ -134,20 +131,19 @@ function webhook2api_processConfiguration($configuration, $post_input) { } } 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)); } // process result if (!empty($configuration['response_mapping']) && is_array($configuration['response_mapping'])) { // TODO: implement - //error_log("Webhook2API.response_mapping: not implemented!"); http_response_code('200'); - civiproxy_log("Webhook successfull, response mapped."); + civiproxy_log("Webhook successful, response mapped."); } else { // default behaviour: http_response_code('200'); - civiproxy_log("Webhook successfull."); + civiproxy_log("Webhook successful."); } // all done exit(); @@ -178,7 +174,7 @@ function webhook2api_callCiviApi($configuration, $data) { } else { echo "Error"; // 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 foreach ($modifiers as $modifier) { // TODO: implement - //error_log("Webhook2API.modifiers: not implemented!"); + + civiproxy_log("Webhook2API.modifiers: not implemented!"); } // set to target @@ -210,16 +207,16 @@ function webhook2api_callCiviApi($configuration, $data) { // sanitise data if (!empty($configuration['parameter_sanitation']) && is_array($configuration['parameter_sanitation'])) { // TODO: implement - //error_log("Webhook2API.sanitation: not implemented!"); + civiproxy_log("Webhook2API.sanitation: not implemented!"); } // send to target REST API 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]; } 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]; } $params['api_key'] = $configuration['api_key']; From 21f2d22506fd5eaa5cd4e107af60b75817597669 Mon Sep 17 00:00:00 2001 From: Michael S Date: Mon, 12 Oct 2020 09:22:51 +0100 Subject: [PATCH 6/8] Update ProxySettings.php #46 Add ability to match pre-releases and build labels e.g. "-dev" --- .../CRM/Admin/Form/Setting/ProxySettings.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/de.systopia.civiproxy/CRM/Admin/Form/Setting/ProxySettings.php b/de.systopia.civiproxy/CRM/Admin/Form/Setting/ProxySettings.php index f2ae02b..524fd94 100644 --- a/de.systopia.civiproxy/CRM/Admin/Form/Setting/ProxySettings.php +++ b/de.systopia.civiproxy/CRM/Admin/Form/Setting/ProxySettings.php @@ -105,9 +105,9 @@ class CRM_Admin_Form_Setting_ProxySettings extends CRM_Admin_Form_Setting if($response === FALSE) { return array('is_error' => 1, 'message' => sprintf(ts('Error: cannot access "%s"'), $url)); }else{ - $result = preg_match("/

CiviProxy Version ([0-9]+\.[0-9]+|[0-9]+\.[0-9]+\.[0-9]+)<\/p>/", $response, $output_array); + $result = preg_match("/

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){ - 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{ return array('is_error' => 0, 'version' => $output_array[1]); } From efc483e2775030fa8d8ded2183ffd4c2c67a9a2c Mon Sep 17 00:00:00 2001 From: eileen Date: Thu, 19 Nov 2020 13:38:17 +1300 Subject: [PATCH 7/8] Fix url references to preferred urls The older urls are still commented in the config.dist.php file so should not be too hard to find for someone dealing with an older site --- docs/configuration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 83fd61d..a2fe7c5 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -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 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 -$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. ### 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: ```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. ### Setting for the location of images and included files in your mail(ing) From 9f3b3e9ed5e737d613308c03fd21e05116c3f775 Mon Sep 17 00:00:00 2001 From: eileen Date: Thu, 19 Nov 2020 13:41:28 +1300 Subject: [PATCH 8/8] Fix typo --- proxy/config.dist.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/config.dist.php b/proxy/config.dist.php index 631facd..9a556e9 100644 --- a/proxy/config.dist.php +++ b/proxy/config.dist.php @@ -63,7 +63,7 @@ $mail_subscription_user_key = NULL; $debug = NULL; //'LUXFbiaoz4dVWuAHEcuBAe7YQ4YP96rN4MCDmKj89p.log'; // 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; /****************************************************************