(dev/core#174) Implement CRM_Utils_Cache::assertValidKey
authorTim Otten <totten@civicrm.org>
Thu, 21 Jun 2018 00:51:55 +0000 (17:51 -0700)
committerTim Otten <totten@civicrm.org>
Fri, 29 Jun 2018 23:42:38 +0000 (16:42 -0700)
CRM/Utils/Cache.php
templates/CRM/common/civicrm.settings.php.template

index 13aeec68ee366b10ce3f305884f13f36130c6fa5..171e4d54374c62db9af0a237900dfb1a72fa93fd 100644 (file)
@@ -214,4 +214,30 @@ class CRM_Utils_Cache {
     throw new CRM_Core_Exception("Failed to instantiate cache. No supported cache type found. " . print_r($params, 1));
   }
 
+  /**
+   * Assert that a key is well-formed.
+   *
+   * @param string $key
+   * @return string
+   *   Same $key, if it's valid.
+   * @throws \CRM_Utils_Cache_InvalidArgumentException
+   */
+  public static function assertValidKey($key) {
+    $strict = CRM_Utils_Constant::value('CIVICRM_PSR16_STRICT', FALSE) || defined('CIVICRM_TEST');
+
+    if (!is_string($key)) {
+      throw new CRM_Utils_Cache_InvalidArgumentException("Invalid cache key: Not a string");
+    }
+
+    if ($strict && !preg_match(';^[A-Za-z0-9_\-\. ]+$;', $key)) {
+      throw new CRM_Utils_Cache_InvalidArgumentException("Invalid cache key: Illegal characters");
+    }
+
+    if ($strict && strlen($key) > 255) {
+      throw new CRM_Utils_Cache_InvalidArgumentException("Invalid cache key: Too long");
+    }
+
+    return $key;
+  }
+
 }
index ae4d6e269fd86876a2bdfdf6a02de88816fe9da9..2895fed38c7f76c79a1f5ef4e3ec215538ee336d 100644 (file)
@@ -399,6 +399,14 @@ if (!defined('CIVICRM_DB_CACHE_PREFIX')) {
   define('CIVICRM_DB_CACHE_PREFIX', '');
 }
 
+/**
+ * The cache system traditionally allowed a wide range of cache-keys, but some
+ * cache-keys are prohibited by PSR-16.
+ */
+if (!defined('CIVICRM_PSR16_STRICT')) {
+  define('CIVICRM_PSR16_STRICT', FALSE);
+}
+
 /**
  * If you have multilingual site and you are using the "inherit CMS language"
  * configuration option, but wish to, for example, use fr_CA instead of the