meeting 26.100.0 Безопасность

Meeting 26.100.0: чужой пункт повестки больше не привязать к своей планёрке

3 мин чтения
Узнавайте о ломающих изменениях Битрикса раньше, чем они доедут до прода: свежие разборы — в канале @bxmax_updates

Обновление безопасности

Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.

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 получили казахский перевод.

Новая версия вышла — разбор уже в Telegram

В канале @bxmax_updates публикуем каждый свежий разбор: что сломается, что устарело и что появилось в API. Узнаете до того, как обновите прод.

Подписаться

Читайте дальше

vibecodeconnector 26.1000.0 Заметное Свежее

Vibecodeconnector 26.1000.0: «Доступы» и «Публичная ссылка» в каталоге, чат в настройках приложения и доступ по живой оргструктуре

В меню приложения в каталоге Вайбкода пункт «Поделиться» разделён на «Доступы к приложению» и «Публичную ссылку», переключатель чата переехал в «Настройки приложения», а доступ по отделам проверяется по текущей оргструктуре. Баланс Вайбкода для виджета тарифа уже лежит в модуле, но выключен флагом….

4 мин
sign 26.1100.0 Ломающее Свежее

Sign 26.1100.0: ручное напоминание подписантам, скачивание шаблонов и REST провайдеров только для администратора

В sign 26.1100.0 подписантам можно напомнить из грида документа, подписание запускается из списка подписантов, а шаблоны и комплекты скачиваются незаполненными. REST провайдеров подписи теперь только для администратора, у сервисов списка символьных кодов новые сигнатуры. Версия требует main и humanr…

7 мин
intranet 26.2000.0 Безопасность Свежее

Intranet 26.2000.0: журнал соглашений только администраторам, проверка стартовой страницы и «MCP-подключения» в меню коробки

Intranet 26.2000.0 закрывает журнал принятых соглашений от всех, кроме администраторов, и принимает стартовой страницей левого меню только адреса внутри портала. В левом меню коробки с модулем `aiassistant` появился пункт «MCP-подключения», а панель чатов сменила `arResult`, так что переделанные коп…

3 мин
humanresources 26.700.0 Ломающее Свежее

Humanresources 26.700.0: триггер на перевод и смену роли, «Появился новый сотрудник» только по отделам и командам

В humanresources 26.700.0 новый конструктор процессов получил триггер на перевод сотрудника, смену его роли и увольнение, а в обмене с 1С для КЭДО появились исключения из сопоставления и отключение компании. Ломаются сценарии «Появился новый сотрудник» с поимённо выбранными людьми, а AJAX `Mapper.de…

5 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…

Можно закрыть чат и перейти на другую страницу. Когда ответ будет готов, на кнопке Домового появится отметка.

Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти