X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fsrc%2Fsieve.c;h=bda482fd11238133d77b79acd2eb1686ff830b2c;hb=96f5fe4ce29825208eafffcb3579d789dc5b45d1;hp=bbbabdfd025878ee5440dbd6c45248db5501621c;hpb=5f71124def96a68fc6b11629f701eb8dcfbedd9e;p=user%2Fhenk%2Fcode%2Fexim.git diff --git a/src/src/sieve.c b/src/src/sieve.c index bbbabdfd0..bda482fd1 100644 --- a/src/src/sieve.c +++ b/src/src/sieve.c @@ -1,10 +1,8 @@ -/* $Cambridge: exim/src/src/sieve.c,v 1.37 2009/02/04 11:31:13 michael Exp $ */ - /************************************************* * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) Michael Haardt 2003-2008 */ +/* Copyright (c) Michael Haardt 2003 - 2015 */ /* See the file NOTICE for conditions of use and distribution. */ /* This code was contributed by Michael Haardt. */ @@ -109,6 +107,38 @@ struct Notification struct Notification *next; }; +/* This should be a complete list of supported extensions, so that an external +ManageSieve (RFC 5804) program can interrogate the current Exim binary for the +list of extensions and provide correct information to a client. + +We'll emit the list in the order given here; keep it alphabetically sorted, so +that callers don't get surprised. + +List *MUST* end with a NULL. Which at least makes ifdef-vs-comma easier. */ + +const uschar *exim_sieve_extension_list[] = { + CUS"comparator-i;ascii-numeric", + CUS"copy", +#ifdef ENCODED_CHARACTER + CUS"encoded-character", +#endif +#ifdef ENOTIFY + CUS"enotify", +#endif + CUS"envelope", +#ifdef ENVELOPE_AUTH + CUS"envelope-auth", +#endif + CUS"fileinto", +#ifdef SUBADDRESS + CUS"subaddress", +#endif +#ifdef VACATION + CUS"vacation", +#endif + NULL +}; + static int eq_asciicase(const struct String *needle, const struct String *haystack, int match_prefix); static int parse_test(struct Sieve *filter, int *cond, int exec); static int parse_commands(struct Sieve *filter, int exec, address_item **generated); @@ -253,7 +283,7 @@ for (pass=0; pass<=1; ++pass) } else *new++='\n'; - line=0; + line=0; /*XXX jgh: questionabale indent; probable BUG */ ++start; } else @@ -403,7 +433,7 @@ if (*uri && *uri!='?') if (uri>start) { capacity=0; - to.character=(uschar*)0; + to.character= NULL; to.length=0; to.character=string_cat(to.character,&capacity,&to.length,start,uri-start); to.character[to.length]='\0'; @@ -437,7 +467,7 @@ if (*uri=='?') if (uri>start) { capacity=0; - hname.character=(uschar*)0; + hname.character= NULL; hname.length=0; hname.character=string_cat(hname.character,&capacity,&hname.length,start,uri-start); hname.character[hname.length]='\0'; @@ -460,7 +490,7 @@ if (*uri=='?') if (uri>start) { capacity=0; - hvalue.character=(uschar*)0; + hvalue.character= NULL; hvalue.length=0; hvalue.character=string_cat(hvalue.character,&capacity,&hvalue.length,start,uri-start); hvalue.character[hvalue.length]='\0'; @@ -1042,7 +1072,7 @@ if (file) setflag(new_addr, af_pfr|af_file); new_addr->mode = 0; } -new_addr->p.errors_address = NULL; +new_addr->prop.errors_address = NULL; new_addr->next = *generated; *generated = new_addr; } @@ -2707,8 +2737,8 @@ Returns: 2 success by stop 1 other success -1 syntax or execution error */ -static int parse_commands(struct Sieve *filter, int exec, - address_item **generated) +static int +parse_commands(struct Sieve *filter, int exec, address_item **generated) { while (*filter->pc) { @@ -2940,7 +2970,6 @@ while (*filter->pc) int m; struct String from; struct String importance; - struct String *options; struct String message; struct String method; struct Notification *already; @@ -2961,7 +2990,6 @@ while (*filter->pc) from.length=-1; importance.character=(uschar*)0; importance.length=-1; - options=(struct String*)0; message.character=(uschar*)0; message.length=-1; recipient=NULL; @@ -2971,7 +2999,7 @@ while (*filter->pc) subject.character=(uschar*)0; body.length=-1; body.character=(uschar*)0; - envelope_from=(sender_address && sender_address[0]) ? expand_string("$local_part_prefix$local_part$local_part_suffix@$domain") : US ""; + envelope_from=(sender_address && sender_address[0]) ? expand_string(US"$local_part_prefix$local_part$local_part_suffix@$domain") : US ""; for (;;) { if (parse_white(filter)==-1) return -1; @@ -3038,11 +3066,11 @@ while (*filter->pc) for (already=filter->notified; already; already=already->next) { if (already->method.length==method.length - && (method.length==-1 || strcmp(already->method.character,method.character)==0) + && (method.length==-1 || Ustrcmp(already->method.character,method.character)==0) && already->importance.length==importance.length - && (importance.length==-1 || strcmp(already->importance.character,importance.character)==0) + && (importance.length==-1 || Ustrcmp(already->importance.character,importance.character)==0) && already->message.length==message.length - && (message.length==-1 || strcmp(already->message.character,message.character)==0)) + && (message.length==-1 || Ustrcmp(already->message.character,message.character)==0)) break; } if (already==(struct Notification*)0) @@ -3068,7 +3096,7 @@ while (*filter->pc) int buffer_capacity; f = fdopen(fd, "wb"); - fprintf(f,"From: %s\n",from.length==-1 ? expand_string("$local_part_prefix$local_part$local_part_suffix@$domain") : from.character); + fprintf(f,"From: %s\n",from.length==-1 ? expand_string(US"$local_part_prefix$local_part$local_part_suffix@$domain") : from.character); for (p=recipient; p; p=p->next) fprintf(f,"To: %s\n",p->text); fprintf(f,"Auto-Submitted: auto-notified; %s\n",filter->enotify_mailto_owner); if (header.length>0) fprintf(f,"%s",header.character); @@ -3332,7 +3360,8 @@ while (*filter->pc) /* Allocation is larger than neccessary, but enough even for split MIME words */ buffer_capacity=32+4*subject.length; buffer=store_get(buffer_capacity); - addr->reply->subject=parse_quote_2047(subject.character, subject.length, US"utf-8", buffer, buffer_capacity, TRUE); + /* deconst cast safe as we pass in a non-const item */ + addr->reply->subject = US parse_quote_2047(subject.character, subject.length, US"utf-8", buffer, buffer_capacity, TRUE); addr->reply->oncelog=once; addr->reply->once_repeat=days*86400; @@ -3401,8 +3430,8 @@ Returns: 1 success -1 syntax or execution error */ -static int parse_start(struct Sieve *filter, int exec, - address_item **generated) +static int +parse_start(struct Sieve *filter, int exec, address_item **generated) { filter->pc=filter->filter; filter->line=1;