Implement the infrastructure of the mailto notification owner as
authorMichael Haardt <michael@moria.de>
Thu, 18 Dec 2008 13:13:53 +0000 (13:13 +0000)
committerMichael Haardt <michael@moria.de>
Thu, 18 Dec 2008 13:13:53 +0000 (13:13 +0000)
required by draft-ietf-sieve-notify-mailto-10.  There is a new redirect
router option sieve_enotify_mailto_owner, which is passed to the Sieve
interpreter.  The actual Sieve patch will follow later.

src/src/deliver.c
src/src/filtertest.c
src/src/functions.h
src/src/rda.c
src/src/routers/queryprogram.c
src/src/routers/redirect.c
src/src/routers/redirect.h
src/src/sieve.c

index c209e12f2863f44dbb951ea79f25b573b9fdce7b..9ab1510e4950bb615da27e6f76d6fe8b08b2a0bd 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/deliver.c,v 1.45 2007/08/22 14:20:28 ph10 Exp $ */
+/* $Cambridge: exim/src/src/deliver.c,v 1.46 2008/12/18 13:13:54 michael Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -4807,6 +4807,7 @@ else if (system_filter != NULL && process_recipients != RECIP_FAIL_TIMEOUT)
       RDO_REWRITE,
     NULL,                   /* No :include: restriction (not used in filter) */
     NULL,                   /* No sieve vacation directory (not sieve!) */
       RDO_REWRITE,
     NULL,                   /* No :include: restriction (not used in filter) */
     NULL,                   /* No sieve vacation directory (not sieve!) */
+    NULL,                   /* No sieve enotify mailto owner (not sieve!) */
     NULL,                   /* No sieve user address (not sieve!) */
     NULL,                   /* No sieve subaddress (not sieve!) */
     &ugid,                  /* uid/gid data */
     NULL,                   /* No sieve user address (not sieve!) */
     NULL,                   /* No sieve subaddress (not sieve!) */
     &ugid,                  /* uid/gid data */
index 30f29562aa3c1a7b9d8fed7dfd93633ae7c9153c..37fc13d45517c3b635e9e7eccd2b309f5523e992 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/filtertest.c,v 1.10 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/filtertest.c,v 1.11 2008/12/18 13:13:54 michael Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -272,7 +272,7 @@ if (is_system)
 else
   {
   yield = (filter_type == FILTER_SIEVE)?
 else
   {
   yield = (filter_type == FILTER_SIEVE)?
-    sieve_interpret(filebuf, RDO_REWRITE, NULL, NULL, NULL, &generated, &error)
+    sieve_interpret(filebuf, RDO_REWRITE, NULL, NULL, NULL, NULL, &generated, &error)
     :
     filter_interpret(filebuf, RDO_REWRITE, &generated, &error);
   }
     :
     filter_interpret(filebuf, RDO_REWRITE, &generated, &error);
   }
