예제 #1
0
 /**
  * Final operations after upgrade has been completed
  *
  * @return void
  */
 protected function finalizeUpgrade()
 {
     if ($this->isForce()) {
         if ($this->isNextStepAvailable()) {
             $target = 'installed';
             $entries = \XLite\Upgrade\Cell::getInstance()->getEntries();
             $this->showInfo(null, 1 < count($entries) ? static::t('Modules have been successfully installed') : static::t('Module has been successfully installed'));
             if ($this->isOnlySkins()) {
                 $target = 'layout';
             } elseif ($this->getPaymentMethodToInstall()) {
                 $target = 'payment_settings';
             } else {
                 $target = 'addons_list_installed';
             }
         } else {
             $target = 'addons_list_marketplace';
             $this->showError(__FUNCTION__);
         }
         $this->setReturnURL($this->buildURL('upgrade', '', $this->getActionParamsCommon() + array('redirect' => $target)));
     }
     // Set cell status
     \XLite\Upgrade\Cell::getInstance()->clear(true, false, false);
     \XLite\Upgrade\Cell::getInstance()->setUpgraded(true);
     // Rebuild cache
     if (!($this->isForce() && $this->isOnlySkins())) {
         \XLite::setCleanUpCacheFlag(true);
     }
 }
예제 #2
0
 /**
  * Switch module
  *
  * @return void
  */
 protected function doActionSwitch()
 {
     $changed = false;
     $data = (array) \XLite\Core\Request::getInstance()->switch;
     $modules = array();
     foreach ($this->getModules('switch') as $module) {
         $old = !empty($data[$module->getModuleId()]['old']);
         $new = !empty($data[$module->getModuleId()]['new']);
         if ($old !== $new) {
             $module->setEnabled(!$old);
             $modules[] = $module;
             $changed = true;
         }
     }
     // Flag to rebuild cache
     if ($changed) {
         \XLite\Core\Database::getRepo('\\XLite\\Model\\Module')->updateInBatch($modules);
         \XLite::setCleanUpCacheFlag(true);
     }
 }
예제 #3
0
 /**
  * We send the free license activation key
  *
  * @return void
  */
 protected function doActivateFreeLicense()
 {
     $info = \XLite\Core\Marketplace::getInstance()->activateFreeLicense(\XLite\Core\Request::getInstance()->email);
     if (\XLite\Core\Marketplace::getInstance()->getError()) {
         // Marketplace returned an error
         $message = \XLite\Core\Marketplace::getInstance()->getError();
         if (\XLite\Core\Marketplace::ERROR_CODE_FREE_LICENSE_REGISTERED == \XLite\Core\Marketplace::getInstance()->getLastErrorCode()) {
             // Free license is already registered: prepare specific error message
             $message = static::t('Free license key for this email is already registered', array('email' => \XLite\Core\Request::getInstance()->email, 'url' => $this->buildURL('activate_free_license', 'resend_key', array('email' => \XLite\Core\Request::getInstance()->email))));
         }
         \XLite\Core\TopMessage::addError($message);
     } elseif ($info && isset($info[\XLite\Core\Marketplace::XC_FREE_LICENSE_KEY])) {
         // License key is successfully activated: register the key in database
         $key = $info[\XLite\Core\Marketplace::XC_FREE_LICENSE_KEY][0];
         // Get key value from the response field 'key' or (if empty) use default value
         $keyValue = !empty($key[\XLite\Core\Marketplace::FIELD_KEY]) ? $key[\XLite\Core\Marketplace::FIELD_KEY] : \XLite\Core\Marketplace::XC_FREE_LICENSE_KEY;
         \XLite\Core\Database::getRepo('\\XLite\\Model\\ModuleKey')->insert($key + array('keyValue' => $keyValue));
         // Clear cache for proper installation
         \XLite\Core\Marketplace::getInstance()->clearActionCache(\XLite\Core\Marketplace::ACTION_GET_ADDONS_LIST);
         // Search for modules from non-free edition
         $nonFreeModules = \XLite\Core\Database::getRepo('XLite\\Model\\Module')->getNonFreeEditionModulesList(false);
         if ($nonFreeModules) {
             // Try to uninstall these modules...
             foreach ($nonFreeModules as $module) {
                 $messages = array();
                 $res = \XLite\Core\Database::getRepo('XLite\\Model\\Module')->uninstallModule($module, $messages);
                 if ($messages) {
                     foreach ($messages as $message) {
                         $method = $res ? 'Info' : 'Error';
                         \XLite\Upgrade\Logger::getInstance()->{'log' . $method}($message, array(), false);
                     }
                 }
             }
             // Initialize rebuild cache routine as a next step
             \XLite::setCleanUpCacheFlag(true);
         }
         \XLite\Core\TopMessage::addInfo('Free license is activated successfully');
         $this->setReturnURL($this->buildURL());
     } else {
         \XLite\Core\TopMessage::addError('Can\'t connect to the marketplace server');
     }
 }
