Further Sieve patches (tidies and documentation).
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 21 Nov 2005 10:09:12 +0000 (10:09 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Mon, 21 Nov 2005 10:09:12 +0000 (10:09 +0000)
doc/doc-txt/ChangeLog
doc/doc-txt/README.SIEVE
src/src/sieve.c

index 8dce076fa2879c30e0b9fa5a78317e0825403e8d..f9acb7dd3d833b98b23cbda42fac8b6e35a30c26 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.264 2005/11/15 11:23:43 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.265 2005/11/21 10:09:12 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -136,6 +136,18 @@ PH/15 If the first argument of "${if match_address" was not empty, but did not
 
 PH/16 In autoreply, treat an empty string for "once" the same as unset.
 
+PH/17 A further patch from the Sieve maintainer: "Introduce the new Sieve
+      extension "envelope-auth".  The code is finished and in agreement with
+      other implementations, but there is no documentation so far and in fact,
+      nobody wrote the draft yet.  This extension is currently #undef'ed, thus
+      not changing the active code.
+
+      Print executed "if" and "elsif" statements when debugging is used. This
+      helps a great deal to understand what a filter does.
+
+      Document more things not specified clearly in RFC3028.  I had all this
+      sorted out, when out of a sudden new issues came to my mind.  Oops."
+
 
 Exim version 4.54
 -----------------
index 72f91da9c3969d8721f99cbc9c2fd94297c4889c..9209dac884fd939148b16526fafcb6d418142593 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/README.SIEVE,v 1.8 2005/11/14 11:41:23 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/README.SIEVE,v 1.9 2005/11/21 10:09:13 ph10 Exp $
 
               Notes on the Sieve implementation for Exim
 
@@ -132,7 +132,7 @@ implicit keep flag; there is no command to set it once it has
 been reset.
 
 
-Semantics of Fileinto
+Semantics Of Fileinto
 
 RFC 3028 does not specify if "fileinto" tries to create a mail folder,
 in case it does not exist.  This implementation allows to configure
@@ -141,7 +141,35 @@ that aspect using the appendfile transport options "create_directory",
 the Exim specification for details.
 
 
-Sieve Syntax and Semantics
+Allof And Anyof Test
+
+RFC 3028 does not specify if these tests use shortcut/lazy evaluation.
+Exim uses shortcut evaluation.
+
+
+Action Reordering
+
+RFC 3028 does not specify if actions may be executed out of order.
+Exim may execute them out of order, e.g. messages may be filed to
+folders or forwarded in a different order than specified, because
+those actions only setup delivery, but do not execute it themselves.
+
+
+Wildcard Matching
+
+RFC 3028 is not exactly clear if comparators act on unicode characters
+or on octets containing their UTF-8 representation.  As it turns out,
+many implementations go the second way.  This does not make a difference
+but for wildcard matching and octet-wise comparison.  Working on unicode
+means a dot matches a character.  Working on UTF-8 means the dot matches
+a single octet of a multi-octet sequence.  For octet-wise comparisons,
+working on UTF-8 means arbitrary byte sequences in headers can not be
+matches, as they are rarely correct UTF-8 sequences and can thus not be
+expressed as string literal.  This implementation works on unicode, but
+this may be changed in case RFC3028bis specifies this issue safe and sound.
+
+
+Sieve Syntax And Semantics
 
 RFC 3028 confuses syntax and semantics sometimes.  It uses a generic
 grammar as syntax for commands and tests and performs many checks during
index f92ac0369bef37b2cccb0bfb37c5d2ed67e20550..3fcb6413c2be29c35f9cd6b397a7c3ff58dbd03a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/sieve.c,v 1.15 2005/11/15 10:08:25 ph10 Exp $ */
+/* $Cambridge: exim/src/src/sieve.c,v 1.16 2005/11/21 10:09:13 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -28,6 +28,9 @@
 /* Undefine it for UNIX-style \n end-of-line terminators (default). */
 #undef RFC_EOL
 
+/* Define this for development of the Sieve extension "envelope-auth". */
+#undef ENVELOPE_AUTH
+
 /* Define this for development of the Sieve extension "notify".     */
 #undef NOTIFY
 
@@ -55,6 +58,9 @@ struct Sieve
   int keep;
   int require_envelope;
   int require_fileinto;
+#ifdef ENVELOPE_AUTH
+  int require_envelope_auth;
+#endif
 #ifdef NOTIFY
   int require_notify;
 #endif
@@ -98,6 +104,8 @@ static uschar str_cc_c[]="Cc";
 static const struct String str_cc={ str_cc_c, 2 };
 static uschar str_bcc_c[]="Bcc";
 static const struct String str_bcc={ str_bcc_c, 3 };
+static uschar str_auth_c[]="auth";
+static const struct String str_auth={ str_auth_c, 4 };
 static uschar str_sender_c[]="Sender";
 static const struct String str_sender={ str_sender_c, 6 };
 static uschar str_resent_from_c[]="Resent-From";
@@ -108,6 +116,10 @@ static uschar str_fileinto_c[]="fileinto";
 static const struct String str_fileinto={ str_fileinto_c, 8 };
 static uschar str_envelope_c[]="envelope";
 static const struct String str_envelope={ str_envelope_c, 8 };
+#ifdef ENVELOPE_AUTH
+static uschar str_envelope_auth_c[]="envelope-auth";
+static const struct String str_envelope_auth={ str_envelope_auth_c, 13 };
+#endif
 #ifdef NOTIFY
 static uschar str_notify_c[]="notify";
 static const struct String str_notify={ str_notify_c, 6 };
@@ -1834,6 +1846,9 @@ else if (parse_identifier(filter,CUS "envelope"))
                   <envelope-part: string-list> <key-list: string-list>
 
   envelope-part is case insensitive "from" or "to"
+#ifdef ENVELOPE_AUTH
+  envelope-part =/ "auth"
+#endif
   */
 
   enum Comparator comparator=COMP_EN_ASCII_CASEMAP;
@@ -1929,6 +1944,23 @@ else if (parse_identifier(filter,CUS "envelope"))
         case ADDRPART_DOMAIN: envelopeExpr=CUS "$domain"; break;
         }
       }
