Forum 26.200.0: REST v3 для сообщений и проверка доступа к комментариям
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Forum 26.200.0 добавляет REST v3-контроллер сообщений и ужесточает проверку доступа к комментариям бизнес-процессов. Исправлена и очистка кеша живой ленты после удаления комментария через REST.
Новое
Удаляйте сообщения через REST v3
Новый контроллер Bitrix\Forum\Infrastructure\Rest\Controller\Message содержит действие deleteAction(DeleteRequest $request): DeleteResponse. Запрос принимает положительный id; передавать filter нельзя. Если сообщения уже нет, действие возвращает успех: повторное удаление после потерянного ответа сервера не превращается в ошибку.
Существующее сообщение может удалить его автор либо пользователь, прошедший проверку CSocNetUser::isUserModuleAdmin(). При отказе контроллер выбрасывает AccessDeniedException. Прежний REST-метод forum.message.delete сохранён.
В контроллере также появились listAction() и tailAction(). Оба помечены #[Hidden] и выбирают только сообщения текущего пользователя. У tailAction() курсор работает по id; отдельный фильтр по этому полю запрещён.
Проверьте сценарии доступа к комментариям бизнес-процесса
Резервная проверка права element_read теперь подтверждает тип документа. Она допускает CIBlockDocument и его наследников, проверяет загрузку модуля, положительный ID и существование элемента инфоблока. Некорректный идентификатор документа даёт отказ в этой ветке проверки.
Эта проверка выполняется, если доступ ещё не получен через администратора, участников или инициатора процесса. Эти способы доступа сохранены. В собственных сценариях с документами другого типа учитывайте, что одного совпадения их ID с ID элемента инфоблока больше недостаточно.
БД
В установочные схемы b_forum_message добавлен индекс по (AUTHOR_ID, ID). В MySQL он называется IX_FORUM_MESSAGE_AUTHOR_ID, в PostgreSQL — ix_b_forum_message_author_id_id. Создаёт его только установщик модуля: на эталонах БУС и Б24 после обновления до 26.200.0 индекса нет. На существующей базе он появится при переустановке модуля или если создать его вручную.
Мелочи и находки
- После REST-удаления комментария кеш живой ленты очищается по
LOG_IDсамого комментария. Раньше код брал ID из результата предыдущей выборки. - Проверка
USER_IDпри REST-удалении теперь учитывает администратора портала Битрикс24 черезCForumRestService::isAdmin(). - При чтении сохранённого состояния индексатора сообщений
unserialize()получает['allowed_classes' => false], запрещая восстановление объектов.