Socialnetwork 26.500.0: проверки прав в ленте и новый REST для комментариев
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Socialnetwork 26.500.0 закрывает обходы прав в ленте, группах и чатах, добавляет REST-чтение комментариев и защищает лимит Scrum-проектов от параллельных запросов. Обновление также принудительно включает новый режим проектов и отключает компонент копирования группы.
Новое
Читайте комментарии поста через REST
Новый метод log.blogcomment.get возвращает опубликованные комментарии и прикреплённые файлы. Обязателен POST_ID; для постраничного чтения можно передать FIRST_ID или LAST_ID, но не оба параметра сразу. LIMIT принимает значения от 1 до 1000.
Перед чтением Socialnetwork проверяет доступ к посту через Livefeed\BlogPost::canRead(). Отсутствующий и недоступный пост возвращается как 404, поэтому метод не раскрывает данные ленты пользователю без прав. За выборку отвечает новый Bitrix\Socialnetwork\Rest\BlogCommentReader с отдельными методами для комментариев и файлов.
Лента и группы проверяют доступ до выдачи данных
AJAX-список пользователей важного поста теперь сначала проверяет право чтения. Для extranet-пользователя участники без общего проекта заменяются обезличенной записью; сотрудник увидит внешнего пользователя только при наличии общей группы. Такая же проверка появилась у старого endpoint socialnetwork.blog.blog/users.php.
Источник живой ленты для Landing вычисляет доступные пользователю группы, проверяет права на логи и посты и повторно валидирует выбранные ID. Динамический блок socialnetwork:livefeed больше не попадает в общий кэш, где результат одного пользователя мог достаться другому.
Отключение подразделения от группы требует права на изменение проекта. Создание чата проходит проверку ChatCreateFields::checkAccess(), а приглашение в коллабу — CollabAccessController. Workgroup::getAction() отклоняет некорректные фильтры DATE_CREATE и DATE_UPDATE.
Scrum-лимит выдерживает параллельные запросы
Создание Scrum-проекта и перевод обычной группы в Scrum блокируют служебную версию счётчика в b_option на primary-соединении. Проверка тарифа, увеличение версии и сохранение группы выполняются в одной транзакции. Два параллельных запроса больше не смогут одновременно пройти лимит по одному устаревшему значению.
Для этой схемы появились Bitrix\Socialnetwork\Helper\ScrumProjectLimit и ScrumProjectLimitException. Отдельные коды ошибок различают превышенный лимит и устаревший снимок состояния.
Теги сохраняются вместе с проектом
Команды создания и обновления получили setTagNames() и getTagNames(). Массив тегов нормализуется до основной операции и передаётся в CSocNetGroup::Add() или Update() новым необязательным аргументом $tagNames. Тег с запятой сохраняет границы, а ошибка проверки больше не возникает после уже выполненного изменения проекта.
ProjectAccessCodesProvider теперь принимает addAccessCodesTab, closed и siteId, а ProjectProvider — фильтры closed и siteId. При точной загрузке по ID провайдер может вернуть существующий проект, даже если его тип скрыт feature-флагом портала.
Диск выбирает один загрузчик
Страницы файлов пользователя, группы и пространств передают DOCKED_UPLOADER_SUPPORTED=Y. Когда папкой владеет новый docked uploader, старый bitrix:disk.file.upload не монтируется и не перехватывает тот же input и drop zone. При старом модуле Disk, выключенной функции или общей ссылке остаётся прежний загрузчик.
Для администратора добавлена страница /user/#user_id#/disk/restrictions/ с ограничениями Диска.
Что сломается
Компонент bitrix:socialnetwork.group_copy больше не копирует группы. SocialnetworkGroupCopy::executeComponent() и AJAX-действие copyGroupAction() сразу выбрасывают SystemException('System error'). Интерфейсы и автоматизация, которые вызывают этот компонент, перестанут работать.
Bitrix\Socialnetwork\V2\Feature::isNewProjectsOn() всегда возвращает true и больше не читает опцию socialnetwork.new_projects. Код с ветвлением по этому методу всегда перейдёт на новую реализацию проектов. Старое действие Workgroup::updateInvitedUsersAction() в этом режиме возвращает Access denied.
Мелочи и находки
Форма проекта связывает ошибку поля USERS с селектором команды и удаляет только эту часть сообщения после выбора участника. Остальные ошибки остаются на месте.
UiPopup::closePopup() обнуляет ссылку на popup до вызова destroy(), поэтому повторный callback уничтожения больше не запускает рекурсивное закрытие.