Вход Регистрация
Файл: forsoc.ru/manul/classes/ExecutorController.inc.php
Строк: 120
<?php

ob_start
();
require_once(
'Localization.inc.php');
require_once(
'FileInfo.inc.php');
require_once(
'Healer.inc.php');
require_once(
'Template.inc.php');
require_once(
'View.inc.php');
require_once(
'XmlValidator.inc.php');
require_once(
'Auth.inc.php');
ob_end_clean();

class 
ExecutorController
{

    private function 
startExecutor()
    {
        
$view = new View();
        
$healer = new Healer();

        if (!empty(
$_POST) && !empty($_POST['recipe'])) {
            
$xmlRecipe $_POST['recipe'];
            
$validator = new XmlValidator();
            global 
$projectRootDir;

            if (
get_magic_quotes_gpc()) $xmlRecipe stripslashes($xmlRecipe);

            
//TODO: implement proper XXE prevention or switch to JSON instead
            
if (strpos(strtoupper($xmlRecipe), '<!ENTITY') !== false) {
                die(
'XXE detected');
            }

            if (!
$validator->validate($xmlRecipe$projectRootDir '/static/xsd/recipe.xsd')) {
                die(
PS_ERR_BROKEN_XML_FILE);
            }

            
$executeList '';
            
$itemTemplate = new Template('executor_item.tpl');

            
$quarantineFiles = array();
            
$deleteFiles = array();
            
$healer->prepareList($xmlRecipe$quarantineFiles$deleteFiles);
            for (
$i 0$i count($deleteFiles); $i++) {
                
$itemTemplate->prepare();
                
$itemTemplate->set('PREFIX''d');
                
$itemTemplate->set('NUM'$i);
                
$itemTemplate->set('ACTION'PS_RECIPE_ACTION_DEL);
                
$itemTemplate->set('FILENAME'$this->getShortFilename($deleteFiles[$i]));
                
$itemTemplate->set('FILENAME_B64'base64_encode($deleteFiles[$i]));
                
$executeList .= $itemTemplate->get();
            }

            for (
$i 0$i count($quarantineFiles); $i++) {
                
$itemTemplate->prepare();
                
$itemTemplate->set('PREFIX''q');
                
$itemTemplate->set('NUM'$i);
                
$itemTemplate->set('ACTION'PS_RECIPE_ACTION_QUARANTINE);
                
$itemTemplate->set('FILENAME'$this->getShortFilename($quarantineFiles[$i]));
                
$itemTemplate->set('FILENAME_B64'base64_encode($quarantineFiles[$i]));
                
$executeList .= $itemTemplate->get();
            }

            
define('PS_EXECUTE_LIST'$executeList);
            
define('PS_EXECUTE_TOTAL_D'count($deleteFiles));
            
define('PS_EXECUTE_TOTAL_Q'count($quarantineFiles));

            
$view->display('executor_changes.tpl');
        } else if (isset(
$_POST['a']) && ($_POST['a'] === 'apply')) {
            
$deleteTotal = (int)$_POST['total_d'];
            
$quarantineTotal = (int)$_POST['total_q'];

            
$deleteFiles = array();
            
$quarantineFiles = array();

            for (
$i 0$i $deleteTotal$i++) {
                if (!empty(
$_POST['d_' $i]) && $_POST['d_' $i] === 'on') {
                    
$deleteFiles[] = base64_decode($_POST['fn_d_' $i]);
                }
            }

            for (
$i 0$i $quarantineTotal$i++) {
                if (!empty(
$_POST['q_' $i]) && $_POST['q_' $i] === 'on') {
                    
$quarantineFiles[] = base64_decode($_POST['fn_q_' $i]);
                }
            }

            
$numQuarantined 0;
            
define('PS_EXECUTOR_LOG'$healer->executeXmlRecipe($deleteFiles$quarantineFiles$numQuarantined));

            
$quarantineUrl $_SERVER['PHP_SELF'] . '?controller=download&f=quarantine';
            
define('PS_QUARANTINE_URL'$quarantineUrl);

            
$view->display('executor_done.tpl');

        } else if (isset(
$_REQUEST['a']) && ($_REQUEST['a'] == 'selfDelete')) {

            global 
$projectRootDir$projectTmpDir;
            if (
$projectTmpDir == sys_get_temp_dir()) {
                @
unlink($projectTmpDir '/scan_log.xml');
                
array_map('unlink'glob($projectTmpDir '/*.manul.tmp.txt'));
                
array_map('unlink'glob($projectTmpDir '/*.manul.tmp'));
                
array_map('unlink'glob($projectTmpDir '/config.php'));
            }

            
$deleteResult $healer->deleteDir($projectRootDir);

            if (
$deleteResult) {
                print(
json_encode(array('result' => 'ok')));
            } else {
                print(
json_encode(array('result' => 'error''details' => $deleteResult)));
            }
        } else {
            
$view->display('executor.tpl');
        }
    }

    private function 
getShortFileName($in_name)
    {
        
define('MAX_PRINTABLE_FILENAME_LEN'70);
        
$outName $in_name;

        if (
strlen($outName) > MAX_PRINTABLE_FILENAME_LEN) {
            
$outName substr($outName0MAX_PRINTABLE_FILENAME_LEN 2) .
                
'...' .
                
substr($outNamestrlen($outName) - MAX_PRINTABLE_FILENAME_LENMAX_PRINTABLE_FILENAME_LEN 2);
        }

        return 
$outName;
    }

    public function 
start()
    {
        
$authenticator = new Auth();
        if (
$authenticator->auth()) {
            
$this->startExecutor();
        }
    }
}
Онлайн: 3
Реклама