Completed
Push — master ( 5ebe1b...42cfd9 )
by David
05:15 queued 01:56
created
lib/Dwoo/Loader.php 1 patch
Indentation   +162 added lines, -162 removed lines patch added patch discarded remove patch
@@ -23,176 +23,176 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
lib/Dwoo/Security/Policy.php 1 patch
Indentation   +271 added lines, -271 removed lines patch added patch discarded remove patch
@@ -25,298 +25,298 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
lib/Dwoo/Template/File.php 1 patch
Indentation   +248 added lines, -248 removed lines patch added patch discarded remove patch
@@ -29,279 +29,279 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
lib/Dwoo/Template/String.php 1 patch
Indentation   +505 added lines, -505 removed lines patch added patch discarded remove patch
@@ -29,509 +29,509 @@
 block discarded – undo
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
 }
Please login to merge, or discard this patch.
lib/Dwoo/Smarty/Filter/Adapter.php 1 patch
Indentation   +17 added lines, -17 removed lines patch added patch discarded remove patch
@@ -23,23 +23,23 @@
 block discarded – undo
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
Please login to merge, or discard this patch.