Intranet 26.1750.0: приглашения в коллабы проверяются по каждому условию, отказы получили коды COLLAB_INVITE_*
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Intranet 26.1750.0 вышел для коробочного Битрикс24 (в БУС этого модуля нет) вместе с im 26.1150.0 и socialnetwork 26.275.0, во всех трёх есть правки коллаб. Префильтр приглашений в коллабу из-за && в условии отказывал, только когда проваливались сразу три проверки, а теперь каждая проверка отказывает сама и отдаёт машиночитаемый код. Администратору стоит обновиться, а тому, кто вызывает приглашения из своего кода, проверить обработку отказов.
Новое
Разбирайте отказ по коду
Префильтр InviteToCollabAccessControl стоит на трёх действиях контроллера Bitrix\Intranet\Controller\Invite: intranet.invite.inviteUsersToCollab, intranet.invite.getLinkByCollabId и intranet.invite.regenerateLinkByCollabId. У его ошибок появились коды, в порядке проверки:
COLLAB_INVITE_MODULES_UNAVAILABLE: не установлен socialnetwork, extranet или другой обязательный модуль коллаб;COLLAB_INVITE_PORTAL_DISABLED: выключена настройка «Разрешить приглашать внешних пользователей в коллабы» или инструмент «Коллабы»;COLLAB_INVITE_ACCESS_DENIED: у пользователя нет права приглашать в эту коллабу;COLLAB_INVITE_TECHNICAL_DISABLED: коллабы выключены технически (CollabFeature::isOn());COLLAB_INVITE_FEATURE_UNAVAILABLE: коллабы недоступны по тарифу;COLLAB_INVITE_EXTRANET_NOT_CONFIGURED: не настроен экстранет-сайт;COLLAB_INVITE_GROUP_DISABLED: владелец коллабы запретил приглашать гостей.
Без кода остались два отказа, 'Collab ID is not specified.' и «Коллаба не найдена». Сравнивать текст бесполезно, потому что MODULES_UNAVAILABLE, TECHNICAL_DISABLED и FEATURE_UNAVAILABLE отдают одну и ту же фразу INTRANET_COLLAB_ACCESS_CONTROL_PORTAL_ACCESS_DENIED. При ошибке копирования или перевыпуска ссылки мессенджер с im 26.1150.0 показывает серверный текст только для кодов из этого списка, на остальные выводит общую ошибку. В своём интерфейсе можно так же: на известный код показать свою подсказку, на остальные COLLAB_INVITE_* серверный текст, а перед вставкой в HTML его экранировать.
const hints = {
COLLAB_INVITE_ACCESS_DENIED: 'Попросите владельца коллабы дать вам право приглашать',
COLLAB_INVITE_EXTRANET_NOT_CONFIGURED: 'Экстранет не настроен, напишите администратору',
};
BX.ajax.runAction('intranet.invite.getLinkByCollabId', { data: { collabId } })
.then((response) => showInviteLink(response.data))
.catch((response) => {
const error = response.errors?.[0] ?? {};
const isInviteCode = String(error.code ?? '').startsWith('COLLAB_INVITE_');
const text = hints[error.code] ?? (isInviteCode ? error.message : 'Не удалось получить ссылку');
BX.UI.Notification.Center.notify({ content: BX.Text.encode(text) });
});
Что сломается
Интеграции получат отказ там, где раньше проходили
Раньше портальная проверка выглядела так: !isOn() && !isFeatureEnabled() && !Requirement::check()->isSuccess(). Хватало одного выполненного условия, чтобы запрос прошёл. В коробке нет модуля bitrix24, поэтому CollabFeature::isFeatureEnabled() там всегда возвращает true, и условие не могло сработать. По той же причине COLLAB_INVITE_FEATURE_UNAVAILABLE коробка не увидит, это код облака.
После обновления эти три действия, в том числе вызванные из вашего кода, откажут на порталах, где коллабы выключены технически или по тарифу, где не настроен экстранет-сайт или не установлен обязательный модуль. Раньше без модуля extranet пропускалась и проверка настройки «Разрешить приглашать внешних пользователей в коллабы».
Порядок проверок тоже другой. Сначала префильтр смотрит право приглашать, потом включены ли коллабы, поэтому пользователь без прав на портале, где коллабы выключены технически или по тарифу, получит COLLAB_INVITE_ACCESS_DENIED. Запрет гостей владельцем коллабы проверяется последним.
Что закрыли
Поле приглашения intranet.invitation-input раньше вставляло серверное сообщение об ошибке в шаблон Tag.render как есть, теперь оно проходит через Text.encode. Обработчик ошибки читает response?.errors?.[0]?.message. До этого при пустом errors он падал на response.errors[0].message и до reject не доходил. Если сервер не вернул сообщения, поле покажет «Не удалось отправить приглашение, попробуйте ещё раз».
Мелочи и находки
- Фразу «Не удалось отправить приглашение...» расширение берёт из lang-файла контроллера:
config.phpвызываетIncludeModuleLangFile($path, Loc::getCurrentLang(), true), получает массив фраз и кладёт нужную вlang_additional. Так JS-расширение может взять фразу из чужого lang-файла и не дублировать ключ. - В ru-тексте
INTRANET_COLLAB_ACCESS_CONTROL_PORTAL_ACCESS_DENIEDосталась опечатка «фозможности», хотя файл в релизе правили. - Прошлые правки приглашений в коллабы, например перевыпуск ссылки только владельцем, разобраны в intranet 26.1400.0–26.1700.0.