Sign 26.800.0: закрыли доступ к чужим документам, к приглашению на подпись можно дописать текст
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Sign 26.800.0 для коробочного Битрикс24 закрывает несколько дыр в проверке прав: часть AJAX-экшенов модуля не проверяла, есть ли у пользователя доступ к конкретному документу, группе или участнику. Если на портале подписывают документы, с сотрудниками или с клиентами, обновляйтесь. Из нового — текст отправителя в приглашении, пакетная загрузка до 30 файлов и модификаторы плейсхолдеров.
Новое
Допишите сотруднику пару слов к приглашению
К приглашению на подпись можно приложить свой текст до 2000 символов. Сотрудник увидит его отдельным блоком «Сообщение по документу» под стандартной фразой, и в карточке чата, и в тексте приглашения. Текст задаётся в мастере отправки, а ещё:
- в REST
sign.b2e.document.sendполемfields.message; - в роботе «Подписать документ с сотрудником», в новом свойстве «Сообщение по документу». Переменные бизнес-процесса в нём работают, лимит в 2000 символов проверяется после подстановки;
- для группы документов: один текст пишется сразу во все документы пачки. Если хоть один из них недоступен или уже ушёл на подпись, текст не сохранится ни в одном.
Текст можно менять, пока документ в статусе new или uploaded, то есть до отправки. Перед показом сервер обезвреживает разметку: упоминания, BB-коды и Markdown из текста не сработают, ссылки http(s) останутся ссылками. Для этого внутрь разметки вставляются невидимые символы U+200B и U+FEFF.
Функция включена во всех регионах, кроме by. Выключить её можно опцией модуля:
<?php declare(strict_types=1);
use Bitrix\Main\Loader;
use Bitrix\Sign\Config\Feature;
Loader::requireModule('sign');
$feature = Feature::instance();
$feature->disableOption(Feature::SIGN_DOCUMENT_MESSAGE_ENABLED_OPTION);
var_dump($feature->isDocumentMessageEnabled()); // bool(false)
Когда функция выключена, REST пропускает fields.message как неизвестный ключ.
Сама карточка приглашения в чате теперь гаснет, когда участник закончил свою часть или документ остановлен либо завершён. Карточки, отправленные до обновления, так и останутся активными.
Загружайте документы пачкой
В мастере кадрового документа появилась загрузка до 30 файлов за раз, всего до 200 МБ. На каждый файл создаётся отдельный документ, и все они попадают в одну группу. Опция is_multi_document_loading_enabled теперь по умолчанию 'Y', поэтому кнопка появится везде, где включена групповая отправка, кроме режима шаблонов. Чтобы её убрать, поставьте опции 'N'. Предел объёма пачки задаёт опция max_upload_batch_total_size_kb.
Бланки уходят в сервис подписи в фоне, цепочкой агентов, и за один запуск агентов на весь портал отправляется один бланк. Пачке из 30 файлов нужно 30 запусков, и пока бланк документа не отправлен, документ стоит в статусе new.
Удаляйте поля и собирайте коды с модификаторами
В панели плейсхолдеров можно удалить поле профиля сотрудника или дополнительное поле участника. Удаляется само пользовательское поле через CUserTypeEntity::Delete(), вместе со значениями у всех сотрудников, так что проверьте, у каких ролей есть права на удаление полей. Стандартные поля юрданных удалить нельзя.
Панель хранит 20 последних скопированных кодов каждого пользователя. К коду поля добавились модификаторы: параметры пишутся после тильды и перечисляются через запятую.
{КОД_ПОЛЯ~Case=1} ФИО в дательном падеже (только регион ru)
{КОД_ПОЛЯ~j F Y} дата с месяцем словом
{КОД_ПОЛЯ~format=National} телефон в национальном формате
{КОД_ПОЛЯ~Case=1,letterCase=upper} дательный падеж заглавными буквами
Модификаторы разбиты на семь групп, от падежа и формата ФИО до адреса и регистра букв. Код собирает сама панель, руками его писать не обязательно.
Что закрыли
- Сохранение подписи и печати компании и обновление номера документа принимали ID любого документа. Теперь проверяется право на редактирование именно этого документа.
- Стадию участника отдавали по его ID без проверки прав, а сейчас её получат только сам участник и те, кто может читать документ.
- Действия над участником по uid (удаление, канал связи, печать) проверяли общее право без привязки к его документу. Теперь документ находится через участника, а если не нашёлся, это отказ.
- Черновики группы документов отдавались по ID группы любому, у кого есть общее право на кадровые документы.
Что сломается
GroupService::getDraftDocumentList() удалён
Черновики группы теперь собираются из двух вызовов:
<?php declare(strict_types=1);
use Bitrix\Main\Loader;
use Bitrix\Sign\Service\Container;
Loader::requireModule('sign');
$groupService = Container::instance()->getDocumentGroupService();
$drafts = $groupService->filterDraft($groupService->getDocumentList($groupId));
У getDocumentList() появился необязательный ?int $limit, без него лимит прежний, 30 документов.
Передавайте зависимости операций по именам
В конструкторы Operation\Member\CreateMembers ($reminderType), Operation\Document\Template\CreateDocumentFromTemplate и Operation\Document\Template\Send ($inviteMessage) новые параметры вставили перед необязательными зависимостями. Если вы передавали сервисы и репозитории по позиции, они уедут в чужой параметр. С именованными аргументами этого не случится, а текст приглашения передаётся одной строкой:
<?php declare(strict_types=1);
use Bitrix\Main\Loader;
use Bitrix\Sign\Operation\Document\Template\Send;
use Bitrix\Sign\Service\Container;
Loader::requireModule('sign');
$template = Container::instance()->getDocumentTemplateRepository()->getById($templateId);
if ($template !== null) {
$result = (new Send(
template: $template,
responsibleUserId: $responsibleId,
inviteMessage: 'Подпишите до пятницы, вопросы задавайте в отделе кадров',
))->launch();
}
Групповые экшены отказывают целиком
sign.api_v1.b2e.document.group.configure, getFillAndStartProgress и documentList теперь проверяют каждый документ группы. Один недоступный документ даёт отказ на всю группу (HTTP 401, код ошибки invalid_authentication). Тот же ответ придёт, если в группе больше 30 документов или группа пустая и чужая. Раньше configure и getFillAndStartProgress пропускали недоступные документы и работали с остальными.
getFillAndStartProgress для пустой группы возвращает ошибку NOTHING_TO_PROCESS вместо completed: true. attach работает, только если и группа, и документ созданы текущим пользователем. sign.api_v1.document.member.loadStage отвечает тем же отказом с invalid_authentication, если участник не найден или прав на него нет. Раньше для несуществующего участника он отдавал пустой массив. Если ваш интерфейс построен на этих экшенах, научите его показывать отказ.
БД
В b_sign_document появилась колонка INVITE_MESSAGE (text, nullable). ORM-поле кодирует эмодзи через Emoji::encode(), чтобы они пережили соединение в utf8mb3. Прямым SQL вы увидите их в виде :f09f918d:, а через Bitrix\Sign\Internal\DocumentTable получите обычный текст.
Мелочи и находки
- Частота напоминаний больше не сбрасывается, когда мастер пересоздаёт стороны документа. В копиях шаблонов, где подписанты заданы только отделами, она тоже сохраняется.
- Сохранение и удаление ролей в настройках прав ждёт блокировку до 3 секунд, а если так её и не получило, бросает
SqlQueryException.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
Bitrix\Sign\Service\Sign\Document\GroupService::getDraftDocumentList()
|
Удалено |
Bitrix\Sign\Service\Sign\Document\GroupService::filterDraft()
|