|
1 <?php |
|
2 /** |
|
3 * Project: Smarty: the PHP compiling template engine |
|
4 * File: smarty_internal_utility.php |
|
5 * SVN: $Id: $ |
|
6 * |
|
7 * This library is free software; you can redistribute it and/or |
|
8 * modify it under the terms of the GNU Lesser General Public |
|
9 * License as published by the Free Software Foundation; either |
|
10 * version 2.1 of the License, or (at your option) any later version. |
|
11 * |
|
12 * This library is distributed in the hope that it will be useful, |
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
15 * Lesser General Public License for more details. |
|
16 * |
|
17 * You should have received a copy of the GNU Lesser General Public |
|
18 * License along with this library; if not, write to the Free Software |
|
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
20 * |
|
21 * For questions, help, comments, discussion, etc., please join the |
|
22 * Smarty mailing list. Send a blank e-mail to |
|
23 * smarty-discussion-subscribe@googlegroups.com |
|
24 * |
|
25 * @link http://www.smarty.net/ |
|
26 * @copyright 2008 New Digital Group, Inc. |
|
27 * @author Monte Ohrt <monte at ohrt dot com> |
|
28 * @author Uwe Tews |
|
29 * @package Smarty |
|
30 * @subpackage PluginsInternal |
|
31 * @version 3-SVN$Rev: 3286 $ |
|
32 */ |
|
33 |
|
34 |
|
35 /** |
|
36 * Utility class |
|
37 * |
|
38 * @package Smarty |
|
39 * @subpackage Security |
|
40 */ |
|
41 class Smarty_Internal_Utility { |
|
42 |
|
43 /** |
|
44 * private constructor to prevent calls creation of new instances |
|
45 */ |
|
46 private final function __construct() |
|
47 { |
|
48 // intentionally left blank |
|
49 } |
|
50 |
|
51 /** |
|
52 * Compile all template files |
|
53 * |
|
54 * @param string $extension template file name extension |
|
55 * @param bool $force_compile force all to recompile |
|
56 * @param int $time_limit set maximum execution time |
|
57 * @param int $max_errors set maximum allowed errors |
|
58 * @param Smarty $smarty Smarty instance |
|
59 * @return integer number of template files compiled |
|
60 */ |
|
61 public static function compileAllTemplates($extention, $force_compile, $time_limit, $max_errors, Smarty $smarty) |
|
62 { |
|
63 // switch off time limit |
|
64 if (function_exists('set_time_limit')) { |
|
65 @set_time_limit($time_limit); |
|
66 } |
|
67 $smarty->force_compile = $force_compile; |
|
68 $_count = 0; |
|
69 $_error_count = 0; |
|
70 // loop over array of template directories |
|
71 foreach($smarty->getTemplateDir() as $_dir) { |
|
72 $_compileDirs = new RecursiveDirectoryIterator($_dir); |
|
73 $_compile = new RecursiveIteratorIterator($_compileDirs); |
|
74 foreach ($_compile as $_fileinfo) { |
|
75 if (substr(basename($_file->getPathname()),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue; |
|
76 $_file = $_fileinfo->getFilename(); |
|
77 if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue; |
|
78 if ($_fileinfo->getPath() == substr($_dir, 0, -1)) { |
|
79 $_template_file = $_file; |
|
80 } else { |
|
81 $_template_file = substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file; |
|
82 } |
|
83 echo '<br>', $_dir, '---', $_template_file; |
|
84 flush(); |
|
85 $_start_time = microtime(true); |
|
86 try { |
|
87 $_tpl = $smarty->createTemplate($_template_file,null,null,null,false); |
|
88 if ($_tpl->mustCompile()) { |
|
89 $_tpl->compileTemplateSource(); |
|
90 $_count++; |
|
91 echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; |
|
92 flush(); |
|
93 } else { |
|
94 echo ' is up to date'; |
|
95 flush(); |
|
96 } |
|
97 } |
|
98 catch (Exception $e) { |
|
99 echo 'Error: ', $e->getMessage(), "<br><br>"; |
|
100 $_error_count++; |
|
101 } |
|
102 // free memory |
|
103 $smarty->template_objects = array(); |
|
104 $_tpl->smarty->template_objects = array(); |
|
105 $_tpl = null; |
|
106 if ($max_errors !== null && $_error_count == $max_errors) { |
|
107 echo '<br><br>too many errors'; |
|
108 exit(); |
|
109 } |
|
110 } |
|
111 } |
|
112 return $_count; |
|
113 } |
|
114 |
|
115 /** |
|
116 * Compile all config files |
|
117 * |
|
118 * @param string $extension config file name extension |
|
119 * @param bool $force_compile force all to recompile |
|
120 * @param int $time_limit set maximum execution time |
|
121 * @param int $max_errors set maximum allowed errors |
|
122 * @param Smarty $smarty Smarty instance |
|
123 * @return integer number of config files compiled |
|
124 */ |
|
125 public static function compileAllConfig($extention, $force_compile, $time_limit, $max_errors, Smarty $smarty) |
|
126 { |
|
127 // switch off time limit |
|
128 if (function_exists('set_time_limit')) { |
|
129 @set_time_limit($time_limit); |
|
130 } |
|
131 $smarty->force_compile = $force_compile; |
|
132 $_count = 0; |
|
133 $_error_count = 0; |
|
134 // loop over array of template directories |
|
135 foreach($smarty->getConfigDir() as $_dir) { |
|
136 $_compileDirs = new RecursiveDirectoryIterator($_dir); |
|
137 $_compile = new RecursiveIteratorIterator($_compileDirs); |
|
138 foreach ($_compile as $_fileinfo) { |
|
139 if (substr(basename($_fileinfo->getPathname()),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue; |
|
140 $_file = $_fileinfo->getFilename(); |
|
141 if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue; |
|
142 if ($_fileinfo->getPath() == substr($_dir, 0, -1)) { |
|
143 $_config_file = $_file; |
|
144 } else { |
|
145 $_config_file = substr($_fileinfo->getPath(), strlen($_dir)) . DS . $_file; |
|
146 } |
|
147 echo '<br>', $_dir, '---', $_config_file; |
|
148 flush(); |
|
149 $_start_time = microtime(true); |
|
150 try { |
|
151 $_config = new Smarty_Internal_Config($_config_file, $smarty); |
|
152 if ($_config->mustCompile()) { |
|
153 $_config->compileConfigSource(); |
|
154 $_count++; |
|
155 echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; |
|
156 flush(); |
|
157 } else { |
|
158 echo ' is up to date'; |
|
159 flush(); |
|
160 } |
|
161 } |
|
162 catch (Exception $e) { |
|
163 echo 'Error: ', $e->getMessage(), "<br><br>"; |
|
164 $_error_count++; |
|
165 } |
|
166 if ($max_errors !== null && $_error_count == $max_errors) { |
|
167 echo '<br><br>too many errors'; |
|
168 exit(); |
|
169 } |
|
170 } |
|
171 } |
|
172 return $_count; |
|
173 } |
|
174 |
|
175 /** |
|
176 * Delete compiled template file |
|
177 * |
|
178 * @param string $resource_name template name |
|
179 * @param string $compile_id compile id |
|
180 * @param integer $exp_time expiration time |
|
181 * @param Smarty $smarty Smarty instance |
|
182 * @return integer number of template files deleted |
|
183 */ |
|
184 public static function clearCompiledTemplate($resource_name, $compile_id, $exp_time, Smarty $smarty) |
|
185 { |
|
186 $_compile_dir = $smarty->getCompileDir(); |
|
187 $_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null; |
|
188 $_dir_sep = $smarty->use_sub_dirs ? DS : '^'; |
|
189 if (isset($resource_name)) { |
|
190 $_save_stat = $smarty->caching; |
|
191 $smarty->caching = false; |
|
192 $tpl = new $smarty->template_class($resource_name, $smarty); |
|
193 $smarty->caching = $_save_stat; |
|
194 |
|
195 // remove from template cache |
|
196 $tpl->source; // have the template registered before unset() |
|
197 if ($smarty->allow_ambiguous_resources) { |
|
198 $_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id; |
|
199 } else { |
|
200 $_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id; |
|
201 } |
|
202 if (isset($_templateId[150])) { |
|
203 $_templateId = sha1($_templateId); |
|
204 } |
|
205 unset($smarty->template_objects[$_templateId]); |
|
206 |
|
207 if ($tpl->source->exists) { |
|
208 $_resource_part_1 = basename(str_replace('^', '/', $tpl->compiled->filepath)); |
|
209 $_resource_part_1_length = strlen($_resource_part_1); |
|
210 } else { |
|
211 return 0; |
|
212 } |
|
213 |
|
214 $_resource_part_2 = str_replace('.php','.cache.php',$_resource_part_1); |
|
215 $_resource_part_2_length = strlen($_resource_part_2); |
|
216 } |
|
217 $_dir = $_compile_dir; |
|
218 if ($smarty->use_sub_dirs && isset($_compile_id)) { |
|
219 $_dir .= $_compile_id . $_dir_sep; |
|
220 } |
|
221 if (isset($_compile_id)) { |
|
222 $_compile_id_part = $_compile_dir . $_compile_id . $_dir_sep; |
|
223 $_compile_id_part_length = strlen($_compile_id_part); |
|
224 } |
|
225 $_count = 0; |
|
226 try { |
|
227 $_compileDirs = new RecursiveDirectoryIterator($_dir); |
|
228 // NOTE: UnexpectedValueException thrown for PHP >= 5.3 |
|
229 } catch (Exception $e) { |
|
230 return 0; |
|
231 } |
|
232 $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST); |
|
233 foreach ($_compile as $_file) { |
|
234 if (substr(basename($_file->getPathname()), 0, 1) == '.' || strpos($_file, '.svn') !== false) |
|
235 continue; |
|
236 |
|
237 $_filepath = (string) $_file; |
|
238 |
|
239 if ($_file->isDir()) { |
|
240 if (!$_compile->isDot()) { |
|
241 // delete folder if empty |
|
242 @rmdir($_file->getPathname()); |
|
243 } |
|
244 } else { |
|
245 $unlink = false; |
|
246 if ((!isset($_compile_id) || (isset($_filepath[$_compile_id_part_length]) && !strncmp($_filepath, $_compile_id_part, $_compile_id_part_length))) |
|
247 && (!isset($resource_name) |
|
248 || (isset($_filepath[$_resource_part_1_length]) |
|
249 && substr_compare($_filepath, $_resource_part_1, -$_resource_part_1_length, $_resource_part_1_length) == 0) |
|
250 || (isset($_filepath[$_resource_part_2_length]) |
|
251 && substr_compare($_filepath, $_resource_part_2, -$_resource_part_2_length, $_resource_part_2_length) == 0))) { |
|
252 if (isset($exp_time)) { |
|
253 if (time() - @filemtime($_filepath) >= $exp_time) { |
|
254 $unlink = true; |
|
255 } |
|
256 } else { |
|
257 $unlink = true; |
|
258 } |
|
259 } |
|
260 |
|
261 if ($unlink && @unlink($_filepath)) { |
|
262 $_count++; |
|
263 } |
|
264 } |
|
265 } |
|
266 // clear compiled cache |
|
267 Smarty_Resource::$sources = array(); |
|
268 Smarty_Resource::$compileds = array(); |
|
269 return $_count; |
|
270 } |
|
271 |
|
272 /** |
|
273 * Return array of tag/attributes of all tags used by an template |
|
274 * |
|
275 * @param Smarty_Internal_Template $templae template object |
|
276 * @return array of tag/attributes |
|
277 */ |
|
278 public static function getTags(Smarty_Internal_Template $template) |
|
279 { |
|
280 $template->smarty->get_used_tags = true; |
|
281 $template->compileTemplateSource(); |
|
282 return $template->used_tags; |
|
283 } |
|
284 |
|
285 |
|
286 /** |
|
287 * diagnose Smarty setup |
|
288 * |
|
289 * If $errors is secified, the diagnostic report will be appended to the array, rather than being output. |
|
290 * |
|
291 * @param Smarty $smarty Smarty instance to test |
|
292 * @param array $errors array to push results into rather than outputting them |
|
293 * @return bool status, true if everything is fine, false else |
|
294 */ |
|
295 public static function testInstall(Smarty $smarty, &$errors=null) |
|
296 { |
|
297 $status = true; |
|
298 |
|
299 if ($errors === null) { |
|
300 echo "<PRE>\n"; |
|
301 echo "Smarty Installation test...\n"; |
|
302 echo "Testing template directory...\n"; |
|
303 } |
|
304 |
|
305 $_stream_resolve_include_path = function_exists('stream_resolve_include_path'); |
|
306 |
|
307 // test if all registered template_dir are accessible |
|
308 foreach($smarty->getTemplateDir() as $template_dir) { |
|
309 $_template_dir = $template_dir; |
|
310 $template_dir = realpath($template_dir); |
|
311 // resolve include_path or fail existance |
|
312 if (!$template_dir) { |
|
313 if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_template_dir)) { |
|
314 // try PHP include_path |
|
315 if ($_stream_resolve_include_path) { |
|
316 $template_dir = stream_resolve_include_path($_template_dir); |
|
317 } else { |
|
318 $template_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_template_dir); |
|
319 } |
|
320 |
|
321 if ($template_dir !== false) { |
|
322 if ($errors === null) { |
|
323 echo "$template_dir is OK.\n"; |
|
324 } |
|
325 |
|
326 continue; |
|
327 } else { |
|
328 $status = false; |
|
329 $message = "FAILED: $_template_dir does not exist (and couldn't be found in include_path either)"; |
|
330 if ($errors === null) { |
|
331 echo $message . ".\n"; |
|
332 } else { |
|
333 $errors['template_dir'] = $message; |
|
334 } |
|
335 |
|
336 continue; |
|
337 } |
|
338 } else { |
|
339 $status = false; |
|
340 $message = "FAILED: $_template_dir does not exist"; |
|
341 if ($errors === null) { |
|
342 echo $message . ".\n"; |
|
343 } else { |
|
344 $errors['template_dir'] = $message; |
|
345 } |
|
346 |
|
347 continue; |
|
348 } |
|
349 } |
|
350 |
|
351 if (!is_dir($template_dir)) { |
|
352 $status = false; |
|
353 $message = "FAILED: $template_dir is not a directory"; |
|
354 if ($errors === null) { |
|
355 echo $message . ".\n"; |
|
356 } else { |
|
357 $errors['template_dir'] = $message; |
|
358 } |
|
359 } elseif (!is_readable($template_dir)) { |
|
360 $status = false; |
|
361 $message = "FAILED: $template_dir is not readable"; |
|
362 if ($errors === null) { |
|
363 echo $message . ".\n"; |
|
364 } else { |
|
365 $errors['template_dir'] = $message; |
|
366 } |
|
367 } else { |
|
368 if ($errors === null) { |
|
369 echo "$template_dir is OK.\n"; |
|
370 } |
|
371 } |
|
372 } |
|
373 |
|
374 |
|
375 if ($errors === null) { |
|
376 echo "Testing compile directory...\n"; |
|
377 } |
|
378 |
|
379 // test if registered compile_dir is accessible |
|
380 $__compile_dir = $smarty->getCompileDir(); |
|
381 $_compile_dir = realpath($__compile_dir); |
|
382 if (!$_compile_dir) { |
|
383 $status = false; |
|
384 $message = "FAILED: {$__compile_dir} does not exist"; |
|
385 if ($errors === null) { |
|
386 echo $message . ".\n"; |
|
387 } else { |
|
388 $errors['compile_dir'] = $message; |
|
389 } |
|
390 } elseif (!is_dir($_compile_dir)) { |
|
391 $status = false; |
|
392 $message = "FAILED: {$_compile_dir} is not a directory"; |
|
393 if ($errors === null) { |
|
394 echo $message . ".\n"; |
|
395 } else { |
|
396 $errors['compile_dir'] = $message; |
|
397 } |
|
398 } elseif (!is_readable($_compile_dir)) { |
|
399 $status = false; |
|
400 $message = "FAILED: {$_compile_dir} is not readable"; |
|
401 if ($errors === null) { |
|
402 echo $message . ".\n"; |
|
403 } else { |
|
404 $errors['compile_dir'] = $message; |
|
405 } |
|
406 } elseif (!is_writable($_compile_dir)) { |
|
407 $status = false; |
|
408 $message = "FAILED: {$_compile_dir} is not writable"; |
|
409 if ($errors === null) { |
|
410 echo $message . ".\n"; |
|
411 } else { |
|
412 $errors['compile_dir'] = $message; |
|
413 } |
|
414 } else { |
|
415 if ($errors === null) { |
|
416 echo "{$_compile_dir} is OK.\n"; |
|
417 } |
|
418 } |
|
419 |
|
420 |
|
421 if ($errors === null) { |
|
422 echo "Testing plugins directory...\n"; |
|
423 } |
|
424 |
|
425 // test if all registered plugins_dir are accessible |
|
426 // and if core plugins directory is still registered |
|
427 $_core_plugins_dir = realpath(dirname(__FILE__) .'/../plugins'); |
|
428 $_core_plugins_available = false; |
|
429 foreach($smarty->getPluginsDir() as $plugin_dir) { |
|
430 $_plugin_dir = $plugin_dir; |
|
431 $plugin_dir = realpath($plugin_dir); |
|
432 // resolve include_path or fail existance |
|
433 if (!$plugin_dir) { |
|
434 if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) { |
|
435 // try PHP include_path |
|
436 if ($_stream_resolve_include_path) { |
|
437 $plugin_dir = stream_resolve_include_path($_plugin_dir); |
|
438 } else { |
|
439 $plugin_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_plugin_dir); |
|
440 } |
|
441 |
|
442 if ($plugin_dir !== false) { |
|
443 if ($errors === null) { |
|
444 echo "$plugin_dir is OK.\n"; |
|
445 } |
|
446 |
|
447 continue; |
|
448 } else { |
|
449 $status = false; |
|
450 $message = "FAILED: $_plugin_dir does not exist (and couldn't be found in include_path either)"; |
|
451 if ($errors === null) { |
|
452 echo $message . ".\n"; |
|
453 } else { |
|
454 $errors['plugins_dir'] = $message; |
|
455 } |
|
456 |
|
457 continue; |
|
458 } |
|
459 } else { |
|
460 $status = false; |
|
461 $message = "FAILED: $_plugin_dir does not exist"; |
|
462 if ($errors === null) { |
|
463 echo $message . ".\n"; |
|
464 } else { |
|
465 $errors['plugins_dir'] = $message; |
|
466 } |
|
467 |
|
468 continue; |
|
469 } |
|
470 } |
|
471 |
|
472 if (!is_dir($plugin_dir)) { |
|
473 $status = false; |
|
474 $message = "FAILED: $plugin_dir is not a directory"; |
|
475 if ($errors === null) { |
|
476 echo $message . ".\n"; |
|
477 } else { |
|
478 $errors['plugins_dir'] = $message; |
|
479 } |
|
480 } elseif (!is_readable($plugin_dir)) { |
|
481 $status = false; |
|
482 $message = "FAILED: $plugin_dir is not readable"; |
|
483 if ($errors === null) { |
|
484 echo $message . ".\n"; |
|
485 } else { |
|
486 $errors['plugins_dir'] = $message; |
|
487 } |
|
488 } elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) { |
|
489 $_core_plugins_available = true; |
|
490 if ($errors === null) { |
|
491 echo "$plugin_dir is OK.\n"; |
|
492 } |
|
493 } else { |
|
494 if ($errors === null) { |
|
495 echo "$plugin_dir is OK.\n"; |
|
496 } |
|
497 } |
|
498 } |
|
499 if (!$_core_plugins_available) { |
|
500 $status = false; |
|
501 $message = "WARNING: Smarty's own libs/plugins is not available"; |
|
502 if ($errors === null) { |
|
503 echo $message . ".\n"; |
|
504 } elseif (!isset($errors['plugins_dir'])) { |
|
505 $errors['plugins_dir'] = $message; |
|
506 } |
|
507 } |
|
508 |
|
509 if ($errors === null) { |
|
510 echo "Testing cache directory...\n"; |
|
511 } |
|
512 |
|
513 |
|
514 // test if all registered cache_dir is accessible |
|
515 $__cache_dir = $smarty->getCacheDir(); |
|
516 $_cache_dir = realpath($__cache_dir); |
|
517 if (!$_cache_dir) { |
|
518 $status = false; |
|
519 $message = "FAILED: {$__cache_dir} does not exist"; |
|
520 if ($errors === null) { |
|
521 echo $message . ".\n"; |
|
522 } else { |
|
523 $errors['cache_dir'] = $message; |
|
524 } |
|
525 } elseif (!is_dir($_cache_dir)) { |
|
526 $status = false; |
|
527 $message = "FAILED: {$_cache_dir} is not a directory"; |
|
528 if ($errors === null) { |
|
529 echo $message . ".\n"; |
|
530 } else { |
|
531 $errors['cache_dir'] = $message; |
|
532 } |
|
533 } elseif (!is_readable($_cache_dir)) { |
|
534 $status = false; |
|
535 $message = "FAILED: {$_cache_dir} is not readable"; |
|
536 if ($errors === null) { |
|
537 echo $message . ".\n"; |
|
538 } else { |
|
539 $errors['cache_dir'] = $message; |
|
540 } |
|
541 } elseif (!is_writable($_cache_dir)) { |
|
542 $status = false; |
|
543 $message = "FAILED: {$_cache_dir} is not writable"; |
|
544 if ($errors === null) { |
|
545 echo $message . ".\n"; |
|
546 } else { |
|
547 $errors['cache_dir'] = $message; |
|
548 } |
|
549 } else { |
|
550 if ($errors === null) { |
|
551 echo "{$_cache_dir} is OK.\n"; |
|
552 } |
|
553 } |
|
554 |
|
555 |
|
556 if ($errors === null) { |
|
557 echo "Testing configs directory...\n"; |
|
558 } |
|
559 |
|
560 // test if all registered config_dir are accessible |
|
561 foreach($smarty->getConfigDir() as $config_dir) { |
|
562 $_config_dir = $config_dir; |
|
563 $config_dir = realpath($config_dir); |
|
564 // resolve include_path or fail existance |
|
565 if (!$config_dir) { |
|
566 if ($smarty->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_config_dir)) { |
|
567 // try PHP include_path |
|
568 if ($_stream_resolve_include_path) { |
|
569 $config_dir = stream_resolve_include_path($_config_dir); |
|
570 } else { |
|
571 $config_dir = Smarty_Internal_Get_Include_Path::getIncludePath($_config_dir); |
|
572 } |
|
573 |
|
574 if ($config_dir !== false) { |
|
575 if ($errors === null) { |
|
576 echo "$config_dir is OK.\n"; |
|
577 } |
|
578 |
|
579 continue; |
|
580 } else { |
|
581 $status = false; |
|
582 $message = "FAILED: $_config_dir does not exist (and couldn't be found in include_path either)"; |
|
583 if ($errors === null) { |
|
584 echo $message . ".\n"; |
|
585 } else { |
|
586 $errors['config_dir'] = $message; |
|
587 } |
|
588 |
|
589 continue; |
|
590 } |
|
591 } else { |
|
592 $status = false; |
|
593 $message = "FAILED: $_config_dir does not exist"; |
|
594 if ($errors === null) { |
|
595 echo $message . ".\n"; |
|
596 } else { |
|
597 $errors['config_dir'] = $message; |
|
598 } |
|
599 |
|
600 continue; |
|
601 } |
|
602 } |
|
603 |
|
604 if (!is_dir($config_dir)) { |
|
605 $status = false; |
|
606 $message = "FAILED: $config_dir is not a directory"; |
|
607 if ($errors === null) { |
|
608 echo $message . ".\n"; |
|
609 } else { |
|
610 $errors['config_dir'] = $message; |
|
611 } |
|
612 } elseif (!is_readable($config_dir)) { |
|
613 $status = false; |
|
614 $message = "FAILED: $config_dir is not readable"; |
|
615 if ($errors === null) { |
|
616 echo $message . ".\n"; |
|
617 } else { |
|
618 $errors['config_dir'] = $message; |
|
619 } |
|
620 } else { |
|
621 if ($errors === null) { |
|
622 echo "$config_dir is OK.\n"; |
|
623 } |
|
624 } |
|
625 } |
|
626 |
|
627 |
|
628 if ($errors === null) { |
|
629 echo "Testing sysplugin files...\n"; |
|
630 } |
|
631 // test if sysplugins are available |
|
632 $source = SMARTY_SYSPLUGINS_DIR; |
|
633 if (is_dir($source)) { |
|
634 $expected = array( |
|
635 "smarty_cacheresource.php" => true, |
|
636 "smarty_cacheresource_custom.php" => true, |
|
637 "smarty_cacheresource_keyvaluestore.php" => true, |
|
638 "smarty_config_source.php" => true, |
|
639 "smarty_internal_cacheresource_file.php" => true, |
|
640 "smarty_internal_compile_append.php" => true, |
|
641 "smarty_internal_compile_assign.php" => true, |
|
642 "smarty_internal_compile_block.php" => true, |
|
643 "smarty_internal_compile_break.php" => true, |
|
644 "smarty_internal_compile_call.php" => true, |
|
645 "smarty_internal_compile_capture.php" => true, |
|
646 "smarty_internal_compile_config_load.php" => true, |
|
647 "smarty_internal_compile_continue.php" => true, |
|
648 "smarty_internal_compile_debug.php" => true, |
|
649 "smarty_internal_compile_eval.php" => true, |
|
650 "smarty_internal_compile_extends.php" => true, |
|
651 "smarty_internal_compile_for.php" => true, |
|
652 "smarty_internal_compile_foreach.php" => true, |
|
653 "smarty_internal_compile_function.php" => true, |
|
654 "smarty_internal_compile_if.php" => true, |
|
655 "smarty_internal_compile_include.php" => true, |
|
656 "smarty_internal_compile_include_php.php" => true, |
|
657 "smarty_internal_compile_insert.php" => true, |
|
658 "smarty_internal_compile_ldelim.php" => true, |
|
659 "smarty_internal_compile_nocache.php" => true, |
|
660 "smarty_internal_compile_private_block_plugin.php" => true, |
|
661 "smarty_internal_compile_private_function_plugin.php" => true, |
|
662 "smarty_internal_compile_private_modifier.php" => true, |
|
663 "smarty_internal_compile_private_object_block_function.php" => true, |
|
664 "smarty_internal_compile_private_object_function.php" => true, |
|
665 "smarty_internal_compile_private_print_expression.php" => true, |
|
666 "smarty_internal_compile_private_registered_block.php" => true, |
|
667 "smarty_internal_compile_private_registered_function.php" => true, |
|
668 "smarty_internal_compile_private_special_variable.php" => true, |
|
669 "smarty_internal_compile_rdelim.php" => true, |
|
670 "smarty_internal_compile_section.php" => true, |
|
671 "smarty_internal_compile_setfilter.php" => true, |
|
672 "smarty_internal_compile_while.php" => true, |
|
673 "smarty_internal_compilebase.php" => true, |
|
674 "smarty_internal_config.php" => true, |
|
675 "smarty_internal_config_file_compiler.php" => true, |
|
676 "smarty_internal_configfilelexer.php" => true, |
|
677 "smarty_internal_configfileparser.php" => true, |
|
678 "smarty_internal_data.php" => true, |
|
679 "smarty_internal_debug.php" => true, |
|
680 "smarty_internal_filter_handler.php" => true, |
|
681 "smarty_internal_function_call_handler.php" => true, |
|
682 "smarty_internal_get_include_path.php" => true, |
|
683 "smarty_internal_nocache_insert.php" => true, |
|
684 "smarty_internal_parsetree.php" => true, |
|
685 "smarty_internal_resource_eval.php" => true, |
|
686 "smarty_internal_resource_extends.php" => true, |
|
687 "smarty_internal_resource_file.php" => true, |
|
688 "smarty_internal_resource_registered.php" => true, |
|
689 "smarty_internal_resource_stream.php" => true, |
|
690 "smarty_internal_resource_string.php" => true, |
|
691 "smarty_internal_smartytemplatecompiler.php" => true, |
|
692 "smarty_internal_template.php" => true, |
|
693 "smarty_internal_templatebase.php" => true, |
|
694 "smarty_internal_templatecompilerbase.php" => true, |
|
695 "smarty_internal_templatelexer.php" => true, |
|
696 "smarty_internal_templateparser.php" => true, |
|
697 "smarty_internal_utility.php" => true, |
|
698 "smarty_internal_write_file.php" => true, |
|
699 "smarty_resource.php" => true, |
|
700 "smarty_resource_custom.php" => true, |
|
701 "smarty_resource_recompiled.php" => true, |
|
702 "smarty_resource_uncompiled.php" => true, |
|
703 "smarty_security.php" => true, |
|
704 ); |
|
705 $iterator = new DirectoryIterator($source); |
|
706 foreach ($iterator as $file) { |
|
707 if (!$file->isDot()) { |
|
708 $filename = $file->getFilename(); |
|
709 if (isset($expected[$filename])) { |
|
710 unset($expected[$filename]); |
|
711 } |
|
712 } |
|
713 } |
|
714 if ($expected) { |
|
715 $status = false; |
|
716 $message = "FAILED: files missing from libs/sysplugins: ". join(', ', array_keys($expected)); |
|
717 if ($errors === null) { |
|
718 echo $message . ".\n"; |
|
719 } else { |
|
720 $errors['sysplugins'] = $message; |
|
721 } |
|
722 } elseif ($errors === null) { |
|
723 echo "... OK\n"; |
|
724 } |
|
725 } else { |
|
726 $status = false; |
|
727 $message = "FAILED: ". SMARTY_SYSPLUGINS_DIR .' is not a directory'; |
|
728 if ($errors === null) { |
|
729 echo $message . ".\n"; |
|
730 } else { |
|
731 $errors['sysplugins_dir_constant'] = $message; |
|
732 } |
|
733 } |
|
734 |
|
735 if ($errors === null) { |
|
736 echo "Testing plugin files...\n"; |
|
737 } |
|
738 // test if core plugins are available |
|
739 $source = SMARTY_PLUGINS_DIR; |
|
740 if (is_dir($source)) { |
|
741 $expected = array( |
|
742 "block.textformat.php" => true, |
|
743 "function.counter.php" => true, |
|
744 "function.cycle.php" => true, |
|
745 "function.fetch.php" => true, |
|
746 "function.html_checkboxes.php" => true, |
|
747 "function.html_image.php" => true, |
|
748 "function.html_options.php" => true, |
|
749 "function.html_radios.php" => true, |
|
750 "function.html_select_date.php" => true, |
|
751 "function.html_select_time.php" => true, |
|
752 "function.html_table.php" => true, |
|
753 "function.mailto.php" => true, |
|
754 "function.math.php" => true, |
|
755 "modifier.capitalize.php" => true, |
|
756 "modifier.date_format.php" => true, |
|
757 "modifier.debug_print_var.php" => true, |
|
758 "modifier.escape.php" => true, |
|
759 "modifier.regex_replace.php" => true, |
|
760 "modifier.replace.php" => true, |
|
761 "modifier.spacify.php" => true, |
|
762 "modifier.truncate.php" => true, |
|
763 "modifiercompiler.cat.php" => true, |
|
764 "modifiercompiler.count_characters.php" => true, |
|
765 "modifiercompiler.count_paragraphs.php" => true, |
|
766 "modifiercompiler.count_sentences.php" => true, |
|
767 "modifiercompiler.count_words.php" => true, |
|
768 "modifiercompiler.default.php" => true, |
|
769 "modifiercompiler.escape.php" => true, |
|
770 "modifiercompiler.from_charset.php" => true, |
|
771 "modifiercompiler.indent.php" => true, |
|
772 "modifiercompiler.lower.php" => true, |
|
773 "modifiercompiler.noprint.php" => true, |
|
774 "modifiercompiler.string_format.php" => true, |
|
775 "modifiercompiler.strip.php" => true, |
|
776 "modifiercompiler.strip_tags.php" => true, |
|
777 "modifiercompiler.to_charset.php" => true, |
|
778 "modifiercompiler.unescape.php" => true, |
|
779 "modifiercompiler.upper.php" => true, |
|
780 "modifiercompiler.wordwrap.php" => true, |
|
781 "outputfilter.trimwhitespace.php" => true, |
|
782 "shared.escape_special_chars.php" => true, |
|
783 "shared.literal_compiler_param.php" => true, |
|
784 "shared.make_timestamp.php" => true, |
|
785 "shared.mb_str_replace.php" => true, |
|
786 "shared.mb_unicode.php" => true, |
|
787 "shared.mb_wordwrap.php" => true, |
|
788 "variablefilter.htmlspecialchars.php" => true, |
|
789 ); |
|
790 $iterator = new DirectoryIterator($source); |
|
791 foreach ($iterator as $file) { |
|
792 if (!$file->isDot()) { |
|
793 $filename = $file->getFilename(); |
|
794 if (isset($expected[$filename])) { |
|
795 unset($expected[$filename]); |
|
796 } |
|
797 } |
|
798 } |
|
799 if ($expected) { |
|
800 $status = false; |
|
801 $message = "FAILED: files missing from libs/plugins: ". join(', ', array_keys($expected)); |
|
802 if ($errors === null) { |
|
803 echo $message . ".\n"; |
|
804 } else { |
|
805 $errors['plugins'] = $message; |
|
806 } |
|
807 } elseif ($errors === null) { |
|
808 echo "... OK\n"; |
|
809 } |
|
810 } else { |
|
811 $status = false; |
|
812 $message = "FAILED: ". SMARTY_PLUGINS_DIR .' is not a directory'; |
|
813 if ($errors === null) { |
|
814 echo $message . ".\n"; |
|
815 } else { |
|
816 $errors['plugins_dir_constant'] = $message; |
|
817 } |
|
818 } |
|
819 |
|
820 if ($errors === null) { |
|
821 echo "Tests complete.\n"; |
|
822 echo "</PRE>\n"; |
|
823 } |
|
824 |
|
825 return $status; |
|
826 } |
|
827 |
|
828 } |
|
829 |
|
830 ?> |