Rpa 26.400.0: единая проверка прав на элементы и задания
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
RPA 26.400.0 меняет серверные проверки доступа к элементам, заданиям и Pull-событиям. Обновление нужно учесть в своих контроллерах, обработчиках канбана и ссылках на создание типа: прежние допущения о правах больше не работают.
Новое
Проверяйте право на конкретное действие
UserPermissions::canViewItem() теперь учитывает сохранённых автора и переместившего элемент пользователя, администратора портала, право менять тип, явные права стадии и участие в задании, на которое этот пользователь ещё не ответил. Фильтр getFilterForViewableItems() работает по тем же правилам, поэтому список и отдельная карточка не должны расходиться по доступности.
Для более точных проверок появились canModifyItem(), canMoveItemFromStage() и canViewItemWithTaskParticipants(). Кеш заданий, на которые пользователь ещё не ответил, сбрасывает clearIncompleteTaskCache(). Код отказа в просмотре вынесен в Command::ERROR_CODE_ITEM_VIEW_PERMISSION.
Защищённые точки расширения разделены по назначению:
Command\Update::{hasChangedUserFields,getChangedUserFieldNames}()проверяет изменённые пользовательские поля;Components\ItemDetail::isReadOnly()определяет режим карточки;Controller\Item::{getViewAccessDeniedError,getUpdateWithoutViewAccessError}()готовит ошибки доступа;Controller\Task::{prepareDoResult,getItemController}()готовит результат ответа на задание и контроллер элемента.
Сверяйте задания с элементом
TaskManager::getUserIncompleteTaskItemIds() возвращает элементы типа, где у пользователя есть задание с USER_STATUS=Waiting. getItemIncompleteParticipantIds() выбирает такие же строки CBPTaskService и извлекает USER_ID участников, которые ещё не ответили на задание элемента. После ответа контроллер очищает кеш заданий, на которые этот пользователь ещё не ответил. Если доступ тут же пропал, ответ больше не содержит элемент и запись таймлайна. Текстовый комментарий теперь можно добавить, если пользователь видит тип и элемент. Новое вложение требует права менять элемент; без него при обновлении комментария можно сохранить только уже прикреплённые файлы.
Обновите Pull-обработчики и канбан
PullManager::rememberItemViewers() сохраняет получателей до записи элемента. sendItemSortedEvent() отправляет изменение пользовательской сортировки с previousItemId, после чего клиент ставит карточку за указанным элементом. У sendKanbanEvent() появился необязательный четвёртый параметр ?array $itemUserIds. В заголовке колонки канбана добавлена кнопка настроек. URL редактора стадии получает typeId через новый параметр UrlManager::getStageDetailUrl(), а слайдер открывается шириной 702 px.
Настройте стадию в новой форме
Редактор стадии группирует настройки, скрывает код стадии и показывает селектор изменения даже для первой стадии. При создании стадии список полей берётся из типа. Названия стадий и сообщения об ошибках теперь экранируются.
Что сломается
canEditItemOnAnyStage() теперь всегда возвращает false.
Доступ через предыдущую стадию удалён. После перемещения карточка может исчезнуть у пользователя прежней стадии и появиться у пользователя, который её переместил, либо у участника, который ещё не ответил на задание. Право создания больше не разрешает всем менять элементы первой стадии. Для своего элемента это право остаётся у автора; для остальных нужна возможность менять сохранённую стадию.
Controller\Item::updateAction() сначала требует просмотр элемента. При отказе поля не применяются, загруженные файлы удаляются, а запрос получает RPA_ITEM_VIEW_ACCESS_DENIED, RPA_ITEM_MOVE_ACCESS_DENIED либо RPA_ITEM_MODIFY_ACCESS_DENIED. Карточка без canModifyItem() открывается read-only, а форма перемещения отдельно проверяет исходную сохранённую стадию.
Компонент rpa.task больше не открывает задание только по известному ID. Пользователь должен входить в TASK['USERS'] либо видеть связанный элемент; задания других модулей отбрасываются. rpa.task.fields сверяет задание с текущим элементом и принимает участника, только пока этот пользователь ещё не ответил на задание. Просмотр сценария бизнес-процесса через ViewWorkflow теперь требует canModifyType() именно у переданного пользователя. Ветка CreateAutomation тоже проверяет права переданного $userId; раньше она использовала текущего пользователя.
Pull-события элемента и таймлайна уходят только подписчикам с правом просмотра. Потерявший доступ получает удаление карточки без её данных. У событий через sendItemEvent() только поля createdTime, updatedTime и movedTime форматируются отдельно для часового пояса каждого получателя. События таймлайна, сортировки и прямого удаления обходят это форматирование.
AJAX-даты теперь формируются через DateTime::toString().
Пользовательские ссылки на создание типа RPA в iframe должны передавать валидный sessid. Manager::openTypeDetail(0) добавляет его сам; ссылка без токена завершится ошибкой.
Проверьте вывод пользовательских данных
URL фотографий в канбане и таймлайне теперь кодируются. Вместе с экранированием названий стадий и сообщений об ошибках это закрывает места, где пользовательские значения попадали в интерфейс без нужной обработки.