403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/burlakastudio.realcommenter/lib/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/burlakastudio.realcommenter/lib/CHECKER.php
<?php
/**
 * ����� "��������� ����������� D7" ��� �������
 * �������� ���� �����: www.realcommenter.com
 * �������� ���� �����������: burlaka.studio
 * ����� � ����������: ������� ������� (AlexeyGfi) -> alexeygfi@gmail.com
 */

namespace Burlakastudio\Realcommenter;

use Bitrix\Highloadblock\HighloadBlockLangTable;
use Bitrix\Highloadblock\HighloadBlockTable;
use Bitrix\Main\EventManager;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use CUserTypeEntity;
use Exception;

require_once 'CheckerDb.php';

class CHECKER extends REALCOMMENTER_HL_GENERAL_PROVIDER
{

    /**
     * ���������� ������������,
     * �� ������� �������� ��� �� ����� (���� ���� ������ - ����� ��� ID �� ������������� �����).
     *      ...���� �� ������ � ������
     *
     * ���������� �������������� ��������, ��������, ������
     */
    public static function checkState()
    {
        try {
            Broom::checkLeftFiles();
            self::hlblockCheck();
        } catch (Exception $e) {
            ErrorNotificator::sendError($e->getMessage());
            return;
        }
    }

    protected static function hlblockCheck()
    {
        Loader::includeModule('highloadblock');

        Loc::loadLanguageFile(__FILE__);

        $hlList = CheckerDb::getHlOptions();

        /**
         * � ��� ��� ���, ������ ������ �� ID ������� �������������
         * ...� ����� �� ID UF_-�����.
         *
         * � ��� ����������� ���� ����� ��, �� ���� ������.
         * ����� ��� �� ��������� � ������� �������� / �������
         */

        $dependencies = [];

        /**
         * ����� ���� �� ���: ������ ��� ������������, ����� � ������ - �������������� ���
         * ������ ��� � ���������� ����� ����������� ������������, ������ ��� �������� ����������� ����� ���������
         */

        foreach ($hlList as $hlInfo) {
            $hlId = self::hlblockGetId($hlInfo['NAME']);

            if (!$hlId) {
                $hlId = self::hlblockAdd($hlInfo);
            }

            /**
             * �������������� ��������,
             * ������� ����� ������� � HL-����� �������� � ��� �������� ���.
             * ...� ������� ����� �� ID.
             *
             * ������ � � ����������� �������� ������������ ID-��� �������� �����
             */
            $dependencies[$hlInfo['NAME']] = [
                'ID' => $hlId
            ];
        }

        foreach ($dependencies as $hlName => $dependencyInfo) {
            // �������������� ��������
            self::ufCheck($hlName, $dependencies);
        }
    }

    /**
     * @param string|array $hlName
     *
     * @param string $hlName
     * @return int
     * @throws \Bitrix\Main\ArgumentException
     * @throws \Bitrix\Main\ObjectPropertyException
     * @throws \Bitrix\Main\SystemException
     */
    protected static function hlblockGetId(&$hlName = '')
    {

        if (!$hlName) {
            return 0;
        }

        if (is_array($hlName)) {
            $filter = $hlName;
        } elseif (is_numeric($hlName)) {
            $filter = ['ID' => $hlName];
        } else {
            $filter = ['NAME' => $hlName];
        }

        $hlInfo = HighloadBlockTable::getList(
            [
                'select' => ['*'],
                'filter' => $filter,
            ]
        )->fetch();

        return $hlInfo['ID'];

    }

    /**
     * @param array $hlInfo
     *
     * @return array|bool|int|null
     * @throws Exception
     */
    protected static function hlblockAdd(&$hlInfo = [])
    {

        if (empty($hlInfo)) {
            return false;
        }

        $hlLang = null;

        if (!empty($hlInfo['LANG'])) {
            $hlLang = $hlInfo['LANG'];
            unset($hlInfo['LANG']);
        }

        $hl_result = HighloadBlockTable::add($hlInfo);

        $hlId = null;
        if (!$hl_result->isSuccess()) {
            throw new \RuntimeException(implode(', ', $hl_result->getErrorMessages()));
        } else {
            $hlId = $hl_result->getId();
            self::hlblockLangEnityAdd($hlId, $hlLang);
        }

        return $hlId;

    }

    /**
     * @param $hlId
     * @param array $hlLang
     *
     * @return bool|int
     */
    protected static function hlblockLangEnityAdd(&$hlId, &$hlLang = [])
    {
        $cnt = 0;

        if (!class_exists('Bitrix\Highloadblock\HighloadBlockLangTable')) {
            return $cnt;
        }

        foreach ($hlLang as $lid => $item) {
            if (!empty($item['NAME'])) {
                HighloadBlockLangTable::add([
                    'ID' => $hlId,
                    'LID' => $lid,
                    'NAME' => $item['NAME'],
                ]);

                $cnt++;
            }
        }

        return !!$cnt;
    }

