Mobile 26.1100.0–26.1200.0: свои вкладки профиля, DeeplinkProvider и закрытый доступ к чужим сменам
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Модуль 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
|