Вход Регистрация
Файл: 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');
    }
}
Онлайн: 1
Реклама