mobile 26.1200.0 Безопасность

Mobile 26.1100.0–26.1200.0: свои вкладки профиля, DeeplinkProvider и закрытый доступ к чужим сменам

1 мин чтения Устаревших API: 11
Узнавайте о ломающих изменениях Битрикса раньше, чем они доедут до прода: свежие разборы — в канале @bxmax_updates

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

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

Модуль mobile пришёл в коробочный Битрикс24 четырьмя версиями: 26.1100.0, 26.1120.0, 26.1150.0 и 26.1200.0 (предыдущие разобраны здесь). Вместе с 26.1100.0 одним пакетом приехали модули чекина stafftrack 26.300.0 и stafftrackmobile 26.300.0. В трёх местах исправлены проверки прав, поэтому обновиться стоит всем. Разработчикам мобильных расширений и интеграций с чекином придётся поправить код, а сотрудники коробочных порталов без модуля timemanmobile после 26.1200.0 не найдут в меню «Ещё» кнопок рабочего дня.

Новое

Добавьте свою вкладку в профиль сотрудника (mobile 26.1120.0)

Сервер, который собирает вкладки профиля для мобильного приложения, теперь бросает событие mobile:onProfileTabsCollect с параметрами viewerId, ownerId и tabs (уже собранные вкладки). Обработчик возвращает EventResult::SUCCESS с ключом tabs, ядро дописывает эти вкладки в конец и проверяет только строковый id. Приложение показывает вкладку, если у неё есть widget, известный ему компонент или rootWidget с именем web. Проще всего пройти этот фильтр веб-вкладкой со своей страницей, так устроена штатная вкладка живой ленты:

        <?php

declare(strict_types=1);

namespace Vendor\Orders\Internals\Integration\Mobile;

use Bitrix\Main\Event;
use Bitrix\Main\EventResult;
use Bitrix\Main\Localization\Loc;

final class ProfileTabs
{
    public static function onCollect(Event $event): EventResult
    {
        $ownerId = (int)$event->getParameter('ownerId');

        return new EventResult(EventResult::SUCCESS, ['tabs' => [[
            'id' => 'vendor_orders',
            'title' => Loc::getMessage('VENDOR_ORDERS_PROFILE_TAB'),
            'params' => [],
            'component' => [
                'name' => 'JSStackComponent',
                'componentCode' => 'vendor_orders',
                'rootWidget' => [
                    'name' => 'web',
                    'settings' => ['page' => ['url' => SITE_DIR . "mobile/orders.php?user={$ownerId}", 'preload' => false]],
                ],
            ],
        ]]]);
    }
}

    

Обработчик регистрируется через registerEventHandler() в install/index.php вашего модуля, страница orders.php тоже ваша. Пример собран по коду ядра, в приложении мы его не запускали.

Выдайте ссылку, которая открывает приложение авторизованным (mobile 26.1200.0)

Bitrix\Mobile\Public\Provider\DeeplinkProvider::getAuthLink(string $intent, ?int $userId = null, ?int $ttl = null) возвращает ссылку, которая открывает мобильный Битрикс24 на нужном разделе и входит под пользователем по одноразовому хешу. Без $userId ссылка выдаётся текущему пользователю, $ttl задаёт жизнь хеша в секундах. Коды preset_task, terminal, preset_terminal, check-in, check-in-settings, calendar_sync_slider и calendar_sync_banner приложение открывает своими экранами, остальные открываются страницей портала.

        use Bitrix\Mobile\Public\Provider\DeeplinkProvider;

// хеш живёт 15 минут
$link = (new DeeplinkProvider())->getAuthLink('check-in', $employeeId, 900);

    

Хеш в ссылке работает как пароль, так что отправляйте её лично сотруднику, а не в общий чат.

Ссылки на Вайбкод и поддержку открываются в приложении (mobile 26.1150.0)

Ссылку /vibecode/app/{id}/ приложение открывает экраном приложения из каталога Вайбкода, а если не получилось, страницей портала. Тот же маршрут ловит старые ссылки на vibecodeconnector.Catalog.openAppPage с catalogItemId, которые лежат в кнопках клавиатуры чата. Такую ссылку можно класть в сообщения бота и уведомления.

Для ссылки /support/, пришедшей извне, приложение само запрашивает бота через mobile.Support.getBotId. В ответе действия появилось поле isSupportActive. При false или пустом боте пользователь видит тост «Чат с поддержкой недоступен».

Включайте фичу по отделам (stafftrack и stafftrackmobile 26.300.0)

