Meeting 26.100.0: чужой пункт повестки больше не привязать к своей планёрке
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Meeting 26.100.0 закрывает дыру, через которую сотрудник мог добавить в повестку своей планёрки пункт из чужой и получить к нему доступ как владелец. Обновите модуль на всех порталах, где работают планёрки. Для установки нужен main 26.700.0, сигнатуры существующих методов не менялись.
Новое
Обновитесь, чтобы закрыть привязку чужих пунктов
До 26.100.0 форма редактирования планёрки meeting.edit принимала ID пункта повестки и не проверяла ни существование пункта, ни права на него. Касалось это любого сотрудника с доступом к планёркам, потому что создать свою планёрку может каждый и отдельного права на это нет. Чужой пункт попадал в его планёрку, и ему открывалась страница пункта: описание, файлы, комментарии с вложениями и список всех планёрок, где пункт обсуждали, с датами, статусами, ответственными и отчётами. Как владелец планёрки он мог ещё и переименовать пункт или переписать описание.
Теперь форма привязывает пункт, только если текущий пользователь может открыть хотя бы одну планёрку с этим пунктом в повестке. Пункты из планёрок, которые пользователь и так видит, привязываются как раньше.
Проверяйте доступ к пункту через HasRoleAccess()
Проверку вынесли в новый метод CMeetingItem::HasRoleAccess(int $ID): bool. Он повторяет правило, по которому открывается страница пункта и скачиваются его файлы: доступ есть у участника любой планёрки с этим пунктом, у руководителя участника и у администратора портала. Метод смотрит только на текущего пользователя из $GLOBALS['USER'], поэтому в агенте или CLI-скрипте без авторизации вернёт false.
Старый CMeetingItem::HasAccess($ID, $USER_ID = null) остался. Он принимает ID любого пользователя (без второго аргумента берёт текущего), но учитывает только прямое участие, без руководителя и администратора. Если проверяете запрос текущего пользователя, берите HasRoleAccess(), иначе ваш код откажет тем, кому штатная страница пункта открыта.
Проверьте свой шаблон meeting.edit
Если ваш шаблон или интеграция передаёт в meeting.edit готовые пункты через AGENDA_ITEM, ID должен быть строкой из цифр без ведущих нулей, которая помещается в int. Пустое значение и "0" по-прежнему создают новый пункт. Строку повестки, где в AGENDA_ITEM стоит "012", "12abc", массив, несуществующий ID или пункт без доступа, форма молча пропускает. Вместе с ней пропадают её новые дочерние строки, а существующий пункт, который перенесли под неё, в этом сохранении не обновится.
Список пунктов для привязки лучше отфильтровать заранее, чтобы пользователь увидел отброшенные до сохранения:
<?php declare(strict_types=1);
use Bitrix\Main\Loader;
/**
* Делит ID пунктов повестки на те, что meeting.edit привяжет, и те, что выбросит без ошибки.
* Пустые значения и "0" (новые пункты) сюда не передавайте.
*
* @param array<array-key, mixed> $rawIds значения AGENDA_ITEM из своей формы
* @return array{accepted: array<array-key, int>, rejected: array<array-key, mixed>}
*/
function splitAgendaItems(array $rawIds): array
{
Loader::requireModule('meeting');
$accepted = [];
$rejected = [];
foreach ($rawIds as $key => $raw) {
// формат как в meeting.edit: только цифры, без ведущих нулей, в пределах int
$isId = is_string($raw)
&& preg_match('/^[1-9][0-9]*$/D', $raw) === 1
&& (string)(int)$raw === $raw;
if ($isId && \CMeetingItem::HasRoleAccess((int)$raw)) {
$accepted[$key] = (int)$raw;
} else {
$rejected[$key] = $raw;
}
}
return ['accepted' => $accepted, 'rejected' => $rejected];
}
['accepted' => $items, 'rejected' => $lost] = splitAgendaItems(['15', '0042', '981']);
// $lost покажите пользователю до сохранения: эти строки форма не сохранит
Мелочи и находки
CAllMeeting::GetFilesData()собираетDOWNLOAD_URLчерезUri::toAbsolute()вместоCHTTP::URN2URI(), который в main помечен@deprecated. Ссылки получаются те же. Если вызываетеCHTTP::URN2URI()в своём коде, меняйте так же:(string)(new \Bitrix\Main\Web\Uri($urn))->toAbsolute(), а хост из второго аргумента передавайте вtoAbsolute($host).- Компоненты
meeting.edit,meeting.item,meeting.listиmeetingsполучили казахский перевод.