Гостевая роль: как позвать подрядчика в один канал
Обычный участник пространства видит все публичные каналы. Значит, приглашение подрядчика в один канал открывало ему всю внутреннюю переписку.
Правило «публичный канал видят все участники пространства» кажется очевидным. На нём держится прозрачность: новый человек может найти нужный разговор без просьб «добавьте меня». Проблема появляется в тот день, когда в пространство нужно позвать человека не из команды.
Проблема
Дизайнер-фрилансер, подрядчик по интеграции, клиент агентства. Им нужен один канал. Но стоит пригласить их в пространство — и они видят все публичные каналы: внутренние обсуждения, спор о бюджете, оценку того самого подрядчика. Позвать человека в один канал было нельзя вовсе.
Обходные пути известные: отдельное пространство на каждого подрядчика или переписка в другом мессенджере. Оба ломают главное — разговор перестаёт жить там же, где задачи и остальная работа.
Решение: исключение из одного правила
Гостевая роль — это не набор урезанных прав, а исключение из правила видимости. Для гостя «публичный видят все» не действует: остаётся только членство в конкретных каналах. Проверка встроена в ту же функцию, что решает для всех, можно ли открыть канал. Отдельной ветки «а если гость» в десятке мест нет — и забыть её в одиннадцатом тоже нельзя.
Администратор не может быть гостем: это противоположные края одной шкалы, и их сочетание ничего не значит.
Утечка через поиск
Самое интересное нашлось позже. Когда мы делали ответы по переписке, выяснилось, что поиск не знал про гостей. Его подзапрос видимых каналов считал видимыми все публичные. Гость не мог открыть внутренний канал — но мог найти его сообщения поиском и прочитать их прямо в выдаче.
Там же нашлась вторая: записи голосовых каналов, включая приватные, видели все участники пространства.
Обе дыры закрыты тем же способом: условия видимости для поиска, записей и ответов модели теперь собирает одна функция. На каждую утечку написан тест, который краснеет, если вернуть старый код.
Урок
Правило доступа, которое проверяется в одном месте, работает. Правило, которое повторяется в каждом месте, где читают данные, однажды забудут повторить — в поиске, в выгрузке, в статистике, в ответе модели. Поэтому в Kontext выгрузка, статистика, отчёты и ответы модели считаются по тем же правилам видимости, что и открытие канала. Даже если из-за этого у двух людей получается разная статистика.
Как настроить гостей — в документации по ролям. Как этим пользуются агентства — на странице решения для агентства.