* @copyright 2015 PrestaShow.pl * @license http://PrestaShow.pl/license * * Emergency update. * * Use when you are not able to log into the admin panel. */ error_reporting(E_ALL); ini_set('display_errors', 'On'); class PShowUpdateNew { public static $modulename; public static $customercode; public static $prestaversion; public static $tmppath; public static $reportbugurl = 'http://modules.prestashow.pl/bug_report.php'; public static $updateurl = 'http://modules.prestashow.pl'; public static $modulepath = null; private static $instance = array(); private $filepath; public static function getInstance($_filepath) { $filepath = self::findRealFilePathFromBacktrace($_filepath); $md5 = md5($filepath); if (!array_key_exists($md5, self::$instance)) { self::$instance[$md5] = new self($filepath); }return self::$instance[$md5]; } public static function findRealFilePathFromBacktrace($filepath) { $backtrace = debug_backtrace(); foreach ($backtrace as $call) { if (array_key_exists('file', $call) && stripos($call['file'], '/system/') === false && stripos($call['file'], '/modules/') !== false) { return $call['file']; } }return $filepath; } public static function getRecommendedProduct() { if (!defined('PS_ADMIN_DIR')) { return array('name' => 'PrestaShow.pl', 'description' => '', 'image' => '', 'url' => 'http://prestashow.pl'); }$context = stream_context_create(array('http' => array('method' => 'GET', 'timeout' => 1))); $products = @unserialize(file_get_contents('http://modules.prestashow.pl/recommended_products/1', false, $context)); if (!$products) { $products = array(array('name' => 'PrestaShow.pl', 'description' => '', 'image' => '', 'url' => 'http://prestashow.pl')); }return reset($products); } private function __construct($filepath) { $this->filepath = $filepath; } public function getModuleName() { $module_path = $this->getModulePath(); $module_path_arr = explode(DIRECTORY_SEPARATOR, $module_path); return $module_path_arr[count($module_path_arr) - 2]; } public function getModulePath() { $filepath = $this->filepath; if (Tools::getValue('controller') && stripos(Tools::getValue('controller'), 'PShow')) { $controller = strtolower(Tools::getValue('controller')); $bestpath = false; for ($i = 0; $i <= strlen($controller); ++$i) { $tmp = _PS_MODULE_DIR_ . substr($controller, 0, $i); $bestpath = is_dir($tmp) ? $tmp : $bestpath; }return $bestpath . '/'; }if (Tools::substr($filepath, -1, 1) == DIRECTORY_SEPARATOR) { $filepath = Tools::substr($filepath, 0, Tools::strlen($filepath) - 1); }$explode = explode(DIRECTORY_SEPARATOR, dirname($filepath)); $stay = array_search('modules', $explode) + 1; if (!array_key_exists($stay, $explode)) { return $filepath . DIRECTORY_SEPARATOR; }$newpath_ = array(); for ($i = 0; $i <= $stay; ++$i) { $newpath_[] = $explode[$i]; }$newpath = implode(DIRECTORY_SEPARATOR, $newpath_); return $newpath . DIRECTORY_SEPARATOR; } public function getCustomerCode() { $customercode = 'no-license'; $customercode_file = $this->getModulePath($this->filepath) . "license"; if (file_exists($customercode_file) && !file_exists($customercode_file . ".php")) { $key = file_get_contents($customercode_file); $key = preg_replace('/\s+/', '', $key); file_put_contents($customercode_file . ".php", "getModulePath() . $this->getModuleName() . '.php'); $matches = array(); preg_match_all('~class ([a-zA-Z0-9]+) extends~', $module_file, $matches); $_matches = end($matches); return end($_matches); } public function getModuleVersionNumber() { $path = $this->getModulePath() . $this->getModuleName() . '.php'; if (stripos($path, 'modules') === false || !file_exists($path)) { return $path; }$module_file = Tools::file_get_contents($this->getModulePath() . $this->getModuleName() . '.php'); preg_match_all('~version([\s]+)\= (\'|\")([0-9]+).([0-9]+).([0-9]+)(\'|\")~', $module_file, $_matches); preg_match_all('~([0-9]+).([0-9]+).([0-9]+)~', implode(reset($_matches)), $matches); $_version = reset($matches); $version = reset($_version); $module_version_arr = explode('.', $version); if (file_exists($this->getModulePath() . 'system/version')) { $skeleton_version = (int) Tools::file_get_contents($this->getModulePath() . 'system/version'); } else { $skeleton_version = 0; }return((int) $module_version_arr[0]) . '.' . ((int) $module_version_arr[1]) . '.' . ((int) $skeleton_version + (int) $module_version_arr[2]); } public function getNewestVersionNumber() { if (!defined('PS_ADMIN_DIR')) { return 'notInAdmin'; }$url = 'http://modules.prestashow.pl'; $url .= '/' . $this->getPrestashopVersion(); $url .= '/' . $this->getModuleName(); $url .= '/' . $this->getModuleVersionNumber(); $url .= '/' . $this->getCustomerCode(); $url .= '/' . gethostbyname(gethostname()); $url .= '/' . $_SERVER["HTTP_HOST"]; if (function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $newestVersionNumber = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode == 200) { return $newestVersionNumber; } }$headers = get_headers($url); if (!strpos($headers[0], '200')) { return 'Unable to check. Try again later...'; }$context = stream_context_create(array('http' => array('method' => 'GET', 'timeout' => 1))); $newestVersionNumber = @file_get_contents($url, false, $context); if (!$newestVersionNumber || $newestVersionNumber == '0.0.0') { return 'Unable to check. Try again later...'; }return $newestVersionNumber; } public function getPrestashopVersion() { return _PS_VERSION_; } public function compareModuleAndNewestVersion() { return version_compare($this->getModuleVersionNumber(), $this->getNewestVersionNumber(), '>='); } public function downloadUpdate() { $url = 'http://modules.prestashow.pl'; $url .= '/download'; $url .= '/' . $this->getPrestashopVersion(); $url .= '/' . $this->getModuleName(); $url .= '/' . $this->getModuleVersionNumber(); $url .= '/' . $this->getCustomerCode(); $url .= '/' . gethostbyname(gethostname()); $url .= '/http://' . $_SERVER["HTTP_HOST"] . __PS_BASE_URI__; $httpCode = false; if (function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_NOBODY, true); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); }if ($httpCode != 200) { $headers = get_headers($url); if (!strpos($headers[0], '200 OK')) { echo '' . $url . ' | ' . var_export($headers, true) . 'brak połączenia z serwerem (' . $this->getCustomerCode() . ')'; return false; } }$tmppath = $this->getTmpPath(); if (!is_dir($tmppath)) { @mkdir($tmppath); if (!is_dir($tmppath)) { echo 'brak katalogu ' . $tmppath; return false; } }if (!is_writable($this->getTmpPath())) { echo 'brak uprawnień, ustaw uprawnienia zapisu dla katalogu ' . $tmppath; return false; }if (function_exists('curl_init')) { set_time_limit(0); $fp = fopen($tmppath . $this->getNewestVersionNumber() . '.zip', 'w+'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 50); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_exec($ch); curl_close($ch); fclose($fp); } else { $context = stream_context_create(array('http' => array('method' => 'GET', 'timeout' => 60))); $package = file_get_contents($url, false, $context); file_put_contents($tmppath . $this->getNewestVersionNumber() . '.zip', $package); }return(file_exists($tmppath . $this->getNewestVersionNumber() . '.zip')); } public function getTmpPath() { return $this->getModulePath() . 'update/tmp/'; } public function extractUpdate() { $version = $this->getNewestVersionNumber(); if (!file_exists($this->getTmpPath() . $version . '.zip')) { return false; }$zip = new ZipArchive(); $res = $zip->open($this->getTmpPath() . $version . '.zip'); if ($res === true) { $zip->extractTo($this->getTmpPath()); $zip->close(); return true; } else { return false; } } public function recurseCopy($src, $dst) { $dir = opendir($src); @mkdir($dst); while (false !== ($file = readdir($dir))) { if (($file != '.') && ($file != '..') && ($file != 'license')) { if (is_dir($src . '/' . $file)) { $this->recurseCopy($src . '/' . $file, $dst . '/' . $file); } else { copy($src . '/' . $file, $dst . '/' . $file); } } }closedir($dir); return true; } public function clearTmpDir() { $this->recurseRemoveDir($this->getTmpPath()); return true; } public function moveUpdateToModule() { $from = $this->getTmpPath() . $this->getModuleName() . "/"; $to = $this->getModulePath(); $this->recurseCopy($from, $to); return true; } public function recurseRemoveDir($_path, $removePath = false) { if (!is_dir($_path)) { return false; }$path = str_replace('//', '/', $_path); if (Tools::substr($path, -1, 1) == DIRECTORY_SEPARATOR) { $path = Tools::substr($path, 0, Tools::strlen($path) - 1); }$files = glob($path . '/*'); foreach ($files as $file) { if (is_dir($file)) { $this->recurseRemoveDir($file, true); continue; }unlink($file); }if ($removePath === true) { @rmdir($path); } } public function makeModuleBackup() { $path = $this->getModulePath() . "update/backups/"; $destPath = $path . $this->getModuleName() . "_" . $this->getModuleVersionNumber() . "_" . date('H.i_d.m.Y') . ".zip"; $zip = new ZipArchive(); if (!is_dir($path)) { @mkdir($path); if (!is_dir($path)) { return 'brak katalogu ' . $path; } }if (!$zip->open($destPath, ZipArchive::CREATE | ZipArchive::OVERWRITE)) { return false; }$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->getModulePath()), RecursiveIteratorIterator::LEAVES_ONLY); try { foreach ($files as $name => $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = Tools::substr($filePath, Tools::strlen($this->getModulePath())); if (preg_match('~update~', $filePath)) { continue; }if (preg_match('~.git~', $filePath)) { continue; }if (preg_match('~license~', $filePath)) { continue; }if (preg_match('~' . $this->getModuleName() . '_~', $filePath)) { continue; }$zip->addFile($filePath, $relativePath); } } } catch (UnexpectedValueException $e) { }$zip->close(); return(file_exists($destPath)); } public function moveBackupToTmp($file) { if (!file_exists($this->getModulePath() . "update/backups/" . $file)) { return false; }copy($this->getModulePath() . "update/backups/" . $file, $this->getTmpPath() . $file); if (!file_exists($this->getTmpPath() . $file)) { return false; }return true; } public function extractBackup($file) { if (!file_exists($this->getTmpPath() . $file)) { return false; }$zip = new ZipArchive(); $res = $zip->open($this->getTmpPath() . $file); if (!file_exists($this->getTmpPath() . 'backup/')) { mkdir($this->getTmpPath() . 'backup/', 0777); }if ($res === TRUE) { $zip->extractTo($this->getTmpPath() . 'backup/'); $zip->close(); return true; } else { return false; } } public function moveBackupToModule() { $from = $this->getTmpPath() . 'backup/'; $to = $this->getModulePath(); $this->recurseCopy($from, $to); return true; } public function execUpdate($from_ver) { $ver_expl = explode('.', $from_ver); $from_ver = $ver_expl[0] . '.' . $ver_expl[1]; $modulename = $this->getModuleName(); require_once $this->getModulePath() . $modulename . '.php'; $instance = new $modulename(); if (!isset($instance->moduleVersionPath)) { $instance->moduleVersionPath = array(); }foreach ($instance->moduleVersionPath as $ver) { $funcName = str_replace('.', '_', $from_ver); if (version_compare($instance->version, $from_ver . '.0') == 1 && method_exists($instance, $funcName)) { $instance->funcName(); } }return false; } public function formatVersionToDisplay($version) { return preg_replace('/([0-9]+).([0-9]+).([0-9]+)/i', '$1.$2-$3', $version); } } ?>