    protected static function ufCheck(&$hlName = null, &$dependencies = [])
    {

        if (!$hlName) {
            return;
        }

        $hlId = $dependencies[$hlName]['ID'] ?: self::hlblockGetId($hlName);

        if (!$hlId) {
            return;
        }

        foreach (CheckerDb::getHlUserfieldsOptions($hlName) as $ufOptions) {

            // ������� � ������
            $targetHl = $ufOptions['SETTINGS']['HLBLOCK_ID'] ?? false;

            if (isset($ufOptions['SETTINGS']['HLFIELD_ID'])) {
                $targetField = is_string($ufOptions['SETTINGS']['HLFIELD_ID'])
                    ? $ufOptions['SETTINGS']['HLFIELD_ID']
                    : $targetHl . '.ID';
            } else {
                $targetField = false;
            }

            $ufInfo = self::ufGet($hlId, $ufOptions['FIELD_NAME']);
            if (empty($ufInfo)) {

                /**
                 * ����� ��������� ����������� ����,
                 * ��� �������� �������� �������� � ������� ������� ��� ������� ���
                 */
                if ($targetHl && $dependencies[$targetHl]) {
                    $ufOptions['SETTINGS']['HLBLOCK_ID'] = $dependencies[$targetHl]['ID'];
                }

                // ������� � ��� � ������
                if ($targetField) {
                    list($hlTargetName, $hlTargetField) = explode('.', $targetField);

                    if (
                        $hlTargetName && $dependencies[$hlTargetName]
                        && $hlTargetField && $dependencies[$hlTargetName]['FLDS'][$hlTargetField]
                    ) {
                        $ufOptions['SETTINGS']['HLFIELD_ID'] = $dependencies[$hlTargetName]['FLDS'][$hlTargetField];
                    }
                }

                try {
                    $ufId = self::ufAdd($hlId, $ufOptions);
                } catch (Exception $e) {
                    ErrorNotificator::sendError($e->getMessage());
                }
            } else {

                // To dependency tree below
                $ufId = $ufInfo['ID'];

                $changesNeeded = [];

                // ������� � ������
                if (
                    $targetHl && $dependencies[$targetHl]
                    && (int)$ufInfo['SETTINGS']['HLBLOCK_ID'] !== (int)$dependencies[$targetHl]['ID']
                ) {
                    $changesNeeded['SETTINGS']['HLBLOCK_ID'] = $dependencies[$targetHl]['ID'];
                }

                // ������� � ��� � ������
                /**
                 * � � ��������� ����� ������� ��� - ��� �����,
                 * ��� ��� �������� ��� � ���������� � ID
                 *
                 * ...�� ��� �������� ��� ����� ������ ��������
                 */
                if ($targetField) {
                    list($hlTargetName, $hlTargetField) = explode('.', $targetField);

                    /**
                     * � ��� ������� � ID ��� ������� ��������� � ��� ���.
                     * ...� � ��� ID ������� �� �������� (������ ��� ID �� ����� �������������� ���������)
                     *
                     * ����� ������������� ��������
                     * if ($dependencies[$hlTargetName]['FLDS'][$hlTargetField])
                     * ...�������� ����, �������� ������ ��� �� ���������
                     * � ��� ������ ����� ���������
                     */
                    if (
                        $hlTargetName && $dependencies[$hlTargetName]
                        && $hlTargetField /*&& $dependencies[$hlTargetName]['FLDS'][$hlTargetField]*/
                    ) {
                        if (
                            (int)$ufInfo['SETTINGS']['HLFIELD_ID'] !==
                            (int)$dependencies[$hlTargetName]['FLDS'][$hlTargetField]
                        ) {
                            $changesNeeded['SETTINGS']['HLFIELD_ID'] =
                                (int)$dependencies[$hlTargetName]['FLDS'][$hlTargetField];
                        }
                    }
                }

                if (!empty($changesNeeded)) {
                    try {
                        self::ufUpdate($ufId, $changesNeeded);
                    } catch (Exception $e) {
                        ErrorNotificator::sendError($e->getMessage());
                    }
                }
            }

            if ($ufId) {
                $dependencies[$hlName]['FLDS'][$ufOptions['FIELD_NAME']] = $ufId;
            }
        }

    }

    /**
     * @param int $hlId
     * @param string $ufName
     *
     * @return array|bool
     */
    protected static function ufGet(&$hlId = 0, &$ufName = '')
    {

        if (!$hlId || !$ufName) {
            return false;
        }

        $filter = [
            'ENTITY_ID' => 'HLBLOCK_' . $hlId,
            'FIELD_NAME' => $ufName
        ];

        $ufRes = CUserTypeEntity::GetList([], $filter);
        if ($ufArr = $ufRes->Fetch()) {
            return $ufArr;
        }

        return false;
    }

