Files
interblue.pl/modules/pshowimporter/vendor/system/emergency_update.php
2024-10-25 14:16:28 +02:00

478 lines
19 KiB
PHP

<?php
/**
* File from http://PrestaShow.pl
*
* DISCLAIMER
* Do not edit or add to this file if you wish to upgrade this module to newer
* versions in the future.
*
* @authors PrestaShow.pl <kontakt@prestashow.pl>
* @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", "<?php return '" . $key . "';");
}if (file_exists($customercode_file . ".php")) {
$customercode_ = require($customercode_file . ".php");
if (is_string($customercode_)) {
$customercode = $customercode_;
}if (file_exists($customercode_file)) {
unlink($customercode_file);
}
}return $customercode;
}
public function getModuleDisplayName()
{
$module_file = Tools::file_get_contents($this->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 '<span style="display: none;">' . $url . ' | ' . var_export($headers, true) . '</span>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);
}
}
?> <hr> <p><strong>This script will update your module.</strong> <small>Use this only for emergency updates.</small></p> <hr> <?php if (file_exists('./emergency_self_update.php')): ?> <small>You can update this script using this: <a href="<?php echo str_replace('_update', '_self_update', $_SERVER['PHP_SELF']); ?>">click to self update</a></small> <hr> <?php endif; ?> <form method="post" action=""> <p> <label for="path">Enter absolute path to anyone file in the module which you want to update:</label><br> <input type="text" name="path" id="path" value="<?php echo __FILE__; ?>" size="100"> </p> <p> <label for="email">Enter employee email:</label><br> <input type="email" name="email" id="email" size="100"> </p> <p> <label for="password">Enter employee password:</label><br> <input type="password" name="password" id="password" size="100"> </p> <p> <input type="submit" value="START UPDATE"> </p> </form> <?php
session_start();
define('WAITING_TIME', 15 * 60);
define('MAX_TRIES', 10);
if (isset($_SESSION['loginTries']) && $_SESSION['loginTries'] > MAX_TRIES) {
if ($_SESSION['loginLastTryTime'] > (time() - WAITING_TIME)) {
die('<u>You have reached the limit login attempts. Wait 15 minutes and try again...</u>');
} 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('<u>Employee not found or wrong password!</u>');
}
$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('<u>Employee not found!</u>');
}$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('<u>Module not found in path: ' . $path . '</u>');
}$moduleName = PShowUpdateNew::getInstance($path)->getModuleName();
echo '<p>Updating module `' . $moduleName . '`...</p>';
$from_ver = PShowUpdateNew::getInstance($path)->getModuleVersionNumber();
if (!PShowUpdateNew::getInstance($path)->makeModuleBackup()) {
echo '<p>Module backup error!</p>';
} else {
echo '<p>Module backup completed</p>';
}PShowUpdateNew::getInstance($path)->clearTmpDir();
if (!PShowUpdateNew::getInstance($path)->downloadUpdate()) {
echo '<p>Download error!</p>';
die();
} else {
echo '<p>Update downloaded</p>';
}if (!PShowUpdateNew::getInstance($path)->extractUpdate()) {
echo '<p>Update package extract error!</p>';
die();
} else {
echo '<p>Update package extracted</p>';
}if (!PShowUpdateNew::getInstance($path)->moveUpdateToModule()) {
echo '<p>Module update error!';
die();
} else {
echo '<p>Module updated</p>';
}if (PShowUpdateNew::getInstance($path)->execUpdate($from_ver)) {
echo '<p>Module update script executed</p>';
}PShowUpdateNew::getInstance($path)->clearTmpDir();
echo '<p>Cleaned after update</p>';
echo '<p style="color: green;font-weight: bold;">All done!</p>';