From 6ea9cce175235af8f793017e09a2dba05fe90aee Mon Sep 17 00:00:00 2001
From: Stephan Bosch <stephan@rename-it.nl>
Date: Sat, 23 Feb 2008 18:47:10 +0100
Subject: [PATCH] Variables: updated included specification to new RFC 5229.

---
 .../draft-ietf-sieve-variables-08.txt         | 898 ------------------
 .../plugins/variables/ext-variables.c         |   2 +-
 src/lib-sieve/plugins/variables/rfc5229.txt   | 619 ++++++++++++
 3 files changed, 620 insertions(+), 899 deletions(-)
 delete mode 100644 src/lib-sieve/plugins/variables/draft-ietf-sieve-variables-08.txt
 create mode 100644 src/lib-sieve/plugins/variables/rfc5229.txt

diff --git a/src/lib-sieve/plugins/variables/draft-ietf-sieve-variables-08.txt b/src/lib-sieve/plugins/variables/draft-ietf-sieve-variables-08.txt
deleted file mode 100644
index bc44882dd..000000000
--- a/src/lib-sieve/plugins/variables/draft-ietf-sieve-variables-08.txt
+++ /dev/null
@@ -1,898 +0,0 @@
-
-
-
-
-
-
-Network Working Group                                        K. T. Homme
-Updates: 3028
-Document: draft-ietf-sieve-variables-08.txt           University of Oslo
-Expires Jun 18, 2006                                         18 Dec 2005
-
-
-
-                       Sieve Extension: Variables
-
-
-
-Status of this Memo
-
-
-   This document is an Internet-Draft and is subject to all provisions
-   of section 3 of RFC 3978.  By submitting this Internet-Draft, each
-   author represents that any applicable patent or other IPR claims of
-   which he or she is aware have been or will be disclosed, and any of
-   which he or she becomes aware will be disclosed, in accordance with
-   Section 6 of BCP 79.
-
-   Internet-Drafts are working documents of the Internet Engineering
-   Task Force (IETF), its areas, and its working groups.  Note that
-   other groups may also distribute working documents as Internet-
-   Drafts.
-
-   Internet-Drafts are draft documents valid for a maximum of six months
-   and may be updated, replaced, or obsoleted by other documents at any
-   time.  It is inappropriate to use Internet-Drafts as reference
-   material or to cite them other than as "work in progress."
-
-   The list of current Internet-Drafts can be accessed at
-   http://www.ietf.org/ietf/1id-abstracts.txt.
-
-   The list of Internet-Draft Shadow Directories can be accessed at
-   http://www.ietf.org/shadow.html.
-
-   Distribution of this memo is unlimited.
-
-
-Abstract
-
-   In advanced mail filtering rule sets, it is useful to keep state or
-   configuration details across rules.  This document updates the Sieve
-   filtering language (RFC 3028) with an extension to support variables.
-   The extension changes the interpretation of strings, adds an action
-   to store data in variables, and supplies a new test so that the value
-   of a string can be examined.
-
-
-
-Homme                                                           [Page 1]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-0.  Meta-information on this draft
-
-   This information is intended to facilitate discussion.  It will be
-   removed when this document leaves the Internet-Draft stage.
-
-
-0.1.  Discussion
-
-   This draft is intended to be an extension to the Sieve mail filtering
-   language, available from the RFC repository as
-   <ftp://ftp.ietf.org/rfc/rfc3028.txt>.
-
-   This draft and the Sieve language itself are being discussed on the
-   MTA Filters mailing list at <ietf-mta-filters@imc.org>.  Subscription
-   requests can be sent to <ietf-mta-filters-request@imc.org> (send an
-   mail message with the word "subscribe" in the body).  More
-   information on the mailing list along with a WWW archive of back
-   messages is available at <http://www.imc.org/ietf-mta-filters/>.
-
-
-0.2.  Noted Changes
-
-0.2.1.  Changes since -00
-
-a)   allow generic time zone names, without requiring implementations to
-     support it.  added a "${timezone}" variable so that the user can
-     check if the implementation does support the time zone name he
-     wants.  the default time zone was changed to localtime again.
-
-b)   allow back references from :matches as well as :regex.
-
-c)   added a section on implementation limits.
-
-d)   clarified global scope so that it spans include.
-
-e)   clarified that this draft only affects scripts which require
-     "variables".
-
-f)   changed modifiers into being tagged arguments for SET, added
-     precedence table.
-
-g)   added optional COMPARATOR to SET to solve the internationalisation
-     problem with :lower etc.
-
-h)   the name of the variable being SET is passed in a string to conform
-     with overall Sieve grammar.  this string is explicitly disallowed
-     from containing variable references.
-
-
-
-
-Homme                                                           [Page 2]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-0.2.2.  Changes since -01
-
-a)   clarify that a character is a Unicode character.
-
-b)   added paragraph warning against relying on Sieve for virus checking
-     to security section.
-
-c)   added a paragraph defining constant string.
-
-d)   added namespace to grammar.
-
-e)   removed SETDATE.
-
-f)   added wording and example requiring short-circuiting of test
-     evaluation.
-
-
-0.2.3.  Changes since -02
-
-a)   add references to Unicode and UTF-8, also more boilerplate
-
-b)   fixed a meaningless example.
-
-c)   changed term "numeric variables" to "numbered variables" to reduce
-     the chance of it being interpreted as variables holding integer
-     values.
-
-d)   allow future extensions to access the raw string value.
-
-e)   an unsuccessful match does NOT reset the numbered variables.
-
-f)   added definition of "string :count"
-
-g)   exceeding implementation limits on variable lengths should not make
-     scripts abort.
-
-
-0.2.4.  Changes since -03
-
-a)   clarify short-circuiting.
-
-b)   editorial changes.
-
-
-0.2.5.  Changes since -04
-
-a)   the wildcards in :matches was changed from greedy to non-greedy to
-     better support "principle of least surprise".  added example to
-
-
-
-Homme                                                           [Page 3]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-     illustrate the difference.
-
-b)   add definition of "variable"; clarify grammar is based on [SIEVE];
-     clarify role of namespaces; add informative references for [REGEX]
-     and [SPAMTEST]; add normative reference for [RELATIONAL]
-
-c)   the use of unsupported numbered variables must be flagged as a
-     syntax error by implementations.
-
-
-0.2.6.  Changes since -00 (WG series)
-
-a)   added example for string test
-
-b)   moved introductory text for MODIFIER from 5.1 into 5.0
-
-c)   added Syntax line for MODIFIER.
-
-d)   added comment to an example showing that the non-greedy "*" still
-     matches everything due to implicit anchors.
-
-e)   added example of expansion of string with unbalanced braces.
-
-f)   updated reference to [SPAMTEST].
-
-
-0.2.7.  Changes since -01
-
-a)   moved References from appendix into the document itself.
-
-b)   added example of SET with a comparator.
-
-c)   changed "highest value" to the less ambiguous "largest value".
-
-d)   updated reference to [UTF-8].
-
-e)   allow numbered variables in namespaces.
-
-f)   change ${0} to mean the complete match.
-
-
-0.2.8.  Changes since -02
-
-a)   explicitly state compatibility with actions in base spec.
-
-b)   "numbered variables" are now called "match variables".
-
-
-
-
-
-Homme                                                           [Page 4]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-c)   clarify definition of "match variable".
-
-d)   it's not the whole namespace which should match the extension
-     keyword, only the first component.
-
-e)   allow level 2 and above of the namespace specification to be all-
-     digit.
-
-f)   combining :upper and :lower etc. is now a syntax error.
-
-g)   allow SET to set variables in namespaces if the extension allows
-     it.
-
-0.2.9.  Changes since -03
-
-a)   added two new modifiers, ":quoteregex" and ":quotewildcard".
-
-b)   added wording about security implications of silent truncation.
-
-0.2.10.  Changes since -04
-
-a)   fix buggy markup and add missing modifier to syntax description
-
-b)   changed two "syntax error" (which really weren't) into just
-     "error".
-
-c)   changed "Syntax:" into "Usage:" to mirror [SIEVE] convention.
-
-d)   removed description of regex interaction and :quoteregex
-
-e)   added note to clarify that ${0010} is the same as ${10}.
-
-f)   changed name of document to align better with other extensions
-     (uses same format at 3431 and 3894)
-
-0.2.11.  Changes since -05
-
-a)   removed "open issues" section.
-
-b)   updated [RELATIONAL] reference
-
-0.2.12.  Changes since -06
-
-a)   updated abstract to mention what this document extends.
-
-b)   changed default scoping behaviour in anticipation of "include"
-     extension.
-
-
-
-
-Homme                                                           [Page 5]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-c)   updated reference to RFC 2234.
-
-d)   clarified whitespace stripping behaviour for "string" test.
-
-0.2.13.  Changes since -07
-
-a)   Replaced reference to Unicode with reference to ISO 10646 and made
-     it informational rather than normative.
-
-b)   Updated [ABNF] since it has been published.
-
-c)   Removed the use of comparator with SET to affect case folding.
-     Restrict case modifiers to US ASCII.
-
-d)   Mention in abstract that this draft updates RFC 3028.
-
-e)   Clarify that match variables contain unmodified extracts from the
-     source value.
-
-f)   Include "INBOX" in all mailbox names for consistency.
-
-
-1.  Introduction
-
-   This is an extension to the Sieve language defined by [SIEVE].  It
-   adds support for storing and referencing named data.  The mechanisms
-   detailed in this document will only apply to Sieve scripts that
-   include a require clause for the "variables" extension.  The require
-   clauses themselves are not affected by this extension.
-
-   Conventions for notations are as in [SIEVE] section 1.1, including
-   use of [KEYWORDS] and [ABNF].  The grammar builds on the grammar of
-   [SIEVE].  In this document, "character" means a character from the
-   ISO 10646 coded character set [ISO10646], which may consist of
-   multiple octets coded in [UTF-8], and "variable" is a named reference
-   to data stored or read back using the mechanisms of this extension.
-
-
-2.  Capability Identifier
-
-   The capability string associated with the extension defined in this
-   document is "variables".
-
-
-3.  Interpretation of strings
-
-   This extension changes the semantics of quoted-string, multi-line-
-   literal and multi-line-dotstuff found in [SIEVE] to enable the
-
-
-
-Homme                                                           [Page 6]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-   inclusion of the value of variables.
-
-   When a string is evaluated, substrings matching variable-ref SHALL be
-   replaced by the value of variable-name.  Only one pass through the
-   string SHALL be done.  Variable names are case insensitive, so "foo"
-   and "FOO" refer to the same variable.  Unknown variables are replaced
-   by the empty string.
-
-      variable-ref        =  "${" [namespace] variable-name "}"
-      namespace           =  identifier "." *sub-namespace
-      sub-namespace       =  variable-name "."
-      variable-name       =  num-variable / identifier
-      num-variable        =  1*DIGIT
-
-   Examples:
-      "&%${}!"     => unchanged, as the empty string is an illegal
-                      identifier
-      "${doh!}"    => unchanged, as "!" is illegal in identifiers
-
-      The variable "company" holds the value "ACME".  No other variables
-      are set.
-
-      "${full}"         => the empty string
-      "${company}"      => "ACME"
-      "${BAD${Company}" => "${BADACME"
-      "${President, ${Company} Inc.}"
-                        => "${President, ACME Inc.}"
-
-   The expanded string MUST use the variable values which are current
-   when control reaches the statement the string is part of.
-
-   Strings where no variable substitutions take place are referred to as
-   constant strings.  Future extensions may specify that passing non-
-   constant strings as arguments to its actions or tests is an error.
-
-   Namespaces are meant for future extensions which make internal state
-   available through variables.  These variables SHOULD be put in a
-   namespace whose first component is the same as its capability string.
-   Such extensions SHOULD state which, if any, of the variables in its
-   namespace are modifiable with the "set" action.
-
-   References to namespaces without a prior require statement for the
-   relevant extension MUST cause an error.
-
-   Tests or actions in future extensions may need to access the
-   unexpanded version of the string argument and, e.g., do the expansion
-   after setting variables in its namespace.  The design of the
-   implementation should allow this.
-
-
-
-Homme                                                           [Page 7]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-3.1.  Quoting
-
-   The semantics of quoting using backslash are not changed: backslash
-   quoting is resolved before doing variable substitution.
-
-   Examples:
-      "${fo\o}"  => ${foo}  => the expansion of variable foo.
-      "${fo\\o}" => ${fo\o} => illegal identifier => left verbatim.
-      "\${foo}"  => ${foo}  => the expansion of variable foo.
-      "\\${foo}" => \${foo} => a backslash character followed by the
-                               expansion of variable foo.
-
-   If it is required to include a character sequence such as "${beep}"
-   verbatim in a text literal, the user can define a variable to
-   circumvent expansion to the empty string.
-
-   Example:
-      set "dollar" "$";
-      set "text" "regarding ${dollar}{beep}";
-
-
-3.2.  Match variables
-
-   A "match variable" has a name consisting only of decimal digits and
-   has no namespace component.
-
-   The decimal value of the match variable name will index the list of
-   matching strings from the most recently evaluated successful match of
-   type ":matches".  The list is empty if no match has been successful.
-
-       Note: Extra leading zeroes are allowed and ignored.
-
-   The list will contain one string for each wildcard ("?" and "*") in
-   the match pattern.  Each string holds the substring from the source
-   value that the corresponding wildcard expands to, possibly the empty
-   string.  The wildcards match as little as possible (non-greedy
-   matching).
-
-   The first string in the list has index 1.  If the index is out of
-   range, the empty string will be substituted.  Index 0 contains the
-   matched part of the source value.
-
-   The interpreter MUST short-circuit tests, ie. not perform more tests
-   than necessary to find the result.  Evaluation order MUST be left to
-   right.  If a test has two or more list arguments, the implementation
-   is free to choose which to iterate over first.
-
-   An extension describing a new match type (e.g., [REGEX]) MAY specify
-
-
-
-Homme                                                           [Page 8]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-   that match variables are set as a side effect when the match type is
-   used in a script which has enabled the "variables" extension.
-
-   Example:
-
-      require ["fileinto", "variables"];
-
-      if header :matches "List-ID" "*<*@*" {
-          fileinto "INBOX.lists.${2}"; stop;
-      }
-
-      # Imagine the header
-      # Subject: [acme-users] [fwd] version 1.0 is out
-      if header :matches "Subject" "[*] *" {
-          # ${1} will hold "acme-users",
-          # ${2} will hold "[fwd] version 1.0 is out"
-          fileinfo "INBOX.lists.${1}"; stop;
-      }
-
-      # Imagine the header
-      # To: coyote@ACME.Example.COM
-      if address :matches ["To", "Cc"] ["coyote@**.com",
-              "wile@**.com"] {
-          # ${0} is the matching address
-          # ${1} is always the empty string
-          # ${2} is part of the domain name ("ACME.Example")
-          fileinto "INBOX.business.${2}"; stop;
-      } else {
-          # Control wouldn't reach this block if any match was
-          # successful, so no match variables are set at this
-          # point.
-      }
-
-      if anyof (true, address :domain :matches "To" "*.com") {
-          # The second test is never evaluated, so there are
-          # still no match variables set.
-          stop;
-      }
-
-
-4.  Action set
-
-   Usage:    set [MODIFIER] <name: string> <value: string>
-
-   The "set" action stores the specified value in the variable
-   identified by name.  The name MUST be a constant string and conform
-   to the syntax of variable-name.  Match variables can not be set.  A
-   namespace can not be used unless an extension explicitly allows its
-
-
-
-Homme                                                           [Page 9]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-   use in "set".  An invalid name MUST be detected as a syntax error.
-
-   Modifiers are applied on a value before it is stored in the variable.
-   See next section for details.
-
-   Variables are only visible to the currently running script.  Note:
-   Future extensions may provide different scoping rules for variables.
-
-   Variable names are case insensitive.
-
-   Example:
-      set "honorific"  "Mr";
-      set "first_name" "Wile";
-      set "last_name"  "Coyote";
-      set "vacation" text:
-      Dear ${HONORIFIC} ${last_name},
-      I'm out, please leave a message after the meep.
-      .
-      ;
-
-   "set" does not affect the implicit keep.  It is compatible with all
-   actions defined in [SIEVE].
-
-
-4.1.  Modifiers
-
-   Usage:    ":lower" / ":upper" / ":lowerfirst" / ":upperfirst" /
-             ":quotewildcard" / ":length"
-
-   Modifier names are case insensitive.  Unknown modifiers MUST yield a
-   syntax error.  More than one modifier can be specified, in which case
-   they are applied according to this precedence list, largest value
-   first:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Homme                                                          [Page 10]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-                     +--------------------------------+
-                     | Precedence     Modifier        |
-                     +--------------------------------+
-                     |     40         :lower          |
-                     |                :upper          |
-                     +--------------------------------+
-                     |     30         :lowerfirst     |
-                     |                :upperfirst     |
-                     +--------------------------------+
-                     |     20         :quotewildcard  |
-                     +--------------------------------+
-                     |     10         :length         |
-                     +--------------------------------+
-
-   It is an error to use two or more modifiers of the same precedence in
-   a single "set" action.
-
-   Examples:
-      # The value assigned to the variable is printed after the arrow
-      set "a" "juMBlEd lETteRS";             => "juMBlEd lETteRS"
-      set :length "b" "${a}";                => "15"
-      set :lower "b" "${a}";                 => "jumbled letters"
-      set :upperfirst "b" "${a}";            => "JuMBlEd lETteRS"
-      set :upperfirst :lower "b" "${a}";     => "Jumbled letters"
-      set :quotewildcard "b" "Rock*";        => "Rock\*"
-
-
-4.1.1.  Modifier ":length"
-
-   The value is the decimal number of characters in the expansion,
-   converted to a string.
-
-
-4.1.2.  Modifier ":quotewildcard"
-
-   This modifier adds the necessary quoting to ensure that the expanded
-   text will only match a literal occurence if used as a parameter to
-   :matches.  Every character with special meaning ("*", "?"  and "\")
-   is prefixed with "\" in the expansion.
-
-4.1.3.  Case modifiers
-
-   These modifiers change the letters of the text from upper to lower
-   case or vice versa.  Characters other than "A"-"Z", "a"-"z" from US-
-   ASCII are left unchanged.
-
-
-
-
-
-
-Homme                                                          [Page 11]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-4.1.3.1.  Modifier ":upper"
-
-   All lower case letters are converted to their upper case counterpart.
-
-
-4.1.3.2.  Modifier ":lower"
-
-   All upper case letters are converted to their lower case counterpart.
-
-
-4.1.3.3.  Modifier ":upperfirst"
-
-   The first character of the string is converted to upper case if it is
-   a letter and set in lower case.  The rest of the string is left
-   unchanged.
-
-
-4.1.3.4.  Modifier ":lowerfirst"
-
-   The first character of the string is converted to lower case if it is
-   a letter and set in upper case.  The rest of the string is left
-   unchanged.
-
-
-5.  Test string
-
-   Usage:    string [MATCH-TYPE] [COMPARATOR]
-             <source: string-list> <key-list: string-list>
-
-   The "string" test evaluates to true if any of the source strings
-   matches any key.  The type of match defaults to ":is".
-
-   In the "string" test, both source and key-list are taken from the
-   script, not the message, and whitespace stripping MUST NOT be done
-   unless the script explicitly requests this through some future
-   mechanism.
-
-   Example:
-      set "state" "${state} pending";
-      if string :matches " ${state} " "* pending *" {
-          # the above test always succeeds
-      }
-
-   The "relational" extension [RELATIONAL] adds a match type called
-   ":count".  The count of a single string is 0 if it is the empty
-   string, or 1 otherwise.  The count of a string list is the sum of the
-   counts of the member strings.
-
-
-
-
-Homme                                                          [Page 12]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-6.  Implementation Limits
-
-   An implementation of this draft MUST support at least 128 distinct
-   variables.  The supported length of variable names MUST be at least
-   32 characters.  Each variable MUST be able to hold at least 4000
-   characters.  Attempts to set the variable to a value larger than what
-   the implementation supports SHOULD be reported as an error at
-   compile-time if possible.  If the attempt is discovered during run-
-   time, the value SHOULD be truncated and it MUST NOT be treated as an
-   error.
-
-   Match variables ${1} through ${9} MUST be supported.  References to
-   higher indices than the implementation supports MUST be treated as a
-   syntax error which SHOULD be discovered at compile-time.
-
-
-7.  Security Considerations
-
-   When match variables are used, and the author of the script isn't
-   careful, strings can contain arbitrary values controlled by the
-   sender of the mail.
-
-   Since values stored by "set" which exceed implementation limits are
-   silently truncated, it's not appropriate to store large structures
-   with security implications in variables.
-
-   The introduction of variables makes advanced decision making easier
-   to write, but since no looping construct is provided, all Sieve
-   scripts will terminate in an orderly manner.
-
-   Sieve filtering should not be relied on as a security measure against
-   hostile mail messages.  Sieve is designed to do simple, mostly static
-   tests, and is not suitable for use as a spam or virus checker, where
-   the perpetrator has a motivation to vary the format of the mail in
-   order to avoid filtering rules.  See also [SPAMTEST].
-
-
-8.  IANA Considerations
-
-   The following template specifies the IANA registration of the
-   variables Sieve extension specified in this document:
-
-   To: iana@iana.org
-   Subject: Registration of new Sieve extension
-
-   Capability name: variables
-   Capability keyword: variables
-   Capability arguments: N/A
-
-
-
-Homme                                                          [Page 13]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-   Standards Track/IESG-approved experimental RFC number:
-           this RFC
-   Person and email address to contact for further information:
-           Kjetil Torgrim Homme
-           kjetilho@ifi.uio.no
-
-   This information should be added to the list of sieve extensions
-   given on http://www.iana.org/assignments/sieve-extensions.
-
-9.  Acknowledgments
-
-   Thanks to Cyrus Daboo, Jutta Degener, Ned Freed, Lawrence Greenfield,
-   Jeffrey Hutzelman, Mark E. Mallett, Alexey Melnikov, Peder Stray and
-   Nigel Swinson for valuable feedback.
-
-
-10.  Author's Address
-
-   Kjetil T. Homme
-   University of Oslo
-   PO Box 1080
-   0316 Oslo, Norway
-
-   Phone: +47 9366 0091
-   E-mail: kjetilho@ifi.uio.no
-
-
-11.  References
-
-
-11.1.  Normative references
-
-
-     [ABNF]       Crocker, D. and Overell, P., "Augmented BNF for Syntax
-                  Specifications: ABNF", RFC 4234, October 2005.
-
-     [KEYWORDS]   Bradner, S., "Key words for use in RFCs to Indicate
-                  Requirement Levels", RFC 2119, March 1997.
-
-     [RELATIONAL] Leiba, B. and Segmuller, W., "Sieve Extension:
-                  Relational Tests", Work in Progress, draft-ietf-
-                  sieve-3431bis-XX.txt
-
-     [SIEVE]      Guenther, P. and Showalter, T., "Sieve: An Email
-                  Filtering Language", Work in Progress, draft-ietf-
-                  sieve-3028bis-XX.txt
-
-
-
-
-
-Homme                                                          [Page 14]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-     [UTF-8]      Yergeau, F., "UTF-8, a transformation format of
-                  Unicode and ISO 10646", RFC 3629, November 2003.
-
-
-11.2.  Informative References
-
-
-     [ISO10646]   ISO/IEC, "Information Technology - Universal Multiple-
-                  Octet Coded Character Set (UCS) - Part 1: Architecture
-                  and Basic Multilingual Plane", May 1993, with
-                  amendments.
-
-     [REGEX]      Murchison, K., "Sieve Email Filtering -- Regular
-                  Expression Extension", Work in Progress.
-
-     [SPAMTEST]   Daboo, C., "SIEVE Email Filtering: Spamtest and
-                  VirusTest Extensions", RFC 3685, February 2004
-
-
-Appendix B.  Intellectual Property Rights Statement
-
-   The IETF takes no position regarding the validity or scope of any
-   intellectual property or other rights that might be claimed to
-   pertain to the implementation or use of the technology described in
-   this document or the extent to which any license under such rights
-   might or might not be available; neither does it represent that it
-   has made any effort to identify any such rights.  Information on the
-   IETF's procedures with respect to rights in standards-track and
-   standards-related documentation can be found in BCP-11.  Copies of
-   claims of rights made available for publication and any assurances of
-   licenses to be made available, or the result of an attempt made to
-   obtain a general license or permission for the use of such
-   proprietary rights by implementors or users of this specification can
-   be obtained from the IETF Secretariat.
-
-
-Appendix C.  Full Copyright Statement
-
-   Copyright (C) The Internet Society (2005).
-
-   This document is subject to the rights, licenses and restrictions
-   contained in BCP 78, and except as set forth therein, the authors
-   retain all their rights.
-
-   This document and the information contained herein are provided on an
-   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
-   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
-   ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
-
-
-
-Homme                                                          [Page 15]
-
-Internet Draft         Sieve Extension: Variables            18 Dec 2005
-
-
-   INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
-   INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
-   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-
-Intellectual Property
-
-   The IETF takes no position regarding the validity or scope of any
-   Intellectual Property Rights or other rights that might be claimed to
-   pertain to the implementation or use of the technology described in
-   this document or the extent to which any license under such rights
-   might or might not be available; nor does it represent that it has
-   made any independent effort to identify any such rights.  Information
-   on the procedures with respect to rights in RFC documents can be
-   found in BCP 78 and BCP 79.
-
-   Copies of IPR disclosures made to the IETF Secretariat and any
-   assurances of licenses to be made available, or the result of an
-   attempt made to obtain a general license or permission for the use of
-   such proprietary rights by implementers or users of this
-   specification can be obtained from the IETF on-line IPR repository at
-   http://www.ietf.org/ipr.
-
-   The IETF invites any interested party to bring to its attention any
-   copyrights, patents or patent applications, or other proprietary
-   rights that may cover technology that may be required to implement
-   this standard.  Please address the information to the IETF at ietf-
-   ipr@ietf.org.
-
-
-Acknowledgement
-
-   Funding for the RFC Editor function is currently provided by the
-   Internet Society.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Homme                                                          [Page 16]
diff --git a/src/lib-sieve/plugins/variables/ext-variables.c b/src/lib-sieve/plugins/variables/ext-variables.c
index bb3e793d8..1deae9e2f 100644
--- a/src/lib-sieve/plugins/variables/ext-variables.c
+++ b/src/lib-sieve/plugins/variables/ext-variables.c
@@ -2,7 +2,7 @@
  * -------------------
  *
  * Authors: Stephan Bosch
- * Specification: draft-ietf-sieve-variables-08.txt
+ * Specification: RFC 5229
  * Implementation: basic variables support
  * Status: under development
  *
diff --git a/src/lib-sieve/plugins/variables/rfc5229.txt b/src/lib-sieve/plugins/variables/rfc5229.txt
new file mode 100644
index 000000000..4468ba1ed
--- /dev/null
+++ b/src/lib-sieve/plugins/variables/rfc5229.txt
@@ -0,0 +1,619 @@
+
+
+
+
+
+
+Network Working Group                                           K. Homme
+Request for Comments: 5229                            University of Oslo
+Updates: 5228                                               January 2008
+Category: Standards Track
+
+
+               Sieve Email Filtering: Variables Extension
+
+Status of This Memo
+
+   This document specifies an Internet standards track protocol for the
+   Internet community, and requests discussion and suggestions for
+   improvements.  Please refer to the current edition of the "Internet
+   Official Protocol Standards" (STD 1) for the standardization state
+   and status of this protocol.  Distribution of this memo is unlimited.
+
+Abstract
+
+   In advanced mail filtering rule sets, it is useful to keep state or
+   configuration details across rules.  This document updates the Sieve
+   filtering language (RFC 5228) with an extension to support variables.
+   The extension changes the interpretation of strings, adds an action
+   to store data in variables, and supplies a new test so that the value
+   of a string can be examined.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Homme                       Standards Track                     [Page 1]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+1.  Introduction
+
+   This is an extension to the Sieve language defined by [SIEVE].  It
+   adds support for storing and referencing named data.  The mechanisms
+   detailed in this document will only apply to Sieve scripts that
+   include a require clause for the "variables" extension.  The require
+   clauses themselves are not affected by this extension.
+
+   Conventions for notations are as in [SIEVE] section 1.1, including
+   use of [KEYWORDS] and [ABNF].  The grammar builds on the grammar of
+   [SIEVE].  In this document, "character" means a character from the
+   ISO 10646 coded character set [ISO10646], which may consist of
+   multiple octets coded in [UTF-8], and "variable" is a named reference
+   to data stored or read back using the mechanisms of this extension.
+
+2.  Capability Identifier
+
+   The capability string associated with the extension defined in this
+   document is "variables".
+
+3.  Interpretation of Strings
+
+   This extension changes the semantics of quoted-string, multi-line-
+   literal and multi-line-dotstuff found in [SIEVE] to enable the
+   inclusion of the value of variables.
+
+   When a string is evaluated, substrings matching variable-ref SHALL be
+   replaced by the value of variable-name.  Only one pass through the
+   string SHALL be done.  Variable names are case insensitive, so "foo"
+   and "FOO" refer to the same variable.  Unknown variables are replaced
+   by the empty string.
+
+      variable-ref        =  "${" [namespace] variable-name "}"
+      namespace           =  identifier "." *sub-namespace
+      sub-namespace       =  variable-name "."
+      variable-name       =  num-variable / identifier
+      num-variable        =  1*DIGIT
+
+   Examples:
+      "&%${}!"     => unchanged, as the empty string is an illegal
+                      identifier
+      "${doh!}"    => unchanged, as "!" is illegal in identifiers
+
+      The variable "company" holds the value "ACME".  No other variables
+      are set.
+
+      "${full}"         => the empty string
+      "${company}"      => "ACME"
+
+
+
+Homme                       Standards Track                     [Page 2]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+      "${BAD${Company}" => "${BADACME"
+      "${President, ${Company} Inc.}"
+                        => "${President, ACME Inc.}"
+
+   The expanded string MUST use the variable values that are current
+   when control reaches the statement the string is part of.
+
+   Strings where no variable substitutions take place are referred to as
+   constant strings.  Future extensions may specify that passing non-
+   constant strings as arguments to its actions or tests is an error.
+
+   Namespaces are meant for future extensions that make internal state
+   available through variables.  These variables SHOULD be put in a
+   namespace whose first component is the same as its capability string.
+   Such extensions SHOULD state which, if any, of the variables in its
+   namespace are modifiable with the "set" action.
+
+   References to namespaces without a prior require statement for the
+   relevant extension MUST cause an error.
+
+   Tests or actions in future extensions may need to access the
+   unexpanded version of the string argument and, e.g., do the expansion
+   after setting variables in its namespace.  The design of the
+   implementation should allow this.
+
+3.1.  Quoting and Encoded Characters
+
+   The semantics of quoting using backslash are not changed: backslash
+   quoting is resolved before doing variable substitution.  Similarly,
+   encoded character processing (see Section 2.4.2.4 of [SIEVE]) is
+   performed before doing variable substitution, but after quoting.
+
+   Examples:
+      "${fo\o}"  => ${foo}  => the expansion of variable foo.
+      "${fo\\o}" => ${fo\o} => illegal identifier => left verbatim.
+      "\${foo}"  => ${foo}  => the expansion of variable foo.
+      "\\${foo}" => \${foo} => a backslash character followed by the
+                               expansion of variable foo.
+
+      If it is required to include a character sequence such as
+      "${beep}" verbatim in a text literal, the user can define a
+      variable to circumvent expansion to the empty string.
+
+   Example:
+      set "dollar" "$";
+      set "text" "regarding ${dollar}{beep}";
+
+
+
+
+
+Homme                       Standards Track                     [Page 3]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+   Example:
+      require ["encoded-character", "variables"];
+      set "name" "Ethelbert"
+      if header :contains "Subject" "dear${hex:20 24 7b 4e}ame}" {
+          # the test string is "dear Ethelbert"
+      }
+
+3.2.  Match Variables
+
+   A "match variable" has a name consisting only of decimal digits and
+   has no namespace component.
+
+   The decimal value of the match variable name will index the list of
+   matching strings from the most recently evaluated successful match of
+   type ":matches".  The list is empty if no match has been successful.
+
+       Note: Extra leading zeroes are allowed and ignored.
+
+   The list will contain one string for each wildcard ("?" and "*") in
+   the match pattern.  Each string holds the substring from the source
+   value that the corresponding wildcard expands to, possibly the empty
+   string.  The wildcards match as little as possible (non-greedy
+   matching).
+
+   The first string in the list has index 1.  If the index is out of
+   range, the empty string will be substituted.  Index 0 contains the
+   matched part of the source value.
+
+   The interpreter MUST short-circuit tests, i.e., not perform more
+   tests than necessary to find the result.  Evaluation order MUST be
+   left to right.  If a test has two or more list arguments, the
+   implementation is free to choose which to iterate over first.
+
+   An extension describing a new match type (e.g., [REGEX]) MAY specify
+   that match variables are set as a side effect when the match type is
+   used in a script that has enabled the "variables" extension.
+
+   Example:
+
+      require ["fileinto", "variables"];
+
+      if header :matches "List-ID" "*<*@*" {
+          fileinto "INBOX.lists.${2}"; stop;
+      }
+
+
+
+
+
+
+
+Homme                       Standards Track                     [Page 4]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+      # Imagine the header
+      # Subject: [acme-users] [fwd] version 1.0 is out
+      if header :matches "Subject" "[*] *" {
+          # ${1} will hold "acme-users",
+          # ${2} will hold "[fwd] version 1.0 is out"
+          fileinfo "INBOX.lists.${1}"; stop;
+      }
+
+      # Imagine the header
+      # To: coyote@ACME.Example.COM
+      if address :matches ["To", "Cc"] ["coyote@**.com",
+              "wile@**.com"] {
+          # ${0} is the matching address
+          # ${1} is always the empty string
+          # ${2} is part of the domain name ("ACME.Example")
+          fileinto "INBOX.business.${2}"; stop;
+      } else {
+          # Control wouldn't reach this block if any match was
+          # successful, so no match variables are set at this
+          # point.
+      }
+
+      if anyof (true, address :domain :matches "To" "*.com") {
+          # The second test is never evaluated, so there are
+          # still no match variables set.
+          stop;
+      }
+
+4.  Action set
+
+   Usage:    set [MODIFIER] <name: string> <value: string>
+
+   The "set" action stores the specified value in the variable
+   identified by name.  The name MUST be a constant string and conform
+   to the syntax of variable-name.  Match variables cannot be set.  A
+   namespace cannot be used unless an extension explicitly allows its
+   use in "set".  An invalid name MUST be detected as a syntax error.
+
+   Modifiers are applied on a value before it is stored in the variable.
+   See the next section for details.
+
+   Variables are only visible to the currently running script.  Note:
+   Future extensions may provide different scoping rules for variables.
+
+   Variable names are case insensitive.
+
+
+
+
+
+
+Homme                       Standards Track                     [Page 5]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+   Example:
+      set "honorific"  "Mr";
+      set "first_name" "Wile";
+      set "last_name"  "Coyote";
+      set "vacation" text:
+      Dear ${HONORIFIC} ${last_name},
+      I'm out, please leave a message after the meep.
+      .
+      ;
+
+   "set" does not affect the implicit keep.  It is compatible with all
+   actions defined in [SIEVE].
+
+4.1.  Modifiers
+
+   Usage:  ":lower" / ":upper" / ":lowerfirst" / ":upperfirst" /
+           ":quotewildcard" / ":length"
+
+   Modifier names are case insensitive.  Unknown modifiers MUST yield a
+   syntax error.  More than one modifier can be specified, in which case
+   they are applied according to this precedence list, largest value
+   first:
+
+                     +--------------------------------+
+                     | Precedence     Modifier        |
+                     +--------------------------------+
+                     |     40         :lower          |
+                     |                :upper          |
+                     +--------------------------------+
+                     |     30         :lowerfirst     |
+                     |                :upperfirst     |
+                     +--------------------------------+
+                     |     20         :quotewildcard  |
+                     +--------------------------------+
+                     |     10         :length         |
+                     +--------------------------------+
+
+   It is an error to use two or more modifiers of the same precedence in
+   a single "set" action.
+
+   Examples:
+      # The value assigned to the variable is printed after the arrow
+      set "a" "juMBlEd lETteRS";             => "juMBlEd lETteRS"
+      set :length "b" "${a}";                => "15"
+      set :lower "b" "${a}";                 => "jumbled letters"
+      set :upperfirst "b" "${a}";            => "JuMBlEd lETteRS"
+      set :upperfirst :lower "b" "${a}";     => "Jumbled letters"
+      set :quotewildcard "b" "Rock*";        => "Rock\*"
+
+
+
+Homme                       Standards Track                     [Page 6]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+4.1.1.  Modifier ":length"
+
+   The value is the decimal number of characters in the expansion,
+   converted to a string.
+
+4.1.2.  Modifier ":quotewildcard"
+
+   This modifier adds the necessary quoting to ensure that the expanded
+   text will only match a literal occurrence if used as a parameter to
+   :matches.  Every character with special meaning ("*", "?",  and "\")
+   is prefixed with "\" in the expansion.
+
+4.1.3.  Case Modifiers
+
+   These modifiers change the letters of the text from upper to lower
+   case or vice versa.  Characters other than "A"-"Z" and "a"-"z" from
+   US-ASCII are left unchanged.
+
+4.1.3.1.  Modifier ":upper"
+
+   All lower case letters are converted to their upper case
+   counterparts.
+
+4.1.3.2.  Modifier ":lower"
+
+   All upper case letters are converted to their lower case
+   counterparts.
+
+4.1.3.3.  Modifier ":upperfirst"
+
+   The first character of the string is converted to upper case if it is
+   a letter and set in lower case.  The rest of the string is left
+   unchanged.
+
+4.1.3.4.  Modifier ":lowerfirst"
+
+   The first character of the string is converted to lower case if it is
+   a letter and set in upper case.  The rest of the string is left
+   unchanged.
+
+5.  Test string
+
+   Usage:  string [MATCH-TYPE] [COMPARATOR]
+           <source: string-list> <key-list: string-list>
+
+   The "string" test evaluates to true if any of the source strings
+   matches any key.  The type of match defaults to ":is".
+
+
+
+
+Homme                       Standards Track                     [Page 7]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+   In the "string" test, both source and key-list are taken from the
+   script, not the message, and whitespace stripping MUST NOT be done
+   unless the script explicitly requests this through some future
+   mechanism.
+
+   Example:
+      set "state" "${state} pending";
+      if string :matches " ${state} " "* pending *" {
+          # the above test always succeeds
+      }
+
+   The "relational" extension [RELATIONAL] adds a match type called
+   ":count".  The count of a single string is 0 if it is the empty
+   string, or 1 otherwise.  The count of a string list is the sum of the
+   counts of the member strings.
+
+6.  Implementation Limits
+
+   An implementation of this document MUST support at least 128 distinct
+   variables.  The supported length of variable names MUST be at least
+   32 characters.  Each variable MUST be able to hold at least 4000
+   characters.  Attempts to set the variable to a value larger than what
+   the implementation supports SHOULD be reported as an error at
+   compile-time if possible.  If the attempt is discovered during run-
+   time, the value SHOULD be truncated, and it MUST NOT be treated as an
+   error.
+
+   Match variables ${1} through ${9} MUST be supported.  References to
+   higher indices than those the implementation supports MUST be treated
+   as a syntax error, which SHOULD be discovered at compile-time.
+
+7.  Security Considerations
+
+   When match variables are used, and the author of the script isn't
+   careful, strings can contain arbitrary values controlled by the
+   sender of the mail.
+
+   Since values stored by "set" that exceed implementation limits are
+   silently truncated, it's not appropriate to store large structures
+   with security implications in variables.
+
+   The introduction of variables makes advanced decision making easier
+   to write, but since no looping construct is provided, all Sieve
+   scripts will terminate in an orderly manner.
+
+   Sieve filtering should not be relied on as a security measure against
+   hostile mail messages.  Sieve is designed to do simple, mostly static
+   tests, and is not suitable for use as a spam or virus checker, where
+
+
+
+Homme                       Standards Track                     [Page 8]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+   the perpetrator has a motivation to vary the format of the mail in
+   order to avoid filtering rules.  See also [SPAMTEST].
+
+8.  IANA Considerations
+
+   The following template specifies the IANA registration of the
+   variables Sieve extension specified in this document:
+
+   To: iana@iana.org
+   Subject: Registration of new Sieve extension
+
+   Capability name: variables
+   Description:     Adds support for variables to the Sieve filtering
+                    language.
+   RFC number:      RFC 5229
+   Contact address: The Sieve discussion list <ietf-mta-filters@imc.org>
+
+9.  Acknowledgments
+
+   Thanks to Cyrus Daboo, Jutta Degener, Ned Freed, Lawrence Greenfield,
+   Jeffrey Hutzelman, Mark E. Mallett, Alexey Melnikov, Peder Stray, and
+   Nigel Swinson for valuable feedback.
+
+10.  References
+
+10.1.  Normative References
+
+   [ABNF]       Crocker, D., Ed., and Overell, P., "Augmented BNF for
+                Syntax Specifications: ABNF", RFC 4234, October 2005.
+
+   [KEYWORDS]   Bradner, S., "Key words for use in RFCs to Indicate
+                Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+   [RELATIONAL] Segmuller, W. and B. Leiba, "Sieve Email Filtering:
+                Relational Extension", RFC 5231, January 2008.
+
+   [SIEVE]      Guenther, P., Ed., and T. Showalter, Ed., "Sieve: An
+                Email Filtering Language", RFC 5228, January 2008.
+
+   [UTF-8]      Yergeau, F., "UTF-8, a transformation format of Unicode
+                and ISO 10646", RFC 3629, November 2003.
+
+10.2.  Informative References
+
+   [ISO10646]   ISO/IEC, "Information Technology - Universal Multiple-
+                Octet Coded Character Set (UCS) - Part 1: Architecture
+                and Basic Multilingual Plane", May 1993, with
+                amendments.
+
+
+
+Homme                       Standards Track                     [Page 9]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+   [REGEX]      Murchison, K., "Sieve Email Filtering -- Regular
+                Expression Extension", Work in Progress, February 2006.
+
+   [SPAMTEST]   Daboo, C., "Sieve Email Filtering: Spamtest and
+                Virustest Extensions", RFC 5235, January 2008.
+
+Author's Address
+
+   Kjetil T. Homme
+   University of Oslo
+   PO Box 1080
+   0316 Oslo, Norway
+
+   Phone: +47 9366 0091
+   EMail: kjetilho@ifi.uio.no
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Homme                       Standards Track                    [Page 10]
+
+RFC 5229               Sieve: Variables Extension           January 2008
+
+
+Full Copyright Statement
+
+   Copyright (C) The IETF Trust (2008).
+
+   This document is subject to the rights, licenses and restrictions
+   contained in BCP 78, and except as set forth therein, the authors
+   retain all their rights.
+
+   This document and the information contained herein are provided on an
+   "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+   OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+   THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+   THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+   WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+   The IETF takes no position regarding the validity or scope of any
+   Intellectual Property Rights or other rights that might be claimed to
+   pertain to the implementation or use of the technology described in
+   this document or the extent to which any license under such rights
+   might or might not be available; nor does it represent that it has
+   made any independent effort to identify any such rights.  Information
+   on the procedures with respect to rights in RFC documents can be
+   found in BCP 78 and BCP 79.
+
+   Copies of IPR disclosures made to the IETF Secretariat and any
+   assurances of licenses to be made available, or the result of an
+   attempt made to obtain a general license or permission for the use of
+   such proprietary rights by implementers or users of this
+   specification can be obtained from the IETF on-line IPR repository at
+   http://www.ietf.org/ipr.
+
+   The IETF invites any interested party to bring to its attention any
+   copyrights, patents or patent applications, or other proprietary
+   rights that may cover technology that may be required to implement
+   this standard.  Please address the information to the IETF at
+   ietf-ipr@ietf.org.
+
+
+
+
+
+
+
+
+
+
+
+
+Homme                       Standards Track                    [Page 11]
+
-- 
GitLab