@@ -23,176 +23,176 @@ |
||
| 23 | 23 | */ |
| 24 | 24 | class Loader implements ILoader |
| 25 | 25 | { |
| 26 | - /** |
|
| 27 | - * Stores the plugin directories. |
|
| 28 | - * |
|
| 29 | - * @see addDirectory |
|
| 30 | - * @var array |
|
| 31 | - */ |
|
| 32 | - protected $paths = array(); |
|
| 26 | + /** |
|
| 27 | + * Stores the plugin directories. |
|
| 28 | + * |
|
| 29 | + * @see addDirectory |
|
| 30 | + * @var array |
|
| 31 | + */ |
|
| 32 | + protected $paths = array(); |
|
| 33 | 33 | |
| 34 | - /** |
|
| 35 | - * Stores the plugins names/paths relationships |
|
| 36 | - * don't edit this on your own, use addDirectory. |
|
| 37 | - * |
|
| 38 | - * @see addDirectory |
|
| 39 | - * @var array |
|
| 40 | - */ |
|
| 41 | - protected $classPath = array(); |
|
| 34 | + /** |
|
| 35 | + * Stores the plugins names/paths relationships |
|
| 36 | + * don't edit this on your own, use addDirectory. |
|
| 37 | + * |
|
| 38 | + * @see addDirectory |
|
| 39 | + * @var array |
|
| 40 | + */ |
|
| 41 | + protected $classPath = array(); |
|
| 42 | 42 | |
| 43 | - /** |
|
| 44 | - * Path where class paths cache files are written. |
|
| 45 | - * |
|
| 46 | - * @var string |
|
| 47 | - */ |
|
| 48 | - protected $cacheDir; |
|
| 43 | + /** |
|
| 44 | + * Path where class paths cache files are written. |
|
| 45 | + * |
|
| 46 | + * @var string |
|
| 47 | + */ |
|
| 48 | + protected $cacheDir; |
|
| 49 | 49 | |
| 50 | - /** |
|
| 51 | - * Path where builtin plugins are stored. |
|
| 52 | - * |
|
| 53 | - * @var string |
|
| 54 | - */ |
|
| 55 | - protected $corePluginDir; |
|
| 50 | + /** |
|
| 51 | + * Path where builtin plugins are stored. |
|
| 52 | + * |
|
| 53 | + * @var string |
|
| 54 | + */ |
|
| 55 | + protected $corePluginDir; |
|
| 56 | 56 | |
| 57 | - /** |
|
| 58 | - * Loader constructor. |
|
| 59 | - * |
|
| 60 | - * @param $cacheDir |
|
| 61 | - */ |
|
| 62 | - public function __construct($cacheDir) |
|
| 63 | - { |
|
| 64 | - $this->corePluginDir = __DIR__ . DIRECTORY_SEPARATOR . 'Plugins'; |
|
| 65 | - $this->cacheDir = rtrim($cacheDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
| 57 | + /** |
|
| 58 | + * Loader constructor. |
|
| 59 | + * |
|
| 60 | + * @param $cacheDir |
|
| 61 | + */ |
|
| 62 | + public function __construct($cacheDir) |
|
| 63 | + { |
|
| 64 | + $this->corePluginDir = __DIR__ . DIRECTORY_SEPARATOR . 'Plugins'; |
|
| 65 | + $this->cacheDir = rtrim($cacheDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; |
|
| 66 | 66 | |
| 67 | - // include class paths or rebuild paths if the cache file isn't there |
|
| 68 | - $cacheFile = $this->cacheDir . 'classpath.cache.d' . Core::RELEASE_TAG . '.php'; |
|
| 69 | - if (file_exists($cacheFile)) { |
|
| 70 | - $classpath = file_get_contents($cacheFile); |
|
| 71 | - $this->classPath = unserialize($classpath) + $this->classPath; |
|
| 72 | - } else { |
|
| 73 | - $this->rebuildClassPathCache($this->corePluginDir, $cacheFile); |
|
| 74 | - } |
|
| 75 | - } |
|
| 67 | + // include class paths or rebuild paths if the cache file isn't there |
|
| 68 | + $cacheFile = $this->cacheDir . 'classpath.cache.d' . Core::RELEASE_TAG . '.php'; |
|
| 69 | + if (file_exists($cacheFile)) { |
|
| 70 | + $classpath = file_get_contents($cacheFile); |
|
| 71 | + $this->classPath = unserialize($classpath) + $this->classPath; |
|
| 72 | + } else { |
|
| 73 | + $this->rebuildClassPathCache($this->corePluginDir, $cacheFile); |
|
| 74 | + } |
|
| 75 | + } |
|
| 76 | 76 | |
| 77 | - /** |
|
| 78 | - * Rebuilds class paths, scans the given directory recursively and saves all paths in the given file. |
|
| 79 | - * |
|
| 80 | - * @param string $path the plugin path to scan |
|
| 81 | - * @param string $cacheFile the file where to store the plugin paths cache, it will be overwritten |
|
| 82 | - * |
|
| 83 | - * @throws Exception |
|
| 84 | - */ |
|
| 85 | - protected function rebuildClassPathCache($path, $cacheFile) |
|
| 86 | - { |
|
| 87 | - if ($cacheFile !== false) { |
|
| 88 | - $tmp = $this->classPath; |
|
| 89 | - $this->classPath = array(); |
|
| 90 | - } |
|
| 77 | + /** |
|
| 78 | + * Rebuilds class paths, scans the given directory recursively and saves all paths in the given file. |
|
| 79 | + * |
|
| 80 | + * @param string $path the plugin path to scan |
|
| 81 | + * @param string $cacheFile the file where to store the plugin paths cache, it will be overwritten |
|
| 82 | + * |
|
| 83 | + * @throws Exception |
|
| 84 | + */ |
|
| 85 | + protected function rebuildClassPathCache($path, $cacheFile) |
|
| 86 | + { |
|
| 87 | + if ($cacheFile !== false) { |
|
| 88 | + $tmp = $this->classPath; |
|
| 89 | + $this->classPath = array(); |
|
| 90 | + } |
|
| 91 | 91 | |
| 92 | - // iterates over all files/folders |
|
| 93 | - $list = glob(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . '*'); |
|
| 94 | - if (is_array($list)) { |
|
| 95 | - foreach ($list as $f) { |
|
| 96 | - if (is_dir($f)) { |
|
| 97 | - $this->rebuildClassPathCache($f, false); |
|
| 98 | - } else { |
|
| 99 | - // TODO: is it still valid now? |
|
| 100 | - $this->classPath[str_replace(array( |
|
| 101 | - 'function.', |
|
| 102 | - 'block.', |
|
| 103 | - 'modifier.', |
|
| 104 | - 'outputfilter.', |
|
| 105 | - 'filter.', |
|
| 106 | - 'prefilter.', |
|
| 107 | - 'postfilter.', |
|
| 108 | - 'pre.', |
|
| 109 | - 'post.', |
|
| 110 | - 'output.', |
|
| 111 | - 'shared.', |
|
| 112 | - 'helper.' |
|
| 113 | - ), '', basename($f, '.php'))] = $f; |
|
| 114 | - } |
|
| 115 | - } |
|
| 116 | - } |
|
| 92 | + // iterates over all files/folders |
|
| 93 | + $list = glob(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . '*'); |
|
| 94 | + if (is_array($list)) { |
|
| 95 | + foreach ($list as $f) { |
|
| 96 | + if (is_dir($f)) { |
|
| 97 | + $this->rebuildClassPathCache($f, false); |
|
| 98 | + } else { |
|
| 99 | + // TODO: is it still valid now? |
|
| 100 | + $this->classPath[str_replace(array( |
|
| 101 | + 'function.', |
|
| 102 | + 'block.', |
|
| 103 | + 'modifier.', |
|
| 104 | + 'outputfilter.', |
|
| 105 | + 'filter.', |
|
| 106 | + 'prefilter.', |
|
| 107 | + 'postfilter.', |
|
| 108 | + 'pre.', |
|
| 109 | + 'post.', |
|
| 110 | + 'output.', |
|
| 111 | + 'shared.', |
|
| 112 | + 'helper.' |
|
| 113 | + ), '', basename($f, '.php'))] = $f; |
|
| 114 | + } |
|
| 115 | + } |
|
| 116 | + } |
|
| 117 | 117 | |
| 118 | - // save in file if it's the first call (not recursed) |
|
| 119 | - if ($cacheFile !== false) { |
|
| 120 | - if (!file_put_contents($cacheFile, serialize($this->classPath))) { |
|
| 121 | - throw new Exception('Could not write into ' . $cacheFile . |
|
| 122 | - ', either because the folder is not there (create it) or because of the chmod configuration (please ensure this directory is writable by php), alternatively you can change the directory used with $dwoo->setCompileDir() or provide a custom loader object with $dwoo->setLoader()'); |
|
| 123 | - } |
|
| 124 | - $this->classPath += $tmp; |
|
| 125 | - } |
|
| 126 | - } |
|
| 118 | + // save in file if it's the first call (not recursed) |
|
| 119 | + if ($cacheFile !== false) { |
|
| 120 | + if (!file_put_contents($cacheFile, serialize($this->classPath))) { |
|
| 121 | + throw new Exception('Could not write into ' . $cacheFile . |
|
| 122 | + ', either because the folder is not there (create it) or because of the chmod configuration (please ensure this directory is writable by php), alternatively you can change the directory used with $dwoo->setCompileDir() or provide a custom loader object with $dwoo->setLoader()'); |
|
| 123 | + } |
|
| 124 | + $this->classPath += $tmp; |
|
| 125 | + } |
|
| 126 | + } |
|
| 127 | 127 | |
| 128 | - /** |
|
| 129 | - * Loads a plugin file. |
|
| 130 | - * |
|
| 131 | - * @param string $class the plugin name, without the `Plugin` prefix |
|
| 132 | - * @param bool $forceRehash if true, the class path caches will be rebuilt if the plugin is not found, in case it |
|
| 133 | - * has just been added, defaults to true |
|
| 134 | - * |
|
| 135 | - * @throws Exception |
|
| 136 | - */ |
|
| 137 | - public function loadPlugin($class, $forceRehash = true) |
|
| 138 | - { |
|
| 139 | - /** |
|
| 140 | - * An unknown class was requested (maybe newly added) or the |
|
| 141 | - * include failed so we rebuild the cache. include() will fail |
|
| 142 | - * with an uncatchable error if the file doesn't exist, which |
|
| 143 | - * usually means that the cache is stale and must be rebuilt, |
|
| 144 | - * so we check for that before trying to include() the plugin. |
|
| 145 | - */ |
|
| 146 | - if ((!isset($this->classPath[$class]) || !is_readable($this->classPath[$class])) || (!isset |
|
| 147 | - ($this->classPath[$class . 'Compile']) || !is_readable($this->classPath[$class . 'Compile']))) { |
|
| 148 | - if ($forceRehash) { |
|
| 149 | - $this->rebuildClassPathCache($this->corePluginDir, $this->cacheDir . 'classpath.cache.d' . |
|
| 150 | - Core::RELEASE_TAG . '.php'); |
|
| 151 | - foreach ($this->paths as $path => $file) { |
|
| 152 | - $this->rebuildClassPathCache($path, $file); |
|
| 153 | - } |
|
| 154 | - if (isset($this->classPath[$class])) { |
|
| 155 | - include_once $this->classPath[$class]; |
|
| 156 | - } elseif (isset($this->classPath[$class . 'Compile'])) { |
|
| 157 | - include_once $this->classPath[$class . 'Compile']; |
|
| 158 | - } else { |
|
| 159 | - throw new Exception('Plugin "' . $class . |
|
| 160 | - '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE); |
|
| 161 | - } |
|
| 162 | - } else { |
|
| 163 | - throw new Exception('Plugin "' . $class . |
|
| 164 | - '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE); |
|
| 165 | - } |
|
| 166 | - } |
|
| 167 | - } |
|
| 128 | + /** |
|
| 129 | + * Loads a plugin file. |
|
| 130 | + * |
|
| 131 | + * @param string $class the plugin name, without the `Plugin` prefix |
|
| 132 | + * @param bool $forceRehash if true, the class path caches will be rebuilt if the plugin is not found, in case it |
|
| 133 | + * has just been added, defaults to true |
|
| 134 | + * |
|
| 135 | + * @throws Exception |
|
| 136 | + */ |
|
| 137 | + public function loadPlugin($class, $forceRehash = true) |
|
| 138 | + { |
|
| 139 | + /** |
|
| 140 | + * An unknown class was requested (maybe newly added) or the |
|
| 141 | + * include failed so we rebuild the cache. include() will fail |
|
| 142 | + * with an uncatchable error if the file doesn't exist, which |
|
| 143 | + * usually means that the cache is stale and must be rebuilt, |
|
| 144 | + * so we check for that before trying to include() the plugin. |
|
| 145 | + */ |
|
| 146 | + if ((!isset($this->classPath[$class]) || !is_readable($this->classPath[$class])) || (!isset |
|
| 147 | + ($this->classPath[$class . 'Compile']) || !is_readable($this->classPath[$class . 'Compile']))) { |
|
| 148 | + if ($forceRehash) { |
|
| 149 | + $this->rebuildClassPathCache($this->corePluginDir, $this->cacheDir . 'classpath.cache.d' . |
|
| 150 | + Core::RELEASE_TAG . '.php'); |
|
| 151 | + foreach ($this->paths as $path => $file) { |
|
| 152 | + $this->rebuildClassPathCache($path, $file); |
|
| 153 | + } |
|
| 154 | + if (isset($this->classPath[$class])) { |
|
| 155 | + include_once $this->classPath[$class]; |
|
| 156 | + } elseif (isset($this->classPath[$class . 'Compile'])) { |
|
| 157 | + include_once $this->classPath[$class . 'Compile']; |
|
| 158 | + } else { |
|
| 159 | + throw new Exception('Plugin "' . $class . |
|
| 160 | + '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE); |
|
| 161 | + } |
|
| 162 | + } else { |
|
| 163 | + throw new Exception('Plugin "' . $class . |
|
| 164 | + '" can not be found, maybe you forgot to bind it if it\'s a custom plugin ?', E_USER_NOTICE); |
|
| 165 | + } |
|
| 166 | + } |
|
| 167 | + } |
|
| 168 | 168 | |
| 169 | - /** |
|
| 170 | - * Adds a plugin directory, the plugins found in the new plugin directory |
|
| 171 | - * will take precedence over the other directories (including the default |
|
| 172 | - * dwoo plugin directory), you can use this for example to override plugins |
|
| 173 | - * in a specific directory for a specific application while keeping all your |
|
| 174 | - * usual plugins in the same place for all applications. |
|
| 175 | - * TOCOM don't forget that php functions overrides are not rehashed so you |
|
| 176 | - * need to clear the classpath caches by hand when adding those. |
|
| 177 | - * |
|
| 178 | - * @param string $pluginDirectory the plugin path to scan |
|
| 179 | - * |
|
| 180 | - * @throws Exception |
|
| 181 | - */ |
|
| 182 | - public function addDirectory($pluginDirectory) |
|
| 183 | - { |
|
| 184 | - $pluginDir = realpath($pluginDirectory); |
|
| 185 | - if (!$pluginDir) { |
|
| 186 | - throw new Exception('Plugin directory does not exist or can not be read : ' . $pluginDirectory); |
|
| 187 | - } |
|
| 188 | - $cacheFile = $this->cacheDir . 'classpath-' . substr(strtr($pluginDir, '/\\:' . PATH_SEPARATOR, '----'), |
|
| 189 | - strlen($pluginDir) > 80 ? - 80 : 0) . '.d' . Core::RELEASE_TAG . '.php'; |
|
| 190 | - $this->paths[$pluginDir] = $cacheFile; |
|
| 191 | - if (file_exists($cacheFile)) { |
|
| 192 | - $classpath = file_get_contents($cacheFile); |
|
| 193 | - $this->classPath = unserialize($classpath) + $this->classPath; |
|
| 194 | - } else { |
|
| 195 | - $this->rebuildClassPathCache($pluginDir, $cacheFile); |
|
| 196 | - } |
|
| 197 | - } |
|
| 169 | + /** |
|
| 170 | + * Adds a plugin directory, the plugins found in the new plugin directory |
|
| 171 | + * will take precedence over the other directories (including the default |
|
| 172 | + * dwoo plugin directory), you can use this for example to override plugins |
|
| 173 | + * in a specific directory for a specific application while keeping all your |
|
| 174 | + * usual plugins in the same place for all applications. |
|
| 175 | + * TOCOM don't forget that php functions overrides are not rehashed so you |
|
| 176 | + * need to clear the classpath caches by hand when adding those. |
|
| 177 | + * |
|
| 178 | + * @param string $pluginDirectory the plugin path to scan |
|
| 179 | + * |
|
| 180 | + * @throws Exception |
|
| 181 | + */ |
|
| 182 | + public function addDirectory($pluginDirectory) |
|
| 183 | + { |
|
| 184 | + $pluginDir = realpath($pluginDirectory); |
|
| 185 | + if (!$pluginDir) { |
|
| 186 | + throw new Exception('Plugin directory does not exist or can not be read : ' . $pluginDirectory); |
|
| 187 | + } |
|
| 188 | + $cacheFile = $this->cacheDir . 'classpath-' . substr(strtr($pluginDir, '/\\:' . PATH_SEPARATOR, '----'), |
|
| 189 | + strlen($pluginDir) > 80 ? - 80 : 0) . '.d' . Core::RELEASE_TAG . '.php'; |
|
| 190 | + $this->paths[$pluginDir] = $cacheFile; |
|
| 191 | + if (file_exists($cacheFile)) { |
|
| 192 | + $classpath = file_get_contents($cacheFile); |
|
| 193 | + $this->classPath = unserialize($classpath) + $this->classPath; |
|
| 194 | + } else { |
|
| 195 | + $this->rebuildClassPathCache($pluginDir, $cacheFile); |
|
| 196 | + } |
|
| 197 | + } |
|
| 198 | 198 | } |
@@ -25,298 +25,298 @@ |
||
| 25 | 25 | */ |
| 26 | 26 | class Policy |
| 27 | 27 | { |
| 28 | - /** |
|
| 29 | - * Php handling constants, defaults to PHP_REMOVE |
|
| 30 | - * PHP_ENCODE : run htmlentities over them |
|
| 31 | - * PHP_REMOVE : remove all <?php ?> (+ short tags if your short tags option is on) from the input template |
|
| 32 | - * PHP_ALLOW : leave them as they are |
|
| 33 | - * |
|
| 34 | - * @var int |
|
| 35 | - */ |
|
| 36 | - const PHP_ENCODE = 1; |
|
| 37 | - const PHP_REMOVE = 2; |
|
| 38 | - const PHP_ALLOW = 3; |
|
| 28 | + /** |
|
| 29 | + * Php handling constants, defaults to PHP_REMOVE |
|
| 30 | + * PHP_ENCODE : run htmlentities over them |
|
| 31 | + * PHP_REMOVE : remove all <?php ?> (+ short tags if your short tags option is on) from the input template |
|
| 32 | + * PHP_ALLOW : leave them as they are |
|
| 33 | + * |
|
| 34 | + * @var int |
|
| 35 | + */ |
|
| 36 | + const PHP_ENCODE = 1; |
|
| 37 | + const PHP_REMOVE = 2; |
|
| 38 | + const PHP_ALLOW = 3; |
|
| 39 | 39 | |
| 40 | - /** |
|
| 41 | - * Constant handling constants, defaults to CONST_DISALLOW |
|
| 42 | - * CONST_DISALLOW : throw an error if {$dwoo.const.*} is used in the template |
|
| 43 | - * CONST_ALLOW : allow {$dwoo.const.*} calls |
|
| 44 | - */ |
|
| 45 | - const CONST_DISALLOW = false; |
|
| 46 | - const CONST_ALLOW = true; |
|
| 40 | + /** |
|
| 41 | + * Constant handling constants, defaults to CONST_DISALLOW |
|
| 42 | + * CONST_DISALLOW : throw an error if {$dwoo.const.*} is used in the template |
|
| 43 | + * CONST_ALLOW : allow {$dwoo.const.*} calls |
|
| 44 | + */ |
|
| 45 | + const CONST_DISALLOW = false; |
|
| 46 | + const CONST_ALLOW = true; |
|
| 47 | 47 | |
| 48 | - /** |
|
| 49 | - * Php functions that are allowed to be used within the template. |
|
| 50 | - * |
|
| 51 | - * @var array |
|
| 52 | - */ |
|
| 53 | - protected $allowedPhpFunctions = array( |
|
| 54 | - 'str_repeat' => true, |
|
| 55 | - 'number_format' => true, |
|
| 56 | - 'htmlentities' => true, |
|
| 57 | - 'htmlspecialchars' => true, |
|
| 58 | - 'long2ip' => true, |
|
| 59 | - 'strlen' => true, |
|
| 60 | - 'list' => true, |
|
| 61 | - 'empty' => true, |
|
| 62 | - 'count' => true, |
|
| 63 | - 'sizeof' => true, |
|
| 64 | - 'in_array' => true, |
|
| 65 | - 'is_array' => true, |
|
| 66 | - ); |
|
| 48 | + /** |
|
| 49 | + * Php functions that are allowed to be used within the template. |
|
| 50 | + * |
|
| 51 | + * @var array |
|
| 52 | + */ |
|
| 53 | + protected $allowedPhpFunctions = array( |
|
| 54 | + 'str_repeat' => true, |
|
| 55 | + 'number_format' => true, |
|
| 56 | + 'htmlentities' => true, |
|
| 57 | + 'htmlspecialchars' => true, |
|
| 58 | + 'long2ip' => true, |
|
| 59 | + 'strlen' => true, |
|
| 60 | + 'list' => true, |
|
| 61 | + 'empty' => true, |
|
| 62 | + 'count' => true, |
|
| 63 | + 'sizeof' => true, |
|
| 64 | + 'in_array' => true, |
|
| 65 | + 'is_array' => true, |
|
| 66 | + ); |
|
| 67 | 67 | |
| 68 | - /** |
|
| 69 | - * Methods that are allowed to be used within the template. |
|
| 70 | - * |
|
| 71 | - * @var array |
|
| 72 | - */ |
|
| 73 | - protected $allowedMethods = array(); |
|
| 68 | + /** |
|
| 69 | + * Methods that are allowed to be used within the template. |
|
| 70 | + * |
|
| 71 | + * @var array |
|
| 72 | + */ |
|
| 73 | + protected $allowedMethods = array(); |
|
| 74 | 74 | |
| 75 | - /** |
|
| 76 | - * Paths that are safe to use with include or other file-access plugins. |
|
| 77 | - * |
|
| 78 | - * @var array |
|
| 79 | - */ |
|
| 80 | - protected $allowedDirectories = array(); |
|
| 75 | + /** |
|
| 76 | + * Paths that are safe to use with include or other file-access plugins. |
|
| 77 | + * |
|
| 78 | + * @var array |
|
| 79 | + */ |
|
| 80 | + protected $allowedDirectories = array(); |
|
| 81 | 81 | |
| 82 | - /** |
|
| 83 | - * Stores the php handling level. |
|
| 84 | - * defaults to self::PHP_REMOVE |
|
| 85 | - * |
|
| 86 | - * @var int |
|
| 87 | - */ |
|
| 88 | - protected $phpHandling = self::PHP_REMOVE; |
|
| 82 | + /** |
|
| 83 | + * Stores the php handling level. |
|
| 84 | + * defaults to self::PHP_REMOVE |
|
| 85 | + * |
|
| 86 | + * @var int |
|
| 87 | + */ |
|
| 88 | + protected $phpHandling = self::PHP_REMOVE; |
|
| 89 | 89 | |
| 90 | - /** |
|
| 91 | - * Stores the constant handling level. |
|
| 92 | - * defaults to self::CONST_DISALLOW |
|
| 93 | - * |
|
| 94 | - * @var bool |
|
| 95 | - */ |
|
| 96 | - protected $constHandling = self::CONST_DISALLOW; |
|
| 90 | + /** |
|
| 91 | + * Stores the constant handling level. |
|
| 92 | + * defaults to self::CONST_DISALLOW |
|
| 93 | + * |
|
| 94 | + * @var bool |
|
| 95 | + */ |
|
| 96 | + protected $constHandling = self::CONST_DISALLOW; |
|
| 97 | 97 | |
| 98 | - /** |
|
| 99 | - * Adds a php function to the allowed list. |
|
| 100 | - * |
|
| 101 | - * @param mixed $func function name or array of function names |
|
| 102 | - */ |
|
| 103 | - public function allowPhpFunction($func) |
|
| 104 | - { |
|
| 105 | - if (is_array($func)) { |
|
| 106 | - foreach ($func as $fname) { |
|
| 107 | - $this->allowedPhpFunctions[strtolower($fname)] = true; |
|
| 108 | - } |
|
| 109 | - } else { |
|
| 110 | - $this->allowedPhpFunctions[strtolower($func)] = true; |
|
| 111 | - } |
|
| 112 | - } |
|
| 98 | + /** |
|
| 99 | + * Adds a php function to the allowed list. |
|
| 100 | + * |
|
| 101 | + * @param mixed $func function name or array of function names |
|
| 102 | + */ |
|
| 103 | + public function allowPhpFunction($func) |
|
| 104 | + { |
|
| 105 | + if (is_array($func)) { |
|
| 106 | + foreach ($func as $fname) { |
|
| 107 | + $this->allowedPhpFunctions[strtolower($fname)] = true; |
|
| 108 | + } |
|
| 109 | + } else { |
|
| 110 | + $this->allowedPhpFunctions[strtolower($func)] = true; |
|
| 111 | + } |
|
| 112 | + } |
|
| 113 | 113 | |
| 114 | - /** |
|
| 115 | - * Removes a php function from the allowed list. |
|
| 116 | - * |
|
| 117 | - * @param mixed $func function name or array of function names |
|
| 118 | - */ |
|
| 119 | - public function disallowPhpFunction($func) |
|
| 120 | - { |
|
| 121 | - if (is_array($func)) { |
|
| 122 | - foreach ($func as $fname) { |
|
| 123 | - unset($this->allowedPhpFunctions[strtolower($fname)]); |
|
| 124 | - } |
|
| 125 | - } else { |
|
| 126 | - unset($this->allowedPhpFunctions[strtolower($func)]); |
|
| 127 | - } |
|
| 128 | - } |
|
| 114 | + /** |
|
| 115 | + * Removes a php function from the allowed list. |
|
| 116 | + * |
|
| 117 | + * @param mixed $func function name or array of function names |
|
| 118 | + */ |
|
| 119 | + public function disallowPhpFunction($func) |
|
| 120 | + { |
|
| 121 | + if (is_array($func)) { |
|
| 122 | + foreach ($func as $fname) { |
|
| 123 | + unset($this->allowedPhpFunctions[strtolower($fname)]); |
|
| 124 | + } |
|
| 125 | + } else { |
|
| 126 | + unset($this->allowedPhpFunctions[strtolower($func)]); |
|
| 127 | + } |
|
| 128 | + } |
|
| 129 | 129 | |
| 130 | - /** |
|
| 131 | - * Returns the list of php functions allowed to run, note that the function names |
|
| 132 | - * are stored in the array keys and not values. |
|
| 133 | - * |
|
| 134 | - * @return array |
|
| 135 | - */ |
|
| 136 | - public function getAllowedPhpFunctions() |
|
| 137 | - { |
|
| 138 | - return $this->allowedPhpFunctions; |
|
| 139 | - } |
|
| 130 | + /** |
|
| 131 | + * Returns the list of php functions allowed to run, note that the function names |
|
| 132 | + * are stored in the array keys and not values. |
|
| 133 | + * |
|
| 134 | + * @return array |
|
| 135 | + */ |
|
| 136 | + public function getAllowedPhpFunctions() |
|
| 137 | + { |
|
| 138 | + return $this->allowedPhpFunctions; |
|
| 139 | + } |
|
| 140 | 140 | |
| 141 | - /** |
|
| 142 | - * Adds a class method to the allowed list, this must be used for |
|
| 143 | - * both static and non static method by providing the class name |
|
| 144 | - * and method name to use. |
|
| 145 | - * |
|
| 146 | - * @param mixed $class class name or array of array('class', 'method') couples |
|
| 147 | - * @param string $method method name |
|
| 148 | - */ |
|
| 149 | - public function allowMethod($class, $method = null) |
|
| 150 | - { |
|
| 151 | - if (is_array($class)) { |
|
| 152 | - foreach ($class as $elem) { |
|
| 153 | - $this->allowedMethods[strtolower($elem[0])][strtolower($elem[1])] = true; |
|
| 154 | - } |
|
| 155 | - } else { |
|
| 156 | - $this->allowedMethods[strtolower($class)][strtolower($method)] = true; |
|
| 157 | - } |
|
| 158 | - } |
|
| 141 | + /** |
|
| 142 | + * Adds a class method to the allowed list, this must be used for |
|
| 143 | + * both static and non static method by providing the class name |
|
| 144 | + * and method name to use. |
|
| 145 | + * |
|
| 146 | + * @param mixed $class class name or array of array('class', 'method') couples |
|
| 147 | + * @param string $method method name |
|
| 148 | + */ |
|
| 149 | + public function allowMethod($class, $method = null) |
|
| 150 | + { |
|
| 151 | + if (is_array($class)) { |
|
| 152 | + foreach ($class as $elem) { |
|
| 153 | + $this->allowedMethods[strtolower($elem[0])][strtolower($elem[1])] = true; |
|
| 154 | + } |
|
| 155 | + } else { |
|
| 156 | + $this->allowedMethods[strtolower($class)][strtolower($method)] = true; |
|
| 157 | + } |
|
| 158 | + } |
|
| 159 | 159 | |
| 160 | - /** |
|
| 161 | - * Removes a class method from the allowed list. |
|
| 162 | - * |
|
| 163 | - * @param mixed $class class name or array of array('class', 'method') couples |
|
| 164 | - * @param string $method method name |
|
| 165 | - */ |
|
| 166 | - public function disallowMethod($class, $method = null) |
|
| 167 | - { |
|
| 168 | - if (is_array($class)) { |
|
| 169 | - foreach ($class as $elem) { |
|
| 170 | - unset($this->allowedMethods[strtolower($elem[0])][strtolower($elem[1])]); |
|
| 171 | - } |
|
| 172 | - } else { |
|
| 173 | - unset($this->allowedMethods[strtolower($class)][strtolower($method)]); |
|
| 174 | - } |
|
| 175 | - } |
|
| 160 | + /** |
|
| 161 | + * Removes a class method from the allowed list. |
|
| 162 | + * |
|
| 163 | + * @param mixed $class class name or array of array('class', 'method') couples |
|
| 164 | + * @param string $method method name |
|
| 165 | + */ |
|
| 166 | + public function disallowMethod($class, $method = null) |
|
| 167 | + { |
|
| 168 | + if (is_array($class)) { |
|
| 169 | + foreach ($class as $elem) { |
|
| 170 | + unset($this->allowedMethods[strtolower($elem[0])][strtolower($elem[1])]); |
|
| 171 | + } |
|
| 172 | + } else { |
|
| 173 | + unset($this->allowedMethods[strtolower($class)][strtolower($method)]); |
|
| 174 | + } |
|
| 175 | + } |
|
| 176 | 176 | |
| 177 | - /** |
|
| 178 | - * Returns the list of class methods allowed to run, note that the class names |
|
| 179 | - * and method names are stored in the array keys and not values. |
|
| 180 | - * |
|
| 181 | - * @return array |
|
| 182 | - */ |
|
| 183 | - public function getAllowedMethods() |
|
| 184 | - { |
|
| 185 | - return $this->allowedMethods; |
|
| 186 | - } |
|
| 177 | + /** |
|
| 178 | + * Returns the list of class methods allowed to run, note that the class names |
|
| 179 | + * and method names are stored in the array keys and not values. |
|
| 180 | + * |
|
| 181 | + * @return array |
|
| 182 | + */ |
|
| 183 | + public function getAllowedMethods() |
|
| 184 | + { |
|
| 185 | + return $this->allowedMethods; |
|
| 186 | + } |
|
| 187 | 187 | |
| 188 | - /** |
|
| 189 | - * Adds a directory to the safelist for includes and other file-access plugins. |
|
| 190 | - * note that all the includePath directories you provide to the Dwoo_Template_File class |
|
| 191 | - * are automatically marked as safe |
|
| 192 | - * |
|
| 193 | - * @param mixed $path a path name or an array of paths |
|
| 194 | - */ |
|
| 195 | - public function allowDirectory($path) |
|
| 196 | - { |
|
| 197 | - if (is_array($path)) { |
|
| 198 | - foreach ($path as $dir) { |
|
| 199 | - $this->allowedDirectories[realpath($dir)] = true; |
|
| 200 | - } |
|
| 201 | - } else { |
|
| 202 | - $this->allowedDirectories[realpath($path)] = true; |
|
| 203 | - } |
|
| 204 | - } |
|
| 188 | + /** |
|
| 189 | + * Adds a directory to the safelist for includes and other file-access plugins. |
|
| 190 | + * note that all the includePath directories you provide to the Dwoo_Template_File class |
|
| 191 | + * are automatically marked as safe |
|
| 192 | + * |
|
| 193 | + * @param mixed $path a path name or an array of paths |
|
| 194 | + */ |
|
| 195 | + public function allowDirectory($path) |
|
| 196 | + { |
|
| 197 | + if (is_array($path)) { |
|
| 198 | + foreach ($path as $dir) { |
|
| 199 | + $this->allowedDirectories[realpath($dir)] = true; |
|
| 200 | + } |
|
| 201 | + } else { |
|
| 202 | + $this->allowedDirectories[realpath($path)] = true; |
|
| 203 | + } |
|
| 204 | + } |
|
| 205 | 205 | |
| 206 | - /** |
|
| 207 | - * Removes a directory from the safe list. |
|
| 208 | - * |
|
| 209 | - * @param mixed $path a path name or an array of paths |
|
| 210 | - */ |
|
| 211 | - public function disallowDirectory($path) |
|
| 212 | - { |
|
| 213 | - if (is_array($path)) { |
|
| 214 | - foreach ($path as $dir) { |
|
| 215 | - unset($this->allowedDirectories[realpath($dir)]); |
|
| 216 | - } |
|
| 217 | - } else { |
|
| 218 | - unset($this->allowedDirectories[realpath($path)]); |
|
| 219 | - } |
|
| 220 | - } |
|
| 206 | + /** |
|
| 207 | + * Removes a directory from the safe list. |
|
| 208 | + * |
|
| 209 | + * @param mixed $path a path name or an array of paths |
|
| 210 | + */ |
|
| 211 | + public function disallowDirectory($path) |
|
| 212 | + { |
|
| 213 | + if (is_array($path)) { |
|
| 214 | + foreach ($path as $dir) { |
|
| 215 | + unset($this->allowedDirectories[realpath($dir)]); |
|
| 216 | + } |
|
| 217 | + } else { |
|
| 218 | + unset($this->allowedDirectories[realpath($path)]); |
|
| 219 | + } |
|
| 220 | + } |
|
| 221 | 221 | |
| 222 | - /** |
|
| 223 | - * Returns the list of safe paths, note that the paths are stored in the array |
|
| 224 | - * keys and not values. |
|
| 225 | - * |
|
| 226 | - * @return array |
|
| 227 | - */ |
|
| 228 | - public function getAllowedDirectories() |
|
| 229 | - { |
|
| 230 | - return $this->allowedDirectories; |
|
| 231 | - } |
|
| 222 | + /** |
|
| 223 | + * Returns the list of safe paths, note that the paths are stored in the array |
|
| 224 | + * keys and not values. |
|
| 225 | + * |
|
| 226 | + * @return array |
|
| 227 | + */ |
|
| 228 | + public function getAllowedDirectories() |
|
| 229 | + { |
|
| 230 | + return $this->allowedDirectories; |
|
| 231 | + } |
|
| 232 | 232 | |
| 233 | - /** |
|
| 234 | - * Sets the php handling level, defaults to REMOVE. |
|
| 235 | - * |
|
| 236 | - * @param int $level one of the Dwoo_Security_Policy::PHP_* constants |
|
| 237 | - */ |
|
| 238 | - public function setPhpHandling($level = self::PHP_REMOVE) |
|
| 239 | - { |
|
| 240 | - $this->phpHandling = $level; |
|
| 241 | - } |
|
| 233 | + /** |
|
| 234 | + * Sets the php handling level, defaults to REMOVE. |
|
| 235 | + * |
|
| 236 | + * @param int $level one of the Dwoo_Security_Policy::PHP_* constants |
|
| 237 | + */ |
|
| 238 | + public function setPhpHandling($level = self::PHP_REMOVE) |
|
| 239 | + { |
|
| 240 | + $this->phpHandling = $level; |
|
| 241 | + } |
|
| 242 | 242 | |
| 243 | - /** |
|
| 244 | - * Returns the php handling level. |
|
| 245 | - * |
|
| 246 | - * @return int the current level, one of the Dwoo_Security_Policy::PHP_* constants |
|
| 247 | - */ |
|
| 248 | - public function getPhpHandling() |
|
| 249 | - { |
|
| 250 | - return $this->phpHandling; |
|
| 251 | - } |
|
| 243 | + /** |
|
| 244 | + * Returns the php handling level. |
|
| 245 | + * |
|
| 246 | + * @return int the current level, one of the Dwoo_Security_Policy::PHP_* constants |
|
| 247 | + */ |
|
| 248 | + public function getPhpHandling() |
|
| 249 | + { |
|
| 250 | + return $this->phpHandling; |
|
| 251 | + } |
|
| 252 | 252 | |
| 253 | - /** |
|
| 254 | - * Sets the constant handling level, defaults to CONST_DISALLOW. |
|
| 255 | - * |
|
| 256 | - * @param bool $level one of the Dwoo_Security_Policy::CONST_* constants |
|
| 257 | - */ |
|
| 258 | - public function setConstantHandling($level = self::CONST_DISALLOW) |
|
| 259 | - { |
|
| 260 | - $this->constHandling = $level; |
|
| 261 | - } |
|
| 253 | + /** |
|
| 254 | + * Sets the constant handling level, defaults to CONST_DISALLOW. |
|
| 255 | + * |
|
| 256 | + * @param bool $level one of the Dwoo_Security_Policy::CONST_* constants |
|
| 257 | + */ |
|
| 258 | + public function setConstantHandling($level = self::CONST_DISALLOW) |
|
| 259 | + { |
|
| 260 | + $this->constHandling = $level; |
|
| 261 | + } |
|
| 262 | 262 | |
| 263 | - /** |
|
| 264 | - * Returns the constant handling level. |
|
| 265 | - * |
|
| 266 | - * @return bool the current level, one of the Dwoo_Security_Policy::CONST_* constants |
|
| 267 | - */ |
|
| 268 | - public function getConstantHandling() |
|
| 269 | - { |
|
| 270 | - return $this->constHandling; |
|
| 271 | - } |
|
| 263 | + /** |
|
| 264 | + * Returns the constant handling level. |
|
| 265 | + * |
|
| 266 | + * @return bool the current level, one of the Dwoo_Security_Policy::CONST_* constants |
|
| 267 | + */ |
|
| 268 | + public function getConstantHandling() |
|
| 269 | + { |
|
| 270 | + return $this->constHandling; |
|
| 271 | + } |
|
| 272 | 272 | |
| 273 | - /** |
|
| 274 | - * This is used at run time to check whether method calls are allowed or not. |
|
| 275 | - * |
|
| 276 | - * @param Core $dwoo dwoo instance that calls this |
|
| 277 | - * @param object $obj any object on which the method must be called |
|
| 278 | - * @param string $method lowercased method name |
|
| 279 | - * @param array $args arguments array |
|
| 280 | - * |
|
| 281 | - * @return mixed result of method call or unll + E_USER_NOTICE if not allowed |
|
| 282 | - */ |
|
| 283 | - public function callMethod(Core $dwoo, $obj, $method, $args) |
|
| 284 | - { |
|
| 285 | - foreach ($this->allowedMethods as $class => $methods) { |
|
| 286 | - if (!isset($methods[$method])) { |
|
| 287 | - continue; |
|
| 288 | - } |
|
| 289 | - if ($obj instanceof $class) { |
|
| 290 | - return call_user_func_array(array($obj, $method), $args); |
|
| 291 | - } |
|
| 292 | - } |
|
| 293 | - $dwoo->triggerError('The current security policy prevents you from calling ' . get_class($obj) . '::' . $method . '()'); |
|
| 273 | + /** |
|
| 274 | + * This is used at run time to check whether method calls are allowed or not. |
|
| 275 | + * |
|
| 276 | + * @param Core $dwoo dwoo instance that calls this |
|
| 277 | + * @param object $obj any object on which the method must be called |
|
| 278 | + * @param string $method lowercased method name |
|
| 279 | + * @param array $args arguments array |
|
| 280 | + * |
|
| 281 | + * @return mixed result of method call or unll + E_USER_NOTICE if not allowed |
|
| 282 | + */ |
|
| 283 | + public function callMethod(Core $dwoo, $obj, $method, $args) |
|
| 284 | + { |
|
| 285 | + foreach ($this->allowedMethods as $class => $methods) { |
|
| 286 | + if (!isset($methods[$method])) { |
|
| 287 | + continue; |
|
| 288 | + } |
|
| 289 | + if ($obj instanceof $class) { |
|
| 290 | + return call_user_func_array(array($obj, $method), $args); |
|
| 291 | + } |
|
| 292 | + } |
|
| 293 | + $dwoo->triggerError('The current security policy prevents you from calling ' . get_class($obj) . '::' . $method . '()'); |
|
| 294 | 294 | |
| 295 | - return null; |
|
| 296 | - } |
|
| 295 | + return null; |
|
| 296 | + } |
|
| 297 | 297 | |
| 298 | - /** |
|
| 299 | - * This is used at compile time to check whether static method calls are allowed or not. |
|
| 300 | - * |
|
| 301 | - * @param mixed $class lowercased class name or array('class', 'method') couple |
|
| 302 | - * @param string $method lowercased method name |
|
| 303 | - * |
|
| 304 | - * @return bool |
|
| 305 | - */ |
|
| 306 | - public function isMethodAllowed($class, $method = null) |
|
| 307 | - { |
|
| 308 | - if (is_array($class)) { |
|
| 309 | - list($class, $method) = $class; |
|
| 310 | - } |
|
| 311 | - foreach ($this->allowedMethods as $allowedClass => $methods) { |
|
| 312 | - if (!isset($methods[$method])) { |
|
| 313 | - continue; |
|
| 314 | - } |
|
| 315 | - if ($class === $allowedClass || is_subclass_of($class, $allowedClass)) { |
|
| 316 | - return true; |
|
| 317 | - } |
|
| 318 | - } |
|
| 298 | + /** |
|
| 299 | + * This is used at compile time to check whether static method calls are allowed or not. |
|
| 300 | + * |
|
| 301 | + * @param mixed $class lowercased class name or array('class', 'method') couple |
|
| 302 | + * @param string $method lowercased method name |
|
| 303 | + * |
|
| 304 | + * @return bool |
|
| 305 | + */ |
|
| 306 | + public function isMethodAllowed($class, $method = null) |
|
| 307 | + { |
|
| 308 | + if (is_array($class)) { |
|
| 309 | + list($class, $method) = $class; |
|
| 310 | + } |
|
| 311 | + foreach ($this->allowedMethods as $allowedClass => $methods) { |
|
| 312 | + if (!isset($methods[$method])) { |
|
| 313 | + continue; |
|
| 314 | + } |
|
| 315 | + if ($class === $allowedClass || is_subclass_of($class, $allowedClass)) { |
|
| 316 | + return true; |
|
| 317 | + } |
|
| 318 | + } |
|
| 319 | 319 | |
| 320 | - return false; |
|
| 321 | - } |
|
| 320 | + return false; |
|
| 321 | + } |
|
| 322 | 322 | } |
@@ -29,279 +29,279 @@ |
||
| 29 | 29 | */ |
| 30 | 30 | class File extends String |
| 31 | 31 | { |
| 32 | - /** |
|
| 33 | - * Template filename. |
|
| 34 | - * |
|
| 35 | - * @var string |
|
| 36 | - */ |
|
| 37 | - protected $file; |
|
| 32 | + /** |
|
| 33 | + * Template filename. |
|
| 34 | + * |
|
| 35 | + * @var string |
|
| 36 | + */ |
|
| 37 | + protected $file; |
|
| 38 | 38 | |
| 39 | - /** |
|
| 40 | - * Include path(s) to look into to find this template. |
|
| 41 | - * |
|
| 42 | - * @var array |
|
| 43 | - */ |
|
| 44 | - protected $includePath = null; |
|
| 39 | + /** |
|
| 40 | + * Include path(s) to look into to find this template. |
|
| 41 | + * |
|
| 42 | + * @var array |
|
| 43 | + */ |
|
| 44 | + protected $includePath = null; |
|
| 45 | 45 | |
| 46 | - /** |
|
| 47 | - * Resolved path cache when looking for a file in multiple include paths. |
|
| 48 | - * this is reset when the include path is changed |
|
| 49 | - * |
|
| 50 | - * @var string |
|
| 51 | - */ |
|
| 52 | - protected $resolvedPath = null; |
|
| 46 | + /** |
|
| 47 | + * Resolved path cache when looking for a file in multiple include paths. |
|
| 48 | + * this is reset when the include path is changed |
|
| 49 | + * |
|
| 50 | + * @var string |
|
| 51 | + */ |
|
| 52 | + protected $resolvedPath = null; |
|
| 53 | 53 | |
| 54 | - /** |
|
| 55 | - * Creates a template from a file. |
|
| 56 | - * |
|
| 57 | - * @param string $file the path to the template file, make sure it exists |
|
| 58 | - * @param int $cacheTime duration of the cache validity for this template, |
|
| 59 | - * if null it defaults to the Dwoo instance that will |
|
| 60 | - * render this template |
|
| 61 | - * @param string $cacheId the unique cache identifier of this page or anything else that |
|
| 62 | - * makes this template's content unique, if null it defaults |
|
| 63 | - * to the current url |
|
| 64 | - * @param string $compileId the unique compiled identifier, which is used to distinguish this |
|
| 65 | - * template from others, if null it defaults to the filename+bits of the path |
|
| 66 | - * @param mixed $includePath a string for a single path to look into for the given file, or an array of paths |
|
| 67 | - */ |
|
| 68 | - public function __construct($file, $cacheTime = null, $cacheId = null, $compileId = null, $includePath = null) |
|
| 69 | - { |
|
| 70 | - $this->file = $file; |
|
| 71 | - $this->name = basename($file); |
|
| 72 | - $this->cacheTime = $cacheTime; |
|
| 54 | + /** |
|
| 55 | + * Creates a template from a file. |
|
| 56 | + * |
|
| 57 | + * @param string $file the path to the template file, make sure it exists |
|
| 58 | + * @param int $cacheTime duration of the cache validity for this template, |
|
| 59 | + * if null it defaults to the Dwoo instance that will |
|
| 60 | + * render this template |
|
| 61 | + * @param string $cacheId the unique cache identifier of this page or anything else that |
|
| 62 | + * makes this template's content unique, if null it defaults |
|
| 63 | + * to the current url |
|
| 64 | + * @param string $compileId the unique compiled identifier, which is used to distinguish this |
|
| 65 | + * template from others, if null it defaults to the filename+bits of the path |
|
| 66 | + * @param mixed $includePath a string for a single path to look into for the given file, or an array of paths |
|
| 67 | + */ |
|
| 68 | + public function __construct($file, $cacheTime = null, $cacheId = null, $compileId = null, $includePath = null) |
|
| 69 | + { |
|
| 70 | + $this->file = $file; |
|
| 71 | + $this->name = basename($file); |
|
| 72 | + $this->cacheTime = $cacheTime; |
|
| 73 | 73 | |
| 74 | - if ($compileId !== null) { |
|
| 75 | - $this->compileId = str_replace('../', '__', strtr($compileId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 76 | - } |
|
| 74 | + if ($compileId !== null) { |
|
| 75 | + $this->compileId = str_replace('../', '__', strtr($compileId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 76 | + } |
|
| 77 | 77 | |
| 78 | - if ($cacheId !== null) { |
|
| 79 | - $this->cacheId = str_replace('../', '__', strtr($cacheId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 80 | - } |
|
| 78 | + if ($cacheId !== null) { |
|
| 79 | + $this->cacheId = str_replace('../', '__', strtr($cacheId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 80 | + } |
|
| 81 | 81 | |
| 82 | - if (is_string($includePath)) { |
|
| 83 | - $this->includePath = array($includePath); |
|
| 84 | - } elseif (is_array($includePath)) { |
|
| 85 | - $this->includePath = $includePath; |
|
| 86 | - } |
|
| 87 | - } |
|
| 82 | + if (is_string($includePath)) { |
|
| 83 | + $this->includePath = array($includePath); |
|
| 84 | + } elseif (is_array($includePath)) { |
|
| 85 | + $this->includePath = $includePath; |
|
| 86 | + } |
|
| 87 | + } |
|
| 88 | 88 | |
| 89 | - /** |
|
| 90 | - * Sets the include path(s) to where the given template filename must be looked up. |
|
| 91 | - * |
|
| 92 | - * @param mixed $paths the path to look into, can be string for a single path or an array of paths |
|
| 93 | - */ |
|
| 94 | - public function setIncludePath($paths) |
|
| 95 | - { |
|
| 96 | - if (is_array($paths) === false) { |
|
| 97 | - $paths = array($paths); |
|
| 98 | - } |
|
| 89 | + /** |
|
| 90 | + * Sets the include path(s) to where the given template filename must be looked up. |
|
| 91 | + * |
|
| 92 | + * @param mixed $paths the path to look into, can be string for a single path or an array of paths |
|
| 93 | + */ |
|
| 94 | + public function setIncludePath($paths) |
|
| 95 | + { |
|
| 96 | + if (is_array($paths) === false) { |
|
| 97 | + $paths = array($paths); |
|
| 98 | + } |
|
| 99 | 99 | |
| 100 | - $this->includePath = $paths; |
|
| 101 | - $this->resolvedPath = null; |
|
| 102 | - } |
|
| 100 | + $this->includePath = $paths; |
|
| 101 | + $this->resolvedPath = null; |
|
| 102 | + } |
|
| 103 | 103 | |
| 104 | - /** |
|
| 105 | - * Return the current include path(s). |
|
| 106 | - * |
|
| 107 | - * @return array |
|
| 108 | - */ |
|
| 109 | - public function getIncludePath() |
|
| 110 | - { |
|
| 111 | - return $this->includePath; |
|
| 112 | - } |
|
| 104 | + /** |
|
| 105 | + * Return the current include path(s). |
|
| 106 | + * |
|
| 107 | + * @return array |
|
| 108 | + */ |
|
| 109 | + public function getIncludePath() |
|
| 110 | + { |
|
| 111 | + return $this->includePath; |
|
| 112 | + } |
|
| 113 | 113 | |
| 114 | - /** |
|
| 115 | - * Checks if compiled file is valid (exists and it's the modification is greater or |
|
| 116 | - * equal to the modification time of the template file). |
|
| 117 | - * |
|
| 118 | - * @param string file |
|
| 119 | - * |
|
| 120 | - * @return bool True cache file existance and it's modification time |
|
| 121 | - */ |
|
| 122 | - protected function isValidCompiledFile($file) |
|
| 123 | - { |
|
| 124 | - return parent::isValidCompiledFile($file) && (int)$this->getUid() <= filemtime($file); |
|
| 125 | - } |
|
| 114 | + /** |
|
| 115 | + * Checks if compiled file is valid (exists and it's the modification is greater or |
|
| 116 | + * equal to the modification time of the template file). |
|
| 117 | + * |
|
| 118 | + * @param string file |
|
| 119 | + * |
|
| 120 | + * @return bool True cache file existance and it's modification time |
|
| 121 | + */ |
|
| 122 | + protected function isValidCompiledFile($file) |
|
| 123 | + { |
|
| 124 | + return parent::isValidCompiledFile($file) && (int)$this->getUid() <= filemtime($file); |
|
| 125 | + } |
|
| 126 | 126 | |
| 127 | - /** |
|
| 128 | - * Returns the template source of this template. |
|
| 129 | - * |
|
| 130 | - * @return string |
|
| 131 | - */ |
|
| 132 | - public function getSource() |
|
| 133 | - { |
|
| 134 | - return file_get_contents($this->getResourceIdentifier()); |
|
| 135 | - } |
|
| 127 | + /** |
|
| 128 | + * Returns the template source of this template. |
|
| 129 | + * |
|
| 130 | + * @return string |
|
| 131 | + */ |
|
| 132 | + public function getSource() |
|
| 133 | + { |
|
| 134 | + return file_get_contents($this->getResourceIdentifier()); |
|
| 135 | + } |
|
| 136 | 136 | |
| 137 | - /** |
|
| 138 | - * Returns the resource name for this template class. |
|
| 139 | - * |
|
| 140 | - * @return string |
|
| 141 | - */ |
|
| 142 | - public function getResourceName() |
|
| 143 | - { |
|
| 144 | - return 'file'; |
|
| 145 | - } |
|
| 137 | + /** |
|
| 138 | + * Returns the resource name for this template class. |
|
| 139 | + * |
|
| 140 | + * @return string |
|
| 141 | + */ |
|
| 142 | + public function getResourceName() |
|
| 143 | + { |
|
| 144 | + return 'file'; |
|
| 145 | + } |
|
| 146 | 146 | |
| 147 | - /** |
|
| 148 | - * Returns this template's source filename. |
|
| 149 | - * |
|
| 150 | - * @return string |
|
| 151 | - * @throws DwooException |
|
| 152 | - */ |
|
| 153 | - public function getResourceIdentifier() |
|
| 154 | - { |
|
| 155 | - if ($this->resolvedPath !== null) { |
|
| 156 | - return $this->resolvedPath; |
|
| 157 | - } elseif ($this->includePath === null) { |
|
| 158 | - return $this->file; |
|
| 159 | - } else { |
|
| 160 | - foreach ($this->includePath as $path) { |
|
| 161 | - $path = rtrim($path, DIRECTORY_SEPARATOR); |
|
| 162 | - if (file_exists($path . DIRECTORY_SEPARATOR . $this->file) === true) { |
|
| 163 | - $this->resolvedPath = $path . DIRECTORY_SEPARATOR . $this->file; |
|
| 147 | + /** |
|
| 148 | + * Returns this template's source filename. |
|
| 149 | + * |
|
| 150 | + * @return string |
|
| 151 | + * @throws DwooException |
|
| 152 | + */ |
|
| 153 | + public function getResourceIdentifier() |
|
| 154 | + { |
|
| 155 | + if ($this->resolvedPath !== null) { |
|
| 156 | + return $this->resolvedPath; |
|
| 157 | + } elseif ($this->includePath === null) { |
|
| 158 | + return $this->file; |
|
| 159 | + } else { |
|
| 160 | + foreach ($this->includePath as $path) { |
|
| 161 | + $path = rtrim($path, DIRECTORY_SEPARATOR); |
|
| 162 | + if (file_exists($path . DIRECTORY_SEPARATOR . $this->file) === true) { |
|
| 163 | + $this->resolvedPath = $path . DIRECTORY_SEPARATOR . $this->file; |
|
| 164 | 164 | |
| 165 | - return $this->resolvedPath; |
|
| 166 | - } |
|
| 167 | - } |
|
| 165 | + return $this->resolvedPath; |
|
| 166 | + } |
|
| 167 | + } |
|
| 168 | 168 | |
| 169 | - throw new DwooException('Template "' . $this->file . '" could not be found in any of your include path(s)'); |
|
| 170 | - } |
|
| 171 | - } |
|
| 169 | + throw new DwooException('Template "' . $this->file . '" could not be found in any of your include path(s)'); |
|
| 170 | + } |
|
| 171 | + } |
|
| 172 | 172 | |
| 173 | - /** |
|
| 174 | - * Returns an unique value identifying the current version of this template, |
|
| 175 | - * in this case it's the unix timestamp of the last modification. |
|
| 176 | - * |
|
| 177 | - * @return string |
|
| 178 | - */ |
|
| 179 | - public function getUid() |
|
| 180 | - { |
|
| 181 | - return (string)filemtime($this->getResourceIdentifier()); |
|
| 182 | - } |
|
| 173 | + /** |
|
| 174 | + * Returns an unique value identifying the current version of this template, |
|
| 175 | + * in this case it's the unix timestamp of the last modification. |
|
| 176 | + * |
|
| 177 | + * @return string |
|
| 178 | + */ |
|
| 179 | + public function getUid() |
|
| 180 | + { |
|
| 181 | + return (string)filemtime($this->getResourceIdentifier()); |
|
| 182 | + } |
|
| 183 | 183 | |
| 184 | - /** |
|
| 185 | - * Returns a new template object from the given include name, null if no include is |
|
| 186 | - * possible (resource not found), or false if include is not permitted by this resource type. |
|
| 187 | - * |
|
| 188 | - * @param Core $core the dwoo instance requiring it |
|
| 189 | - * @param mixed $resourceId the filename (relative to this template's dir) of the template to |
|
| 190 | - * include |
|
| 191 | - * @param int $cacheTime duration of the cache validity for this template, if null it defaults |
|
| 192 | - * to the Dwoo instance that will render this template if null it |
|
| 193 | - * defaults to the Dwoo instance that will render this template if null |
|
| 194 | - * it defaults to the Dwoo instance that will render this template |
|
| 195 | - * @param string $cacheId the unique cache identifier of this page or anything else that makes |
|
| 196 | - * this template's content unique, if null it defaults to the current |
|
| 197 | - * url makes this template's content unique, if null it defaults to the |
|
| 198 | - * current url makes this template's content unique, if null it defaults |
|
| 199 | - * to the current url |
|
| 200 | - * @param string $compileId the unique compiled identifier, which is used to distinguish this |
|
| 201 | - * template from others, if null it defaults to the filename+bits of the |
|
| 202 | - * path template from others, if null it defaults to the filename+bits |
|
| 203 | - * of the path template from others, if null it defaults to the |
|
| 204 | - * filename+bits of the path |
|
| 205 | - * @param ITemplate $parentTemplate the template that is requesting a new template object (through an |
|
| 206 | - * include, extends or any other plugin) an include, extends or any |
|
| 207 | - * other plugin) an include, extends or any other plugin) |
|
| 208 | - * |
|
| 209 | - * @return TemplateFile|null |
|
| 210 | - * @throws DwooException |
|
| 211 | - * @throws SecurityException |
|
| 212 | - */ |
|
| 213 | - public static function templateFactory(Core $core, $resourceId, $cacheTime = null, $cacheId = null, $compileId = null, ITemplate $parentTemplate = null) |
|
| 214 | - { |
|
| 215 | - if (DIRECTORY_SEPARATOR === '\\') { |
|
| 216 | - $resourceId = str_replace( |
|
| 217 | - array("\t", "\n", "\r", "\f", "\v"), array( |
|
| 218 | - '\\t', |
|
| 219 | - '\\n', |
|
| 220 | - '\\r', |
|
| 221 | - '\\f', |
|
| 222 | - '\\v' |
|
| 223 | - ), $resourceId |
|
| 224 | - ); |
|
| 225 | - } |
|
| 226 | - $resourceId = strtr($resourceId, '\\', '/'); |
|
| 184 | + /** |
|
| 185 | + * Returns a new template object from the given include name, null if no include is |
|
| 186 | + * possible (resource not found), or false if include is not permitted by this resource type. |
|
| 187 | + * |
|
| 188 | + * @param Core $core the dwoo instance requiring it |
|
| 189 | + * @param mixed $resourceId the filename (relative to this template's dir) of the template to |
|
| 190 | + * include |
|
| 191 | + * @param int $cacheTime duration of the cache validity for this template, if null it defaults |
|
| 192 | + * to the Dwoo instance that will render this template if null it |
|
| 193 | + * defaults to the Dwoo instance that will render this template if null |
|
| 194 | + * it defaults to the Dwoo instance that will render this template |
|
| 195 | + * @param string $cacheId the unique cache identifier of this page or anything else that makes |
|
| 196 | + * this template's content unique, if null it defaults to the current |
|
| 197 | + * url makes this template's content unique, if null it defaults to the |
|
| 198 | + * current url makes this template's content unique, if null it defaults |
|
| 199 | + * to the current url |
|
| 200 | + * @param string $compileId the unique compiled identifier, which is used to distinguish this |
|
| 201 | + * template from others, if null it defaults to the filename+bits of the |
|
| 202 | + * path template from others, if null it defaults to the filename+bits |
|
| 203 | + * of the path template from others, if null it defaults to the |
|
| 204 | + * filename+bits of the path |
|
| 205 | + * @param ITemplate $parentTemplate the template that is requesting a new template object (through an |
|
| 206 | + * include, extends or any other plugin) an include, extends or any |
|
| 207 | + * other plugin) an include, extends or any other plugin) |
|
| 208 | + * |
|
| 209 | + * @return TemplateFile|null |
|
| 210 | + * @throws DwooException |
|
| 211 | + * @throws SecurityException |
|
| 212 | + */ |
|
| 213 | + public static function templateFactory(Core $core, $resourceId, $cacheTime = null, $cacheId = null, $compileId = null, ITemplate $parentTemplate = null) |
|
| 214 | + { |
|
| 215 | + if (DIRECTORY_SEPARATOR === '\\') { |
|
| 216 | + $resourceId = str_replace( |
|
| 217 | + array("\t", "\n", "\r", "\f", "\v"), array( |
|
| 218 | + '\\t', |
|
| 219 | + '\\n', |
|
| 220 | + '\\r', |
|
| 221 | + '\\f', |
|
| 222 | + '\\v' |
|
| 223 | + ), $resourceId |
|
| 224 | + ); |
|
| 225 | + } |
|
| 226 | + $resourceId = strtr($resourceId, '\\', '/'); |
|
| 227 | 227 | |
| 228 | - $includePath = null; |
|
| 228 | + $includePath = null; |
|
| 229 | 229 | |
| 230 | - if (file_exists($resourceId) === false) { |
|
| 231 | - if ($parentTemplate === null) { |
|
| 232 | - $parentTemplate = $core->getTemplate(); |
|
| 233 | - } |
|
| 234 | - if ($parentTemplate instanceof self) { |
|
| 235 | - if ($includePath = $parentTemplate->getIncludePath()) { |
|
| 236 | - if (strstr($resourceId, '../')) { |
|
| 237 | - throw new DwooException('When using an include path you can not reference a template into a parent directory (using ../)'); |
|
| 238 | - } |
|
| 239 | - } else { |
|
| 240 | - $resourceId = dirname($parentTemplate->getResourceIdentifier()) . DIRECTORY_SEPARATOR . $resourceId; |
|
| 241 | - if (file_exists($resourceId) === false) { |
|
| 242 | - return null; |
|
| 243 | - } |
|
| 244 | - } |
|
| 245 | - } else { |
|
| 246 | - return null; |
|
| 247 | - } |
|
| 248 | - } |
|
| 230 | + if (file_exists($resourceId) === false) { |
|
| 231 | + if ($parentTemplate === null) { |
|
| 232 | + $parentTemplate = $core->getTemplate(); |
|
| 233 | + } |
|
| 234 | + if ($parentTemplate instanceof self) { |
|
| 235 | + if ($includePath = $parentTemplate->getIncludePath()) { |
|
| 236 | + if (strstr($resourceId, '../')) { |
|
| 237 | + throw new DwooException('When using an include path you can not reference a template into a parent directory (using ../)'); |
|
| 238 | + } |
|
| 239 | + } else { |
|
| 240 | + $resourceId = dirname($parentTemplate->getResourceIdentifier()) . DIRECTORY_SEPARATOR . $resourceId; |
|
| 241 | + if (file_exists($resourceId) === false) { |
|
| 242 | + return null; |
|
| 243 | + } |
|
| 244 | + } |
|
| 245 | + } else { |
|
| 246 | + return null; |
|
| 247 | + } |
|
| 248 | + } |
|
| 249 | 249 | |
| 250 | - if ($policy = $core->getSecurityPolicy()) { |
|
| 251 | - while (true) { |
|
| 252 | - if (preg_match('{^([a-z]+?)://}i', $resourceId)) { |
|
| 253 | - throw new SecurityException('The security policy prevents you to read files from external sources : <em>' . $resourceId . '</em>.'); |
|
| 254 | - } |
|
| 250 | + if ($policy = $core->getSecurityPolicy()) { |
|
| 251 | + while (true) { |
|
| 252 | + if (preg_match('{^([a-z]+?)://}i', $resourceId)) { |
|
| 253 | + throw new SecurityException('The security policy prevents you to read files from external sources : <em>' . $resourceId . '</em>.'); |
|
| 254 | + } |
|
| 255 | 255 | |
| 256 | - if ($includePath) { |
|
| 257 | - break; |
|
| 258 | - } |
|
| 256 | + if ($includePath) { |
|
| 257 | + break; |
|
| 258 | + } |
|
| 259 | 259 | |
| 260 | - $resourceId = realpath($resourceId); |
|
| 261 | - $dirs = $policy->getAllowedDirectories(); |
|
| 262 | - foreach ($dirs as $dir => $dummy) { |
|
| 263 | - if (strpos($resourceId, $dir) === 0) { |
|
| 264 | - break 2; |
|
| 265 | - } |
|
| 266 | - } |
|
| 267 | - throw new SecurityException('The security policy prevents you to read <em>' . $resourceId . '</em>'); |
|
| 268 | - } |
|
| 269 | - } |
|
| 260 | + $resourceId = realpath($resourceId); |
|
| 261 | + $dirs = $policy->getAllowedDirectories(); |
|
| 262 | + foreach ($dirs as $dir => $dummy) { |
|
| 263 | + if (strpos($resourceId, $dir) === 0) { |
|
| 264 | + break 2; |
|
| 265 | + } |
|
| 266 | + } |
|
| 267 | + throw new SecurityException('The security policy prevents you to read <em>' . $resourceId . '</em>'); |
|
| 268 | + } |
|
| 269 | + } |
|
| 270 | 270 | |
| 271 | - $class = 'Dwoo\Template\File'; |
|
| 272 | - if ($parentTemplate) { |
|
| 273 | - $class = get_class($parentTemplate); |
|
| 274 | - } |
|
| 271 | + $class = 'Dwoo\Template\File'; |
|
| 272 | + if ($parentTemplate) { |
|
| 273 | + $class = get_class($parentTemplate); |
|
| 274 | + } |
|
| 275 | 275 | |
| 276 | - return new $class($resourceId, $cacheTime, $cacheId, $compileId, $includePath); |
|
| 277 | - } |
|
| 276 | + return new $class($resourceId, $cacheTime, $cacheId, $compileId, $includePath); |
|
| 277 | + } |
|
| 278 | 278 | |
| 279 | - /** |
|
| 280 | - * Returns the full compiled file name and assigns a default value to it if |
|
| 281 | - * required. |
|
| 282 | - * |
|
| 283 | - * @param Core $core the dwoo instance that requests the file name |
|
| 284 | - * |
|
| 285 | - * @return string the full path to the compiled file |
|
| 286 | - */ |
|
| 287 | - protected function getCompiledFilename(Core $core) |
|
| 288 | - { |
|
| 289 | - // no compile id was provided, set default |
|
| 290 | - if ($this->compileId === null) { |
|
| 291 | - $this->compileId = str_replace('../', '__', strtr($this->getResourceIdentifier(), '\\:', '/-')); |
|
| 292 | - } |
|
| 279 | + /** |
|
| 280 | + * Returns the full compiled file name and assigns a default value to it if |
|
| 281 | + * required. |
|
| 282 | + * |
|
| 283 | + * @param Core $core the dwoo instance that requests the file name |
|
| 284 | + * |
|
| 285 | + * @return string the full path to the compiled file |
|
| 286 | + */ |
|
| 287 | + protected function getCompiledFilename(Core $core) |
|
| 288 | + { |
|
| 289 | + // no compile id was provided, set default |
|
| 290 | + if ($this->compileId === null) { |
|
| 291 | + $this->compileId = str_replace('../', '__', strtr($this->getResourceIdentifier(), '\\:', '/-')); |
|
| 292 | + } |
|
| 293 | 293 | |
| 294 | - return $this->compileId . '.d' . Core::RELEASE_TAG . '.php'; |
|
| 295 | - } |
|
| 294 | + return $this->compileId . '.d' . Core::RELEASE_TAG . '.php'; |
|
| 295 | + } |
|
| 296 | 296 | |
| 297 | - /** |
|
| 298 | - * Returns some php code that will check if this template has been modified or not. |
|
| 299 | - * if the function returns null, the template will be instanciated and then the Uid checked |
|
| 300 | - * |
|
| 301 | - * @return string |
|
| 302 | - */ |
|
| 303 | - public function getIsModifiedCode() |
|
| 304 | - { |
|
| 305 | - return '"' . $this->getUid() . '" == filemtime(' . var_export($this->getResourceIdentifier(), true) . ')'; |
|
| 306 | - } |
|
| 297 | + /** |
|
| 298 | + * Returns some php code that will check if this template has been modified or not. |
|
| 299 | + * if the function returns null, the template will be instanciated and then the Uid checked |
|
| 300 | + * |
|
| 301 | + * @return string |
|
| 302 | + */ |
|
| 303 | + public function getIsModifiedCode() |
|
| 304 | + { |
|
| 305 | + return '"' . $this->getUid() . '" == filemtime(' . var_export($this->getResourceIdentifier(), true) . ')'; |
|
| 306 | + } |
|
| 307 | 307 | } |
@@ -29,509 +29,509 @@ |
||
| 29 | 29 | */ |
| 30 | 30 | class String implements ITemplate |
| 31 | 31 | { |
| 32 | - /** |
|
| 33 | - * Template name. |
|
| 34 | - * |
|
| 35 | - * @var string |
|
| 36 | - */ |
|
| 37 | - protected $name; |
|
| 38 | - |
|
| 39 | - /** |
|
| 40 | - * Template compilation id. |
|
| 41 | - * |
|
| 42 | - * @var string |
|
| 43 | - */ |
|
| 44 | - protected $compileId; |
|
| 45 | - |
|
| 46 | - /** |
|
| 47 | - * Template cache id, if not provided in the constructor, it is set to |
|
| 48 | - * the md4 hash of the request_uri. it is however highly recommended to |
|
| 49 | - * provide one that will fit your needs. |
|
| 50 | - * in all cases, the compilation id is prepended to the cache id to separate |
|
| 51 | - * templates with similar cache ids from one another |
|
| 52 | - * |
|
| 53 | - * @var string |
|
| 54 | - */ |
|
| 55 | - protected $cacheId; |
|
| 56 | - |
|
| 57 | - /** |
|
| 58 | - * Validity duration of the generated cache file (in seconds). |
|
| 59 | - * set to -1 for infinite cache, 0 to disable and null to inherit the Dwoo instance's cache time |
|
| 60 | - * |
|
| 61 | - * @var int |
|
| 62 | - */ |
|
| 63 | - protected $cacheTime; |
|
| 64 | - |
|
| 65 | - /** |
|
| 66 | - * Boolean flag that defines whether the compilation should be enforced (once) or |
|
| 67 | - * not use this if you have issues with the compiled templates not being updated |
|
| 68 | - * but if you do need this it's most likely that you should file a bug report. |
|
| 69 | - * |
|
| 70 | - * @var bool |
|
| 71 | - */ |
|
| 72 | - protected $compilationEnforced; |
|
| 73 | - |
|
| 74 | - /** |
|
| 75 | - * Caches the results of the file checks to save some time when the same |
|
| 76 | - * templates is rendered several times. |
|
| 77 | - * |
|
| 78 | - * @var array |
|
| 79 | - */ |
|
| 80 | - protected static $cache = array( |
|
| 81 | - 'cached' => array(), |
|
| 82 | - 'compiled' => array() |
|
| 83 | - ); |
|
| 84 | - |
|
| 85 | - /** |
|
| 86 | - * Holds the compiler that built this template. |
|
| 87 | - * |
|
| 88 | - * @var ICompiler |
|
| 89 | - */ |
|
| 90 | - protected $compiler; |
|
| 91 | - |
|
| 92 | - /** |
|
| 93 | - * Chmod value for all files written (cached or compiled ones). |
|
| 94 | - * set to null if you don't want any chmod operation to happen |
|
| 95 | - * |
|
| 96 | - * @var int |
|
| 97 | - */ |
|
| 98 | - protected $chmod = 0777; |
|
| 99 | - |
|
| 100 | - /** |
|
| 101 | - * Containing template string. |
|
| 102 | - * |
|
| 103 | - * @var string |
|
| 104 | - */ |
|
| 105 | - protected $template; |
|
| 106 | - |
|
| 107 | - /** |
|
| 108 | - * Creates a template from a string. |
|
| 109 | - * |
|
| 110 | - * @param string $templateString the template to use |
|
| 111 | - * @param int $cacheTime duration of the cache validity for this template, |
|
| 112 | - * if null it defaults to the Dwoo instance that will |
|
| 113 | - * render this template, set to -1 for infinite cache or 0 to disable |
|
| 114 | - * @param string $cacheId the unique cache identifier of this page or anything else that |
|
| 115 | - * makes this template's content unique, if null it defaults |
|
| 116 | - * to the current url |
|
| 117 | - * @param string $compileId the unique compiled identifier, which is used to distinguish this |
|
| 118 | - * template from others, if null it defaults to the md4 hash of the template |
|
| 119 | - */ |
|
| 120 | - public function __construct($templateString, $cacheTime = null, $cacheId = null, $compileId = null) |
|
| 121 | - { |
|
| 122 | - $this->template = $templateString; |
|
| 123 | - $this->name = hash('md4', $templateString); |
|
| 124 | - $this->cacheTime = $cacheTime; |
|
| 125 | - |
|
| 126 | - if ($compileId !== null) { |
|
| 127 | - $this->compileId = str_replace('../', '__', strtr($compileId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 128 | - } |
|
| 129 | - |
|
| 130 | - if ($cacheId !== null) { |
|
| 131 | - $this->cacheId = str_replace('../', '__', strtr($cacheId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 132 | - } |
|
| 133 | - } |
|
| 134 | - |
|
| 135 | - /** |
|
| 136 | - * Returns the cache duration for this template. |
|
| 137 | - * defaults to null if it was not provided |
|
| 138 | - * |
|
| 139 | - * @return int|null |
|
| 140 | - */ |
|
| 141 | - public function getCacheTime() |
|
| 142 | - { |
|
| 143 | - return $this->cacheTime; |
|
| 144 | - } |
|
| 145 | - |
|
| 146 | - /** |
|
| 147 | - * Sets the cache duration for this template. |
|
| 148 | - * can be used to set it after the object is created if you did not provide |
|
| 149 | - * it in the constructor |
|
| 150 | - * |
|
| 151 | - * @param int $seconds duration of the cache validity for this template, if |
|
| 152 | - * null it defaults to the Dwoo instance's cache time. 0 = disable and |
|
| 153 | - * -1 = infinite cache |
|
| 154 | - */ |
|
| 155 | - public function setCacheTime($seconds = null) |
|
| 156 | - { |
|
| 157 | - $this->cacheTime = $seconds; |
|
| 158 | - } |
|
| 159 | - |
|
| 160 | - /** |
|
| 161 | - * Returns the chmod value for all files written (cached or compiled ones). |
|
| 162 | - * defaults to 0777 |
|
| 163 | - * |
|
| 164 | - * @return int|null |
|
| 165 | - */ |
|
| 166 | - public function getChmod() |
|
| 167 | - { |
|
| 168 | - return $this->chmod; |
|
| 169 | - } |
|
| 170 | - |
|
| 171 | - /** |
|
| 172 | - * Set the chmod value for all files written (cached or compiled ones). |
|
| 173 | - * set to null if you don't want to do any chmod() operation |
|
| 174 | - * |
|
| 175 | - * @param int $mask new bitmask to use for all files |
|
| 176 | - */ |
|
| 177 | - public function setChmod($mask = null) |
|
| 178 | - { |
|
| 179 | - $this->chmod = $mask; |
|
| 180 | - } |
|
| 181 | - |
|
| 182 | - /** |
|
| 183 | - * Returns the template name. |
|
| 184 | - * |
|
| 185 | - * @return string |
|
| 186 | - */ |
|
| 187 | - public function getName() |
|
| 188 | - { |
|
| 189 | - return $this->name; |
|
| 190 | - } |
|
| 191 | - |
|
| 192 | - /** |
|
| 193 | - * Returns the resource name for this template class. |
|
| 194 | - * |
|
| 195 | - * @return string |
|
| 196 | - */ |
|
| 197 | - public function getResourceName() |
|
| 198 | - { |
|
| 199 | - return 'string'; |
|
| 200 | - } |
|
| 201 | - |
|
| 202 | - /** |
|
| 203 | - * Returns the resource identifier for this template, false here as strings don't have identifiers. |
|
| 204 | - * |
|
| 205 | - * @return false |
|
| 206 | - */ |
|
| 207 | - public function getResourceIdentifier() |
|
| 208 | - { |
|
| 209 | - return false; |
|
| 210 | - } |
|
| 211 | - |
|
| 212 | - /** |
|
| 213 | - * Returns the template source of this template. |
|
| 214 | - * |
|
| 215 | - * @return string |
|
| 216 | - */ |
|
| 217 | - public function getSource() |
|
| 218 | - { |
|
| 219 | - return $this->template; |
|
| 220 | - } |
|
| 221 | - |
|
| 222 | - /** |
|
| 223 | - * Returns an unique value identifying the current version of this template, |
|
| 224 | - * in this case it's the md4 hash of the content. |
|
| 225 | - * |
|
| 226 | - * @return string |
|
| 227 | - */ |
|
| 228 | - public function getUid() |
|
| 229 | - { |
|
| 230 | - return $this->name; |
|
| 231 | - } |
|
| 232 | - |
|
| 233 | - /** |
|
| 234 | - * Returns the compiler used by this template, if it was just compiled, or null. |
|
| 235 | - * |
|
| 236 | - * @return ICompiler |
|
| 237 | - */ |
|
| 238 | - public function getCompiler() |
|
| 239 | - { |
|
| 240 | - return $this->compiler; |
|
| 241 | - } |
|
| 242 | - |
|
| 243 | - /** |
|
| 244 | - * Marks this template as compile-forced, which means it will be recompiled even if it |
|
| 245 | - * was already saved and wasn't modified since the last compilation. do not use this in production, |
|
| 246 | - * it's only meant to be used in development (and the development of dwoo particularly). |
|
| 247 | - */ |
|
| 248 | - public function forceCompilation() |
|
| 249 | - { |
|
| 250 | - $this->compilationEnforced = true; |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - /** |
|
| 254 | - * Returns the cached template output file name, true if it's cache-able but not cached |
|
| 255 | - * or false if it's not cached. |
|
| 256 | - * |
|
| 257 | - * @param Core $core the dwoo instance that requests it |
|
| 258 | - * |
|
| 259 | - * @return string|bool |
|
| 260 | - */ |
|
| 261 | - public function getCachedTemplate(Core $core) |
|
| 262 | - { |
|
| 263 | - if ($this->cacheTime !== null) { |
|
| 264 | - $cacheLength = $this->cacheTime; |
|
| 265 | - } else { |
|
| 266 | - $cacheLength = $core->getCacheTime(); |
|
| 267 | - } |
|
| 268 | - |
|
| 269 | - // file is not cacheable |
|
| 270 | - if ($cacheLength == 0) { |
|
| 271 | - return false; |
|
| 272 | - } |
|
| 273 | - |
|
| 274 | - $cachedFile = $this->getCacheFilename($core); |
|
| 275 | - |
|
| 276 | - if (isset(self::$cache['cached'][$this->cacheId]) === true && file_exists($cachedFile)) { |
|
| 277 | - // already checked, return cache file |
|
| 278 | - return $cachedFile; |
|
| 279 | - } elseif ($this->compilationEnforced !== true && file_exists($cachedFile) && ($cacheLength === - 1 || filemtime($cachedFile) > ($_SERVER['REQUEST_TIME'] - $cacheLength)) && $this->isValidCompiledFile($this->getCompiledFilename($core))) { |
|
| 280 | - // cache is still valid and can be loaded |
|
| 281 | - self::$cache['cached'][$this->cacheId] = true; |
|
| 282 | - |
|
| 283 | - return $cachedFile; |
|
| 284 | - } else { |
|
| 285 | - // file is cacheable |
|
| 286 | - return true; |
|
| 287 | - } |
|
| 288 | - } |
|
| 289 | - |
|
| 290 | - /** |
|
| 291 | - * Caches the provided output into the cache file. |
|
| 292 | - * |
|
| 293 | - * @param Core $core the dwoo instance that requests it |
|
| 294 | - * @param string $output the template output |
|
| 295 | - * |
|
| 296 | - * @return mixed full path of the cached file or false upon failure |
|
| 297 | - */ |
|
| 298 | - public function cache(Core $core, $output) |
|
| 299 | - { |
|
| 300 | - $cacheDir = $core->getCacheDir(); |
|
| 301 | - $cachedFile = $this->getCacheFilename($core); |
|
| 302 | - |
|
| 303 | - // the code below is courtesy of Rasmus Schultz, |
|
| 304 | - // thanks for his help on avoiding concurency issues |
|
| 305 | - $temp = tempnam($cacheDir, 'temp'); |
|
| 306 | - if (!($file = @fopen($temp, 'wb'))) { |
|
| 307 | - $temp = $cacheDir . uniqid('temp'); |
|
| 308 | - if (!($file = @fopen($temp, 'wb'))) { |
|
| 309 | - trigger_error('Error writing temporary file \'' . $temp . '\'', E_USER_WARNING); |
|
| 310 | - |
|
| 311 | - return false; |
|
| 312 | - } |
|
| 313 | - } |
|
| 314 | - |
|
| 315 | - fwrite($file, $output); |
|
| 316 | - fclose($file); |
|
| 317 | - |
|
| 318 | - $this->makeDirectory(dirname($cachedFile), $cacheDir); |
|
| 319 | - if (!@rename($temp, $cachedFile)) { |
|
| 320 | - @unlink($cachedFile); |
|
| 321 | - @rename($temp, $cachedFile); |
|
| 322 | - } |
|
| 323 | - |
|
| 324 | - if ($this->chmod !== null) { |
|
| 325 | - chmod($cachedFile, $this->chmod); |
|
| 326 | - } |
|
| 327 | - |
|
| 328 | - self::$cache['cached'][$this->cacheId] = true; |
|
| 329 | - |
|
| 330 | - return $cachedFile; |
|
| 331 | - } |
|
| 332 | - |
|
| 333 | - /** |
|
| 334 | - * Clears the cached template if it's older than the given time. |
|
| 335 | - * |
|
| 336 | - * @param Core $core the dwoo instance that was used to cache that template |
|
| 337 | - * @param int $olderThan minimum time (in seconds) required for the cache to be cleared |
|
| 338 | - * |
|
| 339 | - * @return bool true if the cache was not present or if it was deleted, false if it remains there |
|
| 340 | - */ |
|
| 341 | - public function clearCache(Core $core, $olderThan = - 1) |
|
| 342 | - { |
|
| 343 | - $cachedFile = $this->getCacheFilename($core); |
|
| 344 | - |
|
| 345 | - return !file_exists($cachedFile) || (filectime($cachedFile) < (time() - $olderThan) && unlink($cachedFile)); |
|
| 346 | - } |
|
| 347 | - |
|
| 348 | - /** |
|
| 349 | - * Returns the compiled template file name. |
|
| 350 | - * |
|
| 351 | - * @param Core $core the dwoo instance that requests it |
|
| 352 | - * @param ICompiler $compiler the compiler that must be used |
|
| 353 | - * |
|
| 354 | - * @return string |
|
| 355 | - */ |
|
| 356 | - public function getCompiledTemplate(Core $core, ICompiler $compiler = null) |
|
| 357 | - { |
|
| 358 | - $compiledFile = $this->getCompiledFilename($core); |
|
| 359 | - |
|
| 360 | - if ($this->compilationEnforced !== true && isset(self::$cache['compiled'][$this->compileId]) === true) { |
|
| 361 | - // already checked, return compiled file |
|
| 362 | - } elseif ($this->compilationEnforced !== true && $this->isValidCompiledFile($compiledFile)) { |
|
| 363 | - // template is compiled |
|
| 364 | - self::$cache['compiled'][$this->compileId] = true; |
|
| 365 | - } else { |
|
| 366 | - // compiles the template |
|
| 367 | - $this->compilationEnforced = false; |
|
| 368 | - |
|
| 369 | - if ($compiler === null) { |
|
| 370 | - $compiler = $core->getDefaultCompilerFactory($this->getResourceName()); |
|
| 371 | - |
|
| 372 | - if ($compiler === null || $compiler === array('Dwoo\Compiler', 'compilerFactory')) { |
|
| 373 | - $compiler = Compiler::compilerFactory(); |
|
| 374 | - } else { |
|
| 375 | - $compiler = call_user_func($compiler); |
|
| 376 | - } |
|
| 377 | - } |
|
| 378 | - |
|
| 379 | - $this->compiler = $compiler; |
|
| 380 | - |
|
| 381 | - $compiler->setCustomPlugins($core->getCustomPlugins()); |
|
| 382 | - $compiler->setSecurityPolicy($core->getSecurityPolicy()); |
|
| 383 | - $this->makeDirectory(dirname($compiledFile), $core->getCompileDir()); |
|
| 384 | - file_put_contents($compiledFile, $compiler->compile($core, $this)); |
|
| 385 | - if ($this->chmod !== null) { |
|
| 386 | - chmod($compiledFile, $this->chmod); |
|
| 387 | - } |
|
| 388 | - |
|
| 389 | - if (extension_loaded('Zend OPcache')) { |
|
| 390 | - opcache_invalidate($compiledFile); |
|
| 391 | - } elseif (extension_loaded('apc') && ini_get('apc.enabled')) { |
|
| 392 | - apc_delete_file($compiledFile); |
|
| 393 | - } |
|
| 394 | - |
|
| 395 | - self::$cache['compiled'][$this->compileId] = true; |
|
| 396 | - } |
|
| 397 | - |
|
| 398 | - return $compiledFile; |
|
| 399 | - } |
|
| 400 | - |
|
| 401 | - /** |
|
| 402 | - * Checks if compiled file is valid (it exists). |
|
| 403 | - * |
|
| 404 | - * @param string $file |
|
| 405 | - * |
|
| 406 | - * @return bool True cache file existance |
|
| 407 | - */ |
|
| 408 | - protected function isValidCompiledFile($file) |
|
| 409 | - { |
|
| 410 | - return file_exists($file); |
|
| 411 | - } |
|
| 412 | - |
|
| 413 | - /** |
|
| 414 | - * Returns a new template string object with the resource id being the template source code. |
|
| 415 | - * |
|
| 416 | - * @param Core $core the dwoo instance requiring it |
|
| 417 | - * @param mixed $resourceId the filename (relative to this template's dir) of the template to include |
|
| 418 | - * @param int $cacheTime duration of the cache validity for this template, if null it defaults to the |
|
| 419 | - * Dwoo instance that will render this template if null it defaults to the Dwoo |
|
| 420 | - * instance that will render this template |
|
| 421 | - * @param string $cacheId the unique cache identifier of this page or anything else that makes this |
|
| 422 | - * template's content unique, if null it defaults to the current url makes this |
|
| 423 | - * template's content unique, if null it defaults to the current url |
|
| 424 | - * @param string $compileId the unique compiled identifier, which is used to distinguish this template from |
|
| 425 | - * others, if null it defaults to the filename+bits of the path template from |
|
| 426 | - * others, if null it defaults to the filename+bits of the path |
|
| 427 | - * @param ITemplate $parentTemplate the template that is requesting a new template object (through an include, |
|
| 428 | - * extends or any other plugin) an include, extends or any other plugin) |
|
| 429 | - * |
|
| 430 | - * @return $this |
|
| 431 | - */ |
|
| 432 | - public static function templateFactory(Core $core, $resourceId, $cacheTime = null, $cacheId = null, $compileId = null, ITemplate $parentTemplate = null) |
|
| 433 | - { |
|
| 434 | - return new self($resourceId, $cacheTime, $cacheId, $compileId); |
|
| 435 | - } |
|
| 436 | - |
|
| 437 | - /** |
|
| 438 | - * Returns the full compiled file name and assigns a default value to it if |
|
| 439 | - * required. |
|
| 440 | - * |
|
| 441 | - * @param Core $core the dwoo instance that requests the file name |
|
| 442 | - * |
|
| 443 | - * @return string the full path to the compiled file |
|
| 444 | - */ |
|
| 445 | - protected function getCompiledFilename(Core $core) |
|
| 446 | - { |
|
| 447 | - // no compile id was provided, set default |
|
| 448 | - if ($this->compileId === null) { |
|
| 449 | - $this->compileId = $this->name; |
|
| 450 | - } |
|
| 451 | - |
|
| 452 | - return $core->getCompileDir() . $this->compileId . '.d' . Core::RELEASE_TAG . '.php'; |
|
| 453 | - } |
|
| 454 | - |
|
| 455 | - /** |
|
| 456 | - * Returns the full cached file name and assigns a default value to it if |
|
| 457 | - * required. |
|
| 458 | - * |
|
| 459 | - * @param Core $core the dwoo instance that requests the file name |
|
| 460 | - * |
|
| 461 | - * @return string the full path to the cached file |
|
| 462 | - */ |
|
| 463 | - protected function getCacheFilename(Core $core) |
|
| 464 | - { |
|
| 465 | - // no cache id provided, use request_uri as default |
|
| 466 | - if ($this->cacheId === null) { |
|
| 467 | - if (isset($_SERVER['REQUEST_URI']) === true) { |
|
| 468 | - $cacheId = $_SERVER['REQUEST_URI']; |
|
| 469 | - } elseif (isset($_SERVER['SCRIPT_FILENAME']) && isset($_SERVER['argv'])) { |
|
| 470 | - $cacheId = $_SERVER['SCRIPT_FILENAME'] . '-' . implode('-', $_SERVER['argv']); |
|
| 471 | - } else { |
|
| 472 | - $cacheId = ''; |
|
| 473 | - } |
|
| 474 | - // force compiled id generation |
|
| 475 | - $this->getCompiledFilename($core); |
|
| 476 | - |
|
| 477 | - $this->cacheId = str_replace('../', '__', $this->compileId . strtr($cacheId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 478 | - } |
|
| 479 | - |
|
| 480 | - return $core->getCacheDir() . $this->cacheId . '.html'; |
|
| 481 | - } |
|
| 482 | - |
|
| 483 | - /** |
|
| 484 | - * Returns some php code that will check if this template has been modified or not. |
|
| 485 | - * if the function returns null, the template will be instanciated and then the Uid checked |
|
| 486 | - * |
|
| 487 | - * @return string |
|
| 488 | - */ |
|
| 489 | - public function getIsModifiedCode() |
|
| 490 | - { |
|
| 491 | - return null; |
|
| 492 | - } |
|
| 493 | - |
|
| 494 | - /** |
|
| 495 | - * Ensures the given path exists. |
|
| 496 | - * |
|
| 497 | - * @param string $path any path |
|
| 498 | - * @param string $baseDir the base directory where the directory is created |
|
| 499 | - * ($path must still contain the full path, $baseDir |
|
| 500 | - * is only used for unix permissions) |
|
| 501 | - * |
|
| 502 | - * @throws Exception |
|
| 503 | - */ |
|
| 504 | - protected function makeDirectory($path, $baseDir = null) |
|
| 505 | - { |
|
| 506 | - if (is_dir($path) === true) { |
|
| 507 | - return; |
|
| 508 | - } |
|
| 509 | - |
|
| 510 | - if ($this->chmod === null) { |
|
| 511 | - $chmod = 0777; |
|
| 512 | - } else { |
|
| 513 | - $chmod = $this->chmod; |
|
| 514 | - } |
|
| 515 | - |
|
| 516 | - $retries = 3; |
|
| 517 | - while ($retries --) { |
|
| 518 | - @mkdir($path, $chmod, true); |
|
| 519 | - if (is_dir($path)) { |
|
| 520 | - break; |
|
| 521 | - } |
|
| 522 | - usleep(20); |
|
| 523 | - } |
|
| 524 | - |
|
| 525 | - // enforce the correct mode for all directories created |
|
| 526 | - if (strpos(PHP_OS, 'WIN') !== 0 && $baseDir !== null) { |
|
| 527 | - $path = strtr(str_replace($baseDir, '', $path), '\\', '/'); |
|
| 528 | - $folders = explode('/', trim($path, '/')); |
|
| 529 | - foreach ($folders as $folder) { |
|
| 530 | - $baseDir .= $folder . DIRECTORY_SEPARATOR; |
|
| 531 | - if (!chmod($baseDir, $chmod)) { |
|
| 532 | - throw new Exception('Unable to chmod ' . "$baseDir to $chmod: " . print_r(error_get_last(), true)); |
|
| 533 | - } |
|
| 534 | - } |
|
| 535 | - } |
|
| 536 | - } |
|
| 32 | + /** |
|
| 33 | + * Template name. |
|
| 34 | + * |
|
| 35 | + * @var string |
|
| 36 | + */ |
|
| 37 | + protected $name; |
|
| 38 | + |
|
| 39 | + /** |
|
| 40 | + * Template compilation id. |
|
| 41 | + * |
|
| 42 | + * @var string |
|
| 43 | + */ |
|
| 44 | + protected $compileId; |
|
| 45 | + |
|
| 46 | + /** |
|
| 47 | + * Template cache id, if not provided in the constructor, it is set to |
|
| 48 | + * the md4 hash of the request_uri. it is however highly recommended to |
|
| 49 | + * provide one that will fit your needs. |
|
| 50 | + * in all cases, the compilation id is prepended to the cache id to separate |
|
| 51 | + * templates with similar cache ids from one another |
|
| 52 | + * |
|
| 53 | + * @var string |
|
| 54 | + */ |
|
| 55 | + protected $cacheId; |
|
| 56 | + |
|
| 57 | + /** |
|
| 58 | + * Validity duration of the generated cache file (in seconds). |
|
| 59 | + * set to -1 for infinite cache, 0 to disable and null to inherit the Dwoo instance's cache time |
|
| 60 | + * |
|
| 61 | + * @var int |
|
| 62 | + */ |
|
| 63 | + protected $cacheTime; |
|
| 64 | + |
|
| 65 | + /** |
|
| 66 | + * Boolean flag that defines whether the compilation should be enforced (once) or |
|
| 67 | + * not use this if you have issues with the compiled templates not being updated |
|
| 68 | + * but if you do need this it's most likely that you should file a bug report. |
|
| 69 | + * |
|
| 70 | + * @var bool |
|
| 71 | + */ |
|
| 72 | + protected $compilationEnforced; |
|
| 73 | + |
|
| 74 | + /** |
|
| 75 | + * Caches the results of the file checks to save some time when the same |
|
| 76 | + * templates is rendered several times. |
|
| 77 | + * |
|
| 78 | + * @var array |
|
| 79 | + */ |
|
| 80 | + protected static $cache = array( |
|
| 81 | + 'cached' => array(), |
|
| 82 | + 'compiled' => array() |
|
| 83 | + ); |
|
| 84 | + |
|
| 85 | + /** |
|
| 86 | + * Holds the compiler that built this template. |
|
| 87 | + * |
|
| 88 | + * @var ICompiler |
|
| 89 | + */ |
|
| 90 | + protected $compiler; |
|
| 91 | + |
|
| 92 | + /** |
|
| 93 | + * Chmod value for all files written (cached or compiled ones). |
|
| 94 | + * set to null if you don't want any chmod operation to happen |
|
| 95 | + * |
|
| 96 | + * @var int |
|
| 97 | + */ |
|
| 98 | + protected $chmod = 0777; |
|
| 99 | + |
|
| 100 | + /** |
|
| 101 | + * Containing template string. |
|
| 102 | + * |
|
| 103 | + * @var string |
|
| 104 | + */ |
|
| 105 | + protected $template; |
|
| 106 | + |
|
| 107 | + /** |
|
| 108 | + * Creates a template from a string. |
|
| 109 | + * |
|
| 110 | + * @param string $templateString the template to use |
|
| 111 | + * @param int $cacheTime duration of the cache validity for this template, |
|
| 112 | + * if null it defaults to the Dwoo instance that will |
|
| 113 | + * render this template, set to -1 for infinite cache or 0 to disable |
|
| 114 | + * @param string $cacheId the unique cache identifier of this page or anything else that |
|
| 115 | + * makes this template's content unique, if null it defaults |
|
| 116 | + * to the current url |
|
| 117 | + * @param string $compileId the unique compiled identifier, which is used to distinguish this |
|
| 118 | + * template from others, if null it defaults to the md4 hash of the template |
|
| 119 | + */ |
|
| 120 | + public function __construct($templateString, $cacheTime = null, $cacheId = null, $compileId = null) |
|
| 121 | + { |
|
| 122 | + $this->template = $templateString; |
|
| 123 | + $this->name = hash('md4', $templateString); |
|
| 124 | + $this->cacheTime = $cacheTime; |
|
| 125 | + |
|
| 126 | + if ($compileId !== null) { |
|
| 127 | + $this->compileId = str_replace('../', '__', strtr($compileId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 128 | + } |
|
| 129 | + |
|
| 130 | + if ($cacheId !== null) { |
|
| 131 | + $this->cacheId = str_replace('../', '__', strtr($cacheId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 132 | + } |
|
| 133 | + } |
|
| 134 | + |
|
| 135 | + /** |
|
| 136 | + * Returns the cache duration for this template. |
|
| 137 | + * defaults to null if it was not provided |
|
| 138 | + * |
|
| 139 | + * @return int|null |
|
| 140 | + */ |
|
| 141 | + public function getCacheTime() |
|
| 142 | + { |
|
| 143 | + return $this->cacheTime; |
|
| 144 | + } |
|
| 145 | + |
|
| 146 | + /** |
|
| 147 | + * Sets the cache duration for this template. |
|
| 148 | + * can be used to set it after the object is created if you did not provide |
|
| 149 | + * it in the constructor |
|
| 150 | + * |
|
| 151 | + * @param int $seconds duration of the cache validity for this template, if |
|
| 152 | + * null it defaults to the Dwoo instance's cache time. 0 = disable and |
|
| 153 | + * -1 = infinite cache |
|
| 154 | + */ |
|
| 155 | + public function setCacheTime($seconds = null) |
|
| 156 | + { |
|
| 157 | + $this->cacheTime = $seconds; |
|
| 158 | + } |
|
| 159 | + |
|
| 160 | + /** |
|
| 161 | + * Returns the chmod value for all files written (cached or compiled ones). |
|
| 162 | + * defaults to 0777 |
|
| 163 | + * |
|
| 164 | + * @return int|null |
|
| 165 | + */ |
|
| 166 | + public function getChmod() |
|
| 167 | + { |
|
| 168 | + return $this->chmod; |
|
| 169 | + } |
|
| 170 | + |
|
| 171 | + /** |
|
| 172 | + * Set the chmod value for all files written (cached or compiled ones). |
|
| 173 | + * set to null if you don't want to do any chmod() operation |
|
| 174 | + * |
|
| 175 | + * @param int $mask new bitmask to use for all files |
|
| 176 | + */ |
|
| 177 | + public function setChmod($mask = null) |
|
| 178 | + { |
|
| 179 | + $this->chmod = $mask; |
|
| 180 | + } |
|
| 181 | + |
|
| 182 | + /** |
|
| 183 | + * Returns the template name. |
|
| 184 | + * |
|
| 185 | + * @return string |
|
| 186 | + */ |
|
| 187 | + public function getName() |
|
| 188 | + { |
|
| 189 | + return $this->name; |
|
| 190 | + } |
|
| 191 | + |
|
| 192 | + /** |
|
| 193 | + * Returns the resource name for this template class. |
|
| 194 | + * |
|
| 195 | + * @return string |
|
| 196 | + */ |
|
| 197 | + public function getResourceName() |
|
| 198 | + { |
|
| 199 | + return 'string'; |
|
| 200 | + } |
|
| 201 | + |
|
| 202 | + /** |
|
| 203 | + * Returns the resource identifier for this template, false here as strings don't have identifiers. |
|
| 204 | + * |
|
| 205 | + * @return false |
|
| 206 | + */ |
|
| 207 | + public function getResourceIdentifier() |
|
| 208 | + { |
|
| 209 | + return false; |
|
| 210 | + } |
|
| 211 | + |
|
| 212 | + /** |
|
| 213 | + * Returns the template source of this template. |
|
| 214 | + * |
|
| 215 | + * @return string |
|
| 216 | + */ |
|
| 217 | + public function getSource() |
|
| 218 | + { |
|
| 219 | + return $this->template; |
|
| 220 | + } |
|
| 221 | + |
|
| 222 | + /** |
|
| 223 | + * Returns an unique value identifying the current version of this template, |
|
| 224 | + * in this case it's the md4 hash of the content. |
|
| 225 | + * |
|
| 226 | + * @return string |
|
| 227 | + */ |
|
| 228 | + public function getUid() |
|
| 229 | + { |
|
| 230 | + return $this->name; |
|
| 231 | + } |
|
| 232 | + |
|
| 233 | + /** |
|
| 234 | + * Returns the compiler used by this template, if it was just compiled, or null. |
|
| 235 | + * |
|
| 236 | + * @return ICompiler |
|
| 237 | + */ |
|
| 238 | + public function getCompiler() |
|
| 239 | + { |
|
| 240 | + return $this->compiler; |
|
| 241 | + } |
|
| 242 | + |
|
| 243 | + /** |
|
| 244 | + * Marks this template as compile-forced, which means it will be recompiled even if it |
|
| 245 | + * was already saved and wasn't modified since the last compilation. do not use this in production, |
|
| 246 | + * it's only meant to be used in development (and the development of dwoo particularly). |
|
| 247 | + */ |
|
| 248 | + public function forceCompilation() |
|
| 249 | + { |
|
| 250 | + $this->compilationEnforced = true; |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + /** |
|
| 254 | + * Returns the cached template output file name, true if it's cache-able but not cached |
|
| 255 | + * or false if it's not cached. |
|
| 256 | + * |
|
| 257 | + * @param Core $core the dwoo instance that requests it |
|
| 258 | + * |
|
| 259 | + * @return string|bool |
|
| 260 | + */ |
|
| 261 | + public function getCachedTemplate(Core $core) |
|
| 262 | + { |
|
| 263 | + if ($this->cacheTime !== null) { |
|
| 264 | + $cacheLength = $this->cacheTime; |
|
| 265 | + } else { |
|
| 266 | + $cacheLength = $core->getCacheTime(); |
|
| 267 | + } |
|
| 268 | + |
|
| 269 | + // file is not cacheable |
|
| 270 | + if ($cacheLength == 0) { |
|
| 271 | + return false; |
|
| 272 | + } |
|
| 273 | + |
|
| 274 | + $cachedFile = $this->getCacheFilename($core); |
|
| 275 | + |
|
| 276 | + if (isset(self::$cache['cached'][$this->cacheId]) === true && file_exists($cachedFile)) { |
|
| 277 | + // already checked, return cache file |
|
| 278 | + return $cachedFile; |
|
| 279 | + } elseif ($this->compilationEnforced !== true && file_exists($cachedFile) && ($cacheLength === - 1 || filemtime($cachedFile) > ($_SERVER['REQUEST_TIME'] - $cacheLength)) && $this->isValidCompiledFile($this->getCompiledFilename($core))) { |
|
| 280 | + // cache is still valid and can be loaded |
|
| 281 | + self::$cache['cached'][$this->cacheId] = true; |
|
| 282 | + |
|
| 283 | + return $cachedFile; |
|
| 284 | + } else { |
|
| 285 | + // file is cacheable |
|
| 286 | + return true; |
|
| 287 | + } |
|
| 288 | + } |
|
| 289 | + |
|
| 290 | + /** |
|
| 291 | + * Caches the provided output into the cache file. |
|
| 292 | + * |
|
| 293 | + * @param Core $core the dwoo instance that requests it |
|
| 294 | + * @param string $output the template output |
|
| 295 | + * |
|
| 296 | + * @return mixed full path of the cached file or false upon failure |
|
| 297 | + */ |
|
| 298 | + public function cache(Core $core, $output) |
|
| 299 | + { |
|
| 300 | + $cacheDir = $core->getCacheDir(); |
|
| 301 | + $cachedFile = $this->getCacheFilename($core); |
|
| 302 | + |
|
| 303 | + // the code below is courtesy of Rasmus Schultz, |
|
| 304 | + // thanks for his help on avoiding concurency issues |
|
| 305 | + $temp = tempnam($cacheDir, 'temp'); |
|
| 306 | + if (!($file = @fopen($temp, 'wb'))) { |
|
| 307 | + $temp = $cacheDir . uniqid('temp'); |
|
| 308 | + if (!($file = @fopen($temp, 'wb'))) { |
|
| 309 | + trigger_error('Error writing temporary file \'' . $temp . '\'', E_USER_WARNING); |
|
| 310 | + |
|
| 311 | + return false; |
|
| 312 | + } |
|
| 313 | + } |
|
| 314 | + |
|
| 315 | + fwrite($file, $output); |
|
| 316 | + fclose($file); |
|
| 317 | + |
|
| 318 | + $this->makeDirectory(dirname($cachedFile), $cacheDir); |
|
| 319 | + if (!@rename($temp, $cachedFile)) { |
|
| 320 | + @unlink($cachedFile); |
|
| 321 | + @rename($temp, $cachedFile); |
|
| 322 | + } |
|
| 323 | + |
|
| 324 | + if ($this->chmod !== null) { |
|
| 325 | + chmod($cachedFile, $this->chmod); |
|
| 326 | + } |
|
| 327 | + |
|
| 328 | + self::$cache['cached'][$this->cacheId] = true; |
|
| 329 | + |
|
| 330 | + return $cachedFile; |
|
| 331 | + } |
|
| 332 | + |
|
| 333 | + /** |
|
| 334 | + * Clears the cached template if it's older than the given time. |
|
| 335 | + * |
|
| 336 | + * @param Core $core the dwoo instance that was used to cache that template |
|
| 337 | + * @param int $olderThan minimum time (in seconds) required for the cache to be cleared |
|
| 338 | + * |
|
| 339 | + * @return bool true if the cache was not present or if it was deleted, false if it remains there |
|
| 340 | + */ |
|
| 341 | + public function clearCache(Core $core, $olderThan = - 1) |
|
| 342 | + { |
|
| 343 | + $cachedFile = $this->getCacheFilename($core); |
|
| 344 | + |
|
| 345 | + return !file_exists($cachedFile) || (filectime($cachedFile) < (time() - $olderThan) && unlink($cachedFile)); |
|
| 346 | + } |
|
| 347 | + |
|
| 348 | + /** |
|
| 349 | + * Returns the compiled template file name. |
|
| 350 | + * |
|
| 351 | + * @param Core $core the dwoo instance that requests it |
|
| 352 | + * @param ICompiler $compiler the compiler that must be used |
|
| 353 | + * |
|
| 354 | + * @return string |
|
| 355 | + */ |
|
| 356 | + public function getCompiledTemplate(Core $core, ICompiler $compiler = null) |
|
| 357 | + { |
|
| 358 | + $compiledFile = $this->getCompiledFilename($core); |
|
| 359 | + |
|
| 360 | + if ($this->compilationEnforced !== true && isset(self::$cache['compiled'][$this->compileId]) === true) { |
|
| 361 | + // already checked, return compiled file |
|
| 362 | + } elseif ($this->compilationEnforced !== true && $this->isValidCompiledFile($compiledFile)) { |
|
| 363 | + // template is compiled |
|
| 364 | + self::$cache['compiled'][$this->compileId] = true; |
|
| 365 | + } else { |
|
| 366 | + // compiles the template |
|
| 367 | + $this->compilationEnforced = false; |
|
| 368 | + |
|
| 369 | + if ($compiler === null) { |
|
| 370 | + $compiler = $core->getDefaultCompilerFactory($this->getResourceName()); |
|
| 371 | + |
|
| 372 | + if ($compiler === null || $compiler === array('Dwoo\Compiler', 'compilerFactory')) { |
|
| 373 | + $compiler = Compiler::compilerFactory(); |
|
| 374 | + } else { |
|
| 375 | + $compiler = call_user_func($compiler); |
|
| 376 | + } |
|
| 377 | + } |
|
| 378 | + |
|
| 379 | + $this->compiler = $compiler; |
|
| 380 | + |
|
| 381 | + $compiler->setCustomPlugins($core->getCustomPlugins()); |
|
| 382 | + $compiler->setSecurityPolicy($core->getSecurityPolicy()); |
|
| 383 | + $this->makeDirectory(dirname($compiledFile), $core->getCompileDir()); |
|
| 384 | + file_put_contents($compiledFile, $compiler->compile($core, $this)); |
|
| 385 | + if ($this->chmod !== null) { |
|
| 386 | + chmod($compiledFile, $this->chmod); |
|
| 387 | + } |
|
| 388 | + |
|
| 389 | + if (extension_loaded('Zend OPcache')) { |
|
| 390 | + opcache_invalidate($compiledFile); |
|
| 391 | + } elseif (extension_loaded('apc') && ini_get('apc.enabled')) { |
|
| 392 | + apc_delete_file($compiledFile); |
|
| 393 | + } |
|
| 394 | + |
|
| 395 | + self::$cache['compiled'][$this->compileId] = true; |
|
| 396 | + } |
|
| 397 | + |
|
| 398 | + return $compiledFile; |
|
| 399 | + } |
|
| 400 | + |
|
| 401 | + /** |
|
| 402 | + * Checks if compiled file is valid (it exists). |
|
| 403 | + * |
|
| 404 | + * @param string $file |
|
| 405 | + * |
|
| 406 | + * @return bool True cache file existance |
|
| 407 | + */ |
|
| 408 | + protected function isValidCompiledFile($file) |
|
| 409 | + { |
|
| 410 | + return file_exists($file); |
|
| 411 | + } |
|
| 412 | + |
|
| 413 | + /** |
|
| 414 | + * Returns a new template string object with the resource id being the template source code. |
|
| 415 | + * |
|
| 416 | + * @param Core $core the dwoo instance requiring it |
|
| 417 | + * @param mixed $resourceId the filename (relative to this template's dir) of the template to include |
|
| 418 | + * @param int $cacheTime duration of the cache validity for this template, if null it defaults to the |
|
| 419 | + * Dwoo instance that will render this template if null it defaults to the Dwoo |
|
| 420 | + * instance that will render this template |
|
| 421 | + * @param string $cacheId the unique cache identifier of this page or anything else that makes this |
|
| 422 | + * template's content unique, if null it defaults to the current url makes this |
|
| 423 | + * template's content unique, if null it defaults to the current url |
|
| 424 | + * @param string $compileId the unique compiled identifier, which is used to distinguish this template from |
|
| 425 | + * others, if null it defaults to the filename+bits of the path template from |
|
| 426 | + * others, if null it defaults to the filename+bits of the path |
|
| 427 | + * @param ITemplate $parentTemplate the template that is requesting a new template object (through an include, |
|
| 428 | + * extends or any other plugin) an include, extends or any other plugin) |
|
| 429 | + * |
|
| 430 | + * @return $this |
|
| 431 | + */ |
|
| 432 | + public static function templateFactory(Core $core, $resourceId, $cacheTime = null, $cacheId = null, $compileId = null, ITemplate $parentTemplate = null) |
|
| 433 | + { |
|
| 434 | + return new self($resourceId, $cacheTime, $cacheId, $compileId); |
|
| 435 | + } |
|
| 436 | + |
|
| 437 | + /** |
|
| 438 | + * Returns the full compiled file name and assigns a default value to it if |
|
| 439 | + * required. |
|
| 440 | + * |
|
| 441 | + * @param Core $core the dwoo instance that requests the file name |
|
| 442 | + * |
|
| 443 | + * @return string the full path to the compiled file |
|
| 444 | + */ |
|
| 445 | + protected function getCompiledFilename(Core $core) |
|
| 446 | + { |
|
| 447 | + // no compile id was provided, set default |
|
| 448 | + if ($this->compileId === null) { |
|
| 449 | + $this->compileId = $this->name; |
|
| 450 | + } |
|
| 451 | + |
|
| 452 | + return $core->getCompileDir() . $this->compileId . '.d' . Core::RELEASE_TAG . '.php'; |
|
| 453 | + } |
|
| 454 | + |
|
| 455 | + /** |
|
| 456 | + * Returns the full cached file name and assigns a default value to it if |
|
| 457 | + * required. |
|
| 458 | + * |
|
| 459 | + * @param Core $core the dwoo instance that requests the file name |
|
| 460 | + * |
|
| 461 | + * @return string the full path to the cached file |
|
| 462 | + */ |
|
| 463 | + protected function getCacheFilename(Core $core) |
|
| 464 | + { |
|
| 465 | + // no cache id provided, use request_uri as default |
|
| 466 | + if ($this->cacheId === null) { |
|
| 467 | + if (isset($_SERVER['REQUEST_URI']) === true) { |
|
| 468 | + $cacheId = $_SERVER['REQUEST_URI']; |
|
| 469 | + } elseif (isset($_SERVER['SCRIPT_FILENAME']) && isset($_SERVER['argv'])) { |
|
| 470 | + $cacheId = $_SERVER['SCRIPT_FILENAME'] . '-' . implode('-', $_SERVER['argv']); |
|
| 471 | + } else { |
|
| 472 | + $cacheId = ''; |
|
| 473 | + } |
|
| 474 | + // force compiled id generation |
|
| 475 | + $this->getCompiledFilename($core); |
|
| 476 | + |
|
| 477 | + $this->cacheId = str_replace('../', '__', $this->compileId . strtr($cacheId, '\\%?=!:;' . PATH_SEPARATOR, '/-------')); |
|
| 478 | + } |
|
| 479 | + |
|
| 480 | + return $core->getCacheDir() . $this->cacheId . '.html'; |
|
| 481 | + } |
|
| 482 | + |
|
| 483 | + /** |
|
| 484 | + * Returns some php code that will check if this template has been modified or not. |
|
| 485 | + * if the function returns null, the template will be instanciated and then the Uid checked |
|
| 486 | + * |
|
| 487 | + * @return string |
|
| 488 | + */ |
|
| 489 | + public function getIsModifiedCode() |
|
| 490 | + { |
|
| 491 | + return null; |
|
| 492 | + } |
|
| 493 | + |
|
| 494 | + /** |
|
| 495 | + * Ensures the given path exists. |
|
| 496 | + * |
|
| 497 | + * @param string $path any path |
|
| 498 | + * @param string $baseDir the base directory where the directory is created |
|
| 499 | + * ($path must still contain the full path, $baseDir |
|
| 500 | + * is only used for unix permissions) |
|
| 501 | + * |
|
| 502 | + * @throws Exception |
|
| 503 | + */ |
|
| 504 | + protected function makeDirectory($path, $baseDir = null) |
|
| 505 | + { |
|
| 506 | + if (is_dir($path) === true) { |
|
| 507 | + return; |
|
| 508 | + } |
|
| 509 | + |
|
| 510 | + if ($this->chmod === null) { |
|
| 511 | + $chmod = 0777; |
|
| 512 | + } else { |
|
| 513 | + $chmod = $this->chmod; |
|
| 514 | + } |
|
| 515 | + |
|
| 516 | + $retries = 3; |
|
| 517 | + while ($retries --) { |
|
| 518 | + @mkdir($path, $chmod, true); |
|
| 519 | + if (is_dir($path)) { |
|
| 520 | + break; |
|
| 521 | + } |
|
| 522 | + usleep(20); |
|
| 523 | + } |
|
| 524 | + |
|
| 525 | + // enforce the correct mode for all directories created |
|
| 526 | + if (strpos(PHP_OS, 'WIN') !== 0 && $baseDir !== null) { |
|
| 527 | + $path = strtr(str_replace($baseDir, '', $path), '\\', '/'); |
|
| 528 | + $folders = explode('/', trim($path, '/')); |
|
| 529 | + foreach ($folders as $folder) { |
|
| 530 | + $baseDir .= $folder . DIRECTORY_SEPARATOR; |
|
| 531 | + if (!chmod($baseDir, $chmod)) { |
|
| 532 | + throw new Exception('Unable to chmod ' . "$baseDir to $chmod: " . print_r(error_get_last(), true)); |
|
| 533 | + } |
|
| 534 | + } |
|
| 535 | + } |
|
| 536 | + } |
|
| 537 | 537 | } |
@@ -23,23 +23,23 @@ |
||
| 23 | 23 | */ |
| 24 | 24 | class Adapter extends Processor |
| 25 | 25 | { |
| 26 | - public $callback; |
|
| 26 | + public $callback; |
|
| 27 | 27 | |
| 28 | - /** |
|
| 29 | - * @param string $input |
|
| 30 | - * |
|
| 31 | - * @return mixed |
|
| 32 | - */ |
|
| 33 | - public function process($input) |
|
| 34 | - { |
|
| 35 | - return call_user_func($this->callback, $input); |
|
| 36 | - } |
|
| 28 | + /** |
|
| 29 | + * @param string $input |
|
| 30 | + * |
|
| 31 | + * @return mixed |
|
| 32 | + */ |
|
| 33 | + public function process($input) |
|
| 34 | + { |
|
| 35 | + return call_user_func($this->callback, $input); |
|
| 36 | + } |
|
| 37 | 37 | |
| 38 | - /** |
|
| 39 | - * @param $callback |
|
| 40 | - */ |
|
| 41 | - public function registerCallback($callback) |
|
| 42 | - { |
|
| 43 | - $this->callback = $callback; |
|
| 44 | - } |
|
| 38 | + /** |
|
| 39 | + * @param $callback |
|
| 40 | + */ |
|
| 41 | + public function registerCallback($callback) |
|
| 42 | + { |
|
| 43 | + $this->callback = $callback; |
|
| 44 | + } |
|
| 45 | 45 | } |
| 46 | 46 | \ No newline at end of file |