CRM-16373 - Save URLs and paths through settings instead of domain
authorTim Otten <totten@civicrm.org>
Sun, 23 Aug 2015 17:03:44 +0000 (10:03 -0700)
committerTim Otten <totten@civicrm.org>
Thu, 17 Sep 2015 22:45:02 +0000 (15:45 -0700)
CRM/Admin/Form/Setting/Path.php
CRM/Admin/Form/Setting/Url.php
CRM/Core/BAO/ConfigSetting.php
CRM/Core/BAO/Setting.php
CRM/Core/Form.php
CRM/Utils/Rule.php
settings/Url.setting.php
tests/phpunit/CRM/Core/BAO/SettingTest.php
tests/phpunit/api/v3/SettingTest.php

index f33b15a57e5b5132f9de9c862a8836c3c69ca179..ba11d3c46c3c49e3a534226e80d5e80976380a28 100644 (file)
  */
 class CRM_Admin_Form_Setting_Path extends CRM_Admin_Form_Setting {
 
+  protected $_settings = array(
+    'uploadDir' => CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME,
+    'imageUploadDir' => CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME,
+    'customFileUploadDir' => CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME,
+    'customTemplateDir' => CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME,
+    'customPHPPathDir' => CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME,
+    'extensionsDir' => CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME,
+  );
+
   /**
    * Build the form object.
    */
   public function buildQuickForm() {
     CRM_Utils_System::setTitle(ts('Settings - Upload Directories'));
+    parent::buildQuickForm();
 
     $directories = array(
       'uploadDir' => ts('Temporary Files'),
@@ -51,16 +61,15 @@ class CRM_Admin_Form_Setting_Path extends CRM_Admin_Form_Setting {
       'extensionsDir' => ts('CiviCRM Extensions Directory'),
     );
     foreach ($directories as $name => $title) {
-      $this->add('text', $name, $title);
+      //$this->add('text', $name, $title);
       $this->addRule($name,
         ts("'%1' directory does not exist",
           array(1 => $title)
         ),
-        'fileExists'
+        'settingPath'
       );
     }
 
-    parent::buildQuickForm();
   }
 
   public function postProcess() {
index 4dbcf9eb49a5ca8eeef3260f4fccd6bde411581d..7a3f8d0072916fa58c3d63632a205fc2f21b6ba6 100644 (file)
 class CRM_Admin_Form_Setting_Url extends CRM_Admin_Form_Setting {
   protected $_settings = array(
     'disable_core_css' => CRM_Core_BAO_Setting::SYSTEM_PREFERENCES_NAME,
+    'userFrameworkResourceURL' => CRM_Core_BAO_Setting::URL_PREFERENCES_NAME,
+    'imageUploadURL' => CRM_Core_BAO_Setting::URL_PREFERENCES_NAME,
+    'customCSSURL' => CRM_Core_BAO_Setting::URL_PREFERENCES_NAME,
+    'extensionsURL' => CRM_Core_BAO_Setting::URL_PREFERENCES_NAME,
   );
 
   /**
@@ -48,10 +52,6 @@ class CRM_Admin_Form_Setting_Url extends CRM_Admin_Form_Setting {
       'version' => 3,
     ));
 
-    $this->addElement('text', 'userFrameworkResourceURL', ts('CiviCRM Resource URL'));
-    $this->addElement('text', 'imageUploadURL', ts('Image Upload URL'));
-    $this->addElement('text', 'customCSSURL', ts('Custom css URL'));
-    $this->addElement('text', 'extensionsURL', ts('Extension Resource URL'));
     $this->addYesNo('enableSSL', ts('Force Secure URLs (SSL)'));
     $this->addYesNo('verifySSL', ts('Verify SSL Certs'));
     // FIXME: verifySSL should use $_settings instead of manually adding fields
index 646ac5ffd542c4fe9bac98a4955a5e088de92a2f..01a5010848fde4fd1dd83d01adbaf57eeb6e2d67 100644 (file)
@@ -84,8 +84,6 @@ class CRM_Core_BAO_ConfigSetting {
       unset($params[$var]);
     }
 
-    CRM_Core_BAO_Setting::fixAndStoreDirAndURL($params);
-
     // also skip all Dir Params, we dont need to store those in the DB!
     foreach ($params as $name => $val) {
       if (substr($name, -3) == 'Dir') {
@@ -315,9 +313,6 @@ class CRM_Core_BAO_ConfigSetting {
 
     // dont add if its empty
     if (!empty($defaults)) {
-      // retrieve directory and url preferences also
-      CRM_Core_BAO_Setting::retrieveDirectoryAndURLPreferences($defaults);
-
       // Pickup enabled-components from settings table if found.
       $enableComponents = Civi::settings()->get('enable_components');
       if (!empty($enableComponents)) {
index cf2d834efb2f33c4417567d6feb18f84735447c5..72a4aaaba8ce87b4ee51e24b3c0b6c2ca3d4afdc 100644 (file)
@@ -904,166 +904,6 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting {
     self::setItem($optionValue, $group, $name);
   }
 
-  /**
-   * @param array $params
-   * @param int $domainID
-   */
-  public static function fixAndStoreDirAndURL(&$params, $domainID = NULL) {
-    if (self::isUpgradeFromPreFourOneAlpha1()) {
-      return;
-    }
-
-    if (empty($domainID)) {
-      $domainID = CRM_Core_Config::domainID();
-    }
-    $sql = "
- SELECT name, group_name
- FROM   civicrm_setting
- WHERE domain_id = %1
- AND ( group_name = %2
- OR  group_name = %3 )
-";
-    $sqlParams = array(
-      1 => array($domainID, 'Integer'),
-      2 => array(self::DIRECTORY_PREFERENCES_NAME, 'String'),
-      3 => array(self::URL_PREFERENCES_NAME, 'String'),
-    );
-
-    $dirParams = array();
-    $urlParams = array();
-
-    $dao = CRM_Core_DAO::executeQuery($sql,
-      $sqlParams,
-      TRUE,
-      NULL,
-      FALSE,
-      TRUE,
-      // trap exceptions as error
-      TRUE
-    );
-
-    if (is_a($dao, 'DB_Error')) {
-      if (CRM_Core_Config::isUpgradeMode()) {
-        // seems like this is a 4.0 -> 4.1 upgrade, so we suppress this error and continue
-        return;
-      }
-      else {
-        echo "Fatal DB error, exiting, seems like your schema does not have civicrm_setting table\n";
-        exit();
-      }
-    }
-
-    while ($dao->fetch()) {
-      if (!isset($params[$dao->name])) {
-        continue;
-      }
-      if ($dao->group_name == self::DIRECTORY_PREFERENCES_NAME) {
-        $dirParams[$dao->name] = CRM_Utils_Array::value($dao->name, $params, '');
-      }
-      else {
-        $urlParams[$dao->name] = CRM_Utils_Array::value($dao->name, $params, '');
-      }
-      unset($params[$dao->name]);
-    }
-
-    if (!empty($dirParams)) {
-      self::storeDirectoryOrURLPreferences($dirParams,
-        self::DIRECTORY_PREFERENCES_NAME
-      );
-    }
-
-    if (!empty($urlParams)) {
-      self::storeDirectoryOrURLPreferences($urlParams,
-        self::URL_PREFERENCES_NAME
-      );
-    }
-  }
-
-  /**
-   * @param array $params
-   * @param $group
-   */
-  public static function storeDirectoryOrURLPreferences(&$params, $group) {
-    foreach ($params as $name => $value) {
-      // always try to store relative directory or url from CMS root
-      $value = ($group == self::DIRECTORY_PREFERENCES_NAME) ? CRM_Utils_File::relativeDirectory($value) : CRM_Utils_System::relativeURL($value);
-
-      self::setItem($value, $group, $name);
-    }
-  }
-
-  /**
-   * @param array $params
-   * @param bool $setInConfig
-   */
-  public static function retrieveDirectoryAndURLPreferences(&$params, $setInConfig = FALSE) {
-    if (CRM_Core_Config::isUpgradeMode()) {
-      $isJoomla = (defined('CIVICRM_UF') && CIVICRM_UF == 'Joomla') ? TRUE : FALSE;
-      // hack to set the resource base url so that js/ css etc is loaded correctly
-      if ($isJoomla) {
-        $params['userFrameworkResourceURL'] = CRM_Utils_File::addTrailingSlash(CIVICRM_UF_BASEURL, '/') . str_replace('administrator', '', CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionValue', 'userFrameworkResourceURL', 'value', 'name'));
-      }
-      if (self::isUpgradeFromPreFourOneAlpha1()) {
-        return;
-      }
-    }
-
-    if ($setInConfig) {
-      $config = CRM_Core_Config::singleton();
-    }
-
-    $sql = "
-SELECT name, group_name, value
-FROM   civicrm_setting
-WHERE  ( group_name = %1
-OR       group_name = %2 )
-AND domain_id = %3
-";
-    $sqlParams = array(
-      1 => array(self::DIRECTORY_PREFERENCES_NAME, 'String'),
-      2 => array(self::URL_PREFERENCES_NAME, 'String'),
-      3 => array(CRM_Core_Config::domainID(), 'Integer'),
-    );
-
-    $dao = CRM_Core_DAO::executeQuery($sql,
-      $sqlParams,
-      TRUE,
-      NULL,
-      FALSE,
-      TRUE,
-      // trap exceptions as error
-      TRUE
-    );
-
-    if (is_a($dao, 'DB_Error')) {
-      echo "Fatal DB error, exiting, seems like your schema does not have civicrm_setting table\n";
-      exit();
-    }
-
-    while ($dao->fetch()) {
-      $value = self::getOverride($dao->group_name, $dao->name, NULL);
-      if ($value === NULL && $dao->value) {
-        $value = unserialize($dao->value);
-        if ($dao->group_name == self::DIRECTORY_PREFERENCES_NAME) {
-          $value = CRM_Utils_File::absoluteDirectory($value);
-        }
-        else {
-          // CRM-7622: we need to remove the language part
-          $value = CRM_Utils_System::absoluteURL($value, TRUE);
-        }
-      }
-      // CRM-10931, If DB doesn't have any value, carry on with any default value thats already available
-      if (!isset($value) && !empty($params[$dao->name])) {
-        $value = $params[$dao->name];
-      }
-      $params[$dao->name] = $value;
-
-      if ($setInConfig) {
-        $config->{$dao->name} = $value;
-      }
-    }
-  }
-
   /**
    * Determine what, if any, overrides have been provided
    * for a setting.
index 69e20b624e15df827d74c755221b0558fb47e9bf..89b2524dd3369575baa5078e8fd92516dcb72977 100644 (file)
@@ -269,6 +269,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       'positiveInteger',
       'xssString',
       'fileExists',
+      'settingPath',
       'autocomplete',
       'validContact',
     );
index 201a580825fe4978bfd381263a96c9f72c6bf127..50a687e0caa364c3c25b1eef4255244bec659e4f 100644 (file)
@@ -160,6 +160,22 @@ class CRM_Utils_Rule {
     return (bool) filter_var($url, FILTER_VALIDATE_URL);
   }
 
+  /**
+   * @param $url
+   *
+   * @return bool
+   */
+  public static function urlish($url) {
+    if (empty($url)) {
+      return TRUE;
+    }
+    if (!preg_match('/^([a-z]+):/', $url)) {
+      // allow relative URL's (CRM-15598)
+      $url = 'http://' . $_SERVER['HTTP_HOST'] . '/' . ltrim($url, '/');
+    }
+    return (bool) filter_var($url, FILTER_VALIDATE_URL);
+  }
+
   /**
    * @param $string
    *
@@ -707,6 +723,19 @@ class CRM_Utils_Rule {
     return file_exists($path);
   }
 
+  /**
+   * Determine whether the value contains a valid reference to a directory.
+   *
+   * Paths stored in the setting system may be absolute -- or may be
+   * relative to the default data directory.
+   *
+   * @param string $path
+   * @return bool
+   */
+  public static function settingPath($path) {
+    return is_dir(\CRM_Utils_File::absoluteDirectory($path));
+  }
+
   /**
    * @param $value
    * @param $options
index aacaa11440054095adb7f2f9cf69f9d0a6bf9af0..c81fb99be25b75db9bcbbd7c25924a704b62767e 100644 (file)
@@ -50,7 +50,7 @@ return array(
     'is_contact' => 0,
     'description' => 'Absolute URL of the location where the civicrm module or component has been installed.',
     'help_text' => NULL,
-    'validate_callback' => 'CRM_Utils_Rule::url',
+    'validate_callback' => 'CRM_Utils_Rule::urlish',
   ),
   'imageUploadURL' => array(
     'group' => 'url',
@@ -66,7 +66,7 @@ return array(
     'is_contact' => 0,
     'description' => 'URL of the location for uploaded image files.',
     'help_text' => NULL,
-    'validate_callback' => 'CRM_Utils_Rule::url',
+    'validate_callback' => 'CRM_Utils_Rule::urlish',
   ),
   'customCSSURL' => array(
     'group' => 'url',
@@ -82,7 +82,7 @@ return array(
     'is_contact' => 0,
     'description' => 'You can modify the look and feel of CiviCRM by adding your own stylesheet. For small to medium sized modifications, use your css file to override some of the styles in civicrm.css. Or if you need to make drastic changes, you can choose to disable civicrm.css completely.',
     'help_text' => NULL,
-    'validate_callback' => 'CRM_Utils_Rule::url',
+    'validate_callback' => 'CRM_Utils_Rule::urlish',
   ),
   'extensionsURL' => array(
     'group' => 'url',
@@ -98,6 +98,6 @@ return array(
     'is_contact' => 0,
     'description' => 'Base URL for extension resources (images, stylesheets, etc). This should match extensionsDir.',
     'help_text' => NULL,
-    'validate_callback' => 'CRM_Utils_Rule::url',
+    'validate_callback' => 'CRM_Utils_Rule::urlish',
   ),
 );
index 475f2995ed47b8e3499b3f4cc4dc044aba1efce7..87a1cee59e222d181345661c4424710383620062 100644 (file)
@@ -110,19 +110,6 @@ class CRM_Core_BAO_SettingTest extends CiviUnitTestCase {
     $this->assertEquals('/test/override', $values['imageUploadDir']);
   }
 
-  /**
-   * Ensure that overrides in $civicrm_setting apply when
-   * when using retrieveDirectoryAndURLPreferences().
-   */
-  public function testRetrieveDirectoryAndURLPreferences_Override() {
-    global $civicrm_setting;
-    $civicrm_setting[CRM_Core_BAO_Setting::DIRECTORY_PREFERENCES_NAME]['imageUploadDir'] = '/test/override';
-
-    $params = array();
-    CRM_Core_BAO_Setting::retrieveDirectoryAndURLPreferences($params);
-    $this->assertEquals('/test/override', $params['imageUploadDir']);
-  }
-
   /**
    * This test checks that CRM_Core_BAO_Setting::updateSettingsFromMetaData();
    * 1) Removes 'maxAttachments' from config (because 'prefetch' is not set in the metadata it should
@@ -176,7 +163,7 @@ class CRM_Core_BAO_SettingTest extends CiviUnitTestCase {
 
   /**
    * Ensure that overrides in $civicrm_setting apply when
-   * when using retrieveDirectoryAndURLPreferences().
+   * when using getItem().
    */
   public function testConvertConfigToSettingNoPrefetch() {
     $settings = array('maxAttachments' => 6);
index 27bc07a8143ba5676a650538d12ef9820cbb8eec..7b5dae352fd0811e3994127a3e5dbf6260209d9c 100644 (file)
@@ -244,7 +244,7 @@ class api_v3_SettingTest extends CiviUnitTestCase {
   public function testCreateInvalidURLSettings() {
     $params = array(
       'domain_id' => $this->_domainID2,
-      'userFrameworkResourceURL' => 'dfhkdhfd',
+      'userFrameworkResourceURL' => 'dfhkd*hfd',
     );
     $result = $this->callAPIFailure('setting', 'create', $params);
     $params = array(