index 514d113cffc34e413078506fd85b154c134f1bd4..2c77c17fd93342dd1923d4de67f01285bc03cd4f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/functions.h,v 1.42 2008/06/04 13:28:23 michael Exp $ */
+/* $Cambridge: exim/src/src/functions.h,v 1.43 2008/12/18 13:13:54 michael Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -203,8 +203,8 @@ extern int     random_number(int);
 extern int     recv_line(int, uschar *, int);
 #endif
 extern int     rda_interpret(redirect_block *, int, uschar *, uschar *,
 extern int     recv_line(int, uschar *, int);
 #endif
 extern int     rda_interpret(redirect_block *, int, uschar *, uschar *,
-                 uschar *, uschar *, ugid_block *, address_item **, uschar **,
-                 error_block **, int *, uschar *);
+                 uschar *, uschar *, uschar *, ugid_block *, address_item **,
+                 uschar **, error_block **, int *, uschar *);
 extern int     rda_is_filter(const uschar *);
 extern BOOL    readconf_depends(driver_instance *, uschar *);
 extern void    readconf_driver_init(uschar *, driver_instance **,
 extern int     rda_is_filter(const uschar *);
 extern BOOL    readconf_depends(driver_instance *, uschar *);
 extern void    readconf_driver_init(uschar *, driver_instance **,
@@ -268,7 +268,7 @@ extern void    sha1_end(sha1 *, const uschar *, int, uschar *);
 extern void    sha1_mid(sha1 *, const uschar *);
 extern void    sha1_start(sha1 *);
 extern int     sieve_interpret(uschar *, int, uschar *, uschar *, uschar *,
 extern void    sha1_mid(sha1 *, const uschar *);
 extern void    sha1_start(sha1 *);
 extern int     sieve_interpret(uschar *, int, uschar *, uschar *, uschar *,
-                 address_item **, uschar **);
+                 uschar *, address_item **, uschar **);
 extern void    sigalrm_handler(int);
 extern BOOL    smtp_buffered(void);
 extern void    smtp_closedown(uschar *);
 extern void    sigalrm_handler(int);
 extern BOOL    smtp_buffered(void);
 extern void    smtp_closedown(uschar *);
index 13701dca47b6f141c28330598ff46441725d804c..2af9fbfaadc23e9384be1a7e64354df0355c9f25 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/rda.c,v 1.14 2007/01/08 10:50:18 ph10 Exp $ */
+/* $Cambridge: exim/src/src/rda.c,v 1.15 2008/12/18 13:13:54 michael Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -327,6 +327,7 @@ Arguments:
   options                   the options bits
   include_directory         restrain to this directory
   sieve_vacation_directory  passed to sieve_interpret
   options                   the options bits
   include_directory         restrain to this directory
   sieve_vacation_directory  passed to sieve_interpret
+  sieve_enotify_mailto_owner passed to sieve_interpret
   sieve_useraddress         passed to sieve_interpret
   sieve_subaddress          passed to sieve_interpret
   generated                 where to hang generated addresses
   sieve_useraddress         passed to sieve_interpret
   sieve_subaddress          passed to sieve_interpret
   generated                 where to hang generated addresses
@@ -344,9 +345,10 @@ Returns:                    a suitable return for rda_interpret()
 
 static int
 rda_extract(redirect_block *rdata, int options, uschar *include_directory,
 
 static int
 rda_extract(redirect_block *rdata, int options, uschar *include_directory,
-  uschar *sieve_vacation_directory, uschar *sieve_useraddress,
-  uschar *sieve_subaddress, address_item **generated, uschar **error,
-  error_block **eblockp, int *filtertype)
+  uschar *sieve_vacation_directory, uschar *sieve_enotify_mailto_owner,
+  uschar *sieve_useraddress, uschar *sieve_subaddress,
+  address_item **generated, uschar **error, error_block **eblockp,
+  int *filtertype)
 {
 uschar *data;
 
 {
 uschar *data;
 
@@ -405,7 +407,8 @@ if (*filtertype != FILTER_FORWARD)
       return FF_ERROR;
       }
     frc = sieve_interpret(data, options, sieve_vacation_directory,
       return FF_ERROR;
       }
     frc = sieve_interpret(data, options, sieve_vacation_directory,
-      sieve_useraddress, sieve_subaddress, generated, error);
+      sieve_enotify_mailto_owner, sieve_useraddress, sieve_subaddress,
+      generated, error);
     }
 
   expand_forbid = old_expand_forbid;
     }
 
   expand_forbid = old_expand_forbid;
@@ -511,7 +514,8 @@ Arguments:
   options                   options to pass to the extraction functions,
                               plus ENOTDIR and EACCES handling bits
   include_directory         restrain :include: to this directory
   options                   options to pass to the extraction functions,
                               plus ENOTDIR and EACCES handling bits
   include_directory         restrain :include: to this directory
-  sieve_vacation_directory  directory passed to sieve_interpret()
+  sieve_vacation_directory  directory passed to sieve_interpret
+  sieve_enotify_mailto_owner passed to sieve_interpret
   sieve_useraddress         passed to sieve_interpret
   sieve_subaddress          passed to sieve_interpret
   ugid                      uid/gid to run under - if NULL, no change
   sieve_useraddress         passed to sieve_interpret
   sieve_subaddress          passed to sieve_interpret
   ugid                      uid/gid to run under - if NULL, no change
@@ -540,9 +544,10 @@ Returns:        values from extraction function, or FF_NONEXIST:
 
 int
 rda_interpret(redirect_block *rdata, int options, uschar *include_directory,
 
 int
 rda_interpret(redirect_block *rdata, int options, uschar *include_directory,
-  uschar *sieve_vacation_directory, uschar *sieve_useraddress,
-  uschar *sieve_subaddress, ugid_block *ugid, address_item **generated,
-  uschar **error, error_block **eblockp, int *filtertype, uschar *rname)
+  uschar *sieve_vacation_directory, uschar *sieve_enotify_mailto_owner,
+  uschar *sieve_useraddress, uschar *sieve_subaddress, ugid_block *ugid,
+  address_item **generated, uschar **error, error_block **eblockp,
+  int *filtertype, uschar *rname)
 {
 int fd, rc, pfd[2];
 int yield, status;
 {
 int fd, rc, pfd[2];
 int yield, status;
@@ -586,8 +591,8 @@ if (!ugid->uid_set ||                         /* Either there's no uid, or */
      Ustrstr(data, ":include:") == NULL))     /* and there's no :include: */
   {
   return rda_extract(rdata, options, include_directory,
      Ustrstr(data, ":include:") == NULL))     /* and there's no :include: */
   {
   return rda_extract(rdata, options, include_directory,
-    sieve_vacation_directory, sieve_useraddress, sieve_subaddress,
-    generated, error, eblockp, filtertype);
+    sieve_vacation_directory, sieve_enotify_mailto_owner, sieve_useraddress,
+    sieve_subaddress, generated, error, eblockp, filtertype);
   }
 
 /* We need to run the processing code in a sub-process. However, if we can
   }
 
 /* We need to run the processing code in a sub-process. However, if we can
@@ -636,8 +641,8 @@ if ((pid = fork()) == 0)
   /* Now do the business */
 
   yield = rda_extract(rdata, options, include_directory,
   /* Now do the business */
 
   yield = rda_extract(rdata, options, include_directory,
-    sieve_vacation_directory, sieve_useraddress, sieve_subaddress, generated,
-    error, eblockp, filtertype);
+    sieve_vacation_directory, sieve_enotify_mailto_owner, sieve_useraddress,
+    sieve_subaddress, generated, error, eblockp, filtertype);
 
   /* Pass back whether it was a filter, and the return code and any overall
   error text via the pipe. */
 
   /* Pass back whether it was a filter, and the return code and any overall
   error text via the pipe. */
