im · im 26.700.0 Безопасность

im 26.700.0: гостевой доступ переписан с нуля — REST-метод joinByCode удалён

4 мин чтения

Обновление безопасности

Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.

Вход гостя в чат по ссылке перестал быть «REST-методом плюс правилом в urlrewrite» и стал полноценной областью авторизации на уровне ядра. Заодно у гостевых ссылок появился срок жизни, а у неактивных гостей — агент очистки. Если вы что-то строили поверх гостевых чатов, этот релиз ломающий.

Что было и что стало

Раньше схема выглядела так: установщик модуля прописывал в urlrewrite правило /guest/{code}/guest/index.php, ставил шаблон im_guest и права на каталог, а вход выполнялся REST-методом im.v2.Guest.joinByCode.

Теперь:

  • REST-метод joinByCode удалён, вместо него im.v2.Guest.checkSessioncheckSessionAction(string $code, ?Token $token = null). Разница принципиальная: раньше вызов по коду создавал гостя, теперь проверяется существующая сессия.
  • Появилась страница Guest\Controller\Page::viewAction(string $code) со своим шаблоном.
  • Установщик больше не трогает urlrewrite, шаблон im_guest и права на /guest/. В коде оставлен комментарий: при установленном intranet маршрут /guest/ здесь больше не описывается. Из im.router/class.php снята обработка GUEST_PATH.

GuestApplication: гостя заперли в собственной области

Ключевое — новый Guest\Auth\GuestApplication (приложение авторизации main, ID im_guest), подписанный на onApplicationsBuildList и onApplicationScopeError. Он ограничивает сессию гостя списком физических скриптов: /guest/, /bitrix/routing_index.php, /rest/, /bitrix/services/main/ajax.php и ещё несколько служебных. Всё, что вне списка, приводит к main:onApplicationScopeError, а пролог отвечает 403.

Зачем понадобилось отдельное приложение, объясняет комментарий в самом классе: архитектурно это копия Intranet\PublicApplication, но со своей областью — чтобы более широкий public-список (лайвчат, видеоконференции, платёжные коллбэки) не протекал на гостей. То есть до этого гость, вошедший по ссылке в чат, жил в общей публичной области с доступом к сценариям, к которым его не звали.

Там же — поучительная деталь про сопровождение таких списков. В allowlist явно внесены /bitrix/tools/conversion/ и /bitrix/tools/public_session.php, потому что шаблон Битрикс24 сам дёргает их сразу после загрузки гостевой страницы (счётчик и продление сессии). Без этого проверка области падала на хите счётчика, срабатывал Logout() с regenerateId(), гостевая сессия умирала посреди пачки AJAX-запросов, и наружу это выглядело как плавающие 401/500 и «Could not start session by PHP».

Ссылки с истечением и уборка гостей

  • SharingLink\Dto\CreateDto::initForGuestChat* и GuestInviteService::inviteByEmail() / inviteByPhone() получили опциональный ?DateTime $dateExpire = null. Гостевая ссылка теперь может протухать.
  • CleanupService::cleanInactiveGuestsAgent() — агент с интервалом 60 секунд, чистит неактивных гостей пачками и сам подстраивает период по тому, был ли батч полным.
  • AuthorizationService научился invalidateGuestUser(), terminate(), setInviteCode(); появился pull-событие Guest\Pull\UserLogout.

Общая мысль релиза: гостевая учётка перестала быть вечной.

Что сломается

  • im.v2.Guest.joinByCode — метода нет. Внешние интеграции, которые им пользовались, встанут.
  • CopilotTitle::sendPush()sendPush(Chat $chat), аргумент обязательный.
  • GuestLinkService::getOrCreateLink(Chat $chat, int $authorId, bool $withMessage = true) — параметр $withMessage удалён.
  • Features::__construct — в конец добавлен bool $isCopilotDraftChatAvailable. Позиционная сборка Features ломается.
  • Установка модуля больше не создаёт правило urlrewrite для /guest/. Если вы полагались на него в своих маршрутах — проверьте.

Совместимо: Features::isChatWithGuestsAvailable(?int $inviterId = null), CopilotChat::sendBanner() (?bool $isUpdatebool $isUpdate = false), новые поля manageMessagesAutoDelete и manageGuestInvites в ChatCreateFields.

Черновик чата с Копилотом

Отдельная небольшая история: Chat\Copilot\DraftChatService, экшен Controller\Copilot\DraftChat::getAction и методы CopilotChat::isDraftChat(), activateDraftChat(), activateDraftIfNeeded().

Логика — чат заводится как черновик и активируется только при первом реальном сообщении. Пользователь открыл Копилота, передумал и закрыл — в списке чатов ничего не осталось. Без этого каждое открытие плодило бы пустой чат.

Что делать

  1. Найдите в интеграциях im.v2.Guest.joinByCode — переезжать на checkSession.
  2. Проверьте позиционные вызовы Features, sendPush, getOrCreateLink.
  3. Если у вас свой шаблон или права на /guest/ — они больше не ставятся установщиком.
  4. Учтите срок жизни гостевых ссылок при выдаче: теперь их можно (и стоит) ограничивать.

Читайте дальше

im 26.800.0 Заметное Свежее

im 26.800.0 + socialnetwork 26.100.0: чаты крепятся к проекту, markdown в сообщениях, учёт входов по ссылке

Большой парный релиз: `im` и `socialnetwork` едут одним батчем, потому что делают одну вещь — сращивают чаты с проектами. Чат теперь можно прикрепить к проекту как дочерний, лента знает о своих IM-сообщениях, а прочтение в одном месте гасит счётчик в другом. Плюс markdown и учёт участников шаринг-сс...

5 мин
bizprocdesigner 26.500.0 Заметное Свежее

bizprocdesigner 26.500.0: фильтр ноды приехал выключенным

Крупный UI-релиз редактора схем плюс новый тип конструкции — фильтр ноды. Ломающих изменений нет: все правки контроллера и DTO совместимы со старыми вызовами. Главное, что стоит знать заранее: фича спрятана за опцией и по умолчанию выключена.

3 мин
calendar 25.195.0 Заметное Свежее

calendar 25.195.0: активность БП считает минуты встреч и перестала терять последний день

Точечный релиз вокруг одной активности бизнес-процессов — «Получить информацию из календаря». Она научилась отдавать списки заголовков и суммарные минуты встреч, а заодно у неё поправили границу выборки. Публичного PHP API релиз не меняет.

3 мин
calendar 25.197.0 Заметное Свежее

calendar 25.197.0: тип события call_sync и чат, который создаётся сам

У события календаря появился собственный тип, и первый его пользователь — синхронизированные созвоны: при создании такого события автоматически поднимается чат с гостевой ссылкой. Ломающих изменений нет, все правки сигнатур совместимы.

3 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…
Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти