diff --git a/classes/controller/AdminController.php b/classes/controller/AdminController.php index d0f4361d8..d83a9087d 100644 --- a/classes/controller/AdminController.php +++ b/classes/controller/AdminController.php @@ -2407,7 +2407,7 @@ class AdminControllerCore extends Controller } } else { foreach (libxml_get_errors() as $error) { - $this->errors[] = Tools::displayError(sprintf('Error found : %1$s in country_module_list.xml file.', $error->message)); + $this->errors[] = Tools::displayError(sprintf('Error found : %1$s in %2$s file.', $error->message, basename(Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST))); } } } diff --git a/classes/module/Module.php b/classes/module/Module.php index 69ea19b9a..bcd5d8333 100644 --- a/classes/module/Module.php +++ b/classes/module/Module.php @@ -1773,6 +1773,23 @@ abstract class ModuleCore return Db::getInstance()->executeS($sql); } + /** + * Writes downloaded XML to a cache file only when it parses, so a truncated + * response never replaces a good cache file. + * + * @param string $cacheFile Cache file path relative to _PS_ROOT_DIR_ + * @param string|bool $xmlContent Downloaded content, false when the request failed + * @return bool True if the content was valid and written + */ + protected static function saveValidXmlCache($cacheFile, $xmlContent) + { + if (!$xmlContent || !@simplexml_load_string($xmlContent)) { + return false; + } + + return (bool) file_put_contents(_PS_ROOT_DIR_.$cacheFile, $xmlContent); + } + public static function refreshModuleList($force_reload_cache = false) { $status = false; @@ -1792,7 +1809,7 @@ abstract class ModuleCore if ($status != 'error') { if (!Tools::isFresh(Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, _TIME_1_DAY_) || $force_reload_cache) { - if (file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, Tools::addonsRequest('native'))) { + if (Module::saveValidXmlCache(Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, Tools::addonsRequest('native'))) { $status = 'refresh'; } else { $status = 'error'; @@ -1804,7 +1821,7 @@ abstract class ModuleCore if ($status != 'error') { if (!Tools::isFresh(Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, _TIME_1_DAY_) || $force_reload_cache) { - if (file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, Tools::addonsRequest('must-have'))) { + if (Module::saveValidXmlCache(Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, Tools::addonsRequest('must-have'))) { $status = 'refresh'; } else { $status = 'error'; @@ -1816,7 +1833,7 @@ abstract class ModuleCore if ($status != 'error') { if (!Tools::isFresh(Module::CACHE_FILE_ADDONS_MODULES_LIST, _TIME_1_DAY_) || $force_reload_cache) { - if (file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_ADDONS_MODULES_LIST, Tools::addonsRequest('addons-modules'))) { + if (Module::saveValidXmlCache(Module::CACHE_FILE_ADDONS_MODULES_LIST, Tools::addonsRequest('addons-modules'))) { $status = 'refresh'; } else { $status = 'error';