One document matched: draft-ietf-sieve-external-lists-04.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY Kwds        PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml'>
<!ENTITY ABNF        PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5234.xml'>
<!ENTITY Sieve       PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5228.xml'>
<!ENTITY ManageSieve PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5804.xml'>
<!ENTITY URI         PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.3986.xml'>
<!ENTITY TAG-URI     PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.4151.xml'>
<!ENTITY ACAP        PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.2244.xml'>
<!ENTITY LDAP        PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.4510.xml'>
<!ENTITY Variables   PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5229.xml'>
<!ENTITY Subaddress  PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5233.xml'>
<!ENTITY Relational  PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5231.xml'>
<!ENTITY Spamtest    PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5235.xml'>
<!ENTITY Date        PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5260.xml'>
<!ENTITY Notify      PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5435.xml'>
<!ENTITY NotifyXMPP  PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5437.xml'>
<!ENTITY Ihave       PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.5463.xml'>
<!ENTITY carddav     PUBLIC '' 'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.draft-ietf-vcarddav-carddav-10.xml'>
]>
<!-- ?xml-stylesheet type='text/xsl' href='http://xml.resource.org/authoring/rfc2629.xslt' ? -->
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>

<?rfc toc="yes" ?>
<?rfc tocompact="no" ?>
<?rfc tocindent="no" ?>
<?rfc comments="yes" ?>
<?rfc inline="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc sortrefs="yes"?>
<?rfc iprnotified="no" ?>
<?rfc strict="yes" ?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>

