Кратко
- RFC 5229 добавил команду
set, подстановку значений в строки и переменные совпадения, но использовать их можно было только после явного объявления возможностиvariables. - Память оставалась ограниченной: захват зависел от реально выполненных условий, значения были видны только текущему скрипту, а превышение лимита реализации могло привести к усечению.
Фильтру требовалась небольшая память, а не более мощный сервер
К январю 2008 года у Sieve уже было ясное назначение: фильтровать сообщения при окончательной доставке. Базовая спецификация описывала полезный, но намеренно ограниченный язык. В нём не было переменных и циклов, и он не мог запускать команды оболочки. Это были не забытые удобства, которые любое расширение должно было просто добавить. Так задавались границы того, что написанный пользователем фильтр мог потребовать от почтового сервера.
RFC 5229 осторожно расширил одну часть этой границы. Скрипт мог объявить require "variables", сохранить именованную строку командой set, подставить её в другую строку или проверить значение, сформированное самим скриптом. Успешное сопоставление с подстановочными знаками могло предоставить полное совпадение как ${0}, а захваченные фрагменты — как ${1}, ${2} и далее. Например, правило могло извлечь имя списка из заголовка и вставить его в путь почтовой папки, не дублируя один и тот же текст в нескольких местах.
Это не означало появления долговременной памяти. В RFC сказано, что переменные видны только выполняющемуся в данный момент скрипту. Документ не определяет хранилище для всего почтового ящика, журнал предыдущих сообщений или общее состояние разных пользователей. Слово «переменная» звучит широко, но стандартизованный объект скромнее: имя, связанное со строкой на время выполнения этого скрипта.
Явное объявление было частью модели безопасности
Скрипт должен был запросить возможность до её использования. Без variables смысл строк не менялся молча. Для расширяемого языка это важно: возможность означает не только новую операцию, но и явное соглашение между скриптом и интерпретатором, что она доступна.
Подстановка выполнялась, когда управление доходило до соответствующей инструкции, и использовала значения, актуальные в этот момент. Проход был однократным. Неизвестная переменная заменялась пустой строкой, а регистр букв в имени не имел значения. Такая краткость могла скрывать ошибки. Опечатка в названии переменной могла просто убрать часть текста, не сообщив явно об отсутствующем значении. Если подставленное значение само содержало ссылку ${...}, повторной рекурсивной подстановки не происходило.
Набор модификаторов был узким: преобразование регистра ASCII, смена регистра первой буквы, экранирование подстановочных знаков и подсчёт длины строки. Добавлялась и проверка string. Арифметики, циклов и произвольного исполнения кода не было. Дополнительная выразительность означала возможность называть и ограниченно повторно использовать несколько строк, а не свободу вычислять что угодно.
Захват зависит от условия, которое действительно выполнилось
При использовании переменных совпадения источником данных становится сам ход исполнения. RFC 5229 требует проверять условия слева направо и прекращать их оценку, как только булев результат уже определён. Например, в anyof (true, header :matches ...) первое значение уже даёт истину, поэтому проверка заголовка пропускается и захвата не создаёт. Более позднее успешное :matches может заменить предыдущий список совпадений; неудачная проверка новых фрагментов не даёт. В сложном правиле, прежде чем полагаться на ${1}, нужно выяснить, какая проверка действительно запускалась.
Типы сопоставления, добавленные другими расширениями, тоже не наследуют побочные эффекты захвата автоматически. RFC 5173, опубликованный через три месяца после RFC 5229, проводит показательную границу: при включённой variables ссылки на переменные в ключах проверки body раскрываются, но подстановочные совпадения самой проверки body не должны устанавливать переменные совпадения. Стандарты допускают некоторые сочетания, но не объявляют одинаковыми операции, которые лишь внешне похожи.
Минимальные требования показывают границы в цифрах. Реализация должна поддерживать не менее 128 переменных, имена длиной не менее 32 символов, значения длиной не менее 4 000 символов и захваты ${1}${9}. Если значение превышает лимит конкретной реализации, желательно обнаружить это при компиляции; если проблема выявилась только во время выполнения, значение предполагается усечь, и это не должно считаться ошибкой. Поэтому раздел безопасности не рекомендует хранить в переменных крупные структуры, значимые для безопасности, и предупреждает, что отправитель способен произвольно влиять на захваченный текст.
Длинная история черновиков не доказывает распространённость
История в Datatracker восходит к индивидуальным черновикам марта 2003 года; версии рабочей группы Sieve появляются с конца 2004-го, за ними последовали несколько редакций в 2005-м. В материалах IESG документ назван результатом работы группы Sieve Mail Filtering Language. Одобрение в 2006 году и публикация RFC 5229 в январе 2008-го — разные зафиксированные этапы. По этой хронологии нельзя установить ни причину длительной разработки, ни число серверов, внедривших расширение.
Заметка Heng Lu о «Minimum Initial Specification» даёт аналитическую рамку: require позволяет сохранить компактную основу и одновременно активировать будущие возможности локально, в каждом скрипте. «Running-Code Primacy» напоминает, что опубликованная возможность ещё не доказывает её реализацию или включение на каком-либо конкретном сервере. Анализ «Reality Layers» помогает различать объявление в скрипте, состояние интерпретатора, поведение сервера и то, что в итоге увидел пользователь в почтовом ящике. Это позднейшие аналитические подходы, а не свидетельство намерений авторов RFC.
Фильтр получил возможность запомнить результат одного совпадения и повторно использовать несколько именованных строк. Но это само по себе не доказывает, что он сохраняет предыдущую переписку, удостоверяет отправителя или знает конечный маршрут письма. Исторический шаг RFC 5229 заключался не в снятии границы Sieve, а в том, чтобы сделать одну явно включаемую стыковку полезнее.
Источники
- RFC 5229: расширение переменных для фильтрации почты Sieve
- Запись RFC Editor о RFC 5229
- Запись RFC 5229 в IETF Datatracker
- История черновика Sieve Variables
- Материалы IESG по черновику Variables
- Черновик 08: Sieve Extension: Variables
- RFC 5228: язык фильтрации почты Sieve
- Запись RFC Editor о RFC 5228
- RFC 3028: язык фильтрации почты Sieve
- Запись RFC Editor о RFC 3028
- RFC 5173: расширение Body для Sieve
- Запись RFC Editor о RFC 5173
- Heng Lu, «Running-Code Primacy»
- Heng Lu, «Minimum Initial Specification, Localized Future Decision, and Voluntary Adoption»
- Heng Lu, «On Reality Layers, Symbolic Power, and Why Clarity Feels So Hostile»
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
