diff options
Diffstat (limited to 'libs/sysplugins/smarty_internal_utility.php')
| -rw-r--r-- | libs/sysplugins/smarty_internal_utility.php | 556 |
1 files changed, 454 insertions, 102 deletions
diff --git a/libs/sysplugins/smarty_internal_utility.php b/libs/sysplugins/smarty_internal_utility.php index 57046bca..d52f6056 100644 --- a/libs/sysplugins/smarty_internal_utility.php +++ b/libs/sysplugins/smarty_internal_utility.php @@ -1,5 +1,4 @@ <?php - /** * Project: Smarty: the PHP compiling template engine * File: smarty_internal_utility.php @@ -32,41 +31,48 @@ * @version 3-SVN$Rev: 3286 $ */ + +/** + * Utility class + * + * @package Smarty + * @subpackage Security + */ class Smarty_Internal_Utility { - protected $smarty; - function __construct($smarty) + /** + * private constructor to prevent calls creation of new instances + */ + private final function __construct() { - $this->smarty = $smarty; + // intentionally left blank } /** * Compile all template files * - * @param string $extension file extension - * @param bool $force_compile force all to recompile - * @param int $time_limit - * @param int $max_errors - * @return integer number of template files recompiled + * @param string $extension template file name extension + * @param bool $force_compile force all to recompile + * @param int $time_limit set maximum execution time + * @param int $max_errors set maximum allowed errors + * @param Smarty $smarty Smarty instance + * @return integer number of template files compiled */ - function compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) + public static function compileAllTemplates($extention, $force_compile, $time_limit, $max_errors, Smarty $smarty) { // switch off time limit if (function_exists('set_time_limit')) { @set_time_limit($time_limit); } - $this->smarty->force_compile = $force_compile; + $smarty->force_compile = $force_compile; $_count = 0; $_error_count = 0; // loop over array of template directories - foreach((array)$this->smarty->template_dir as $_dir) { - if (strpos('/\\', substr($_dir, -1)) === false) { - $_dir .= DS; - } + foreach($smarty->getTemplateDir() as $_dir) { $_compileDirs = new RecursiveDirectoryIterator($_dir); $_compile = new RecursiveIteratorIterator($_compileDirs); foreach ($_compile as $_fileinfo) { - if (substr($_fileinfo->getBasename(),0,1) == '.') continue; + if (substr($_fileinfo->getBasename(),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue; $_file = $_fileinfo->getFilename(); if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue; if ($_fileinfo->getPath() == substr($_dir, 0, -1)) { @@ -78,7 +84,7 @@ class Smarty_Internal_Utility { flush(); $_start_time = microtime(true); try { - $_tpl = $this->smarty->createTemplate($_template_file,null,null,null,false); + $_tpl = $smarty->createTemplate($_template_file,null,null,null,false); if ($_tpl->mustCompile()) { $_tpl->compileTemplateSource(); echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; @@ -92,8 +98,8 @@ class Smarty_Internal_Utility { echo 'Error: ', $e->getMessage(), "<br><br>"; $_error_count++; } - // free memory - $this->smarty->template_objects = array(); + // free memory + $smarty->template_objects = array(); $_tpl->smarty->template_objects = array(); $_tpl = null; if ($max_errors !== null && $_error_count == $max_errors) { @@ -108,30 +114,28 @@ class Smarty_Internal_Utility { /** * Compile all config files * - * @param string $extension file extension - * @param bool $force_compile force all to recompile - * @param int $time_limit - * @param int $max_errors - * @return integer number of template files recompiled + * @param string $extension config file name extension + * @param bool $force_compile force all to recompile + * @param int $time_limit set maximum execution time + * @param int $max_errors set maximum allowed errors + * @param Smarty $smarty Smarty instance + * @return integer number of config files compiled */ - function compileAllConfig($extention = '.conf', $force_compile = false, $time_limit = 0, $max_errors = null) + public static function compileAllConfig($extention, $force_compile, $time_limit, $max_errors, Smarty $smarty) { // switch off time limit if (function_exists('set_time_limit')) { @set_time_limit($time_limit); } - $this->smarty->force_compile = $force_compile; + $smarty->force_compile = $force_compile; $_count = 0; $_error_count = 0; // loop over array of template directories - foreach((array)$this->smarty->config_dir as $_dir) { - if (strpos('/\\', substr($_dir, -1)) === false) { - $_dir .= DS; - } + foreach($smarty->getConfigDir() as $_dir) { $_compileDirs = new RecursiveDirectoryIterator($_dir); $_compile = new RecursiveIteratorIterator($_compileDirs); foreach ($_compile as $_fileinfo) { - if (substr($_fileinfo->getBasename(),0,1) == '.') continue; + if (substr($_fileinfo->getBasename(),0,1) == '.' || strpos($_fileinfo, '.svn') !== false) continue; $_file = $_fileinfo->getFilename(); if (!substr_compare($_file, $extention, - strlen($extention)) == 0) continue; if ($_fileinfo->getPath() == substr($_dir, 0, -1)) { @@ -143,7 +147,7 @@ class Smarty_Internal_Utility { flush(); $_start_time = microtime(true); try { - $_config = new Smarty_Internal_Config($_config_file, $this->smarty); + $_config = new Smarty_Internal_Config($_config_file, $smarty); if ($_config->mustCompile()) { $_config->compileConfigSource(); echo ' compiled in ', microtime(true) - $_start_time, ' seconds'; @@ -169,132 +173,480 @@ class Smarty_Internal_Utility { /** * Delete compiled template file * - * @param string $resource_name template name - * @param string $compile_id compile id - * @param integer $exp_time expiration time + * @param string $resource_name template name + * @param string $compile_id compile id + * @param integer $exp_time expiration time + * @param Smarty $smarty Smarty instance * @return integer number of template files deleted */ - function clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) + public static function clearCompiledTemplate($resource_name, $compile_id, $exp_time, Smarty $smarty) { + $_compile_dir = $smarty->getCompileDir(); $_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null; - $_dir_sep = $this->smarty->use_sub_dirs ? DS : '^'; + $_dir_sep = $smarty->use_sub_dirs ? DS : '^'; if (isset($resource_name)) { - $_resource_part_1 = $resource_name . '.php'; - $_resource_part_2 = $resource_name . '.cache' . '.php'; + $_save_stat = $smarty->caching; + $smarty->caching = false; + $tpl = new $smarty->template_class($resource_name, $smarty); + $smarty->caching = $_save_stat; + if ($tpl->source->exists) { + $_resource_part_1 = basename(str_replace('^', '/', $tpl->compiled->filepath)); + // remove from template cache + unset($smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); + } else { + // remove from template cache + unset($smarty->template_objects[sha1($tpl->template_resource . $tpl->cache_id . $tpl->compile_id)]); + return 0; + } + $_resource_part_2 = str_replace('.php','.cache.php',$_resource_part_1); } else { $_resource_part = ''; } - $_dir = $this->smarty->compile_dir; - if ($this->smarty->use_sub_dirs && isset($_compile_id)) { + $_dir = $_compile_dir; + if ($smarty->use_sub_dirs && isset($_compile_id)) { $_dir .= $_compile_id . $_dir_sep; } if (isset($_compile_id)) { - $_compile_id_part = $this->smarty->compile_dir . $_compile_id . $_dir_sep; + $_compile_id_part = $_compile_dir . $_compile_id . $_dir_sep; } $_count = 0; $_compileDirs = new RecursiveDirectoryIterator($_dir); $_compile = new RecursiveIteratorIterator($_compileDirs, RecursiveIteratorIterator::CHILD_FIRST); foreach ($_compile as $_file) { - if (substr($_file->getBasename(),0,1) == '.') continue; + if (substr($_file->getBasename(), 0, 1) == '.' || strpos($_file, '.svn') !== false) + continue; if ($_file->isDir()) { if (!$_compile->isDot()) { // delete folder if empty @rmdir($_file->getPathname()); } } else { - if ((!isset($_compile_id) || (strlen((string)$_file) > strlen($_compile_id_part) && substr_compare((string)$_file, $_compile_id_part, 0, strlen($_compile_id_part)) == 0)) && - (!isset($resource_name) || (strlen((string)$_file) > strlen($_resource_part_1) && substr_compare((string)$_file, $_resource_part_1, - strlen($_resource_part_1), strlen($_resource_part_1)) == 0) || - (strlen((string)$_file) > strlen($_resource_part_2) && substr_compare((string)$_file, $_resource_part_2, - strlen($_resource_part_2), strlen($_resource_part_2)) == 0))) { + if ((!isset($_compile_id) || (strlen((string) $_file) > strlen($_compile_id_part) && substr_compare((string) $_file, $_compile_id_part, 0, strlen($_compile_id_part)) == 0)) && + (!isset($resource_name) || (strlen((string) $_file) > strlen($_resource_part_1) && substr_compare((string) $_file, $_resource_part_1, - strlen($_resource_part_1), strlen($_resource_part_1)) == 0) || + (strlen((string) $_file) > strlen($_resource_part_2) && substr_compare((string) $_file, $_resource_part_2, - strlen($_resource_part_2), strlen($_resource_part_2)) == 0))) { if (isset($exp_time)) { if (time() - @filemtime($_file) >= $exp_time) { - $_count += @unlink((string) $_file) ? 1 : 0; + $_count += @ unlink((string) $_file) ? 1 : 0; } } else { - $_count += @unlink((string) $_file) ? 1 : 0; + $_count += @ unlink((string) $_file) ? 1 : 0; } } } } + // clear compiled cache + Smarty_Resource::$sources = array(); + Smarty_Resource::$compileds = array(); return $_count; } /** * Return array of tag/attributes of all tags used by an template * - * @param object $templae template object + * @param Smarty_Internal_Template $templae template object * @return array of tag/attributes */ - public static function getTags(Smarty_Internal_Template $template) - { - $template->smarty->get_used_tags = true; - $template->compileTemplateSource(); - return $template->used_tags; - } + public static function getTags(Smarty_Internal_Template $template) + { + $template->smarty->get_used_tags = true; + $template->compileTemplateSource(); + return $template->used_tags; + } + - function testInstall() + /** + * diagnose Smarty setup + * + * If $errors is secified, the diagnostic report will be appended to the array, rather than being output. + * + * @param Smarty $smarty Smarty instance to test + * @param array $errors array to push results into rather than outputting them + * @return bool status, true if everything is fine, false else + */ + public static function testInstall(Smarty $smarty, &$errors=null) { - echo "<PRE>\n"; + $status = true; + + if ($errors === null) { + echo "<PRE>\n"; + echo "Smarty Installation test...\n"; + echo "Testing template directory...\n"; + } + + // test if all registered template_dir are accessible + foreach($smarty->getTemplateDir() as $template_dir) { + if (!is_dir($template_dir)) { + $status = false; + $message = "FAILED: $template_dir is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['template_dir'] = $message; + } + } elseif (!is_readable($template_dir)) { + $status = false; + $message = "FAILED: $template_dir is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['template_dir'] = $message; + } + } else { + if ($errors === null) { + echo "$template_dir is OK.\n"; + } + } + } - echo "Smarty Installation test...\n"; - echo "Testing template directory...\n"; + if ($errors === null) { + echo "Testing compile directory...\n"; + } + + // test if registered compile_dir is accessible + $_compile_dir = $smarty->getCompileDir(); + if (!is_dir($_compile_dir)) { + $status = false; + $message = "FAILED: {$_compile_dir} is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['compile_dir'] = $message; + } + } elseif (!is_readable($_compile_dir)) { + $status = false; + $message = "FAILED: {$_compile_dir} is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['compile_dir'] = $message; + } + } elseif (!is_writable($_compile_dir)) { + $status = false; + $message = "FAILED: {$_compile_dir} is not writable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['compile_dir'] = $message; + } + } else { + if ($errors === null) { + echo "{$_compile_dir} is OK.\n"; + } + } + - foreach((array)$this->smarty->template_dir as $template_dir) { - if (!is_dir($template_dir)) - echo "FAILED: $template_dir is not a directory.\n"; - elseif (!is_readable($template_dir)) - echo "FAILED: $template_dir is not readable.\n"; - else - echo "$template_dir is OK.\n"; + if ($errors === null) { + echo "Testing plugins directory...\n"; } - echo "Testing compile directory...\n"; + // test if all registered plugins_dir are accessible + // and if core plugins directory is still registered + $_core_plugins_dir = realpath(dirname(__FILE__) .'/../plugins'); + $_core_plugins_available = false; + foreach($smarty->getPluginsDir() as $plugin_dir) { + if (!is_dir($plugin_dir)) { + $status = false; + $message = "FAILED: $plugin_dir is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['plugins_dir'] = $message; + } + } elseif (!is_readable($plugin_dir)) { + $status = false; + $message = "FAILED: $plugin_dir is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['plugins_dir'] = $message; + } + } elseif ($_core_plugins_dir && $_core_plugins_dir == realpath($plugin_dir)) { + $_core_plugins_available = true; + } else { + if ($errors === null) { + echo "$plugin_dir is OK.\n"; + } + } + } + if (!$_core_plugins_available) { + $status = false; + $message = "WARNING: Smarty's own libs/plugins is not available"; + if ($errors === null) { + echo $message . ".\n"; + } elseif (!isset($errors['plugins_dir'])) { + $errors['plugins_dir'] = $message; + } + } - if (!is_dir($this->smarty->compile_dir)) - echo "FAILED: {$this->smarty->compile_dir} is not a directory.\n"; - elseif (!is_readable($this->smarty->compile_dir)) - echo "FAILED: {$this->smarty->compile_dir} is not readable.\n"; - elseif (!is_writable($this->smarty->compile_dir)) - echo "FAILED: {$this->smarty->compile_dir} is not writable.\n"; - else - echo "{$this->smarty->compile_dir} is OK.\n"; + if ($errors === null) { + echo "Testing cache directory...\n"; + } - echo "Testing plugins directory...\n"; + $_cache_dir = $smarty->getCacheDir(); - foreach((array)$this->smarty->plugins_dir as $plugin_dir) { - if (!is_dir($plugin_dir)) - echo "FAILED: $plugin_dir is not a directory.\n"; - elseif (!is_readable($plugin_dir)) - echo "FAILED: $plugin_dir is not readable.\n"; - else - echo "$plugin_dir is OK.\n"; + // test if all registered cache_dir is accessible + if (!is_dir($_cache_dir)) { + $status = false; + $message = "FAILED: {$_cache_dir} is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['cache_dir'] = $message; + } + } elseif (!is_readable($_cache_dir)) { + $status = false; + $message = "FAILED: {$_cache_dir} is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['cache_dir'] = $message; + } + } elseif (!is_writable($_cache_dir)) { + $status = false; + $message = "FAILED: {$_cache_dir} is not writable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['cache_dir'] = $message; + } + } else { + if ($errors === null) { + echo "{$_cache_dir} is OK.\n"; + } } - echo "Testing cache directory...\n"; - if (!is_dir($this->smarty->cache_dir)) - echo "FAILED: {$this->smarty->cache_dir} is not a directory.\n"; - elseif (!is_readable($this->smarty->cache_dir)) - echo "FAILED: {$this->smarty->cache_dir} is not readable.\n"; - elseif (!is_writable($this->smarty->cache_dir)) - echo "FAILED: {$this->smarty->cache_dir} is not writable.\n"; - else - echo "{$this->smarty->cache_dir} is OK.\n"; + if ($errors === null) { + echo "Testing configs directory...\n"; + } + + // test if all registered config_dir are accessible + foreach($smarty->getConfigDir() as $config_dir) { + if (!is_dir($config_dir)) { + $status = false; + $message = "FAILED: $config_dir is not a directory"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['config_dir'] = $message; + } + } elseif (!is_readable($config_dir)) { + $status = false; + $message = "FAILED: $config_dir is not readable"; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['config_dir'] = $message; + } + } else { + if ($errors === null) { + echo "$config_dir is OK.\n"; + } + } + } - echo "Testing configs directory...\n"; - if (!is_dir($this->smarty->config_dir)) - echo "FAILED: {$this->smarty->config_dir} is not a directory.\n"; - elseif (!is_readable($this->smarty->config_dir)) - echo "FAILED: {$this->smarty->config_dir} is not readable.\n"; - else - echo "{$this->smarty->config_dir} is OK.\n"; + if ($errors === null) { + echo "Testing sysplugin files...\n"; + } + // test if sysplugins are available + $source = SMARTY_SYSPLUGINS_DIR; + if (is_dir($source)) { + $expected = array( + "smarty_cacheresource.php" => true, + "smarty_cacheresource_custom.php" => true, + "smarty_cacheresource_keyvaluestore.php" => true, + "smarty_config_source.php" => true, + "smarty_internal_cacheresource_file.php" => true, + "smarty_internal_compile_append.php" => true, + "smarty_internal_compile_assign.php" => true, + "smarty_internal_compile_block.php" => true, + "smarty_internal_compile_break.php" => true, + "smarty_internal_compile_call.php" => true, + "smarty_internal_compile_capture.php" => true, + "smarty_internal_compile_config_load.php" => true, + "smarty_internal_compile_continue.php" => true, + "smarty_internal_compile_debug.php" => true, + "smarty_internal_compile_eval.php" => true, + "smarty_internal_compile_extends.php" => true, + "smarty_internal_compile_for.php" => true, + "smarty_internal_compile_foreach.php" => true, + "smarty_internal_compile_function.php" => true, + "smarty_internal_compile_if.php" => true, + "smarty_internal_compile_include.php" => true, + "smarty_internal_compile_include_php.php" => true, + "smarty_internal_compile_insert.php" => true, + "smarty_internal_compile_ldelim.php" => true, + "smarty_internal_compile_nocache.php" => true, + "smarty_internal_compile_private_block_plugin.php" => true, + "smarty_internal_compile_private_function_plugin.php" => true, + "smarty_internal_compile_private_modifier.php" => true, + "smarty_internal_compile_private_object_block_function.php" => true, + "smarty_internal_compile_private_object_function.php" => true, + "smarty_internal_compile_private_print_expression.php" => true, + "smarty_internal_compile_private_registered_block.php" => true, + "smarty_internal_compile_private_registered_function.php" => true, + "smarty_internal_compile_private_special_variable.php" => true, + "smarty_internal_compile_rdelim.php" => true, + "smarty_internal_compile_section.php" => true, + "smarty_internal_compile_setfilter.php" => true, + "smarty_internal_compile_while.php" => true, + "smarty_internal_compilebase.php" => true, + "smarty_internal_config.php" => true, + "smarty_internal_config_file_compiler.php" => true, + "smarty_internal_configfilelexer.php" => true, + "smarty_internal_configfileparser.php" => true, + "smarty_internal_data.php" => true, + "smarty_internal_debug.php" => true, + "smarty_internal_filter_handler.php" => true, + "smarty_internal_function_call_handler.php" => true, + "smarty_internal_get_include_path.php" => true, + "smarty_internal_nocache_insert.php" => true, + "smarty_internal_parsetree.php" => true, + "smarty_internal_resource_eval.php" => true, + "smarty_internal_resource_extends.php" => true, + "smarty_internal_resource_file.php" => true, + "smarty_internal_resource_registered.php" => true, + "smarty_internal_resource_stream.php" => true, + "smarty_internal_resource_string.php" => true, + "smarty_internal_smartytemplatecompiler.php" => true, + "smarty_internal_template.php" => true, + "smarty_internal_templatebase.php" => true, + "smarty_internal_templatecompilerbase.php" => true, + "smarty_internal_templatelexer.php" => true, + "smarty_internal_templateparser.php" => true, + "smarty_internal_utility.php" => true, + "smarty_internal_write_file.php" => true, + "smarty_resource.php" => true, + "smarty_resource_custom.php" => true, + "smarty_resource_recompiled.php" => true, + "smarty_resource_uncompiled.php" => true, + "smarty_security.php" => true, + ); + $iterator = new DirectoryIterator($source); + foreach ($iterator as $file) { + if (!$file->isDot()) { + $filename = $file->getFilename(); + if (isset($expected[$filename])) { + unset($expected[$filename]); + } + } + } + if ($expected) { + $status = false; + $message = "FAILED: files missing from libs/sysplugins: ". join(', ', array_keys($expected)); + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['sysplugins'] = $message; + } + } elseif ($errors === null) { + echo "... OK\n"; + } + } else { + $status = false; + $message = "FAILED: ". SMARTY_SYSPLUGINS_DIR .' is not a directory'; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['sysplugins_dir_constant'] = $message; + } + } - echo "Tests complete.\n"; + if ($errors === null) { + echo "Testing plugin files...\n"; + } + // test if core plugins are available + $source = SMARTY_PLUGINS_DIR; + if (is_dir($source)) { + $expected = array( + "block.textformat.php" => true, + "function.counter.php" => true, + "function.cycle.php" => true, + "function.fetch.php" => true, + "function.html_checkboxes.php" => true, + "function.html_image.php" => true, + "function.html_options.php" => true, + "function.html_radios.php" => true, + "function.html_select_date.php" => true, + "function.html_select_time.php" => true, + "function.html_table.php" => true, + "function.mailto.php" => true, + "function.math.php" => true, + "modifier.capitalize.php" => true, + "modifier.date_format.php" => true, + "modifier.debug_print_var.php" => true, + "modifier.escape.php" => true, + "modifier.regex_replace.php" => true, + "modifier.replace.php" => true, + "modifier.spacify.php" => true, + "modifier.truncate.php" => true, + "modifiercompiler.cat.php" => true, + "modifiercompiler.count_characters.php" => true, + "modifiercompiler.count_paragraphs.php" => true, + "modifiercompiler.count_sentences.php" => true, + "modifiercompiler.count_words.php" => true, + "modifiercompiler.default.php" => true, + "modifiercompiler.escape.php" => true, + "modifiercompiler.from_charset.php" => true, + "modifiercompiler.indent.php" => true, + "modifiercompiler.lower.php" => true, + "modifiercompiler.noprint.php" => true, + "modifiercompiler.string_format.php" => true, + "modifiercompiler.strip.php" => true, + "modifiercompiler.strip_tags.php" => true, + "modifiercompiler.to_charset.php" => true, + "modifiercompiler.unescape.php" => true, + "modifiercompiler.upper.php" => true, + "modifiercompiler.wordwrap.php" => true, + "outputfilter.trimwhitespace.php" => true, + "shared.escape_special_chars.php" => true, + "shared.literal_compiler_param.php" => true, + "shared.make_timestamp.php" => true, + "shared.mb_str_replace.php" => true, + "shared.mb_unicode.php" => true, + "shared.mb_wordwrap.php" => true, + "variablefilter.htmlspecialchars.php" => true, + ); + $iterator = new DirectoryIterator($source); + foreach ($iterator as $file) { + if (!$file->isDot()) { + $filename = $file->getFilename(); + if (isset($expected[$filename])) { + unset($expected[$filename]); + } + } + } + if ($expected) { + $status = false; + $message = "FAILED: files missing from libs/plugins: ". join(', ', array_keys($expected)); + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['plugins'] = $message; + } + } elseif ($errors === null) { + echo "... OK\n"; + } + } else { + $status = false; + $message = "FAILED: ". SMARTY_PLUGINS_DIR .' is not a directory'; + if ($errors === null) { + echo $message . ".\n"; + } else { + $errors['plugins_dir_constant'] = $message; + } + } - echo "</PRE>\n"; + if ($errors === null) { + echo "Tests complete.\n"; + echo "</PRE>\n"; + } - return true; + return $status; } + } + ?>
\ No newline at end of file |