index b5f0b435e6a43d1cbe6ee66cd1f33590c2c7443d..3ae577ba8255d807f7b39d3e2038733ee8b5545b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/routers/queryprogram.c,v 1.10 2007/01/08 10:50:20 ph10 Exp $ */
+/* $Cambridge: exim/src/src/routers/queryprogram.c,v 1.11 2008/12/18 13:13:54 michael Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -378,6 +378,7 @@ if (strcmpic(rword, US"REDIRECT") == 0)
       RDO_REWRITE,               /* rewrite generated addresses */
     NULL,                        /* :include: directory not relevant */
     NULL,                        /* sieve vacation directory not relevant */
       RDO_REWRITE,               /* rewrite generated addresses */
     NULL,                        /* :include: directory not relevant */
     NULL,                        /* sieve vacation directory not relevant */
+    NULL,                        /* sieve enotify mailto owner not relevant */
     NULL,                        /* sieve useraddress not relevant */
     NULL,                        /* sieve subaddress not relevant */
     &ugid,                       /* uid/gid (but not set) */
     NULL,                        /* sieve useraddress not relevant */
     NULL,                        /* sieve subaddress not relevant */
     &ugid,                       /* uid/gid (but not set) */
index 74aba2065ea17720b69f061bb4654a4489ac34f8..7a8f5b755b842cf8977a826c99be38b2cc7877a3 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/routers/redirect.c,v 1.20 2007/01/08 10:50:20 ph10 Exp $ */
+/* $Cambridge: exim/src/src/routers/redirect.c,v 1.21 2008/12/18 13:13:54 michael Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -107,6 +107,8 @@ optionlist redirect_router_options[] = {
       (void *)offsetof(redirect_router_options_block, sieve_useraddress) },
   { "sieve_vacation_directory", opt_stringptr,
       (void *)offsetof(redirect_router_options_block, sieve_vacation_directory) },
       (void *)offsetof(redirect_router_options_block, sieve_useraddress) },
   { "sieve_vacation_directory", opt_stringptr,
       (void *)offsetof(redirect_router_options_block, sieve_vacation_directory) },
+  { "sieve_enotify_mailto_owner", opt_stringptr,
+      (void *)offsetof(redirect_router_options_block, sieve_enotify_mailto_owner) },
   { "skip_syntax_errors", opt_bool,
       (void *)offsetof(redirect_router_options_block, skip_syntax_errors) },
 #ifdef EXPERIMENTAL_SRS
   { "skip_syntax_errors", opt_bool,
       (void *)offsetof(redirect_router_options_block, skip_syntax_errors) },
 #ifdef EXPERIMENTAL_SRS
@@ -151,6 +153,7 @@ redirect_router_options_block redirect_router_option_defaults = {
   NULL,        /* sieve_subaddress */
   NULL,        /* sieve_useraddress */
   NULL,        /* sieve_vacation_directory */
   NULL,        /* sieve_subaddress */
   NULL,        /* sieve_useraddress */
   NULL,        /* sieve_vacation_directory */