예제 #4
0
 /**
  * Common restore database method used by actions
  *
  * @param mixed $sqlFile File with SQL data for loading into database
  *
  * @return boolean
  */
 protected function restoreDatabase($sqlFile)
 {
     $result = false;
     // File to create temporary backup to be able rollback database
     $backupSQLFile = LC_DIR_BACKUP . sprintf('sqldump.backup.%d.sql', \XLite\Core\Converter::time());
     // Make the process of restoring database verbose
     $verbose = true;
     // Start
     $this->startDump();
     // Making the temporary backup file
     \Includes\Utils\Operator::flush(static::t('Making backup of the current database state ... '), true);
     $result = \XLite\Core\Database::getInstance()->exportSQLToFile($backupSQLFile, $verbose);
     \Includes\Utils\Operator::flush(static::t('done') . LC_EOL . LC_EOL, true);
     // Loading specified SQL-file to the database
     \Includes\Utils\Operator::flush(static::t('Loading the database from file .'));
     $result = \Includes\Utils\Database::uploadSQLFromFile($sqlFile, $verbose);
     $restore = false;
     if ($result) {
         // If file has been loaded into database successfully
         $message = static::t('Database restored successfully!');
         // Prepare the cache rebuilding
         \XLite::setCleanUpCacheFlag(true);
     } else {
         // If an error occured while loading file into database
         $message = static::t('The database has not been restored because of the errors');
         $restore = true;
     }
     // Display the result message
     \Includes\Utils\Operator::flush(' ' . static::t('done') . LC_EOL . LC_EOL . $message . LC_EOL);
     if ($restore) {
         // Restore database from temporary backup
         \Includes\Utils\Operator::flush(LC_EOL . static::t('Restoring database from the backup .'));
         \Includes\Utils\Database::uploadSQLFromFile($backupSQLFile, $verbose);
         \Includes\Utils\Operator::flush(' ' . static::t('done') . LC_EOL . LC_EOL);
     }
     // Display Javascript to cancel scrolling page to bottom
     func_refresh_end();
     // Display the bottom HTML part
     $this->displayPageFooter();
     // Remove temporary backup file
     unlink($backupSQLFile);
     return $result;
 }
예제 #5
0
 /**
  * doActionRebuild
  *
  * @return void
  */
 public function doActionRebuild()
 {
     \XLite::setCleanUpCacheFlag(true);
     // To avoid the infinite loop
     $this->setReturnURL($this->buildURL());
 }