This script will update your module. Use this only for emergency updates.


You can update this script using this: click to self update




MAX_TRIES) { if ($_SESSION['loginLastTryTime'] > (time() - WAITING_TIME)) { die('You have reached the limit login attempts. Wait 15 minutes and try again...'); } else { $_SESSION['loginTries'] = 0; } }require_once "../../../../config/config.inc.php"; if (!Tools::getValue('password') || !Tools::getValue('password')) { die(); }error_reporting(E_ALL); ini_set('display_errors', 'On'); function employeeNotFound() { if (!isset($_SESSION['loginTries'])) { $_SESSION['loginTries'] = 0; } ++$_SESSION['loginTries']; $_SESSION['loginLastTryTime'] = time(); die('Employee not found or wrong password!'); } $email = pSQL(Tools::getValue('email')); if (version_compare(_PS_VERSION_, '1.7') >= 0) { $sql = new DbQuery(); $sql->select('e.*'); $sql->from('employee', 'e'); $sql->where('e.`email` = \'' . pSQL($email) . '\''); $sql->where('e.`active` = 1'); $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); if (!$result) { die('Employee not found!'); }$crypto = \PrestaShop\PrestaShop\Adapter\ServiceLocator::get('\\PrestaShop\\PrestaShop\\Core\\Crypto\\Hashing'); if (!$crypto->checkHash(Tools::getValue('password'), $result['passwd'])) { employeeNotFound(); } } else { $password = Tools::encrypt(Tools::getValue('password')); $q = "SELECT COUNT(*) " . "FROM " . _DB_PREFIX_ . "employee " . "WHERE `email` = '" . $email . "' AND `passwd` = '" . $password . "'; "; $foundEmployee = Db::getInstance()->getValue($q); if (!$foundEmployee) { employeeNotFound(); } }$path = Tools::getValue('path'); if (empty($path)) { die('Module not found in path: ' . $path . ''); }$moduleName = PShowUpdateNew::getInstance($path)->getModuleName(); echo '

Updating module `' . $moduleName . '`...

'; $from_ver = PShowUpdateNew::getInstance($path)->getModuleVersionNumber(); if (!PShowUpdateNew::getInstance($path)->makeModuleBackup()) { echo '

Module backup error!

'; } else { echo '

Module backup completed

'; }PShowUpdateNew::getInstance($path)->clearTmpDir(); if (!PShowUpdateNew::getInstance($path)->downloadUpdate()) { echo '

Download error!

'; die(); } else { echo '

Update downloaded

'; }if (!PShowUpdateNew::getInstance($path)->extractUpdate()) { echo '

Update package extract error!

'; die(); } else { echo '

Update package extracted

'; }if (!PShowUpdateNew::getInstance($path)->moveUpdateToModule()) { echo '

Module update error!'; die(); } else { echo '

Module updated

'; }if (PShowUpdateNew::getInstance($path)->execUpdate($from_ver)) { echo '

Module update script executed

'; }PShowUpdateNew::getInstance($path)->clearTmpDir(); echo '

Cleaned after update

'; echo '

All done!

';