+#ifdef ENVELOPE_AUTH
+    else if (eq_asciicase(e,&str_auth,0))
+      {
+      switch (addressPart)
+        {
+        case ADDRPART_ALL: envelopeExpr=CUS "$authenticated_sender"; break;
+#ifdef SUBADDRESS
+        case ADDRPART_USER:
+#endif
+        case ADDRPART_LOCALPART: envelopeExpr=CUS "${local_part:$authenticated_sender}"; break;
+        case ADDRPART_DOMAIN: envelopeExpr=CUS "${domain:$authenticated_sender}"; break;
+#ifdef SUBADDRESS
+        case ADDRPART_DETAIL: envelopeExpr=CUS 0; break;
+#endif
+        }
+      }
+#endif
     else
       {
       filter->errmsg=CUS "invalid envelope string";
@@ -2069,6 +2101,11 @@ while (*filter->pc)
       {
       if (exec) debug_printf("if %s\n",cond?"true":"false");
       }
+    if ((filter_test != FTEST_NONE && debug_selector != 0) ||
+        (debug_selector & D_filter) != 0)
+      {
+      if (exec) debug_printf("if %s\n",cond?"true":"false");
+      }
     m=parse_block(filter,exec ? cond : 0, generated);
     if (m==-1 || m==2) return m;
     if (m==0)
@@ -2095,6 +2132,11 @@ while (*filter->pc)
           {
           if (exec) debug_printf("elsif %s\n",cond?"true":"false");
           }
+        if ((filter_test != FTEST_NONE && debug_selector != 0) ||
+            (debug_selector & D_filter) != 0)
+          {
+          if (exec) debug_printf("elsif %s\n",cond?"true":"false");
+          }
         m=parse_block(filter,exec && unsuccessful ? cond : 0, generated);
         if (m==-1 || m==2) return m;
         if (m==0)
@@ -2616,6 +2658,9 @@ filter->line=1;
 filter->keep=1;
 filter->require_envelope=0;
 filter->require_fileinto=0;
+#ifdef ENVELOPE_AUTH
+filter->require_envelope_auth=0;
+#endif
 #ifdef NOTIFY
 filter->require_notify=0;
 #endif
@@ -2684,6 +2729,9 @@ while (parse_identifier(filter,CUS "require"))
     {
     if (eq_octet(check,&str_envelope,0)) filter->require_envelope=1;
     else if (eq_octet(check,&str_fileinto,0)) filter->require_fileinto=1;
+#ifdef ENVELOPE_AUTH
+    else if (eq_octet(check,&str_envelope_auth,0)) filter->require_envelope_auth=1;
+#endif
 #ifdef NOTIFY
     else if (eq_octet(check,&str_notify,0)) filter->require_notify=1;
 #endif