예제 #6
0
 /**
  * Third step: install downloaded upgrades
  *
  * @return void
  */
 protected function doActionInstallUpgrades()
 {
     $this->setReturnURL($this->buildURL('upgrade'));
     if (\XLite\Upgrade\Cell::getInstance()->isUnpacked()) {
         \Includes\SafeMode::sendNotification();
         $restorePoint = \Includes\Utils\ModulesManager::getEmptyRestorePoint();
         //write current state
         $current = \XLite\Core\Database::getRepo('\\XLite\\Model\\Module')->findBy(array('enabled' => true));
         foreach ($current as $module) {
             $restorePoint['current'][$module->getModuleId()] = $module->getActualName();
         }
         \Includes\Utils\Operator::showMessage('Installing updates, please wait...');
         if (\XLite\Core\Request::getInstance()->preUpgradeWarningModules) {
             \XLite\Upgrade\Cell::getInstance()->setPreUpgradeWarningModules(array_keys(array_filter(\XLite\Core\Request::getInstance()->preUpgradeWarningModules, function ($value) {
                 return 0 == $value;
             })));
         }
         // Disable selected modules
         $modules = array();
         foreach (\XLite\Upgrade\Cell::getInstance()->getIncompatibleModules(true) as $module) {
             $module->setEnabled(false);
             $modules[] = $module;
             $restorePoint['disabled'][$module->getModuleId()] = $module->getActualName();
         }
         \XLite\Core\Database::getRepo('XLite\\Model\\Module')->updateInBatch($modules);
         // Do actions according the admin choice for the disabled modules with hooks
         $modulesToEnable = array();
         /** @var \XLite\Model\Module $module */
         foreach (\XLite\Upgrade\Cell::getInstance()->getDisabledModulesHooks() as $marketplaceId => $module) {
             $action = \XLite\Core\Request::getInstance()->disabledModulesHooks[$marketplaceId];
             $module = \XLite\Core\Database::getEM()->merge($module);
             if (1 == $action) {
                 // Enable module
                 $module->setEnabled(true);
                 $modulesToEnable[] = $module;
                 $restorePoint['enabled'][$module->getModuleId()] = $module->getActualName();
             } elseif (0 == $action) {
                 // Uninstall module
                 \XLite\Upgrade\Cell::getInstance()->removeModuleEntry($module);
                 $this->uninstallModule($module);
                 $restorePoint['deleted'][] = $module->getActualName();
             }
         }
         \XLite\Core\Database::getRepo('XLite\\Model\\Module')->updateInBatch($modulesToEnable);
         if (\XLite\Upgrade\Cell::getInstance()->getEntries()) {
             foreach (\XLite\Upgrade\Cell::getInstance()->getEntries() as $module) {
                 $restorePoint['installed'][] = $module->getActualName();
             }
             // Perform upgrade
             // pre_upgrade / post_upgrade hooks will be proceeded here
             $this->runStep('upgrade', array(false, $this->getFilesToOverWrite()));
             if ($this->isForce()) {
                 if ($this->isNextStepAvailable()) {
                     $target = 'installed';
                     $this->showInfo(null, 1 < count($modules) ? static::t('Modules have been successfully installed') : static::t('Module has been successfully installed'));
                     if ($this->isOnlySkins()) {
                         $target = 'layout';
                     } elseif ($this->getPaymentMethodToInstall()) {
                         $target = 'payment_settings';
                     } else {
                         $target = 'addons_list_installed';
                     }
                 } else {
                     $target = 'addons_list_marketplace';
                     $this->showError(__FUNCTION__);
                 }
                 $this->setReturnURL($this->buildURL('upgrade', '', $this->getActionParamsCommon() + array('redirect' => $target)));
             }
         } else {
             // All modules for upgrade were set for uninstallation
             // There are no upgrade procedures to perform
             \XLite\Core\Marketplace::getInstance()->clearActionCache();
             $this->setReturnURL($this->buildURL('addons_list_installed'));
         }
         // Set cell status
         \XLite\Upgrade\Cell::getInstance()->clear(true, false, false);
         \XLite\Upgrade\Cell::getInstance()->setUpgraded(true);
         \Includes\Utils\ModulesManager::updateModuleMigrationLog($restorePoint);
         // Rebuild cache
         if (!($this->isForce() && $this->isOnlySkins())) {
             \XLite::setCleanUpCacheFlag(true);
         }
     } else {
         $this->showWarning(__FUNCTION__, static::t('unable to install: not all archives were unpacked. Please, try again', array('list' => $this->getErrorEntriesHTML())));
     }
 }