+  NULL,        /* sieve_enotify_mailto_owner */
   NULL,        /* syntax_errors_text */
   NULL,        /* syntax_errors_to */
   NULL,        /* qualify_domain */
   NULL,        /* syntax_errors_text */
   NULL,        /* syntax_errors_to */
   NULL,        /* qualify_domain */
@@ -693,10 +696,10 @@ else
   }
 
 frc = rda_interpret(&redirect, options, ob->include_directory,
   }
 
 frc = rda_interpret(&redirect, options, ob->include_directory,
-  ob->sieve_vacation_directory, ob->sieve_useraddress, ob->sieve_subaddress,
-  &ugid, &generated, &(addr->message), ob->skip_syntax_errors? &eblock : NULL,
-  &filtertype, string_sprintf("%s router (recipient is %s)", rblock->name,
-  addr->address));
+  ob->sieve_vacation_directory, ob->sieve_enotify_mailto_owner,
+  ob->sieve_useraddress, ob->sieve_subaddress, &ugid, &generated,
+  &(addr->message), ob->skip_syntax_errors? &eblock : NULL, &filtertype,
+  string_sprintf("%s router (recipient is %s)", rblock->name, addr->address));
 
 qualify_domain_recipient = save_qualify_domain_recipient;
 
 
 qualify_domain_recipient = save_qualify_domain_recipient;
 
