Кратко
- Параметры выбора решают, какие имена войдут в ответ, а параметры возврата только добавляют сведения к уже выбранным именам. Список без исходного запроса теряет доказательство членства.
- При RECURSIVEMATCH родитель может быть возвращён из-за потомка, удовлетворившего SUBSCRIBED, хотя сам родитель не подписан или помечен
\NonExistent; CHILDINFO фиксирует эту временную причинную связь.
Дерево показывает ответ, но скрывает вопрос
Иерархия в почтовом клиенте выглядит убедительно. Отступ означает вложенность, значок раскрытия обещает дочерние элементы, а каждая строка кажется существующим объектом, доступным для выбора. Этот интерфейсный язык полезен, но он легко приписывает ответу больше полномочий, чем дал сервер.
LIST-EXTENDED описывает не нейтральную перепись, а запрос. Reference name и шаблоны определяют область сопоставления. Selection options задают членство имён в результате. Return options запрашивают дополнительные сведения об уже выбранных именах. Аутентифицированный principal, поколение capabilities и момент обработки дополнительно ограничивают наблюдение.
Одно и то же состояние сервера поэтому может породить несколько правильных деревьев. Один запрос выбирает подписанные имена. Другой перечисляет локальные ящики, а затем отмечает подписку. Третий расширяет область до удалённых имён. Четвёртый показывает родителя только затем, чтобы не потерять соответствующего условию потомка.
Для аудита недостаточно сохранить строки на экране. Нужны сервер и сессия, поколение объявленных возможностей, principal, reference name, исходные и канонические шаблоны, параметры выбора и возврата, command tag, полный поток немаркированных ответов и время. Этот чек объясняет, почему каждая строка появилась; без него остаётся ответ, лишённый своего вопроса.
Членство и аннотация принадлежат разным операциям
Selection option меняет правило допуска имени. Обычно имя должно совпасть хотя бы с одним каноническим шаблоном LIST и удовлетворить всем условиям выбора. Для родительских имён RECURSIVEMATCH вводит специально описанное исключение, но не отменяет остальные границы по аналогии.
Return option определяет информацию, сопровождающую уже совпавшие имена. Он не вправе добавлять новые имена. Если реализация использует аннотацию как фильтр или фильтр как простой атрибут, внешне правдоподобный ответ будет относиться к другому вопросу.
SUBSCRIBED наглядно занимает обе роли. В позиции выбора он просит подписанные имена вместо существующих ящиков. Набор может не включить реальные ящики и включить подписку, пережившую удаление объекта. В позиции возврата SUBSCRIBED только добавляет точное состояние подписки к именам, которые базовая LIST уже выбрала; он не сужает и не расширяет набор.
Выбор SUBSCRIBED подразумевает одноимённый возврат, поэтому строки несут \Subscribed. Но происхождение всё равно должно различать причину и наблюдаемый атрибут. Для миграции важно, попала ли строка в набор благодаря подписке или подписка была замечена у строки, выбранной по другой причине.
LIST (SUBSCRIBED) нельзя сводить и к LSUB. Расширенная команда требует точных и полных атрибутов в их обычном смысле. LSUB сохраняет отдельное историческое поведение. Единая модель «подписанных папок» стирает именно то семантическое различие, ради которого была определена новая операция.
Условие мог выполнить не родитель
Пусть подписан Foo/Baz, но не Foo. Шаблон, охватывающий только первый уровень, не захватывает дочернее имя. Условие SUBSCRIBED отвергает родителя. Без дополнительного контекста клиент увидит пустой результат и не узнает о подписке глубже в дереве.
С RECURSIVEMATCH сервер может вернуть Foo вместе с CHILDINFO (SUBSCRIBED). Родитель по-прежнему обязан совпасть с каноническим шаблоном LIST из команды. Потомок, вызвавший его появление, совпадать с этим шаблоном не обязан.
Точный смысл строки таков: по меньшей мере один потомок удовлетворил критерию, а родитель даёт иерархический контекст. Строка не утверждает, что сам Foo подписан. Если отбросить CHILDINFO и оставить одно имя, объяснительный узел превращается в прямое состояние подписки.
Следующая ошибка возникает, когда все видимые строки автоматически получают действия SELECT, перемещения или удаления. Контекстное имя тогда приобретает права объекта, которые сервер не подтверждал. Представление и операционная пригодность относятся к разным слоям реальности.
Правило допустимости подчёркивает назначение RECURSIVEMATCH. Его нельзя посылать одного или только вместе с REMOTE: сервер должен ответить BAD. Нужен другой критерий, выполненный потомком. Это не универсальный переключатель полного рекурсивного перечисления.
Текстовый предок может не существовать как ящик
В иерархии IMAP не каждый префикс имени обязан быть отдельным почтовым ящиком. Customers/ABC может существовать без ящика Customers. Тем не менее родительское имя требуется интерфейсу, чтобы показать положение дочернего элемента.
RFC 5258 позволяет вернуть такой родитель с \NonExistent и CHILDINFO (SUBSCRIBED). Противоречия нет. Первый атрибут говорит, что имя не обозначает существующий ящик, и подразумевает \NoSelect. Второй объясняет, что имя попало в ответ из-за потомка, прошедшего выбор.
Даже \Subscribed и \NonExistent могут быть истинны одновременно. Подписка — состояние имени, существование — состояние объекта ящика. После удаления объекта запись подписки может остаться. Система, выводящая существование из подписки, скрывает ровно тот остаток, который должна найти процедура сверки.
RFC 2342 проводит соседнюю, но отдельную границу. NAMESPACE описывает устройство личных, чужих и общих имён, не доказывая существование или доступ. RFC 5258 рассматривает причинность уже выполненного обнаружения: строка может появиться из-за состояния потомка, а не собственного состояния. Грамматика имени и причина выбора требуют разных чеков.
CHILDINFO сообщает причину, но не адрес потомка
CHILDINFO перечисляет критерии выбора, из-за которых вернулся несовпавший предок, и подтверждает, что им удовлетворял хотя бы один потомок. Какой именно, этот элемент не говорит. Он не замораживает имя, существование или доступность потомка.
Между ответом LIST и следующей командой другая сессия может удалить или переименовать дочерний ящик. Может измениться ACL. Клиент обязан корректно пережить ситуацию, когда последующий поиск не находит ни одного подходящего потомка. CHILDINFO — наблюдение с временной границей, а не постоянный внешний ключ.
Причина полезна и при нескольких конвейерных командах LIST. Немаркированные ответы нужно связать с правильным вопросом. Параметры запроса, порядок получения и критерии CHILDINFO вместе образуют запись зависимости. Один завершающий tag не возвращает каждой промежуточной строке её операционный смысл.
Серверу рекомендуется не отправлять избыточный CHILDINFO, если совпавший потомок также возвращён. Рекомендация SHOULD не становится правилом вывода об отсутствии. Клиент должен принять избыточность без двойного учёта и не заключать, что потомков нет, только из-за отсутствия элемента там, где он не был обязателен.
CHILDINFO также не равен \HasChildren. Первый объясняет, почему выбор включил предка. Второй описывает доступные дочерние ящики для навигации. Причинное происхождение строки и структурная подсказка не должны храниться в одном производном флаге.
Значок раскрытия ограничен пользователем и временем
Return option CHILDREN запрашивает \HasChildren или \HasNoChildren. Клиент благодаря этому рисует свёрнутое дерево, не загружая всю иерархию. Оптимизация переносит ограниченное серверное наблюдение в привычный элемент интерфейса.
Серверу не следует выдавать \HasChildren, если дети существуют, но текущему пользователю ни один недоступен, хотя эффективное вычисление не всегда возможно. Атрибут, верный во время обработки, может устареть до следующего щелчка из-за удаления или изменения прав.
\HasNoChildren означает отсутствие дочерних ящиков, доступных текущему аутентифицированному principal. Это не утверждение об их отсутствии для всех. И это не \NoInferiors, которое означает, что потомков нет и их нельзя создать. Постоянный флаг «лист» для обоих стирает разницу между текущей видимостью и структурной невозможностью.
Безопасный ключ кэша включает сервер, учётную запись или principal, поколение namespace, имя ящика, поколение политики доступа и время наблюдения. Раскрытие узла должно запускать обновляемое обнаружение, а не разрешать удаление сохранённых потомков на основании старого состояния.
Расширенная проекция не становится источником владения
REMOTE необычен среди selection options: он расширяет обработку с локальных на удалённые ящики и не имеет парного return option. Но возвращённое удалённое имя не доказывает достижимость, успешность SELECT или право чтения сообщений.
LIST-STATUS добавляет состояние, SPECIAL-USE — роли, NOTIFY и CONTEXT — механизмы обновления. ACL из RFC 4314 сохраняет права отдельно от появления имени. Все эти возможности делают дерево богаче или свежее, но не освобождают его от исходного запроса, principal и поколения.
Реестры IANA закрепляют общий словарь capabilities и атрибутов имён. Наличие токена подтверждает нормативную ссылку, а не объявление, корректную реализацию или одинаковую область на конкретном сервере. RFC 9051 переносит семантику в современный IMAP, но доказательственный вопрос остаётся конкретным: какая команда исполнялась, для какой идентичности и почему появилась каждая строка?
Дисциплина слоёв реальности Лу Хэна даёт управленческое правило. Родитель реален как элемент одного результата. Потомок реален как сообщённая в тот момент причина. Ящик, подписка, право, синхронизация и экранный узел реальны по отдельности. Абстракция надёжна лишь пока связи обратимы до запроса и независимых проверок.
Источники
- RFC 5258: расширения команды LIST
- Карточка RFC 5258 в RFC Editor
- Карточка RFC 5258 в IETF Datatracker
- Поиск исправлений RFC 5258
- RFC 3501: IMAP4rev1
- RFC 2342: пространство имён IMAP4
- RFC 5255: интернационализация IMAP
- RFC 4466: расширения ABNF для IMAP4
- RFC 5256: SORT и THREAD
- RFC 5267: CONTEXT
- RFC 5465: NOTIFY
- RFC 5819: LIST-STATUS
- RFC 6154: SPECIAL-USE
- RFC 4314: расширение ACL для IMAP
- RFC 9051: IMAP4rev2
- Реестр возможностей IMAP в IANA
- Реестр атрибутов имён ящиков в IANA
- Lu Heng: приоритет работающего кода
- Lu Heng: слои реальности
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