예제 #7
0
 /**
  * Action of license key registration
  *
  * @return void
  */
 protected function doActionRegisterKey()
 {
     $key = \XLite\Core\Request::getInstance()->key;
     if ($key) {
         $keysInfo = \XLite\Core\Marketplace::getInstance()->checkAddonKey($key);
     } else {
         $keysInfo = null;
         $emptyKey = true;
     }
     $this->setReturnURL($this->buildURL('addons_list_marketplace'));
     if ($keysInfo && $keysInfo[$key]) {
         $keysInfo = $keysInfo[$key];
         $repo = \XLite\Core\Database::getRepo('\\XLite\\Model\\ModuleKey');
         foreach ($keysInfo as $info) {
             if (\XLite\Model\ModuleKey::KEY_TYPE_XCN == $info['keyType']) {
                 $xcnPlan = $info['xcnPlan'];
                 $keyData = $info['keyData'];
                 // Unset some fields which is not in database
                 unset($info['xcnPlan']);
                 unset($info['keyData']);
                 unset($info['key']);
                 $entity = $repo->findOneBy($info);
                 if (!$entity) {
                     $entity = new \XLite\Model\ModuleKey();
                     $entity->map($info);
                 }
                 $entity->setKeyValue($key);
                 $entity->setXcnPlan($xcnPlan);
                 $entity->setKeyData($keyData);
                 if (!empty($keyData['wave'])) {
                     $this->updateUpgradeWaveOption($keyData['wave']);
                 }
                 $isValid = true;
                 if (\XLite::isFreeLicense($entity)) {
                     if (0 == \XLite\Core\Database::getRepo('XLite\\Model\\Module')->hasMarketplaceModules(true)) {
                         $isValid = false;
                         $this->showError(__FUNCTION__, static::t('Cannot gather modules from the marketplace. Please try later.'));
                     }
                 }
                 if ($isValid) {
                     // Save entity (key) in the database
                     \XLite\Core\Database::getEM()->persist($entity);
                     \XLite\Core\Database::getEM()->flush();
                     if (\XLite::isFreeLicense()) {
                         // Search for modules from non-free edition
                         $nonFreeModules = \XLite\Core\Database::getRepo('XLite\\Model\\Module')->getNonFreeEditionModulesList(false);
                         if ($nonFreeModules) {
                             // Try to uninstall these modules...
                             foreach ($nonFreeModules as $module) {
                                 $messages = array();
                                 $res = \XLite\Core\Database::getRepo('XLite\\Model\\Module')->uninstallModule($module, $messages);
                                 if ($messages) {
                                     foreach ($messages as $message) {
                                         $method = $res ? 'Info' : 'Error';
                                         \XLite\Upgrade\Logger::getInstance()->{'log' . $method}($message, array(), false);
                                     }
                                 }
                             }
                         }
                         \XLite::setCleanUpCacheFlag(true);
                     }
                     if (empty($keyData['message'])) {
                         $this->showInfo(__FUNCTION__, static::t('X-Cart license key has been successfully verified'));
                     } else {
                         $this->showWarning(__FUNCTION__, static::t('X-Cart license key has been successfully verified and activated. But this key has expired and do not allow upgrade store.'));
                     }
                     // Clear cache for proper installation
                     \XLite\Core\Marketplace::getInstance()->clearActionCache(\XLite\Core\Marketplace::ACTION_GET_ADDONS_LIST);
                     $this->setHardRedirect();
                 }
             } else {
                 $keyData = $info['keyData'];
                 $module = \XLite\Core\Database::getRepo('\\XLite\\Model\\Module')->findOneBy(array('author' => $info['author'], 'name' => $info['name']));
                 if ($module) {
                     $entity = $repo->findKey($info['author'], $info['name']);
                     if ($entity) {
                         $entity->setKeyValue($key);
                         $repo->update($entity);
                     } else {
                         $entity = $repo->insert($info + array('keyValue' => $key));
                     }
                     if (!empty($keyData['wave'])) {
                         $this->updateUpgradeWaveOption($keyData['wave']);
                     }
                     // Clear cache for proper installation
                     \XLite\Core\Marketplace::getInstance()->clearActionCache(\XLite\Core\Marketplace::ACTION_GET_ADDONS_LIST);
                     if (empty($keyData['message'])) {
                         $this->showInfo(__FUNCTION__, static::t('License key has been successfully verified for "{{name}}" module by "{{author}}" author', array('name' => $module->getModuleName(), 'author' => $module->getAuthorName())));
                     } else {
                         $this->showWarning(__FUNCTION__, static::t('License key has been successfully verified and activated for "{{name}}" module by "{{author}}" author. But this key has expired and do not allow upgrade store.', array('name' => $module->getModuleName(), 'author' => $module->getAuthorName())));
                     }
                     // We install the addon after the successfull key verification
                     $this->setReturnURL($this->buildURL('upgrade', 'install_addon_force', array('moduleIds[]' => $module->getModuleID(), 'agree' => 'Y')));
                 } else {
                     $this->showError(__FUNCTION__, static::t('Key is validated, but the module X was not found', array('module' => implode(',', $info))));
                 }
             }
         }
     } elseif (!isset($emptyKey)) {
         $error = \XLite\Core\Marketplace::getInstance()->getError();
         $message = $error ? static::t('Response from marketplace: X', array('response' => $error)) : static::t('Response from marketplace is not received');
         $this->showError(__FUNCTION__, $message);
     } else {
         $this->showError(__FUNCTION__, static::t('Please specify non-empty key'));
     }
 }