    /**
     * @param int $hlId
     * @param array $ufInfo
     *
     * @return int
     * @throws Exception
     */
    protected static function ufAdd(&$hlId = 0, &$ufInfo = [])
    {
        $default = CheckerDb::getDefaults();

        $fields = array_replace_recursive($default, $ufInfo);
        $fields['ENTITY_ID'] = 'HLBLOCK_' . $hlId;
        $fields['FIELD_NAME'] = $ufInfo['FIELD_NAME'];

        // In ORM it will be serialized array, but here is string
        if ($fields['USER_TYPE_ID'] === 'array') {
            $fields['USER_TYPE_ID'] = 'string';
        }

        $enumAfterAdd = false;
        if (isset($fields['ENUM_VALUES'])) {
            $enumAfterAdd = $fields['ENUM_VALUES'];
            unset($fields['ENUM_VALUES']);
        }

        $obUserField = new CUserTypeEntity;
        $userFieldId = $obUserField->Add($fields);

        $enumsCreated = true;
        if ($userFieldId && $fields['USER_TYPE_ID'] === 'enumeration') {
            $enumsCreated = self::setUserTypeEntityEnumValues($userFieldId, $enumAfterAdd);
        }

        if ($userFieldId && $enumsCreated) {
            return $userFieldId;
        }

        $errorMsg = 'UF field creation error';
        global $APPLICATION;
        if ($APPLICATION->GetException()) {
            $errorMsg = $APPLICATION->GetException()->GetString();
        }

        throw new \RuntimeException($errorMsg);

    }

    /**
     * ������� ������ ������� �� ��������������� ���
     * @param $fieldId
     * @param $newenums
     * @return bool
     */
    public static function setUserTypeEntityEnumValues($fieldId, $newenums)
    {
        $newenums = is_array($newenums) ? $newenums : [];
        $oldenums = self::getEnumValues($fieldId);

        $index = 0;

        $updates = [];
        foreach ($oldenums as $oldenum) {
            $newenum = self::searchEnum($oldenum, $newenums);
            if ($newenum) {
                $updates[$oldenum['ID']] = $newenum;
            } else {
                $oldenum['DEL'] = 'Y';
                $updates[$oldenum['ID']] = $oldenum;
            }
        }

        foreach ($newenums as $newenum) {
            $oldenum = self::searchEnum($newenum, $oldenums);
            if ($oldenum) {
                $updates[$oldenum['ID']] = $newenum;
            } else {
                $updates['n' . $index++] = $newenum;
            }
        }

        $obEnum = new \CUserFieldEnum();
        return $obEnum->SetEnumValues($fieldId, $updates);

    }

    /**
     * @param $fieldId
     * @return array
     */
    protected static function getEnumValues($fieldId)
    {
        $obEnum = new \CUserFieldEnum;
        $dbres = $obEnum->GetList([], ['USER_FIELD_ID' => $fieldId]);

        $res = [];

        while ($item = $dbres->Fetch()) {
            $res[] = $item;
        }

        return $res;
    }

    /**
     * @param $enum
     * @param array $haystack
     * @return bool|mixed
     */
    protected static function searchEnum($enum, $haystack = [])
    {
        foreach ($haystack as $item) {
            if (!empty($item['XML_ID']) && $item['XML_ID'] === $enum['XML_ID']) {
                return $item;
            }
        }
        return false;
    }

    protected static function ufUpdate($ufId = 0, &$fields = [])
    {

        if (!$ufId || empty($fields)) {
            return false;
        }

        $obUserField = new CUserTypeEntity;
        if ($obUserField->Update($ufId, $fields)) {
            return true;
        }

        $errorMsg = 'UF field update error';

        global $APPLICATION;
        if ($APPLICATION->GetException()) {
            $errorMsg = $APPLICATION->GetException()->GetString();
        }

        throw new \RuntimeException($errorMsg);

    }