index e4f6f2abeb77c6452a600fe7e09bd78f8239e447..dfed4697a5278de1da635d48ef463d9620643955 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/routers/redirect.h,v 1.9 2007/01/08 10:50:20 ph10 Exp $ */
+/* $Cambridge: exim/src/src/routers/redirect.h,v 1.10 2008/12/18 13:13:54 michael Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -28,6 +28,7 @@ typedef struct {
   uschar *sieve_subaddress;
   uschar *sieve_useraddress;
   uschar *sieve_vacation_directory;
   uschar *sieve_subaddress;
   uschar *sieve_useraddress;
   uschar *sieve_vacation_directory;
+  uschar *sieve_enotify_mailto_owner;
   uschar *syntax_errors_text;
   uschar *syntax_errors_to;
   uschar *qualify_domain;
   uschar *syntax_errors_text;
   uschar *syntax_errors_to;
   uschar *qualify_domain;
index 30fa62999302861828925143eba52b3a8d86de2b..f1b7cd1f7f1c375cd87f7b801e1aa2a1c10fc801 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/sieve.c,v 1.35 2008/11/18 11:10:43 michael Exp $ */
+/* $Cambridge: exim/src/src/sieve.c,v 1.36 2008/12/18 13:13:53 michael Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -71,6 +71,7 @@ struct Sieve
   int require_enotify;
   struct Notification *notified;
 #endif
   int require_enotify;
   struct Notification *notified;
 #endif
+  uschar *enotify_mailto_owner;
 #ifdef SUBADDRESS
   int require_subaddress;
 #endif
 #ifdef SUBADDRESS
   int require_subaddress;
 #endif
@@ -3490,7 +3491,15 @@ while (parse_identifier(filter,CUS "require"))
     else if (eq_octet(check,&str_envelope_auth,0)) filter->require_envelope_auth=1;
 #endif
 #ifdef ENOTIFY
     else if (eq_octet(check,&str_envelope_auth,0)) filter->require_envelope_auth=1;
 #endif
 #ifdef ENOTIFY
-    else if (eq_octet(check,&str_enotify,0)) filter->require_enotify=1;
+    else if (eq_octet(check,&str_enotify,0))
+      {
+      if (filter->enotify_mailto_owner == NULL)
+        {
+        filter->errmsg=CUS "enotify disabled";
+        return -1;
+        }
+        filter->require_enotify=1;
+      }
 #endif
 #ifdef SUBADDRESS
     else if (eq_octet(check,&str_subaddress,0)) filter->require_subaddress=1;
 #endif
 #ifdef SUBADDRESS
     else if (eq_octet(check,&str_subaddress,0)) filter->require_subaddress=1;
@@ -3538,7 +3547,8 @@ Arguments:
   filter      points to the entire file, read into store as a single string
   options     controls whether various special things are allowed, and requests
               special actions (not currently used)
   filter      points to the entire file, read into store as a single string
   options     controls whether various special things are allowed, and requests
               special actions (not currently used)
-  sieve_vacation_directory  where to store vacation "once" files
+  vacation_directory    where to store vacation "once" files
+  enotify_mailto_owner  owner of mailto notifications
   useraddress string expression for :user part of address
   subaddress  string expression for :subaddress part of address
   generated   where to hang newly-generated addresses
   useraddress string expression for :user part of address
   subaddress  string expression for :subaddress part of address
   generated   where to hang newly-generated addresses
@@ -3554,7 +3564,8 @@ Returns:      FF_DELIVERED     success, a significant action was taken
 
 int
 sieve_interpret(uschar *filter, int options, uschar *vacation_directory,
 
 int
 sieve_interpret(uschar *filter, int options, uschar *vacation_directory,
-  uschar *useraddress, uschar *subaddress, address_item **generated, uschar **error)
+  uschar *enotify_mailto_owner, uschar *useraddress, uschar *subaddress,
+  address_item **generated, uschar **error)
 {
 struct Sieve sieve;
 int r;
 {
 struct Sieve sieve;
 int r;
@@ -3580,6 +3591,20 @@ else
     }
   }
 
     }
   }
 
+if (enotify_mailto_owner == NULL)
+  sieve.enotify_mailto_owner = NULL;
+else
+  {
+  sieve.enotify_mailto_owner=expand_string(enotify_mailto_owner);
+  if (sieve.enotify_mailto_owner == NULL)
+    {
+    *error = string_sprintf("failed to expand \"%s\" "
+      "(sieve_enotify_mailto_owner): %s", enotify_mailto_owner,
+      expand_string_message);
+    return FF_ERROR;
+    }
+  }
+
 sieve.useraddress = useraddress == NULL ? CUS "$local_part_prefix$local_part$local_part_suffix" : useraddress;
 sieve.subaddress = subaddress;
 
 sieve.useraddress = useraddress == NULL ? CUS "$local_part_prefix$local_part$local_part_suffix" : useraddress;
 sieve.subaddress = subaddress;