예제 #8
0
 /**
  * Switch module
  *
  * @return void
  */
 public function doActionSwitch()
 {
     $changed = false;
     $deleted = false;
     $data = (array) \XLite\Core\Request::getInstance()->switch;
     $modules = array();
     $firstModule = null;
     $switchModules = $this->getModules('switch');
     $switchModulesKeys = array();
     $excludedModules = array();
     $excludedEnableModules = array();
     $restorePoint = \Includes\Utils\ModulesManager::getEmptyRestorePoint();
     $current = \XLite\Core\Database::getRepo('\\XLite\\Model\\Module')->findBy(array('enabled' => true));
     foreach ($current as $module) {
         $restorePoint['current'][$module->getModuleId()] = $module->getActualName();
     }
     // Correct modules list
     foreach ($switchModules as $key => $module) {
         $toDelete = false;
         $toDisable = false;
         $toEnable = false;
         $switchModulesKeys[] = $module->getModuleId();
         if (!empty($data[$module->getModuleId()]['delete'])) {
             $toDelete = true;
         } else {
             $old = !empty($data[$module->getModuleId()]['old']);
             $new = !empty($data[$module->getModuleId()]['new']);
             $toDisable = !$new && $old != $new;
             $toEnable = $new && $old != $new;
         }
         if ($toDelete || $toDisable) {
             $dependentModules = $module->getDependentModules();
             if ($dependentModules) {
                 foreach ($dependentModules as $dep) {
                     $depModule = \XLite\Core\Database::getRepo('XLite\\Model\\Module')->getModuleInstalled($dep);
                     if ($depModule) {
                         $depDelete = !empty($data[$depModule->getModuleId()]['delete']);
                         $depDisable = empty($data[$depModule->getModuleId()]['new']);
                         if ($toDelete && !$depDelete || $toDisable && !$depDelete && !$depDisable) {
                             // Remove current module from the actions list if it has active dependent modules
                             $excludedModules[] = $module->getModuleName();
                             unset($data[$module->getModuleId()]);
                             unset($switchModules[$key]);
                             break;
                         }
                     }
                 }
             }
         } elseif ($toEnable) {
             // Get the list of modules which current module depends on
             $list = $this->getAllDisabledModuleDependencies($module);
             if ($list) {
                 foreach ($list as $m) {
                     if (empty($data[$m->getModuleId()]) || empty($data[$m->getModuleId()]['delete']) && empty($data[$m->getModuleId()]['new'])) {
                         $data[$m->getModuleId()] = array('old' => 0, 'new' => 1);
                         $additionalSwitchModules[$m->getModuleId()] = $m;
                     }
                 }
             } elseif (false === $list) {
                 // Remove current module from the actions list as it can't be enabled
                 $excludedEnableModules[] = $module->getModuleName();
                 unset($data[$module->getModuleId()]);
             }
         }
     }
     if ($excludedModules) {
         \XLite\Core\TopMessage::addWarning('The following selected modules cannot be disabled or uninstalled as they have dependent modules', array('list' => implode(', ', $excludedModules)));
         // Selection has excluded modules - this is a critical case, break an entire operation
         return;
     }
     if ($excludedEnableModules) {
         \XLite\Core\TopMessage::addWarning('The following selected modules cannot be enabled as they depend on disabled modules which cannot be enabled', array('list' => implode(', ', $excludedEnableModules)));
         // Selection has excluded modules - this is a critical case, break an entire operation
         return;
     }
     if (!empty($additionalSwitchModules)) {
         // Extend $switchModules list by additional modules
         foreach ($additionalSwitchModules as $k => $am) {
             if (!in_array($k, $switchModulesKeys)) {
                 $switchModules[] = $am;
             }
         }
     }
     foreach ($switchModules as $module) {
         if (!empty($data[$module->getModuleId()]['delete'])) {
             $old = $new = null;
             $delete = true;
         } else {
             $old = !empty($data[$module->getModuleId()]['old']);
             $new = !empty($data[$module->getModuleId()]['new']);
             $delete = false;
         }
         if ($delete) {
             // Uninstall module
             if ($module->getEnabled()) {
                 $module->setEnabled(false);
                 $module->callModuleMethod('callDisableEvent');
             }
             if (!defined('LC_MODULE_CONTROL')) {
                 define('LC_MODULE_CONTROL', true);
             }
             if ($this->uninstallModule($module)) {
                 $deleted = true;
                 $restorePoint['deleted'][] = $module->getActualName();
             }
         } elseif ($old !== $new) {
             // Change module status
             $module->setEnabled($new);
             // Call disable event to make some module specific changes
             if ($old) {
                 $module->callModuleMethod('callDisableEvent');
             } elseif (is_null($firstModule)) {
                 $firstModule = $module;
             }
             if ($new) {
                 $restorePoint['enabled'][$module->getModuleId()] = $module->getActualName();
             } else {
                 $restorePoint['disabled'][$module->getModuleId()] = $module->getActualName();
             }
             $modules[] = $module;
             $changed = true;
         }
     }
     // Flag to rebuild cache
     if ($changed) {
         // We redirect the admin to the modules page on the activated module anchor
         // The first module in a batch which is available now
         \XLite\Core\Session::getInstance()->returnURL = $firstModule ? $this->getModulePageURL($firstModule) : (\XLite\Core\Request::getInstance()->return ?: '');
         \XLite\Core\Database::getRepo('\\XLite\\Model\\Module')->updateInBatch($modules);
     }
     if ($deleted) {
         // Refresh marketplace modules cache
         \XLite\Core\Marketplace::getInstance()->saveAddonsList(0);
         \XLite\Core\Marketplace::getInstance()->clearActionCache(\XLite\Core\Marketplace::ACTION_CHECK_FOR_UPDATES);
     }
     if ($changed || $deleted) {
         // Flag to rebuild classes cache
         \XLite::setCleanUpCacheFlag(true);
     }
     \Includes\Utils\ModulesManager::updateModuleMigrationLog($restorePoint);
 }