Your IP : 18.189.43.15


Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/bitrix.xscan/admin/
Upload File :
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/bitrix.xscan/admin/worker_fork.php

<?
require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_admin_before.php");
require_once($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/prolog.php");

if (!$USER->IsAdmin())
    $APPLICATION->AuthForm();

IncludeModuleLangFile(__FILE__);

if (function_exists('mb_internal_encoding'))
    mb_internal_encoding('ISO-8859-1');


$strError = '';
$file = '';

$APPLICATION->SetTitle(GetMessage("BITRIX_XSCAN_SEARCH"));

if (isset($_REQUEST['ajax']) || isset($_REQUEST['grid_action'])) {
    CModule::includemodule('bitrix.xscan');
} else {
    require($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/include/prolog_admin_after.php");
}

$filterOptions = new \Bitrix\Main\UI\Filter\Options('report_filter');
$filters = $filterOptions->getFilter();

$filter = [];
foreach ($filters as $k => $v) {
    if (!$v) {
        continue;
    }

    if ($k === 'mtime_from') {
        $filter['>=mtime'] = $v;
    }
    if ($k === 'mtime_to') {
        $filter['<=mtime'] = $v;
    }

    if ($k === 'ctime_from') {
        $filter['>=ctime'] = $v;
    }
    if ($k === 'ctime_to') {
        $filter['<=ctime'] = $v;
    }

    if ($k == 'tags') {
        foreach ($v as $t) {
            $filter[] = ['%tags' => $t];
        }
    }

    if ($k === 'preset') {
        if ($v === 'a') {
            $filter[] = ['%src' => '/bitrix/admin'];
        }
        if ($v === 'm') {
            $filter[] = ['%src' => '/bitrix/modules'];
        }
        if ($v === 'c') {
            $filter[] = ['%src' => '/bitrix/components'];
        }
        if ($v === '!m') {
            $filter[] = ['!%src' => '/bitrix/modules'];
        }
        if ($v === 'pop') {
            $filter[] = ['LOGIC' => 'OR', ['%src' => '/prolog_after.php'], ['%src' => '/index.php'], ['%src' => '/content.php'], ['%src' => '/main.php'], ['%src' => '/spread.php'], ['%src' => '/bx_root.php'], ['%src' => '/.access.php'], ['%src' => '/radio.php']];
        }
    }

    if ($k === 'FIND') {
        if (strpos($v, '!') === 0) {
            $v = ltrim($v, '!');
            $filter[] = ['LOGIC' => 'AND', ['!%src' => $v], ['!%message' => $v]];
        } else {
            $filter[] = ['LOGIC' => 'OR', ['%src' => $v], ['%message' => $v]];
        }
    }
}

if (isset($_POST['download-files'])) {
    if (!check_bitrix_sessid()) {
        $strError = CBitrixXscanFork::ShowMsg(GetMessage("BITRIX_XSCAN_SESSIA_USTARELA_OBN"), 'red');
        echo $strError;
        die();
    }

    $filter['type'] = 'file';
    $all = isset($_POST['all']) && $_POST['all'] === 'true';

    if (!$all) {
        $filesId = Bitrix\Main\Web\Json::decode($_POST['download-files']);
        $filter = ['@id' => $filesId];
    }

    $list = XScanResultTable::getList([
        'select' => [
            'src'
        ],
        'filter' => $filter
    ])->fetchAll();

    $files = array_column($list, 'src');

    foreach ($files as $i => $file) {
        if (!file_exists($file) && file_exists($new_f = preg_replace('#\.php[578]?$#i', '.ph_', $file))) {
            $files[$i] = $new_f;
        }
    }

    $tempDir = CTempFile::GetDirectoryName(1);
    CheckDirPath($tempDir);
    $tempFile = $tempDir . Bitrix\Main\Security\Random::getString(32);

    $zip = CBXArchive::GetArchive($tempFile, 'ZIP');
    $zip->Pack($files);

    $tempFile = \CFile::MakeFileArray($tempFile);

    \CFile::ViewByUser($tempFile, [
        "force_download" => true,
        "attachment_name" => 'xscan_results.zip',
    ]);

    \Bitrix\Main\Application::getInstance()->end();
}

if (isset($_POST['hide-files'])) {
    if (!check_bitrix_sessid()) {
        $strError = CBitrixXscanFork::ShowMsg(GetMessage("BITRIX_XSCAN_SESSIA_USTARELA_OBN"), 'red');
        echo $strError;
        die();
    }

    $all = isset($_POST['all']) && $_POST['all'] === 'true';

    if (!$all) {
        $filesId = Bitrix\Main\Web\Json::decode($_POST['hide-files']);
        $filter = ['@id' => $filesId];
    }

    $list = XScanResultTable::deleteList($filter);

    echo \Bitrix\Main\Web\Json::encode(['error' => '']);

    \Bitrix\Main\Application::getInstance()->end();
}

$grid_options = new Bitrix\Main\Grid\Options('report_list');
$nav_params = $grid_options->GetNavParams();

$nav = new \Bitrix\Main\UI\PageNavigation("report_list");
$nav->allowAllRecords(false)
    ->setPageSize($nav_params['nPageSize']);

if (isset($_GET['clear_nav']) && $_GET['clear_nav'] == 'Y') {
    $nav->setCurrentPage(1);
} elseif (isset($_GET['grid_action']) && $_GET['grid_action'] === 'more' && $_GET['grid_id'] === $grid_options->getId()) {
    $nav->setCurrentPage($_GET['report_list']);
} elseif (isset($_GET['grid_action']) && $_GET['grid_action'] === 'pagination') {
    $nav->initFromUri();
} elseif (isset($_SESSION['xscan_page'])) {
    $nav->setCurrentPage($_SESSION['xscan_page']);
}

$_SESSION['xscan_page'] = $nav->getCurrentPage();


\Bitrix\Main\UI\Extension::load(["ui.layout-form", "ui.buttons", "ui.dialogs.messagebox", "ui.progressbar", "ui.alerts", "sidepanel"]);

$progress = isset($_REQUEST['progress']) ? (int)$_REQUEST['progress'] : 0;
$total = isset($_REQUEST['total']) ? (int)$_REQUEST['total'] : 0;
$inprogress = False;

$scaner = new CBitrixXscanFork($progress, $total);

$action = $_REQUEST['action'] ?? "";
$start_path = isset($_REQUEST['start_path']) ? $_REQUEST['start_path'] : $_SERVER['DOCUMENT_ROOT'];
$start_path = rtrim($start_path, '/');

if (isset($_REQUEST['ajax'])) {
    $break_point = isset($_REQUEST['break_point']) ? $_REQUEST['break_point'] : '';
    $clean = isset($_REQUEST['clean']) && $_REQUEST['clean'] == 'Y';
    \CBitrixXscanAjax::run($scaner, $nav, $start_path, $break_point, $clean);
    die();
}
?>

<script>
    function callback(result) {

        if (BX.SidePanel.Instance.isOpen()) {
            BX.SidePanel.Instance.close();
            BX.SidePanel.Instance.postMessage(window, 'xscan-grid', {'result': result});
        } else if (BX('alert_msg')) {
            result = JSON.parse(result);
            BX('alert_msg').innerHTML = result['msg'] || result['error'];
            GridRenew();
        } else {
            window.close();
        }

    }
    function hit(file, action){
        BX.ajax.post('/bitrix/admin/bitrix.xscan_worker_fork.php',
            {
                'sessid': BX.bitrix_sessid(),
                'ajax': true,
                'action': action,
                'file': file
            },
            callback
        );

    }

    <?php
        if (isset($_GET['pro']) && $_GET['pro'] !== 'off'){
            echo "localStorage.setItem('xscan_pro', true);";
        }
        elseif (isset($_GET['pro']) && $_GET['pro'] == 'off'){
            echo "localStorage.removeItem('xscan_pro');";
        }
    ?>

    var pro = localStorage.getItem('xscan_pro');

    function xscan_prison(file) {
        if(pro){
            hit(file, 'prison');
        }
        else {
            BX.UI.Dialogs.MessageBox.confirm('<?= GetMessage("BITRIX_XSCAN_WARN") ?>', () => {
                hit(file, 'prison');
                return true;
            });
        }
    }

    function xscan_hide(file) {
        if(pro){
            hit(file, 'hide');
        }
        else {
            BX.UI.Dialogs.MessageBox.confirm('<?= GetMessage("BITRIX_XSCAN_HIDE") ?>', () => {
                hit(file, 'hide');
                return true;
            });
        }
    }

    function xscan_release(file) {
        if(pro){
            hit(file, 'release');
        }
        else {
            BX.UI.Dialogs.MessageBox.confirm('<?= GetMessage("BITRIX_XSCAN_WARN_RELEASE") ?>', () => {
                hit(file, 'release');
                return true;
            });
        }
    }

</script>

<?php

if ($action === 'showfile') {

    if (isset($_REQUEST['file'])) {
        $file = '/' . trim($_REQUEST['file'], '/');
    }

    if (!$file || !file_exists($file)) {
        echo CBitrixXscanFork::ShowMsg(GetMessage("BITRIX_XSCAN_FILE_NOT_FOUND") . htmlspecialcharsbx($file), 'red');
    } else {

        $stat = stat($file);
        $res = $scaner->CheckFile($file);

        ?>

        <div class="ui-alert ui-alert-icon-warning">
            <span class="ui-alert-message"><strong><?= GetMessage("BITRIX_XSCAN_FAYL") ?></strong> <?= htmlspecialcharsbx($file) ?></span>
        </div>

        <div class="ui-alert ui-alert-icon-warning">
            <span class="ui-alert-message"><strong><?= GetMessage("BITRIX_XSCAN_M_DATE") ?></strong> <?= ConvertTimeStamp($stat['mtime'], "FULL") ?></span>
        </div>

        <div class="ui-alert ui-alert-icon-warning">
            <span class="ui-alert-message"><strong><?= GetMessage("BITRIX_XSCAN_C_DATE") ?></strong> <?= ConvertTimeStamp($stat['ctime'], "FULL") ?></span>
        </div>

        <?php

        if ($res) {
            ?>

            <div class="ui-alert ui-alert-icon-warning">
                <span class="ui-alert-message"><strong><?= GetMessage("BITRIX_XSCAN_SCORE") ?></strong> <?= htmlspecialcharsbx($scaner->getScore()) ?></span>
            </div>

            <?php

            foreach ($scaner->getResult() as $value) {
                ?>

                <div class="ui-alert ui-alert-danger ui-alert-icon-danger" style="flex-wrap: wrap">
                    <span class="ui-alert-message"><strong><?= GetMessage("BITRIX_XSCAN_PODOZRITELQNYY_KOD") ?></strong></span>
                    <span style="width: 100%"><br></span>
                    <span class="ui-alert-message"><?= $value['subj'] ?></span>
                    <span style="width: 100%"><br></span>
                    <span><?= nl2br(htmlspecialcharsbx($value['code'])); ?></span>
                </div>

                <?php

            }

        } elseif (in_array($file, $scaner->getErrors())) {
            echo CBitrixXscanFork::ShowMsg(GetMessage("BITRIX_XSCAN_FILE_ERROR"), 'red');
        } else {
            echo CBitrixXscanFork::ShowMsg(GetMessage("BITRIX_XSCAN_FAYL_NE_VYGLADIT_POD"), 'green');
        }

        echo '<div class="ui-alert"><span class="ui-alert-message">' . highlight_file($file, true) . '</span></div>';

        echo '<div style="position:fixed; bottom:25px; right:20px;">';

        if (preg_match('/\.ph[_p][578]?$/', $file)) {
            echo strtolower(substr($file, -4)) !== '.ph_' ? CBitrixXscanFork::getIsolateButton($file) : CBitrixXscanFork::getUnIsolateButton($file);
        }

        if (!isset($_GET['hta'])) {
            echo CBitrixXscanFork::getHideButton($file);
        }

        echo '<a class="ui-btn ui-btn-primary ui-btn-sm" href="/bitrix/admin/bitrix.xscan_file_edit.php?path=' . urlencode($file) . '&full_src=Y&IFRAME=Y&back_url=' . urlencode($_SERVER['REQUEST_URI']) . '">' . GetMessage("BITRIX_XSCAN_EDIT_BTN") . '</a>';

        if (isset($_GET['IFRAME_TYPE']) && $_GET['IFRAME_TYPE'] == 'SIDE_SLIDER') {
            echo '<button class="ui-btn ui-btn-primary-dark ui-btn-sm" onclick="BX.SidePanel.Instance.close();">' . GetMessage("BITRIX_XSCAN_CLOSE_BTN") . '</button>';
        }
        echo '</div>';


        CMain::FinalActions();
        die();
    }
}


$sort = $grid_options->GetSorting(['sort' => ['ID' => 'asc'], 'vars' => ['by' => 'by', 'order' => 'order']]);
$list = \CBitrixXscanFork::getList($filter, $inprogress, $nav, $sort);
$total = \CBitrixXscanFork::getTotal($filter);
$nav->setRecordCount($total);

$snippet = new \Bitrix\Main\Grid\Panel\Snippet();

if (!isset($_REQUEST['grid_action'])){


if (in_array("xdebug", get_loaded_extensions())) {
    echo CBitrixXscanFork::ShowMsg(GetMessage("BITRIX_XSCAN_XDEBUG"), 'red');
}

?>

    <form method="post" action="" onsubmit="return false;">

        <?= bitrix_sessid_post() ?>
        <div class="ui-form-row-inline">

            <div class="ui-form-row ui-form-row-line">
                <div class="ui-form-label">
                    <div class="ui-ctl-label-text"><?= GetMessage("BITRIX_XSCAN_NACALQNYY_PUTQ") ?></div>
                </div>

                <div class="ui-form-content" style="margin-right: 15px">
                    <div class="ui-ctl ui-ctl-textbox ui-ctl-w100">
                        <input id="start_path" name="start_path" value="<?= htmlspecialcharsbx($start_path); ?>"
                               class="ui-ctl-element">
                    </div>
                </div>

                <div class="ui-form-content">
                    <button type="submit" onclick="Start();" id="start_button"
                            class="ui-btn ui-btn-primary"><?= GetMessage("BITRIX_XSCAN_START_SCAN") ?></button>
                </div>
            </div>

        </div>
    </form>

    <form hidden id="download-form" method="POST" target="_blank">
        <?= bitrix_sessid_post() ?>
        <input value="" name="download-files" id="download-files">
        <input value="" name="all" id="download-checkbox">
    </form>

    <script>

        function xscan_download(files) {
            var gridObject = BX.Main.gridManager.getById("report_list");
            var grid = gridObject.instance
            var selectedIds = grid.getRows().getSelectedIds();

            var checkboxAll = document.getElementById('actallrows_report_list')
            var inputCheckbox = document.getElementById('download-checkbox')
            if (checkboxAll.checked) {
                inputCheckbox.value = true
            } else {
                inputCheckbox.value = false
            }

            var form = document.getElementById('download-form')
            var input = document.getElementById('download-files')
            input.value = JSON.stringify(selectedIds);
            form.submit()

            return true;
        }

        function xscan_hide_files(files) {
            var gridObject = BX.Main.gridManager.getById("report_list");
            var grid = gridObject.instance
            var selectedIds = grid.getRows().getSelectedIds();

            var checkboxAll = document.getElementById('actallrows_report_list')

            BX.ajax.post('/bitrix/admin/bitrix.xscan_worker_fork.php',
                {
                    'sessid': BX.bitrix_sessid(),
                    'ajax': true,
                    'hide-files': JSON.stringify(selectedIds),
                    'all': checkboxAll.checked == true
                },
                callback
            );

            return true;
        }

        function Start() {
            BX('start_button').classList.add('ui-btn-wait');
            BX('start_button').disabled = true;
            BX('alert_msg').innerHTML = '';
            go('Y');
        }

        function GridRenew() {
            var gridObject = BX.Main.gridManager.getById("report_list");

            if (gridObject.hasOwnProperty('instance')) {
                gridObject.instance.reloadTable('POST', {});
            }
        }

        function go(clean = 'N', progress = '', total = '', break_point = '') {
            BX.ajax({
                url: '/bitrix/admin/bitrix.xscan_worker_fork.php',
                method: 'POST',
                data: {
                    'sessid': BX.bitrix_sessid(),
                    'action': 'scan',
                    'ajax': true,
                    'progress': progress,
                    'total': total,
                    'clean': clean,
                    'break_point': break_point,
                    'start_path': BX('start_path').value,
                },
                onsuccess: function (result) {
                    result = JSON.parse(result);
                    GridRenew();
                    if (result['error']) {
                        BX('alert_msg').innerHTML = result['error'];
                    }

                    if (result['break_point']) {
                        BX('progress_bar').style.display = '';
                        BX('progress').innerHTML = result['progress'] + " / " + result['total'];
                        BX('progressprc').style.width = result['prc'] + '%';

                        go('N', result['progress'], result['total'], result['break_point']);
                    } else {
                        BX('start_button').classList.remove('ui-btn-wait');
                        BX('start_button').disabled = false;
                        BX('progress_bar').style.display = 'none';
                    }
                },
                onfailure: function (err, status, conf) {

                    if (conf && conf.xhr && conf.xhr.getResponseHeader('xscan-bp')) {
                        bp = conf.xhr.getResponseHeader('xscan-bp');

                        BX.ajax.post('/bitrix/admin/bitrix.xscan_worker_fork.php',
                            {
                                'sessid': BX.bitrix_sessid(),
                                'ajax': true,
                                'action': 'add_error',
                                'file': bp

                            },
                            function (result) {
                                // result = JSON.parse(result);
                                // BX('alert_msg').innerHTML = result['msg'] || result['error'];
                                go('N', progress, total, break_point);
                            }
                        );
                    }
                }
            });

        }

        BX.SidePanel.Instance.bindAnchors({
            rules:
                [
                    {
                        condition: [
                            ".*action=showfile&file=.*",
                        ],
                        loader: "xscan",

                        options: {
                            animationDuration: 1,
                            cacheable: false
                        }
                    }
                ]
        });


        function income_event(a) {
            if (a.eventId == 'xscan-grid') {
                result = JSON.parse(a.data.result);
                BX('alert_msg').innerHTML = result['msg'] || result['error'];
                GridRenew();
            }
        }

        BX.addCustomEvent('SidePanel.Slider:onMessage', income_event);

    </script>

    <div id="alert_msg">
    </div>

    <div id="progress_bar" style="display: none" class="ui-progressbar ui-progressbar-bg">
        <div class="ui-progressbar-text-before">
            <strong><?= GetMessage("BITRIX_XSCAN_IN_PROGRESS") ?></strong>
        </div>
        <div class="ui-progressbar-track">
            <div class="ui-progressbar-bar" id="progressprc" style=""></div>
        </div>
        <div class="ui-progressbar-text-after" id="progress"></div>
    </div>
    <br>

    <?php

    $APPLICATION->IncludeComponent(
        "bitrix:main.ui.filter",
        "",
        [
            "FILTER_ID" => 'report_filter',
            "GRID_ID" => 'report_list',
            "FILTER" => [
                [
                    "id" => "mtime",
                    "name" => GetMessage("BITRIX_XSCAN_M_DATE"),
                    "type" => "date",
                    "default" => "true",
                ],
                [
                    "id" => "ctime",
                    "name" => GetMessage("BITRIX_XSCAN_C_DATE"),
                    "type" => "date",
                    "default" => "true",
                ],
                [
                    "id" => "tags",
                    "name" => "tags",
                    "type" => "list",
                    "params" => [
                        "multiple" => "Y",
                    ],
                    "items" => ['core' => 'core',
                        'no_prolog' => 'no_prolog',
                        'obfuscator' => 'obfuscator',
                        'lang' => 'lang',
                        'hidden' => 'hidden',
                        'random_name' => 'random_name',
                        'marketplace' => 'marketplace'
                    ],
                    "default" => 'true',

                ],
                [
                    "id" => "preset",
                    "name" => "preset",
                    "type" => "list",
                    "items" => [
                        "a" => "/bitrix/admin",
                        "m" => "/bitrix/modules",
                        "c" => "/bitrix/components",
                        "!m" => "not /bitrix/modules",
                        "pop" => GetMessage("BITRIX_XSCAN_POPULAR"),
                    ]
                ],


            ],
            "FILTER_PRESETS" => [
                "admin" => [
                    "name" => '/bitrix/admin',
                    "fields" => [
                        "preset" => ["a"]
                    ],
                ],
                "modules" => [
                    "name" => '/bitrix/modules',
                    "fields" => [
                        "preset" => ["m"]
                    ],
                ],
                "components" => [
                    "name" => '/bitrix/components',
                    "fields" => [
                        "preset" => ["c"]
                    ],
                ],
                "not_modules" => [
                    "name" => 'not /bitrix/modules',
                    "fields" => [
                        "preset" => ["!m"]
                    ],
                ],
                "popular" => [
                    "name" => GetMessage("BITRIX_XSCAN_POPULAR"),
                    "fields" => [
                        "preset" => ["pop"]
                    ],
                ],
            ],
            "ENABLE_LIVE_SEARCH" => false,
            "ENABLE_LABEL" => true,
        ]
    );


    }

$APPLICATION->IncludeComponent(
        'bitrix:main.ui.grid',
        '',
        [
            'GRID_ID' => 'report_list',
            'COLUMNS' => [
                ['id' => 'ID', 'name' => 'id', 'sort' => 'id', 'default' => true],
                ['id' => 'FILE_NAME', 'name' => GetMessage("BITRIX_XSCAN_NAME"), 'default' => true],
                ['id' => 'FILE_TYPE', 'name' => GetMessage("BITRIX_XSCAN_TYPE"), 'default' => true],
                ['id' => 'FILE_SIZE', 'name' => GetMessage("BITRIX_XSCAN_SIZE"), 'default' => true],
                ['id' => 'FILE_SCORE', 'name' => GetMessage("BITRIX_XSCAN_SCORE"), 'sort' => 'score', 'default' => true],
                ['id' => 'FILE_MODIFY', 'name' => GetMessage("BITRIX_XSCAN_M_DATE"), 'sort' => 'mtime', 'default' => true],
                ['id' => 'FILE_CREATE', 'name' => GetMessage("BITRIX_XSCAN_C_DATE"), 'sort' => 'ctime', 'default' => true],
                ['id' => 'TAGS', 'name' => 'tags', 'default' => true],
                ['id' => 'ACTIONS', 'name' => GetMessage("BITRIX_XSCAN_ACTIONS"), 'default' => true],
                ['id' => 'HIDE', 'name' => GetMessage("BITRIX_XSCAN_HIDE_BTN"), 'default' => true],

            ],
            'ROWS' => $list,
            'TOTAL_ROWS_COUNT' => $total,
            'SHOW_ROW_CHECKBOXES' => false,
            'SHOW_GRID_SETTINGS_MENU' => true,
            'SHOW_TOTAL_COUNTER' => true,
            'ALLOW_COLUMNS_RESIZE' => true,
            'ALLOW_HORIZONTAL_SCROLL' => true,
            'ALLOW_SORT' => true,

            'AJAX_MODE' => 'Y',
            'AJAX_ID' => \CAjax::GetComponentID('bitrix:main.ui.grid', '', ''),
            'AJAX_OPTION_JUMP' => 'N',
            'AJAX_OPTION_STYLE' => 'N',
            'AJAX_OPTION_HISTORY' => 'N',

            'NAV_OBJECT' => $nav,
            'CURRENT_PAGE' => $nav->getCurrentPage(),
            'NAV_PARAM_NAME' => $nav->getId(),
            'SHOW_NAVIGATION_PANEL' => true,
            'SHOW_PAGINATION' => true,
            'SHOW_MORE_BUTTON' => false,
            'ENABLE_NEXT_PAGE' => true,

            'SHOW_CHECK_ALL_CHECKBOXES' => true,
            'SHOW_ROW_CHECKBOXES' => true,
            'SHOW_SELECTED_COUNTER' => true,
            'SHOW_ACTION_PANEL' => true,
            'ACTION_PANEL' => [
                'GROUPS' => [
                    [
                        'ITEMS' => [
                            [
                                "TYPE" => \Bitrix\Main\Grid\Panel\Types::BUTTON,
                                "ID" => "action_button_download",
                                "NAME" => "action_button_download",
                                "TEXT" => GetMessage("BITRIX_XSCAN_DOWNLOAD"),
                                'ONCHANGE' => array(
                                    array(
                                        'ACTION' => Bitrix\Main\Grid\Panel\Actions::CALLBACK,
                                        'DATA' => [["JS" => "xscan_download()"]]
                                    )
                                )
                            ],
                            [
                                "TYPE" => \Bitrix\Main\Grid\Panel\Types::BUTTON,
                                "ID" => "action_button_hide",
                                "NAME" => "action_button_hide",
                                "TEXT" => GetMessage("BITRIX_XSCAN_HIDE_BTN"),
                                'ONCHANGE' => array(
                                    array(
                                        'ACTION' => Bitrix\Main\Grid\Panel\Actions::CALLBACK,
                                        'DATA' => [["JS" => "xscan_hide_files()"]]
                                    )
                                )
                            ],
                            $snippet->getForAllCheckbox()
                        ],
                    ]
                ],
            ],


            'SHOW_PAGESIZE' => true,
            'DEFAULT_PAGE_SIZE' => 20,
            'PAGE_SIZES' => [
                ['NAME' => "5", 'VALUE' => '5'],
                ['NAME' => '10', 'VALUE' => '10'],
                ['NAME' => '20', 'VALUE' => '20'],
                ['NAME' => '50', 'VALUE' => '50'],
                ['NAME' => '100', 'VALUE' => '100']
            ],

        ]
    );

if (!isset($_REQUEST['grid_action'])) {
    require($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/include/epilog_admin_before.php");
    require($_SERVER["DOCUMENT_ROOT"] . BX_ROOT . "/modules/main/include/epilog_admin_after.php");
}

?>