Файл: library/XenForo/Install/Controller/Upgrade.php
Строк: 431
<?php
class XenForo_Install_Controller_Upgrade extends XenForo_Install_Controller_Abstract
{
    protected function _preDispatch($action)
    {
        if (!$this->_getInstallModel()->isInstalled())
        {
            throw $this->responseException(
                $this->responseRedirect(XenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL, 'index.php?install/')
            );
        }
        if (strtolower($action) !== 'login')
        {
            $this->_getUpgradeModel()->setupVisitorFromUpgradeCookie();
            $visitor = XenForo_Visitor::getInstance();
            if (!$visitor['is_admin'])
            {
                throw $this->responseException(
                    $this->responseReroute(__CLASS__, 'login')
                );
            }
            if (!$visitor->hasAdminPermission('upgradeXenForo'))
            {
                throw new XenForo_Exception(new XenForo_Phrase('you_do_not_have_permission_upgrade'), true);
            }
        }
    }
    /**
    * Setup the session.
    *
    * @param string $action
    */
    protected function _setupSession($action)
    {
        if (XenForo_Application::isRegistered('session'))
        {
            return;
        }
        $class = XenForo_Application::resolveDynamicClass('XenForo_Session');
        $session = new $class(array('admin' => true));
        XenForo_Application::set('session', $session);
        $session->start();
        XenForo_Visitor::setup($session->get('user_id'));
    }
    public function actionIndex()
    {
        if ($this->_getUpgradeModel()->getNewestUpgradeVersionId() > XenForo_Application::$versionId)
        {
            return $this->responseError(new XenForo_Phrase('upgrade_found_newer_than_version'));
        }
        if ($this->_getUpgradeModel()->getLatestUpgradeVersionId() === XenForo_Application::$versionId
            && XenForo_Application::get('options')->currentVersionId >= XenForo_Application::$versionId)
        {
            return $this->responseView('XenForo_Install_View_Upgrade_Current', 'upgrade_current');
        }
        if (class_exists('XenForo_Install_Data_FileSums'))
        {
            $hashes = XenForo_Install_Data_FileSums::getHashes();
            foreach ($hashes AS $key => $hash)
            {
                if (!preg_match('#^(./)?(install/|library/XenForo/Install/|library/XenForo/Application.php)#', $key))
                {
                    unset($hashes[$key]);
                }
            }
            $fileErrors = XenForo_Helper_Hash::compareHashes($hashes);
            $hashesExist = true;
        }
        else
        {
            $fileErrors = array();
            $hashesExist = false;
        }
        $db = XenForo_Application::getDb();
        return $this->responseView('XenForo_Install_View_Upgrade_Start', 'upgrade_start', array(
            'targetVersion' => XenForo_Application::$version,
            'errors' => $this->_getInstallModel()->getRequirementErrors($db),
            'warnings' => $this->_getInstallModel()->getRequirementWarnings($db),
            'isCliRecommended' => $this->_getUpgradeModel()->isCliUpgradeRecommended(),
            'cliCommand' => $this->_getUpgradeModel()->getCliCommand(),
            'fileErrors' => $fileErrors,
            'hashesExist' => $hashesExist
        ));
    }
    public function actionRun()
    {
        $this->_assertPostOnly();
        $upgradeModel = $this->_getUpgradeModel();
        $lastCompletedVersion = $upgradeModel->getLatestUpgradeVersionId();
        if ($lastCompletedVersion === XenForo_Application::$versionId)
        {
            return $this->actionRebuild();
        }
        $input = $this->_input->filter(array(
            'run_version' => XenForo_Input::UINT,
            'step' => XenForo_Input::STRING,
            'position' => XenForo_Input::UINT,
            'step_data' => XenForo_Input::JSON_ARRAY
        ));
        if (!$input['run_version'])
        {
            $input['run_version'] = $upgradeModel->getNextUpgradeVersionId($lastCompletedVersion);
            $input['step'] = 1;
            if ($input['run_version'])
            {
                if ($input['run_version'] > XenForo_Application::$versionId)
                {
                    return $this->responseError(new XenForo_Phrase('upgrade_found_newer_than_version'));
                }
                $upgrade = $upgradeModel->getUpgrade($input['run_version']);
            }
            else
            {
                $upgrade = false;
            }
        }
        else
        {
            $upgrade = $upgradeModel->getUpgrade($input['run_version']);
        }
        if (!$upgrade)
        {
            $upgradeModel->insertUpgradeLog();
            return $this->actionRebuild();
        }
        if (!$input['step'])
        {
            $input['step'] = 1;
        }
        if (method_exists($upgrade, 'step' . $input['step']))
        {
            $result = $upgrade->{'step' . $input['step']}($input['position'], $input['step_data'], $this);
        }
        else
        {
            $result = 'complete';
        }
        if ($result instanceof XenForo_ControllerResponse_Abstract)
        {
            return $result;
        }
        $stepMessage = '';
        $stepData = false;
        if ($result === 'complete')
        {
            $upgradeModel->insertUpgradeLog($input['run_version']);
            $viewParams = array(
                'newRunVersion' => '',
                'newStep' => '',
                'versionName' => $upgrade->getVersionName(),
                'step' => $input['step']
            );
        }
        else
        {
            if ($result === true || $result === null)
            {
                $result = $input['step'] + 1;
            }
            else if (is_array($result))
            {
                $input['position'] = $result[0];
                $stepMessage = $result[1];
                if (!empty($result[2]))
                {
                    $stepData = $result[2];
                }
                $result = $input['step']; // stay on same step
            }
            $viewParams = array(
                'newRunVersion' => $input['run_version'],
                'newStep' => $result,
                'position' => $input['position'],
                'stepMessage' => $stepMessage,
                'stepData' => $stepData,
                'versionName' => $upgrade->getVersionName(),
                'step' => $input['step']
            );
        }
        return $this->responseView('XenForo_Install_View_Upgrade_Run', 'upgrade_run', $viewParams);
    }
    public function actionRebuild()
    {
        $this->_getInstallModel()->insertDeferredRebuild();
        return $this->responseReroute(__CLASS__, 'runDeferred');
    }
    public function actionRunDeferred()
    {
        $output = $this->_manualDeferredRunner('index.php?upgrade/run-deferred', 'index.php?upgrade/complete');
        if ($output instanceof XenForo_ControllerResponse_Redirect)
        {
            // complete, update the version if needed
            if ($this->_getUpgradeModel()->getLatestUpgradeVersionId() === XenForo_Application::$versionId)
            {
                $this->_getUpgradeModel()->updateVersion();
            }
        }
        return $output;
    }
    public function actionComplete()
    {
        if (XenForo_Application::get('options')->currentVersionId == XenForo_Application::$versionId)
        {
            $schemaErrors = $this->_getUpgradeModel()->getDefaultSchemaErrors();
            if ($schemaErrors)
            {
                return $this->responseView('XenForo_Install_View_Upgrade_Errors', 'upgrade_errors', array(
                    'version' => XenForo_Application::$version,
                    'errors' => $schemaErrors
                ));
            }
            $this->getModelFromCache('XenForo_Model_BbCode')->updateBbCodeParseCacheVersion();
            return $this->responseView('XenForo_Install_View_Upgrade_Complete', 'upgrade_complete', array(
                'version' => XenForo_Application::$version
            ));
        }
        else
        {
            return $this->responseMessage(new XenForo_Phrase('uh_oh_upgrade_did_not_complete'));
        }
    }
    public function actionLogin()
    {
        if ($this->_getUpgradeModel()->setupVisitorFromUpgradeCookie())
        {
            $visitor = XenForo_Visitor::getInstance();
            if ($visitor['is_admin'] && $visitor->hasAdminPermission('upgradeXenForo'))
            {
                return $this->responseRedirect(
                    XenForo_ControllerResponse_Redirect::RESOURCE_CANONICAL,
                    'index.php?upgrade/'
                );
            }
        }
        $error = '';
        if ($this->isConfirmedPost())
        {
            $data = $this->_input->filter(array(
                'login' => XenForo_Input::STRING,
                'password' => XenForo_Input::STRING,
                'redirect' => XenForo_Input::STRING
            ));
            $redirect = ($data['redirect'] ? $data['redirect'] : 'index.php?upgrade/');
            /** @var $loginModel XenForo_Model_Login */
            $loginModel = $this->getModelFromCache('XenForo_Model_Login');
            if ($loginModel->requireLoginCaptcha($data['login']))
            {
                // just block logins here instead of using the captcha
                return $this->responseError(new XenForo_Phrase('your_account_has_temporarily_been_locked_due_to_failed_login_attempts'));
            }
            /** @var $userModel XenForo_Model_User */
            $userModel = $this->getModelFromCache('XenForo_Model_User');
            $userId = $userModel->validateAuthentication($data['login'], $data['password'], $error);
            if (!$userId)
            {
                try
                {
                    $loginModel->logLoginAttempt($data['login']);
                    if ($loginModel->requireLoginCaptcha($data['login']))
                    {
                        return $this->responseError(new XenForo_Phrase('your_account_has_temporarily_been_locked_due_to_failed_login_attempts'));
                    }
                }
                catch (Exception $e) {}
            }
            else
            {
                try
                {
                    $loginModel->clearLoginAttempts($data['login']);
                    XenForo_Model_Ip::log($userId, 'user', $userId, 'login_upgrade');
                }
                catch (Exception $e) {}
                XenForo_Visitor::setup($userId);
                $visitor = XenForo_Visitor::getInstance();
                if (!$visitor->is_admin)
                {
                    return $this->responseError(new XenForo_Phrase('your_account_does_not_have_admin_privileges'));
                }
                if (!$visitor->hasAdminPermission('upgradeXenForo'))
                {
                    return $this->responseError(new XenForo_Phrase('you_do_not_have_permission_upgrade'));
                }
                $this->_getUpgradeModel()->setUpgradeCookie($userId);
                return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS, $redirect);
            }
        }
        return $this->responseView('XenForo_Install_View_Upgrade_Login', 'upgrade_login', array(
            'error' => $error
        ));
    }
    /**
     * @return XenForo_Install_Model_Install
     */
    protected function _getInstallModel()
    {
        return $this->getModelFromCache('XenForo_Install_Model_Install');
    }
    /**
     * @return XenForo_Install_Model_Upgrade
     */
    protected function _getUpgradeModel()
    {
        return $this->getModelFromCache('XenForo_Install_Model_Upgrade');
    }
}