ph10 2007/08/17 12:16:45 BST
Modified files:
exim-doc/doc-txt ChangeLog
exim-src/src sieve.c
Log:
Patch from the Sieve maintainer.
Revision Changes Path
1.522 +3 -0 exim/exim-doc/doc-txt/ChangeLog
1.29 +94 -3 exim/exim-src/src/sieve.c
Index: ChangeLog
===================================================================
RCS file: /home/cvs/exim/exim-doc/doc-txt/ChangeLog,v
retrieving revision 1.521
retrieving revision 1.522
diff -u -r1.521 -r1.522
--- ChangeLog 4 Jul 2007 10:37:03 -0000 1.521
+++ ChangeLog 17 Aug 2007 11:16:45 -0000 1.522
@@ -1,4 +1,4 @@
-$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.521 2007/07/04 10:37:03 ph10 Exp $
+$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.522 2007/08/17 11:16:45 ph10 Exp $
Change log file for Exim from version 4.21
-------------------------------------------
@@ -79,6 +79,9 @@
PH/15 Removed an incorrect (int) cast when reading the value of SIZE in a
MAIL command. The effect was to mangle the value on 64-bit systems.
+PH/16 Another patch from the Sieve maintainer.
+
+
Exim version 4.67
-----------------
Index: sieve.c
===================================================================
RCS file: /home/cvs/exim/exim-src/src/sieve.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -r1.28 -r1.29
--- sieve.c 19 Apr 2007 13:19:06 -0000 1.28
+++ sieve.c 17 Aug 2007 11:16:45 -0000 1.29
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/exim-src/src/sieve.c,v 1.28 2007/04/19 13:19:06 ph10 Exp $ */
+/* $Cambridge: exim/exim-src/src/sieve.c,v 1.29 2007/08/17 11:16:45 ph10 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -143,6 +143,10 @@
#ifdef ENOTIFY
static uschar str_enotify_c[]="enotify";
static const struct String str_enotify={ str_enotify_c, 7 };
+static uschar str_online_c[]="online";
+static const struct String str_online={ str_online_c, 6 };
+static uschar str_maybe_c[]="maybe";
+static const struct String str_maybe={ str_maybe_c, 5 };
#endif
#ifdef SUBADDRESS
static uschar str_subaddress_c[]="subaddress";
@@ -2476,11 +2480,11 @@
return 1;
}
#ifdef ENOTIFY
-else if (parse_identifier(filter,CUS "valid_notif_method"))
+else if (parse_identifier(filter,CUS "valid_notify_method"))
{
/*
- valid_notif_method = "valid_notif_method"
- <notification-uris: string-list>
+ valid_notify_method = "valid_notify_method"
+ <notification-uris: string-list>
*/
struct String *uris,*u;
@@ -2516,6 +2520,93 @@
}
return 1;
}
+else if (parse_identifier(filter,CUS "notify_method_capability"))
+ {
+ /*
+ notify_method_capability = "notify_method_capability" [COMPARATOR] [MATCH-TYPE]
+ <notification-uri: string>
+ <notification-capability: string>
+ <key-list: string-list>
+ */
+
+ int m;
+ int co=0,mt=0;
+
+ enum Comparator comparator=COMP_EN_ASCII_CASEMAP;
+ enum MatchType matchType=MATCH_IS;
+ struct String uri,capa,*keys,*k;
+
+ if (!filter->require_enotify)
+ {
+ filter->errmsg=CUS "missing previous require \"enotify\";";
+ return -1;
+ }
+ for (;;)
+ {
+ if (parse_white(filter)==-1) return -1;
+ if ((m=parse_comparator(filter,&comparator))!=0)
+ {
+ if (m==-1) return -1;
+ if (co)
+ {
+ filter->errmsg=CUS "comparator already specified";
+ return -1;
+ }
+ else co=1;
+ }
+ else if ((m=parse_matchtype(filter,&matchType))!=0)
+ {
+ if (m==-1) return -1;
+ if (mt)
+ {
+ filter->errmsg=CUS "match type already specified";
+ return -1;
+ }
+ else mt=1;
+ }
+ else break;
+ }
+ if ((m=parse_string(filter,&uri))!=1)
+ {
+ if (m==0) filter->errmsg=CUS "missing notification URI string";
+ return -1;
+ }
+ if (parse_white(filter)==-1) return -1;
+ if ((m=parse_string(filter,&capa))!=1)
+ {
+ if (m==0) filter->errmsg=CUS "missing notification capability string";
+ return -1;
+ }
+ if (parse_white(filter)==-1) return -1;
+ if ((m=parse_stringlist(filter,&keys))!=1)
+ {
+ if (m==0) filter->errmsg=CUS "missing key string list";
+ return -1;
+ }
+ if (exec)
+ {
+ string_item *recipient;
+ struct String header,body;
+
+ *cond=0;
+ recipient=NULL;
+ header.length=-1;
+ header.character=(uschar*)0;
+ body.length=-1;
+ body.character=(uschar*)0;
+ if (parse_mailto_uri(filter,uri.character,&recipient,&header,&body)==1)
+ {
+ if (eq_asciicase(&capa,&str_online,0)==1)
+ for (k=keys; k->length!=-1; ++k)
+ {
+ *cond=compare(filter,k,&str_maybe,comparator,matchType);
+ if (*cond==-1) return -1;
+ if (*cond) break;
+ }
+ }
+ }
+ return 1;
+ }
#endif
else return 0;
}