%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/mail/install/components/bitrix/mail.blacklist.list/ |
Current File : //home/bitrix/www/bitrix/modules/mail/install/components/bitrix/mail.blacklist.list/class.php |
<?php if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) { die(); } use Bitrix\Mail\BlacklistTable; use Bitrix\Main\Engine\Contract\Controllerable; use Bitrix\Main\Localization\Loc; use Bitrix\Main; use Bitrix\Main\Loader; use Bitrix\Mail\Blacklist\ItemType; Loc::loadMessages(__FILE__); /** */ class MailBlacklistListComponent extends CBitrixComponent implements Controllerable { protected $gridId = 'MAIL_BLACKLIST_LIST'; protected $filterId = 'MAIL_BLACKLIST_LIST'; private $userId = 0; private $errorCollection; /** @inheritdoc */ public function __construct(CBitrixComponent $component = null) { $this->errorCollection = new \Bitrix\Main\ErrorCollection(); parent::__construct($component); } /** @inheritdoc */ public function executeComponent() { if (!$this->runBeforeAction()) { return; } $this->userId = Main\Engine\CurrentUser::get()->getId(); $this->arResult['IFRAME'] = $this->arParams['IFRAME'] == 'Y' || $this->request->get('IFRAME') == 'Y' ? 'Y' : 'N'; $this->arResult['CAN_DELETE'] = $this->isUserAdmin(); $this->arResult['USER_ID'] = $this->userId; $this->arResult['GRID_ID'] = $this->gridId; $this->arResult['FILTER_ID'] = $this->filterId; $this->processGridActions($this->arResult['GRID_ID']); $this->arResult['HEADERS'] = [ ['id' => 'EMAIL', 'name' => Loc::getMessage('MAIL_BLACKLIST_LIST_COLUMN_EMAIL'), 'sort' => 'EMAIL', 'default' => true, 'editable' => false], ['id' => 'IS_FOR_ALL_USERS', 'name' => Loc::getMessage('MAIL_BLACKLIST_LIST_COLUMN_IS_FOR_ALL_USERS'), 'sort' => 'IS_FOR_ALL_USERS', 'default' => true, 'editable' => false], ]; $gridOptions = new \Bitrix\Main\Grid\Options($this->arResult['GRID_ID']); $gridSorting = $gridOptions->GetSorting( [ 'sort' => ['ID' => 'asc'], 'vars' => ['by' => 'by', 'order' => 'order'], ] ); $this->arResult['SORT'] = $gridSorting['sort']; $this->arResult['SORT_VARS'] = $gridSorting['vars']; $this->arResult['FILTER'] = [ [ 'id' => "TYPE", 'name' => Loc::getMessage('MAIL_BLACKLIST_LIST_FILTER_TYPE'), 'type' => 'list', 'items' => [ ItemType::DOMAIN => Loc::getMessage('MAIL_BLACKLIST_LIST_FILTER_DOMAIN_TITLE'), ItemType::EMAIL => Loc::getMessage('MAIL_BLACKLIST_LIST_FILTER_MAIL_TITLE'), ], 'params' => ['multiple' => 'N'], 'default' => true, ], ]; $blacklistMails = $this->getBlacklistMails(); $this->makeRows($blacklistMails); if ($this->request->getPost('hasAjaxDeleteError')) { $this->addError(Loc::getMessage('MAIL_BLACKLIST_LIST_INTERNAL_AJAX_DELETE_ERROR')); } $this->includeComponentTemplate(); } /** * @param $mails */ private function makeRows($mails) { $count = 0; $items = []; foreach ($mails as $index => $mail) { $fields['~ID'] = $mail['ID']; $fields['ID'] = intval($mail['ID']); $fields['~EMAIL'] = $mail['ITEM_VALUE']; $fields['EMAIL'] = htmlspecialcharsbx($mail['ITEM_VALUE']); $fields['~IS_FOR_ALL_USERS'] = $mail['USER_ID'] == 0 ? Loc::getMessage('MAIL_BLACKLIST_LIST_IS_FOR_ALL_USERS') : ''; $fields['IS_FOR_ALL_USERS'] = $fields['~IS_FOR_ALL_USERS']; $fields['CAN_DELETE'] = $mail['USER_ID'] == 0 ? $this->isUserAdmin() : true; $fields['PATH_TO_DELETE'] = ''; $items[] = $fields; $count++; } $this->arResult['ROWS_COUNT'] = $count; $this->arResult['ITEMS'] = &$items; } /** * @return bool */ private function isUserAdmin() { global $USER; if (!(is_object($USER) && $USER->IsAuthorized())) { return false; } return (bool)($USER->isAdmin() || $USER->canDoOperation('bitrix24_config')); } /** * @return array * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ObjectPropertyException * @throws \Bitrix\Main\SystemException */ private function getBlacklistMails() { if (!$this->userId) { return []; } $filterOptions = new \Bitrix\Main\UI\Filter\Options($this->filterId); $gridFilter = $filterOptions->getFilter($this->arResult['FILTER']); $baseFilter = [ 'LOGIC' => 'OR', [ '=MAILBOX_ID' => 0, '@USER_ID' => [0, $this->userId], ], ]; $mailsQuery = \Bitrix\Mail\BlacklistTable::query() ->addSelect(('ID')) ->addSelect(('ITEM_VALUE')) ->addSelect(('ITEM_TYPE')) ->addSelect(('USER_ID')); $userMailboxes = \Bitrix\Mail\MailboxTable::getUserMailboxes(); if (!empty($userMailboxes)) { $baseFilter[] = ['@MAILBOX_ID' => array_column($userMailboxes, 'ID')]; } $mailsQuery = $mailsQuery->setFilter([$baseFilter]); if (isset($gridFilter['FIND']) && $gridFilter['FIND']) { $mailsQuery = $mailsQuery ->where([['ITEM_VALUE', 'like', "%{$gridFilter['FIND']}%",]]); } if (isset($gridFilter['TYPE']) && in_array($gridFilter['TYPE'], [ItemType::EMAIL, ItemType::DOMAIN])) { $mailsQuery = $mailsQuery ->where('ITEM_TYPE', $gridFilter['TYPE']); } if (!empty($this->arResult['SORT'])) { if (isset($this->arResult['SORT']['EMAIL'])) { $mailsQuery = $mailsQuery ->addOrder('ITEM_VALUE', $this->arResult['SORT']['EMAIL'] == 'desc' ? 'DESC' : 'ASC'); } if (isset($this->arResult['SORT']['IS_FOR_ALL_USERS'])) { $mailsQuery = $mailsQuery ->addOrder('USER_ID', $this->arResult['SORT']['IS_FOR_ALL_USERS'] == 'desc' ? 'DESC' : 'ASC'); } } $mails = $mailsQuery ->exec() ->fetchAll(); return $mails; } private function processDelete() { $request = $this->request; if (!$request->getPost('ID')) { return; } foreach ($request->getPost('ID') as $emailId) { $result = $this->deleteEmailAddressById($emailId); if (!$result->isSuccess()) { $emailEntity = $result->getData(); $email = $emailEntity ? $emailEntity['ITEM_VALUE'] : ''; $this->addError(Loc::getMessage('MAIL_BLACKLIST_LIST_DELETE_ERROR', ['#EMAIL#' => $email])); return; } } } /** * @param $errorMessage */ private function addError($errorMessage) { $this->arResult["MESSAGES"][] = [ "TYPE" => \Bitrix\Main\Grid\MessageType::ERROR, "TITLE" => Loc::getMessage('MAIL_BLACKLIST_LIST_INTERNAL_ERROR_TITLE'), "TEXT" => $errorMessage, ]; } /** * @param $gridId */ private function processGridActions($gridId) { $postAction = 'action_button_' . $gridId; if ($this->request->isPost() && $this->request->getPost($postAction) && check_bitrix_sessid()) { if ($this->request->getPost($postAction) == 'delete') { $this->processDelete(); } } } /** * @return array */ public function configureActions() { return []; } /** * @return array */ public function getPopupContentAction() { if (!$this->runBeforeAction()) { return []; } ob_start(); $isForAllUsers = $this->isUserAdmin(); include __DIR__ . '/templates/.default/popup_content.php'; $html = ob_get_clean(); return ['html' => $html]; } /** * @param $emails * @param bool $isForAllUsers * @return void|array * @throws Main\ArgumentException * @throws Main\Db\SqlQueryException * @throws Main\LoaderException * @throws Main\ObjectPropertyException * @throws Main\SystemException */ public function addMailsAction($emails, $isForAllUsers = false) { if (!($this->runBeforeAction() && check_bitrix_sessid())) { return; } if ($isForAllUsers && !$this->isUserAdmin()) { $isForAllUsers = false; } if (!empty($emails)) { $blacklistMails = $this->sanitizeEmails($emails); BlacklistTable::addMailsBatch($blacklistMails, $isForAllUsers ? 0 : \Bitrix\Main\Engine\CurrentUser::get()->getId() ); } return; } /** * @param $id * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\LoaderException * @throws \Bitrix\Main\ObjectPropertyException * @throws \Bitrix\Main\SystemException */ public function deleteAction($id) { if (!($id && $this->runBeforeAction() && check_bitrix_sessid())) { return; } $result = $this->deleteEmailAddressById($id); if (!$result->isSuccess()) { $this->errorCollection->add([new Main\Error('MAIL_BLACKLIST_LIST_INTERNAL_ERROR_TITLE')]); } } private function runBeforeAction() { global $APPLICATION, $USER; if (!Loader::includeModule('mail')) { return false; } if (!(is_object($USER) && $USER->IsAuthorized())) { $APPLICATION->AuthForm(''); return false; } return true; } private function deleteEmailAddressById($id) { $result = new Main\Result(); $email = \Bitrix\Mail\BlacklistTable::getById($id)->fetch(); if (!$email) { return $result->addError(new Main\Error('')); } if ($email['USER_ID'] == 0 && $email['MAILBOX_ID'] == 0 && !$this->isUserAdmin()) { return $result->addError(new Main\Error('')); } $result->setData($email); if ($email['USER_ID'] > 0 && $email['USER_ID'] != \Bitrix\Main\Engine\CurrentUser::get()->getId()) { return $result->addError(new Main\Error('')); } if ($email['MAILBOX_ID'] > 0) { $mailbox = \Bitrix\Mail\MailboxTable::getUserMailbox($email['MAILBOX_ID']); if (!$mailbox) { return $result->addError(new Main\Error('')); } } $deleteResult = \Bitrix\Mail\BlacklistTable::delete($id); if (!$deleteResult->isSuccess()) { return $result->addErrors($deleteResult->getErrors()); } return $result; } /** * @param $emails * @return array */ private function sanitizeEmails($emails) { $blacklist = preg_split('/[\r\n,;]+/', $emails); foreach ($blacklist as $index => $email) { $email = ltrim($email, " \t\n\r\0\x0b@"); $email = rtrim($email); $blacklist[$index] = null; if (strpos($email, '@') === false) { if (check_email(sprintf('email@%s', $email))) { $blacklist[$index] = $email; } } else { if (check_email($email)) { $blacklist[$index] = $email; } } } return array_unique(array_filter($blacklist)); } }