Intranet 26.1400.0–26.1700.0: закрыты дыры в приглашениях и чатах групп, удалены intranet.backup и intranet.configs
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
В коробочный Битрикс24 подряд вышли пять версий intranet: 26.1400.0, 26.1475.0, 26.1500.0, 26.1600.0 и 26.1700.0. Администратору стоит обновиться ради безопасности: закрыты подстановка кода в строки агентов, доступ к чужим чатам рабочих групп, приглашение в чужие отделы и обход проверки прав в sharepoint.link, а SSRF в нём сужен. Разработчику перед обновлением надо проверить кастомные шаблоны и код вокруг Entity\User, потому что два компонента удалены, конструктор сменился, а картинки модуля переехали из PNG в WebP.
Новое
Добавьте свои правила слайдеров без правки шаблона (26.1500.0)
Расширение intranet.sidepanel.bindings хранит правила, какие ссылки портала открываются в боковом слайдере. В 26.1500.0 у него появилось событие intranet:onCollectSidePanelBindings. Обработчик вызывает addExtension(), и ваше JS-расширение попадает в зависимости bindings и грузится вместе с ним. В модулях Битрикс24 на событие пока никто не подписан.
<?php declare(strict_types=1);
use Bitrix\Intranet\Public\Event\OnCollectSidePanelBindingsEvent;
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
'intranet',
'onCollectSidePanelBindings',
static function (OnCollectSidePanelBindingsEvent $event): void {
$event->addExtension('vendor.sidepanel-rules');
},
);
Само расширение лежит в /local/js/vendor/sidepanel-rules/ с обычным config.php, правила слайдера описывайте в нём.
Ловите первый вход сотрудника в коробке (26.1500.0)
Событие intranet:onUserFirstInitialization с параметрами userId и invitationFields было и раньше. С 26.1500.0 коробка запускает инициализацию ещё и при первой авторизации, если у пользователя пустой LAST_LOGIN, и заодно ставит новичку задачи по шаблонам «для новых сотрудников». До этого задачи получали только в облаке. Ошибки инициализации, в том числе исключение из вашего обработчика, теперь пишутся в лог исключений (exception_handling) с текстом «User initialization failed for user ...». Раньше \Exception из обработчика молча терялся, а \Error всплывал.
<?php declare(strict_types=1);
use Bitrix\Main\Event;
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
'intranet',
'onUserFirstInitialization',
static function (Event $event): void {
$userId = (int)$event->getParameter('userId');
// выдать доступы, назначить наставника
},
);
Ограничьте выбор отделов поддеревом (26.1600.0)
Провайдер department в entity-selector принимает опцию allowedDepartmentIds. В диалоге остаются только эти отделы и их потомки. Опции приходят с клиента, поэтому это фильтр интерфейса, права на сервере проверяйте отдельно.
const dialog = new BX.UI.EntitySelector.Dialog({
targetNode: button,
entities: [{
id: 'department',
options: { allowedDepartmentIds: [12, 40] },
}],
});
Настройте 2FA под свою почту и сотрудников без смартфона (26.1600.0)
Адрес From для писем с кодами 2FA хранится в опции intranet:otp_email_from. Пустую опцию модуль заполняет сам адресом из шаблона письма USER_OTP_EMAIL_CONFIRM или адресом сайта по умолчанию. Поле «Email отправителя кодов двухфакторной аутентификации» в настройках безопасности по умолчанию скрыто и появляется, только если опция intranet:allow_show_change_2fa_email_send равна Y. Модуль кладёт этот адрес в поле OTP_EMAIL_FROM из обработчика OnBeforeEventAdd, а шаблоны писем используют макрос #OTP_EMAIL_FROM#. Тот же приём подойдёт для ваших почтовых событий. Переключатель «Разрешить подтверждение входа без мобильного приложения» включён по умолчанию. С ним сотрудник подключает push-2FA, подтвердив телефон по SMS или почту, без привязки смартфона. Когда кто-то выключает обязательную 2FA, портал просит подтверждения, а потом показывает в настройках, кто и когда это сделал.
Что заметят пользователи
- Ссылки на папки Диска
/folder/<код>и отдельные права по умолчанию для них (26.1475.0), подробнее в разборе disk 26.1200.0. - Страница прав бизнес-процессов
/bizproc/permissions/в разделе автоматизации, если включён новый дизайнер (26.1400.0). - Пресет «Системные пользователи» в списке сотрудников. Мастер увольнения системного пользователя может заодно отключить его REST-интеграции (26.1400.0).
- В облаке появилось удаление собственного профиля (26.1400.0).
Что сломается
Найдите вызовы удалённых компонентов (26.1400.0, 26.1600.0)
В 26.1400.0 удалён bitrix:intranet.backup, в 26.1600.0 bitrix:intranet.configs вместе с классом IntranetConfigsComponent. Если брали у него processOldAccessCodes(), переходите на Bitrix\Intranet\Settings\CommunicationSettings::processOldAccessCodes(). Из шаблона Air пропал AirTemplate::isRightPanelExpanded() (26.1400.0).
Проверьте код вокруг Entity\User (26.1400.0, 26.1700.0)
В 26.1400.0 в конструктор Bitrix\Intranet\Entity\User после personalMobile вставлен ?string $personalGender. При позиционном вызове съедут workPosition, password и всё, что за ними, именованные аргументы работают как прежде. Интерфейс Contract\Repository\UserRepository получил пять методов (findRealUsersByIds, findSystemUsersByFilter и другие), и своя реализация перестанет ему соответствовать. В 26.1700.0 в Enum\UserRole добавился SYSTEM_USER = 'rest_system', и исчерпывающий match без default теперь упадёт с UnhandledMatchError.
Обновите AJAX-вызовы (26.1400.0, 26.1600.0)
В 26.1400.0 moveToIntranetAction компонента bitrix:intranet.user.profile стал ждать массив departmentIds вместо departmentId, а intranet.v2.Otp.logoutAll принимает только POST и возвращает networkLogoutUrl. В 26.1600.0 intranet.invite.register стал пропускать только EMAIL, PHONE, PHONE_COUNTRY, DEPARTMENT_ID, MESSAGE_TEXT и CONTEXT, остальные поля из своих форм приглашения он молча отбросит.
Поправьте ссылки на картинки (26.1400.0)
225 PNG модуля заменены на WebP, среди них картинки intranet.ustat, баннеры и шаблоны bitrix24 и login. Из /bitrix/js/intranet/, /bitrix/components/bitrix/intranet.*, /bitrix/images/intranet/ и /bitrix/templates/ старые файлы удалены, и кастомный CSS со ссылкой на такой .png получит 404. В публичной папке /images/ PNG остались, WebP легли рядом.
Проверьте /timeman/ при выключенном учёте времени (26.1500.0)
Если в настройках инструментов выключен «Учёт рабочего времени», страницы /timeman/ показывают заглушку, а блок учёта времени в шаблоне и связанные сервисы отключаются. В коробке раньше при установленном timeman страницы открывались несмотря на выключатель. В облаке выключение больше не удаляет модули timeman и timemanmobile.
Что закрыли
- 26.1400.0.
sharepoint.linkпроверяет адрес сервера SharePoint с таймаутами и без чтения ответа, в облаке запрещены приватные IP. Режимtestбольше не обходит проверку доступа к инфоблоку. - 26.1400.0. Строка агента выполняется как PHP, поэтому параметры в агентах напоминаний календаря,
CIntranetEventHandlers::DeleteLogEntryи отсутствий теперь приводятся к числу или экранируются. ЗаголовокHostпри сборке ссылок календаря проверяется. - 26.1400.0. Перевыпустить ссылку-приглашение в коллабу может только её владелец и только POST-запросом. Пункт приложения в левом меню видят только те, у кого есть доступ к его встройке.
- 26.1500.0. Чат рабочей группы через
intranet.controlbuttonполучают участники и те, кто может редактировать группу. Чат события календаря достаётся только участникам события. - 26.1600.0. Отделы в
intranet.invite.registerурезаются до тех, куда приглашающий вправе звать. Отключить или отложить 2FA можно только на период из списка (1–10 дней), бессрочно разрешено лишь с правомsecurity_edit_user_otp, интегратор свою 2FA не отключит. - 26.1700.0. Секрет ссылки саморегистрации меняет только администратор.
Мелочи и находки
- Первая страница портала вида
/company/personal/user/<id>/tasks/теперь хранится с#USER_ID#, и каждый попадает в свои задачи (26.1700.0). Public\Provider\Otp\DayListProvider::getList()отдаёт пункт «бессрочно» только при переданном$targetUserи правеsecurity_edit_user_otp(26.1600.0).Integration\Tasks::createDemoTasksForUser()возвращаетResultвместоvoid(26.1500.0).
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
bitrix:intranet.backup
|
Удалено | — |
bitrix:intranet.configs
|
Удалено | — |
IntranetConfigsComponent::processOldAccessCodes()
|
Удалено |
Bitrix\Intranet\Settings\CommunicationSettings::processOldAccessCodes()
|
Bitrix\Intranet\Integration\Templates\Air\AirTemplate::isRightPanelExpanded()
|
Удалено | — |