Новый чекин можно включить на всю компанию или только на список отделов с подотделами. В stafftrack для этого есть Feature::turnCheckInRolloutOn()/Off(), setCheckInRolloutDepartments() и isCheckInRolloutEnabled(int $userId). Все они работают через Bitrix\StaffTrack\Public\Services\DepartmentFeatureToggle, который хранит флаг компании и JSON со списком ID узлов структуры humanresources в опциях любого модуля, разворачивает поддерево и кеширует его на час. Подойдёт и для поэтапного запуска своей фичи:

        <?php

declare(strict_types=1);

use Bitrix\Main\Engine\CurrentUser;
use Bitrix\Main\Loader;
use Bitrix\StaffTrack\Public\Services\DepartmentFeatureToggle;

Loader::requireModule('stafftrack');

$toggle = new DepartmentFeatureToggle();
// узлы 12 и 40 структуры humanresources (не ID из UF_DEPARTMENT) вместе с подотделами
$toggle->setEnabledDepartments('vendor.orders', 'new_board_departments', [12, 40]);

$enabled = $toggle->isEnabledForUser(
    (int)CurrentUser::get()->getId(),
    'vendor.orders',
    'new_board_company',
    'new_board_departments',
);

    

В приложении новый чекин показывает маршрут и таймлайн со стоянками, а автоматические чекины уходят на сервер пачками через stafftrackmobile.v2.CheckIn.batchAdd, до 100 за вызов. Второй движок карты отметок, MapLibre GL, мы разбирали в location 26.400.0.

Остальное новое в mobile работает только в облаке или спрятано за выключенными фича-флагами: плашка тарифа с демо подписки, карточка интегратора, специалисты по внедрению, «Битрикс.Ответы», «Покупки и счета» (26.1100.0, 26.1200.0).

Обновитесь ради прав доступа

Чужие смены закрыты (stafftrack 26.300.0)

Правило просмотра смен было заглушкой и пропускало всех. Теперь смену видят администратор, её владелец и коллеги по общему отделу. stafftrack.Shift.list для не-админа без фильтра по сотруднику отдаёт только свои смены, а недоступные ID из фильтра молча отбрасывает. Если ваши отчёты строятся на stafftrack.Shift.get и Shift.list, по сотрудникам других отделов данных станет меньше.

Мобильному чекину вернули CSRF (stafftrackmobile 26.300.0)

