diff options
author | Philip Hazel <ph10@hermes.cam.ac.uk> | 2005-03-01 10:21:43 +0000 |
---|---|---|
committer | Philip Hazel <ph10@hermes.cam.ac.uk> | 2005-03-01 10:21:43 +0000 |
commit | 4929acf0bc309c61ff6aac84162e3660f268cd65 (patch) | |
tree | 11015e34f22f1aab8c832fce8392889d5d92e091 | |
parent | a6c11ddfcace581681a02574b90280c0e7ff10be (diff) |
(1) Update version number and (overlooked) copyright date.
(2) Sieve patch for testing vacation handling with -bf.
-rw-r--r-- | doc/doc-txt/README.SIEVE | 31 | ||||
-rw-r--r-- | src/src/globals.c | 4 | ||||
-rw-r--r-- | src/src/sieve.c | 170 | ||||
-rw-r--r-- | src/src/version.c | 4 |
4 files changed, 100 insertions, 109 deletions
diff --git a/doc/doc-txt/README.SIEVE b/doc/doc-txt/README.SIEVE index 4d04851e1..0622dc906 100644 --- a/doc/doc-txt/README.SIEVE +++ b/doc/doc-txt/README.SIEVE @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/README.SIEVE,v 1.1 2004/10/07 15:04:35 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/README.SIEVE,v 1.2 2005/03/01 10:21:43 ph10 Exp $ Notes on the Sieve implementation for Exim @@ -363,12 +363,6 @@ is not required by the vacation draft, which does not specify how the UTF-8 reason is processed to compose the resulting message. -Envelope Sender - -The vacation draft does not specify the envelope sender. This -implementation uses the empty envelope sender to prevent mail loops. - - Default Subject The draft specifies that the default message subject is "Re: " @@ -388,25 +382,10 @@ the current draft concerning automatic mail responses. Rate Limiting Responses -The draft says: - - Vacation responses are not just per address, but are per address - per vacation command. - -This is badly worded, because commands are not enumerated. It meant -to say: - - Vacation responses are not just per address, but are per address - per reason string and per specified subject and ":mime" option. - -Existing implementations work that way and it makes more sense, too. -Including the ":mime" option is mostly for correctness, as the reason -strings with and without this option are rarely equal. - -This implementation hashes the reason, specified subject and ":mime" -option and uses the hex string representation as filename within the -"sieve_vacation_directory" to store the recipient addresses for this -vacation parameter set. +This implementation hashes the reason, specified subject, ":mime" +option and ":addresses" option and uses the hex string representation +as filename within the "sieve_vacation_directory" to store the recipient +addresses for this vacation parameter set. The draft specifies that sites may define a minimum ":days" value than 1. This implementation uses 1. The maximum value MUST greater than 7, diff --git a/src/src/globals.c b/src/src/globals.c index 497fe3d8e..7bef5792f 100644 --- a/src/src/globals.c +++ b/src/src/globals.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/globals.c,v 1.17 2005/02/17 11:58:26 ph10 Exp $ */ +/* $Cambridge: exim/src/src/globals.c,v 1.18 2005/03/01 10:21:44 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -1167,7 +1167,7 @@ uschar *warnmsg_delay = NULL; uschar *warnmsg_recipients = NULL; BOOL write_rejectlog = TRUE; -uschar *version_copyright = US"Copyright (c) University of Cambridge 2004"; +uschar *version_copyright = US"Copyright (c) University of Cambridge 2005"; uschar *version_date = US"?"; uschar *version_cnumber = US"????"; uschar *version_string = US"?"; diff --git a/src/src/sieve.c b/src/src/sieve.c index 0229dbcbd..abe0d37f3 100644 --- a/src/src/sieve.c +++ b/src/src/sieve.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/sieve.c,v 1.7 2005/02/17 11:58:26 ph10 Exp $ */ +/* $Cambridge: exim/src/src/sieve.c,v 1.8 2005/03/01 10:21:44 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -2468,11 +2468,12 @@ while (*filter->pc) if (filter_personal(aliases,TRUE)) { + if (filter_test == FTEST_NONE) + { + /* ensure oncelog directory exists; failure will be detected later */ - /* ensure oncelog directory exists; failure will be detected later */ - - (void)directory_make(NULL, filter->vacation_directory, 0700, FALSE); - + (void)directory_make(NULL, filter->vacation_directory, 0700, FALSE); + } /* build oncelog filename */ key.character=(uschar*)0; @@ -2489,91 +2490,102 @@ while (*filter->pc) md5_start(&base); md5_end(&base, key.character, key.length, digest); for (i = 0; i < 16; i++) sprintf(CS (hexdigest+2*i), "%02X", digest[i]); - capacity=Ustrlen(filter->vacation_directory); - start=capacity; - once=string_cat(filter->vacation_directory,&capacity,&start,US"/",1); - once=string_cat(once,&capacity,&start,hexdigest,33); - once[start] = '\0'; - - /* process subject */ - - if (subject.length==-1) - { - expand_header(&subject,&str_subject); - while (subject.length>=4 && Ustrncmp(subject.character,"Re: ",4)==0) + if (filter_test != FTEST_NONE) { - subject.character+=4; - subject.length-=4; + debug_printf("Sieve: mail was personal, vacation file basename: %s\n", hexdigest); } - capacity=6; - start=6; - subject.character=string_cat(US"Auto: ",&capacity,&start,subject.character,subject.length); - subject.length=start; - } - - /* add address to list of generated addresses */ - - addr = deliver_make_addr(string_sprintf(">%.256s", sender_address), FALSE); - setflag(addr, af_pfr); - setflag(addr, af_ignore_error); - addr->next = *generated; - *generated = addr; - addr->reply = store_get(sizeof(reply_item)); - memset(addr->reply,0,sizeof(reply_item)); /* XXX */ - addr->reply->to = string_copy(sender_address); - addr->reply->from = expand_string(US"$local_part@$domain"); - /* Allocation is larger than neccessary, but enough even for split MIME words */ - buffer_capacity=16+4*subject.length; - buffer=store_get(buffer_capacity); - addr->reply->subject=parse_quote_2047(subject.character, subject.length, US"utf-8", buffer, buffer_capacity); - addr->reply->oncelog=once; - addr->reply->once_repeat=days*86400; - - /* build body and MIME headers */ - - if (reason_is_mime) + else { - uschar *mime_body,*reason_end; + capacity=Ustrlen(filter->vacation_directory); + start=capacity; + once=string_cat(filter->vacation_directory,&capacity,&start,US"/",1); + once=string_cat(once,&capacity,&start,hexdigest,33); + once[start] = '\0'; + + /* process subject */ + + if (subject.length==-1) + { + expand_header(&subject,&str_subject); + while (subject.length>=4 && Ustrncmp(subject.character,"Re: ",4)==0) + { + subject.character+=4; + subject.length-=4; + } + capacity=6; + start=6; + subject.character=string_cat(US"Auto: ",&capacity,&start,subject.character,subject.length); + subject.length=start; + } + + /* add address to list of generated addresses */ + + addr = deliver_make_addr(string_sprintf(">%.256s", sender_address), FALSE); + setflag(addr, af_pfr); + setflag(addr, af_ignore_error); + addr->next = *generated; + *generated = addr; + addr->reply = store_get(sizeof(reply_item)); + memset(addr->reply,0,sizeof(reply_item)); /* XXX */ + addr->reply->to = string_copy(sender_address); + addr->reply->from = expand_string(US"$local_part@$domain"); + /* Allocation is larger than neccessary, but enough even for split MIME words */ + buffer_capacity=16+4*subject.length; + buffer=store_get(buffer_capacity); + addr->reply->subject=parse_quote_2047(subject.character, subject.length, US"utf-8", buffer, buffer_capacity); + addr->reply->oncelog=once; + addr->reply->once_repeat=days*86400; + + /* build body and MIME headers */ + + if (reason_is_mime) + { + uschar *mime_body,*reason_end; #ifdef RFC_EOL - static const uschar nlnl[]="\r\n\r\n"; + static const uschar nlnl[]="\r\n\r\n"; #else - static const uschar nlnl[]="\n\n"; + static const uschar nlnl[]="\n\n"; #endif - for - ( - mime_body=reason.character,reason_end=reason.character+reason.length; - mime_body<(reason_end-sizeof(nlnl)-1) && memcmp(mime_body,nlnl,sizeof(nlnl)-1); - ++mime_body - ); - capacity = 0; - start = 0; - addr->reply->headers = string_cat(NULL,&capacity,&start,reason.character,mime_body-reason.character); - addr->reply->headers[start] = '\0'; - capacity = 0; - start = 0; - if (mime_body+(sizeof(nlnl)-1)<reason_end) mime_body+=sizeof(nlnl)-1; - else mime_body=reason_end-1; - addr->reply->text = string_cat(NULL,&capacity,&start,mime_body,reason_end-mime_body); - addr->reply->text[start] = '\0'; + for + ( + mime_body=reason.character,reason_end=reason.character+reason.length; + mime_body<(reason_end-sizeof(nlnl)-1) && memcmp(mime_body,nlnl,sizeof(nlnl)-1); + ++mime_body + ); + capacity = 0; + start = 0; + addr->reply->headers = string_cat(NULL,&capacity,&start,reason.character,mime_body-reason.character); + addr->reply->headers[start] = '\0'; + capacity = 0; + start = 0; + if (mime_body+(sizeof(nlnl)-1)<reason_end) mime_body+=sizeof(nlnl)-1; + else mime_body=reason_end-1; + addr->reply->text = string_cat(NULL,&capacity,&start,mime_body,reason_end-mime_body); + addr->reply->text[start] = '\0'; + } + else + { + struct String qp; + + capacity = 0; + start = reason.length; + addr->reply->headers = US"MIME-Version: 1.0\n" + "Content-Type: text/plain;\n" + "\tcharset=\"utf-8\"\n" + "Content-Transfer-Encoding: quoted-printable"; + addr->reply->text = quoted_printable_encode(&reason,&qp)->character; + } } - else + } + else if (filter_test != FTEST_NONE) { - struct String qp; - - capacity = 0; - start = reason.length; - addr->reply->headers = US"MIME-Version: 1.0\n" - "Content-Type: text/plain;\n" - "\tcharset=\"utf-8\"\n" - "Content-Transfer-Encoding: quoted-printable"; - addr->reply->text = quoted_printable_encode(&reason,&qp)->character; + debug_printf("Sieve: mail was not personal, vacation would ignore it\n"); } - } } } + else break; #endif - else break; } return 1; } @@ -2613,7 +2625,7 @@ filter->require_iascii_numeric=0; if (parse_white(filter)==-1) return -1; -if (exec && filter->vacation_directory != NULL) /* 2nd test added by PH */ +if (exec && filter->vacation_directory != NULL && filter_test == FTEST_NONE) { DIR *oncelogdir; struct dirent *oncelog; @@ -2672,7 +2684,7 @@ while (parse_identifier(filter,CUS "require")) #ifdef VACATION else if (eq_asciicase(check,&str_vacation,0)) { - if (filter->vacation_directory == NULL) + if (filter_test == FTEST_NONE && filter->vacation_directory == NULL) { filter->errmsg=CUS "vacation disabled"; return -1; diff --git a/src/src/version.c b/src/src/version.c index 9a458f130..cba0e64ec 100644 --- a/src/src/version.c +++ b/src/src/version.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/version.c,v 1.6 2005/02/17 14:53:50 ph10 Exp $ */ +/* $Cambridge: exim/src/src/version.c,v 1.7 2005/03/01 10:21:44 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -12,7 +12,7 @@ #include "exim.h" -#define THIS_VERSION "4.50" +#define THIS_VERSION "4.51" /* The header file cnumber.h contains a single line containing the |