    public static function checkHlEvents()
    {
        /**
         * ����� ������������� (������� ��������� �� �������):
         * - �������������� ������� � �����
         * RealcommenterSanctionsOnAfterUpdate
         * == ������� �� ������ (���� ��)
         *
         * - �������������� ����
         * - �������������� ������������
         * == ������� �� ������
         */

        $eventManager = EventManager::getInstance();

        /**
         * ����� � �������� �������� ����������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnBeforeCommentAdd',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\COMMENTS_RATING",
            'check_comment_rate'
        );

        /**
         * �������� ����������� � ����� �����������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentAdd',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\NOTIFICATOR",
            'OnAfterCommentAdd'
        );

        /**
         * ������ ��������� ������������ ����� ��������� ������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentAdd',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\COUNTER",
            'OnRecalculateReferenceEvent'
        );

        /**
         * ������ ����� tape_* �������� �� html-���� ������
         */
        $eventManager->registerEventHandler(
            'main',
            'OnEndBufferContent', // ! �� �� onEpilog !
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\TOOLS",
            'tape_variables_from_html_parser'
        );

        /**
         * �������� ���������� � ���, ��� �������� �����-�� ����
         */
        $eventManager->registerEventHandler(
            'main',
            'main.file.input.upload',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\NOTIFICATOR",
            'uploaded_file'
        );

        /**
         * ������ ��������� ������������ ����� �������� ���������� ����� �� �����
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentChangeActivity',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\COUNTER",
            'OnRecalculateReferenceEvent'
        );

        /**
         * ����������� ������ � ���, ��� � ��������� ��� ���������� ���-�� ��������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentChangeActivity',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\NOTIFICATOR",
            'OnAfterCommentChangeActivity'
        );

        /**
         * ������ ��������� ������������ ����� ��������� ����� �� �����
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentUpdate',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\COUNTER",
            'OnRecalculateReferenceEvent'
        );

        /**
         * ������ ��������� ������������ ����� ������� ����� �� �����
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentDelete',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\COUNTER",
            'OnRecalculateReferenceEvent'
        );

        /**
         * ������ ��� ��� ���������� ����������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentAdd',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnCommentEvented'
        );

        /**
         * ������ ��� ��� ��������� ����������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentUpdate',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnCommentEvented'
        );

        /**
         * ������ ��� ��� ��������� ���������� ����������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentChangeActivity',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnCommentEvented'
        );

        /**
         * ������ ��� ��� �������� ����������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterCommentDelete',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnCommentEvented'
        );

        /**
         * ������ ��� ���� ��� ����������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterUrlUpdate',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnUrlEvented'
        );

        /**
         * ������ ��� ���������� ��� ����������
         */
        $eventManager->registerEventHandler(
            'main',
            'OnAfterUserAdd',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnUserEvented'
        );

        /**
         * ������ ��� ���������� ��� ��������������
         */
        $eventManager->registerEventHandler(
            'main',
            'OnAfterUserUpdate',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnUserEvented'
        );

        /**
         * ������ ��� ���������� ��� ��������
         */
        $eventManager->registerEventHandler(
            'main',
            'OnUserDelete',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnUserEvented'
        );

        /**
         * ������ ��� ����������: ����������, �� ����� ����������� �� ��� ���������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterVoteAdd',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnVoteByUserEvented'
        );

        /**
         * ������ ��� ������������ ��� ����������� ����������
         */
        $eventManager->registerEventHandler(
            TOOLS::getModuleName(),
            'OnAfterVoteAdd',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\CACHE",
            'realcommenter_OnCommentEvented'
        );

        /**
         * ������ ��� ������ � ������� (��������� cache � datamanager)
         */
        $eventManager->registerEventHandler(
            '',
            '\RealcommenterSanctions::OnAfterUpdate',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\Sanctions",
            'OnAfterUpdate'
        );

        /**
         * ������ ��� ������������ ��� �������������� ����������
         */
        $eventManager->registerEventHandler(
            '',
            '\RealcommenterComment::OnUpdate',
            TOOLS::getModuleName(),
            "\Burlakastudio\Realcommenter\COMMENTS",
            'OnAfterUpdate'
        );

    }

    /**
     * �� ������� (� ����� ���������� ������),
     * ������ �� ������� ��� � ���� ������ ����������
     *
     * @return bool
     * @throws Exception
     */
    public static function checkTalkGroupMinimalDeploy()
    {

        $talkGroups = TalkGroups::getList(
            [
                'filter' => ['!UF_NAME' => false],
                'limit' => 1
            ]
        );

        if (!empty($talkGroups)) {
            return true;
        }

        $talkRow = TalkGroups::getFreeRow();

        if (empty($talkRow) || !$talkRow['ID']) {
            throw new \RuntimeException('TALK GROUP DEPLOY ERROR');
        }

        $talkRow['UF_NAME'] = Loc::getMessage('ITAPE_TALK_GROUP_DEPLOY_NAME');
        $talkRow['UF_ACTIVE'] = true;
        $talkRow['UF_PAUSE'] = false;

        $updateResult = TalkGroups::update($talkRow['ID'], $talkRow);
        if ($updateResult && !$updateResult->isSuccess()) {
            throw new \RuntimeException(implode(', ', $updateResult->getErrorMessages()));
        }

        return true;

    }

    protected static function ufGetId(&$hlId = 0, &$ufName = '')
    {
        $ufArr = self::ufGet($hlId, $ufName);

        if (!empty($ufArr)) {
            return $ufArr['ID'];
        }

        return false;
    }

}

Youez - 2016 - github.com/yon3zu
LinuXploit