Атрибуты-фильтры модуля (#[IntranetOnly], #[NewCheckInEnabled], #[CheckInToolEnabled], #[AutoCheckInEnabled]) были объявлены с типом FilterType::Prefilter. Атрибут такого типа задаёт ключ prefilters в конфигурации действия, и контроллер уже не берёт getDefaultPreFilters(). В 26.300.0 тип сменили на EnablePrefilter, и действиям stafftrackmobile.v2.CheckIn.* вернулись Authentication и Csrf. Контроллер CheckIn к тому же теперь наследует Base модуля, поэтому принимает только POST и не вызывается через REST.

Ту же ошибку легко повторить в своём модуле. EnablePrefilter дописывает фильтр к стандартным, Prefilter заменяет их целиком:

        <?php

declare(strict_types=1);

namespace Vendor\Orders\Infrastructure\Controller\Attribute;

use Attribute;
use Bitrix\Main\Engine\ActionFilter\Attribute\FilterAttributeInterface;
use Bitrix\Main\Engine\ActionFilter\FilterType;
use Vendor\Orders\Infrastructure\Controller\Filter\ManagerOnlyFilter;

#[Attribute(Attribute::TARGET_METHOD)]
final class ManagerOnly implements FilterAttributeInterface
{
    public function getFilters(): array
    {
        return [new ManagerOnlyFilter()];
    }

    public function getType(): FilterType
    {
        // Prefilter выкинул бы Authentication и Csrf из списка фильтров действия
        return FilterType::EnablePrefilter;
    }
}

    

Лента не отдаёт получателей без доступа к записи (mobile 26.1200.0)

Действие get_more_destination компонента mobile.socialnetwork.log.entry отдаёт список получателей записи живой ленты, только если пользователь может эту запись читать. Для записей CRM вместо прав ленты проверяются права CRM. В старых компонентах mobile.crm.entity.list и mobile.crm.product.list экранируются параметры страницы, которые попадают в разметку.

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

Кнопки рабочего дня пропали из меню «Ещё» (mobile 26.1200.0)

Шапка меню «Ещё» вместо своего блока рабочего дня рисует WorkdayPanel из timeman:layout/workday-panel. Это расширение модуля timemanmobile, а в нашем эталоне коробки его нет, поэтому кнопок «Начать» и «Завершить» рабочий день в меню больше нет. Предупредите сотрудников, которые отмечают день с телефона.

Из ответа mobile.Menu.getMenu ушли поля workTime и restrictions.canManageWorkTimeOnMobile, а canUseTimeMan() теперь требует включённого инструмента «Учёт рабочего времени». Что поменялось в самом timeman, смотрите в разборе timeman 26.300.0.

Проверьте код вокруг чекина (stafftrack и stafftrackmobile 26.300.0)

  • CheckInProvider::getInstance() удалён, пишите new CheckInProvider().
  • stafftrackmobile.v2.Feature.isNewCheckInFeatureEnabled возвращает false или массив {isEnabled: true, isCheckInRolloutEnabled: bool}. Строгое сравнение ответа с true перестанет срабатывать.
  • Feature::isWesternPortal() из stafftrackmobile удалён, тот же список зон остался в Bitrix\StaffTrack\Feature::isWesternPortal(). Ключ isWesternPortal в ответе v2.CheckIn.getMapData остался и теперь равен StaffTrack\Feature::isGeoRetentionLimited().
  • stafftrack.Shift.*, stafftrack.DepartmentStatistics.* и stafftrack.UserLinkStatistics.* возвращают ошибку с кодом 403, когда включён новый чекин. Теперь его включает одна опция stafftrackmobile, прежние условия про bizproc и AI-агентов сняты.
  • CheckInNormalizer отдаёт latitude/longitude = null вместо 0.0, точки без координат выпали из route и checkIns.
  • Только POST принимают stafftrack.Feature.turnCheckInSettingOn/Off, turnCheckInGeoOn/Off, createDepartmentHeadChat, а также stafftrack.CheckInOnboarding.registerShown и enableAll.

Геоданные чекинов старше трёх месяцев удаляются (stafftrack 26.300.0)

Новый агент ClearCheckInGeoAgent раз в сутки берёт данные старше трёх месяцев. Он стирает координаты и адрес в b_stafftrack_check_in и гео в b_stafftrack_check_in_by_day, безвозвратно удаляет сообщения чатов с чекинами и файлы статических карт. Работает агент там, где регион лицензии не входит в список ru, by, kz, uz, kg, am, az, ge, ua, in, cn, tr, sc, tc, hi, ur. Тип портала агент не проверяет, так что под очистку попадёт и коробка с лицензией региона вне списка, например br. Российской коробки это не касается. Если геоданные чекинов нужны для отчётности, выгрузите их до обновления.

Поправьте мобильные расширения (mobile 26.1100.0, 26.1200.0)

  • Удалено JN-расширение intent (26.1200.0): объекта Intent с addHandler() и execute() и события onIntentHandle больше нет. Разбор intent-кодов переехал в intent/registry и запускается при старте приложения.
  • layout/ui/plan-restriction/demo-activation-success заменён на demo-activation/success (26.1100.0).
  • Иконка Icon.ADD_TASK переименована в Icon.LIST_TASKS_ADD, файл add_task.svg в list_tasks_add.svg (26.1100.0).
  • Классы флагов Bitrix\Mobile\Feature\AudioPlayerV2Feature и OnboardingPushFeature удалены (26.1200.0). Замены Bitrix\ImMobile\Public\Feature\AudioPlayerV2Flag (в immobile 26.1000.0 нашего эталона этого класса ещё нет) и Bitrix\Mobile\Public\Feature\OnboardingPushFlag проверяются через Bitrix\Main\Config\Feature::isEnabled(). Со старым классом Bitrix\Mobile\Config\Feature::isEnabled() вернёт «выключено», а new AudioPlayerV2Feature() упадёт.

Deprecated

  • Bitrix\Mobile\Deeplink (26.1200.0). getAuthLink() теперь только проксирует вызов в DeeplinkProvider::getAuthLink(), переходите на провайдер.
  • Bitrix\Mobile\Dto\Dto (26.1100.0). Пометка написана с опечаткой, @deprected, поэтому поиск по @deprecated её не найдёт. Замена — обычные readonly-классы.
  • JS (26.1100.0): inAppUrl.register(pattern, handler) заменяется на inAppUrl.addRoute(pattern).handler(fn).name(...), флаг deeplink: true в контексте открытия — на context.presentation (Presentation.MODAL).

Мелочи и находки

  • Неизвестный класс флага Bitrix\Main\Config\Feature считает включённым, а Bitrix\Mobile\Config\Feature выключенным. В 26.1200.0 на механизм main переехали OnboardingPushFlag и AudioPlayerV2Flag, остальные флаги mobile, включая новые, проверяются через Bitrix\Mobile\Config\Feature. Перед проверкой флага чужого модуля проверяйте class_exists(), а не установку модуля. Модуль старой версии может быть установлен без нужного класса, как в нашем эталоне immobile 26.1000.0 без AudioPlayerV2Flag.

Устаревшие и удалённые API в этой версии

Символ Статус Чем заменять
Bitrix\Mobile\Deeplink::getAuthLink() Deprecated Bitrix\Mobile\Public\Provider\DeeplinkProvider::getAuthLink()
Bitrix\Mobile\Dto\Dto Deprecated readonly-классы
in-app-url inAppUrl.register() Deprecated inAppUrl.addRoute()
Bitrix\StaffTrack\Public\Provider\CheckInProvider::getInstance() Удалено new CheckInProvider()
Bitrix\StaffTrackMobile\Infrastructure\Controllers\Feature::isWesternPortal() Удалено Bitrix\StaffTrack\Feature::isWesternPortal()
Bitrix\StaffTrack\Public\Provider\CheckInOnboardingProvider::isPlanningServiceEnabled() Удалено —
Bitrix\StaffTrack\Public\Provider\CheckInOnboardingProvider::isWithinNewPortalDelay() Удалено —
Bitrix\Mobile\Feature\AudioPlayerV2Feature Удалено Bitrix\ImMobile\Public\Feature\AudioPlayerV2Flag
Bitrix\Mobile\Feature\OnboardingPushFeature Удалено Bitrix\Mobile\Public\Feature\OnboardingPushFlag
assets/icons Icon.ADD_TASK Удалено Icon.LIST_TASKS_ADD
layout/ui/plan-restriction/demo-activation-success Удалено demo-activation/success

Новая версия вышла — разбор уже в Telegram

В канале @bxmax_updates публикуем каждый свежий разбор: что сломается, что устарело и что появилось в API. Узнаете до того, как обновите прод.

Подписаться

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

mobile 26.1050.0 Заметное Свежее

Mobile 26.1000.0–26.1050.0: Мобильный Маркет и личный кабинет за опциями, push/listener ловит пуш при холодном старте

Модуль mobile пришёл в коробочный Битрикс24 сразу двумя версиями, 26.1000.0 и 26.1050.0 (прошлую, 26.975.0, мы [разбирали отдельно](/bitrix-updates/mobile/mobile-26-975-0)). Почти всё новое лежит в 26.1000.0: Мобильный Маркет и личный кабинет сотрудника (оба выключены опциями) и JS-модуль `push/list…

2 мин
mobile 26.975.0 Рутинное Свежее

Mobile 26.975.0: вайбкод-приложения открываются в нативном PersistentScreen, если клиент его поддерживает

Mobile 26.975.0 вышел в коробку 11 сентября 2026 года (по официальному каналу «Битрикс24 changelog»). Он правит мобильный JS каталога вайбкод-приложений и расширения `feature`, а в `deps.php` каталога добавляет зависимость от `feature`. PHP-классы и БД не затронуты. `openInApp(url, options)` из `vib…

1 мин
socialnetwork 26.200.0 Безопасность Свежее

Socialnetwork 26.200.0: XSS в заявках и списке участников, копирование проекта по праву редактирования и курсор в log.blogpost.get

Socialnetwork 26.200.0 закрывает XSS в списке участников проекта и в заявках в группы, подмену ссылок через название группы и утечку задач в контекст AI. Копировать проект теперь можно только с правом на редактирование. Администраторам, у которых стояли 26.100.0 или 26.150.0, стоит проверить права с…

2 мин
sign 26.800.0 Безопасность Свежее

Sign 26.800.0: закрыли доступ к чужим документам, к приглашению на подпись можно дописать текст

Sign 26.800.0 для коробочного Битрикс24 закрывает несколько дыр в проверке прав: часть AJAX-экшенов модуля не проверяла, есть ли у пользователя доступ к конкретному документу, группе или участнику. Если на портале подписывают документы, с сотрудниками или с клиентами, обновляйтесь. Из нового — текст…

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

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

на связи

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

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

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

Войти