<rfc category="std"
     ipr="trust200902"
     docName="draft-ietf-sieve-external-lists-04">
    <front>
        <title>Sieve Extension: Externally Stored Lists</title>
        <author initials='A.' surname="Melnikov" fullname="Alexey Melnikov">
            <organization>Isode Limited</organization>
            <address>
              <postal>
                <street>5 Castle Business Village</street>
                <street>36 Station Road</street>
                <city>Hampton</city>
                <region>Middlesex</region>
                <code>TW12 2BX</code>
                <country>UK</country>
              </postal>
              <email>Alexey.Melnikov@isode.com</email>
            </address>
        </author>
        <author initials='B.' surname="Leiba" fullname="Barry Leiba">
            <organization>Huawei Technologies</organization>
            <address>
              <phone>+1 646 827 0648</phone>
              <email>barryleiba@computer.org</email>
              <uri>http://internetmessagingtechnology.org/</uri>
            </address>
        </author>
        <date year="2010"/>
        <area>Applications</area>
        <workgroup>Sieve Working Group</workgroup>
        <keyword>Sieve</keyword>
        <keyword>external list</keyword>
        
        <abstract>
          <t>
            The Sieve scripting language can be used to implement whitelisting,
            blacklisting, personal distribution lists, and other sorts of list matching.
            Currently, this requires
            that all members of such lists be hardcoded in the script itself.
            Whenever a member of a list is added or deleted, the script needs
            to be updated and possibly uploaded to a mail server.
          </t>
            
          <t>
            This document defines a Sieve extension for accessing externally stored
            lists -- lists whose members are stored externally to the script, such as
            using LDAP (RFC 4510), ACAP (RFC 2244), or relational databases.
          </t>
        </abstract>
        
        <note title="ToDo">
          <t>
            <list style="symbols">
              <t>
                Do we need support for URI schemes in ihave?  From IETF 77 minutes:
                "Can use ihave to test if a URI is valid, both that the scheme is supported and
                that the URI can be retrieved/queried."
              </t>
              <t>
                Do we need to say anything about comparators?  We can be silent (as now),
                we can say that comparators MAY be ignored as a list-specific thing,
                or we can say that comparators MUST NOT be used.
              </t>
              <t>
                Should we add a mandatory-to-implement tag?  Ned suggests (and I agree) that
                it might be good to add a registry of well-defined strings that can be used
                instead of URIs, and define the initial string "pab" to represent the user's
                personal address book.
              </t>
            </list>
          </t>
        </note>
    </front>

    <middle>
        <section anchor="intro" title="Introduction">
          <t>
            This document specifies an extension to the Sieve language <xref target="RFC5228"/>
            for checking membership in an external list 
            or for redirecting messages to an external list of recipients.
            An "external list" is a list whose members are stored externally to the Sieve script,
            such as using LDAP <xref target="RFC4510"/>, ACAP <xref target="RFC2244"/>,
            or relational databases.
          </t>
          <t>
            This extension adds a new match type to apply to supported tests,
            and a new tagged argument to the "redirect" action.
          </t>
          
          <section title="Conventions used in this document">
            <t>
              Conventions for notations are as in <xref target="RFC5228"/> section 1.1, including
              the use of <xref target="RFC5234"/>.
            </t>
            <t>
              The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
              "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
              document are to be interpreted as described in <xref target="RFC2119"/>.
            </t>
          </section>
        </section>
        
        <section title="Extlists extension">
            
          <section anchor="capability" title="Capability Identifier">
            <t>
              The capability string associated with the extension defined in this
              document is "extlists".
            </t>
          </section>

          <section title=':list match type for supported tests'>
            <t>ABNF:
              <list style="hanging" hangIndent="8">
                <t hangText="   MATCH-TYPE">=/ ":list"
                  <vspace />; only valid for supported tests
                </t>
              </list>
            </t>
            <t>
              The new ":list" match type changes the interpretation
              of the "key-list" parameter (the second parameter) to
              supported tests.
              When the match type is ":list", the key-list becomes a list of names of externally
              stored lists. The external lists are queried, perhaps through a list-specific
              mechanism, and the test evaluates to "true" if any of the specified values
              matches any member of one or more of the lists.
            </t>
            <t>
              Implementations MUST support "address", "envelope" and "header" tests.
              Implementations that include the Variables extension <xref target="RFC5229" />
              MUST also support "string" tests.
            </t>
            <t>
              Implementations MAY support other tests but MUST raise an error
              (which SHOULD be a compile-time error, but MAY be a runtime error)
              when a script uses :list with a test for which it is not supported.
              To maintain interoperability, other tests that can be used with :list
              SHOULD be documented in a
              specification that defines a capability string that can be tested (in a
              "require" statement, or using ihave <xref target="RFC5463" />).
            </t>
            <t>
              For example, testing ':header ["to", "cc"]' against a list would cause each
              "to" and "cc" value, ignoring leading and trailing whitespace, to be queried.
              If any value is found to belong to the list, the test returns "true".
              If no value belongs to the list, the test returns "false".
              Once a value is found in the list, there is no need for the query
              mechanism to look further.
            </t>              
            <t>
              For some lists, the Sieve engine might directly retrieve the list and make its
              own comparison.  Other lists might not work that way -- they might provide a way
              to ask if a value is in the list, but not permit retrieval of the list itself.
              It is up to the Sieve implementation to understand how to interact with any
              supported list.  If the Sieve engine is permanently unable to query the list
              (perhaps because the list doesn't support the required operation), the test
              MUST result in a runtime error in the Sieve script.
            </t>
            <t>
              See <xref target="list-name-syntax"/> for the detailed description
              of syntax used for naming externally stored lists.
            </t>
          </section>

          <section title=':list tagged argument to the "redirect" action'>
            <t>
              <list style="hanging" hangIndent="8">
                <t hangText="Usage:">
                  redirect :list <ext-list-name: string>
                </t>
              </list>
            </t>
            <t>
              The "redirect" action with the ":list" argument is used to send
              the message to one or more email addresses stored in the externally stored
              list 'ext-list-name'. This variant of the redirect command can be used
              to implement a personal distribution list.
            </t>
            <t>
              For this feature to work, one of the following conditions has to be true:
              <list style="numbers">
                <t>
                  The list resolves to a list of email addresses, and the Sieve
                  engine is able to enumerate those addresses.
                </t>
                <t>
                  The list handler is able to take care of the redirection on
                  behalf of the Sieve engine.
                </t>
              </list>
            </t>

            <t>
              In cases where, for example, a list contains hashed email address values or
              an email address pattern ("sz*@example.com", "*+ietf@example.net"),
              the Sieve engine will not be able to redirect to that list, and responsibility
              must pass to the list handler.
            </t>
            <t>
              If neither the Sieve engine nor the list handler
              can enumerate (or iterate) the list, or the list
              does not resolve to email addresses, the situation
              MUST result in a runtime error in the Sieve script.
            </t>
            <t>
              See <xref target="list-name-syntax"/> for the detailed description
              of syntax used for naming externally stored lists.
            </t>
          </section>

          <section anchor="other-uses" title='Other uses for external lists'>
            <t>
              The uses for external lists specified here represent the useful
              cases and situations at the time of this writing.
              Other uses for external lists, using other Sieve features,
              might be devised in the future, and such uses can be
              described in extensions to this document.
            </t>
          </section>

          <section anchor="list-name-syntax" title='Syntax of an externally stored list name'>
            <t>
              A name of an externally stored list is always an absolute URI <xref target="RFC3986"/>.
              Implementations might find URIs such as LDAP <xref target="RFC4510"/>,
              CardDAV <xref target="I-D.ietf-vcarddav-carddav"/>,
              or Tag <xref target="RFC4151"/> to be useful for naming external lists.
            </t>
            <t>
              The "tag" URI scheme <xref target="RFC4151"/> MUST be supported, and
              can be used to represent opaque,
              but user friendlier identifiers. Resolution of such identifiers is going
              to be implementation specific and it can help in hiding the complexity of
              an implementation from end users. For example, an implementation can
              provide a web interface for managing lists of users stored in LDAP.
              Requiring users to know generic LDAP URI syntax might not be very
              practical, due to its complexity. An implementation can instead use
              a fixed tag URI prefix such as "tag:example.com,<date>:" (where <date>
              can be, for example, a date generated once on installation of the web interface and
              left untouched upon upgrades)
              and the prefix doesn't even need to be shown to end users.
            </t>

          </section>

          <section anchor="manage-sieve" title='Interaction with ManageSieve'>
            <t>
              This extension defines the following new capability for ManageSieve
              (see <xref target="RFC5804"/> section 1.7):
            </t>
            <t>
              EXTLISTS - A space-separated list of URI schema parts <xref target="RFC3986"/>
              for supported externally stored list types.  This capability MUST be returned
              if the Sieve implementation supports the "extlists" extension defined in this
              document.
            </t>
            <t>
              This also extends the ManageSieve ABNF as follows:
              <list style="hanging" hangIndent="8">
                <t hangText="single-capability">=/ DQUOTE "EXTLISTS" DQUOTE SP ext-list-types CRLF
                  <vspace />; single-capability is defined in <xref target="RFC5804"/>
                </t>
                <t hangText="ext-list-types">= string
                  <vspace />; space separated list of URI schema parts
                  <vspace />; for supported externally stored list types.
                  <vspace />; MUST NOT be empty.
                </t>
              </list>
            </t>

          </section>

          <section anchor="examples" title='Examples'>

            <section anchor="example1" title='Example 1'>
            <t>
              This example uses the "envelope" option <xref target="RFC5228"/>
              and the "subaddress" extension  <xref target="RFC5233"/>:
              <figure>
               <artwork><![CDATA[
    require ["extlists", "envelope", "subaddress"];

    # Submission from list members is sent to all members
    if allof (envelope :detail :list "to"
                       "tag:example.com,2009-05-28:mylist",
              header :list "from"
                     "tag:example.com,2009-05-28:mylist") {
        redirect :list "tag:example.com,2009-05-28:mylist";
    }
]]></artwork>
              </figure>
            </t>
            </section>

            <section anchor="example2" title='Example 2'>
            <t>
              This example uses the "currentdate" test <xref target="RFC5260"/>
              and a list containing the dates of local holidays.  If today is
              a holiday, the script will notify <xref target="RFC5435"/>
              the user via XMPP <xref target="RFC5437"/>
              about the message.
              <figure>
               <artwork><![CDATA[
    require ["extlists", "date", "enotify"];
    if currentdate :list "date"
       "tag:example.com,2010-01-01:localHolidays" {
       notify "xmpp:romeo@im.example.com";
    }
]]></artwork>
              </figure>
            </t>
            </section>

            <section anchor="example3" title='Example 3'>
            <t>
              This example uses a personal address book, along with
              spamtest  <xref target="RFC5235"/>
              and the relational extension <xref target="RFC5231"/>
              to give a different level of spam tolerance to known senders.
              <figure>
               <artwork><![CDATA[
    require ["envelope", "extlists", "fileinto", "spamtest",
             "relational", "comparator-i;ascii-numeric"];
    if allof (
         envelope :list "from" "tag:example.com,2010-04-10:pab",
         spamtest :value "ge" :comparator "i;ascii-numeric" "8"
             )
      { /* Known: allow high spam score */
        fileinto "spam";
      }
    elsif spamtest :value "ge" :comparator "i;ascii-numeric" "3"
      { /* Unknown: less tolerance in spam score */
        fileinto "spam";
      }
]]></artwork>
              </figure>
            </t>
            </section>

          </section>
        </section>


        <section anchor="security" title="Security Considerations">
          <t>
            Security considerations related to the "address"/"envelope"/"header" tests and
            "redirect" action discussed in Sieve <xref target="RFC5228"/> also apply
            to this document.
          </t>

          <t>
            External list memberships ought to be treated as if they are
            an integral part of the script,
            so a temporary failure to access an external list
            SHOULD be handled in the same way as a temporary failure to retrieve
            the Sieve script itself.
          </t>

          <t>
            For example, if the Sieve script is stored in the 
            Lightweight Directory Access Protocol <xref target="RFC4510"/> and the script
            can't be retrieved when a message is processed (perhaps the LDAP server is
            unavailable), then the Sieve engine
            might delay message delivery until the script can be retrieved successfully.
            Similarly, if an external list is stored in LDAP and that LDAP server is
            unavailable, the Sieve engine would take the same action -- delay message delivery
            and try again later.
          </t>

          <t>
            Protocols/APIs used to retrieve/verify external list membership MUST provide
            an appropriate level of confidentiality and authentication.
            Usually, that will be at least the same level of confidentiality as
            protocols/APIs used to retrieve Sieve scripts, but only the implementation
            (or deployment) will know what is appropriate.
            There's a difference, for example, between making an LDAP
            request on a closed LAN that's only used for trusted servers
            (it may be that neither encryption nor authentication is needed),
            on a firewalled LAN internal to a company
            (it might be OK to skip encryption, depending upon policy),
            and on the open Internet
            (encryption and authentication are probably both required).
            It also matters whether the list being accessed is private or public
            (no encryption or authentication may be needed for public data, even on the
            Internet).
          </t>
            
          <t>
            Implementations of this extension should keep in mind that
            matching values against an externally stored list can be IO
            and/or CPU intensive. This can be used to deny service to the mailserver
            and/or to servers providing access to externally stored mailing lists.
            A naïve implementation, such as the one that tries to retrieve content
            of the whole list to perform matching can make this worse.
          </t>
            
          <t>
            But note that many protocols that can be used for accessing externally
            stored lists support flexible searching features that can be used
            to minimize network traffic and load on the directory service.
            For example, LDAP allows for search filters.
            Implementations SHOULD use such features whenever they can.
          </t>

          <t>
            Many organizations support external lists with thousands of recipients.
            In order to avoid mailbombs when redirecting a message to
            an externally stored list, implementations SHOULD enforce
            limits on the number of recipients and/or on domains to which such
            recipients belong.
          </t>
        </section>

        <section anchor="iana" title="IANA Considerations">
          <section title="Registration of Sieve extension">
            <t>
              The following template specifies the IANA registration of the
              Sieve extension specified in this document:
            </t>
            <t>
              To: iana@iana.org
              <vspace/>
              Subject: Registration of new Sieve extension
              <vspace/>
              Capability name: extlists
              <vspace/>
              Description: adds the ':list' match type to certain Sieve tests,
              and the ':list' argument to the 'redirect' action.
              The ':list' match type changes tests to match
              values against values stored in one or more externally stored
              lists. The ':list' argument to the redirect action changes
              the redirect action to forward the message to email addresses
              stored in the externally stored list.
              <vspace/>
              RFC number: this RFC
              <vspace/>
              Contact address:
              <vspace/>
                  The Sieve discussion list <sieve@ietf.org>
            </t>
            <t>
              This information should be added to the list of sieve extensions
              given on http://www.iana.org/assignments/sieve-extensions.
            </t>
          </section>

          <section title="Registration of ManageSieve capability">
            <t>
              The following requests IANA to register a new ManageSieve Capability according
              to the IANA registration template specified in <xref target="RFC5804"/>:
            </t>
            <t>
              To: iana@iana.org
              <vspace/>
              Subject: ManageSieve Capability Registration
              <vspace/>
              Capability name: extlists
              <vspace/>
              Description: This capability is returned if the server supports the
              "extlists" [RFCXXXX] Sieve extension.
              <vspace/>
              Relevant publications: this RFC, <xref target="manage-sieve"/>
              <vspace/>
              Person & email address to contact for further information:
              Alexey Melnikov <alexey.melnikov@isode.com>
              <vspace/>
              Author/Change controller: IESG
            </t>
          </section>
        </section>

        <section anchor="acknowledgements" title="Acknowledgements">
            <t>
            Thanks to Alexandros Vellis, Nigel Swinson, Ned Freed,
            Kjetil Torgrim Homme, Dave Cridland, Cyrus Daboo, Pete Resnick,
            and Robert Burrell Donkin
            for ideas, comments and suggestions.
            Kristin Hubner also helped greatly with the examples.
            </t>
        </section>
    </middle>

    <back>
      <references title="Normative References">
        &Kwds;
        &ABNF;
        &Sieve;
        &ManageSieve;
        &URI;
        &TAG-URI;
      </references>
        
      <references title="Informative References">
        &ACAP;
        &LDAP;
        &Variables;
        &Subaddress;
        &Relational;
        &Spamtest;
        &Date;
        &Notify;
        &NotifyXMPP;
        &Ihave;
        &carddav;
      </references>
    </back>
</rfc>

PAFTECH AB 2003-20262026-04-24 17:18:26