From 3b998fcc2b5acaa98b9e69c8bad21ebf509e07d7 Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Mon, 24 Feb 2014 17:16:53 -0800 Subject: [PATCH] HR-287 - CRM_Core_BAO_Setting - Guard against duplicate settings folders Not sure this is needed, but there's been some example code floating around in which extensions use buggy self-defenses to avoid duplicates. --- CRM/Core/BAO/Setting.php | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/CRM/Core/BAO/Setting.php b/CRM/Core/BAO/Setting.php index 7449521ab1..5278501212 100644 --- a/CRM/Core/BAO/Setting.php +++ b/CRM/Core/BAO/Setting.php @@ -637,13 +637,10 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting { if ($settingsMetadata === NULL) { $settingsMetadata = CRM_Core_BAO_Cache::getItem('CiviCRM setting Spec', 'All', $componentID); if (empty($settingsMetadata)) { - $settingsMetadata = array(); global $civicrm_root; $metaDataFolders = array($civicrm_root. '/settings'); CRM_Utils_Hook::alterSettingsFolders($metaDataFolders); - foreach ($metaDataFolders as $metaDataFolder) { - $settingsMetadata = $settingsMetadata + self::loadSettingsMetaData($metaDataFolder); - } + $settingsMetadata = self::loadSettingsMetaDataFolders($metaDataFolders); CRM_Core_BAO_Cache::setItem($settingsMetadata,'CiviCRM setting Spec', 'All', $componentID); } $cached = 0; @@ -667,6 +664,24 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting { } + /** + * Load the settings files defined in a series of folders + * @param array $metaDataFolders list of folder paths + * @return array + */ + public static function loadSettingsMetaDataFolders($metaDataFolders) { + $settingsMetadata = array(); + $loadedFolders = array(); + foreach ($metaDataFolders as $metaDataFolder) { + $realFolder = realpath($metaDataFolder); + if (is_dir($realFolder) && !isset($loadedFolders[$realFolder])) { + $loadedFolders[$realFolder] = TRUE; + $settingsMetadata = $settingsMetadata + self::loadSettingsMetaData($metaDataFolder); + } + } + return $settingsMetadata; + } + /** * Load up settings metadata from files */ -- 2.25.1