Bizprocmobile 26.300.0: публичные ошибки и защита файловых ссылок
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Версия 26.300.0 отделяет разрешённые сообщения от внутренних AJAX-ошибок в мобильном интерфейсе бизнес-процессов. Проверка доступа к файловым ссылкам включается только при наличии ShowFileAccessService, а сторонним мобильным расширениям нужно учесть Promise-контракт WorkflowInfo.open().
Новое
Новый trait Bitrix\BizprocMobile\Trait\AddPublicErrorsTrait передаёт пользовательские ошибки через Bitrix\Mobile\Trait\PublicErrorsTrait. Его защищённый метод addErrorsAsPublic(array $errors): void сохраняет порядок ошибок и не теряет элемент с пустым сообщением. Контроллеры задач, процессов, обязательных параметров и действий с процессами помечают ожидаемые ошибки в customData.public. Перед отправкой на клиент из сообщения удаляется HTML, а <br> превращается в перевод строки. Мобильные экраны задач, деталей процесса, обязательных параметров и мастера запуска обрабатывают ответы через ajaxPublicErrorHandler. Пользователь видит только помеченный сервером текст. Для остальных ошибок обработчик показывает общее сообщение о внутренней ошибке, без исходного текста.
Перед завершением задания приложение проверяет обязательный комментарий. Проверка учитывает режимы CommentRequired: Y, YA при принятии и YR при отклонении. Пустое значение и строка 0 блокируют отправку. Поле получает ошибку и прокручивается в видимую область.
Ссылки на задание или процесс открываются через presenter. WorkflowInfo.open() принимает параметры presentation и canOpenInDefault, описанные типом WorkflowInfoProps. Если расширение не загрузилось или виджет не открылся, маршрут показывает исходную страницу портала.
BbCodeView проверяет ссылки на /bitrix/tools/bizproc_show_file.php, когда доступен ShowFileAccessService. Запрещённая или отсутствующая ссылка заменяется на /dev/null. Проверка class_exists() сохраняет прежнее поведение до установки совместимой версии модуля bizproc с этим сервисом.
Что сломается
Экспортируемый JS-метод WorkflowInfo.open() раньше возвращал undefined и подавлял ошибку openWidget(). В версии 26.300.0 он возвращает Promise, а ошибка открытия доходит до вызывающего кода. Штатные вызовы уже получили catch или переход на страницу портала. В сторонних мобильных расширениях нужно обработать rejection или ожидать вызов через await внутри try/catch.
Мелочи и находки
DatetimeField принимает стандартный формат ядра и DATE_ISO8601. Значение ISO 8601, которое раньше становилось пустым в мобильном редакторе, теперь передаётся в поле даты.
Метод WorkflowUserGridView::getTaskHash() сменил видимость с private на protected. Подклассы могут переиспользовать или переопределить формулу хеша задания. Сам расчёт проверяет структуру элемента REQUEST перед чтением Type, поэтому скалярные и другие нестандартные значения из шаблонов вне дизайнера не приводят к обращению по массивному индексу.
Список процессов передаёт в голосовой контекст экран, режим и текущий фильтр. Аватары таймлайна используют ui-system/blocks/avatar с withRedux вместо ReduxAvatar.