Add support for specifying the vacation time in seconds in addition to days.
Signed-off-by: Philipp Hahn <h...@univention.de> --- lib/imapoptions | 2 +- sieve/README | 3 +++ sieve/interp.c | 3 +++ sieve/script.c | 12 ++++++++++++ sieve/script.h | 1 + sieve/sieve-lex.l | 1 + sieve/sieve.y | 11 +++++++++-- sieve/test.c | 5 ++++- .../actionExtensions/uberExtensionActionScript.key | 10 ++++++++++ .../actionExtensions/uberExtensionActionScript.s | 13 ++++++++++++- 10 files changed, 56 insertions(+), 5 deletions(-) diff --git a/lib/imapoptions b/lib/imapoptions index 8c4f4ef..f97be2d 100644 --- a/lib/imapoptions +++ b/lib/imapoptions @@ -1213,7 +1213,7 @@ product version in the capabilities */ user's scripts reside on a remote server (in a Murder). Otherwise, timsieved will proxy traffic to the remote server. */ -{ "sieve_extensions", "fileinto reject vacation imapflags notify envelope relational regex subaddress copy", BITFIELD("fileinto", "reject", "vacation", "imapflags", "notify", "include", "envelope", "body", "relational", "regex", "subaddress", "copy") } +{ "sieve_extensions", "fileinto reject vacation vacation-seconds imapflags notify envelope relational regex subaddress copy", BITFIELD("fileinto", "reject", "vacation", "vacation-seconds", "imapflags", "notify", "include", "envelope", "body", "relational", "regex", "subaddress", "copy") } /* Space-separated list of Sieve extensions allowed to be used in sieve scripts, enforced at submission by timsieved(8). Any previously installed script will be unaffected by this option and diff --git a/sieve/README b/sieve/README index 0d6e108..9eda8ac 100644 --- a/sieve/README +++ b/sieve/README @@ -41,6 +41,9 @@ RFC 3028, January, 2001. [VACATION] Showalter, T., "Sieve: Vacation Extension", draft-showalter-sieve-vacation-04.txt, August, 2000. +[VACATION2] George, R., Leiba, B., "Sieve Vacation: Seconds parameter", +RFC 6131, July 2011. + [IMAPFLAGS] Melnikov, A., "Sieve -- IMAP flag extension", draft-melnikov-sieve-imapflags-03.txt, July, 2000. diff --git a/sieve/interp.c b/sieve/interp.c index 3c4b8bf..e36fe48 100644 --- a/sieve/interp.c +++ b/sieve/interp.c @@ -118,6 +118,9 @@ const char *sieve_listextensions(sieve_interp_t *i) if (i->vacation && (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_VACATION)) strlcat(extensions, " vacation", EXT_LEN); + if (i->vacation && + (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_VACATION_SECONDS)) + strlcat(extensions, " vacation-seconds", EXT_LEN); if (i->markflags && (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_IMAPFLAGS)) strlcat(extensions, " imapflags", EXT_LEN); diff --git a/sieve/script.c b/sieve/script.c index 0b06c2f..2a8afac 100644 --- a/sieve/script.c +++ b/sieve/script.c @@ -119,6 +119,18 @@ int script_require(sieve_script_t *s, char *req) } else { return 0; } + } else if (!strcmp("vacation-seconds", req)) { + if (s->interp.vacation && + (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_VACATION_SECONDS)) { + /* Note that "vacation-seconds" implies "vacation", and a script + * with "vacation-seconds" in a "require" list MAY omit "vacation" + * from that list. */ + s->support.vacation = 1; + s->support.vacation_seconds = 1; + return 1; + } else { + return 0; + } } else if (!strcmp("imapflags", req)) { if (s->interp.markflags->count && (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_IMAPFLAGS)) { diff --git a/sieve/script.h b/sieve/script.h index 7fb49bf..d85793f 100644 --- a/sieve/script.h +++ b/sieve/script.h @@ -70,6 +70,7 @@ struct sieve_script { int i_ascii_numeric: 1; int include : 1; int copy : 1; + int vacation_seconds: 1; } support; void *script_context; diff --git a/sieve/sieve-lex.l b/sieve/sieve-lex.l index 87145ac..c3baa57 100644 --- a/sieve/sieve-lex.l +++ b/sieve/sieve-lex.l @@ -136,6 +136,7 @@ CRLF (\r\n|\r|\n) <INITIAL>:message return MESSAGE; <INITIAL>vacation return VACATION; <INITIAL>:days return DAYS; +<INITIAL>:seconds return SECONDS; <INITIAL>:addresses return ADDRESSES; <INITIAL>:subject return SUBJECT; <INITIAL>:from return FROM; diff --git a/sieve/sieve.y b/sieve/sieve.y index 84542d8..b7de609 100644 --- a/sieve/sieve.y +++ b/sieve/sieve.y @@ -200,7 +200,7 @@ extern void sieverestart(FILE *f); %token GT GE LT LE EQ NE %token ALL LOCALPART DOMAIN USER DETAIL %token RAW TEXT CONTENT -%token DAYS ADDRESSES SUBJECT FROM HANDLE MIME +%token DAYS ADDRESSES SUBJECT FROM HANDLE MIME SECONDS %token METHOD ID OPTIONS LOW NORMAL HIGH ANY MESSAGE %token INCLUDE PERSONAL GLOBAL RETURN %token COPY @@ -414,8 +414,15 @@ priority: LOW { $$ = LOW; } vtags: /* empty */ { $$ = new_vtags(); } | vtags DAYS NUMBER { if ($$->seconds != -1) { - yyerror("duplicate :days"); YYERROR; } + yyerror("duplicate :days or :seconds"); YYERROR; } else { $$->seconds = $3 * DAY2SEC; } } + | vtags SECONDS NUMBER { if (!parse_script->support.vacation_seconds) { + yyerror("vacation-seconds not required"); + YYERROR; + } + if ($$->seconds != -1) { + yyerror("duplicate :days or :seconds"); YYERROR; } + else { $$->seconds = $3; } } | vtags ADDRESSES stringlist { if ($$->addresses != NULL) { yyerror("duplicate :addresses"); YYERROR; diff --git a/sieve/test.c b/sieve/test.c index bdabc14..09ed80d 100644 --- a/sieve/test.c +++ b/sieve/test.c @@ -468,7 +468,10 @@ static int autorespond(void *ac, void *ic __attribute__((unused)), for (i = 0; i < SIEVE_HASHLEN; i++) { printf("%x", arc->hash[i]); } - printf("' in %d days? ", arc->seconds / DAY2SEC); + if (arc->seconds % DAY2SEC) + printf("' in %d seconds? ", arc->seconds); + else + printf("' in %d days? ", arc->seconds / DAY2SEC); scanf(" %c", &yn); } diff --git a/sieve/tests/actionExtensions/uberExtensionActionScript.key b/sieve/tests/actionExtensions/uberExtensionActionScript.key index c39d35d..07d98d1 100644 --- a/sieve/tests/actionExtensions/uberExtensionActionScript.key +++ b/sieve/tests/actionExtensions/uberExtensionActionScript.key @@ -42,3 +42,13 @@ Have I already responded to '373d72afbd3cbfcb7a7922d70d5dd6e' in 5 days? no echo 'I'll respond in a week or two, when i get back' | mail -s 'i'm at the beach' 'me@unspecified-domain' for message '/afs/andrew/system/src/local/cyrus/046/sieve/tests/actionExtensions/testm/ueatest-vacation' keep message + +'ueatest-vacation-seconds' + +Envelope body of 'to'? you +Envelope body of 'from'? me +Have I already responded to '373d72afbd3cbfcb7a7922d70d5dd6e' in 60 seconds? no + +echo 'I'll respond in a minute, when i get back' | mail -s 'i'm out of the room' 'me@unspecified-domain' for message '/afs/andrew/system/src/local/cyrus/046/sieve/tests/actionExtensions/testm/ueatest-vacation' + +keep message diff --git a/sieve/tests/actionExtensions/uberExtensionActionScript.s b/sieve/tests/actionExtensions/uberExtensionActionScript.s index f65c01d..9eb58f2 100644 --- a/sieve/tests/actionExtensions/uberExtensionActionScript.s +++ b/sieve/tests/actionExtensions/uberExtensionActionScript.s @@ -1,4 +1,4 @@ -require ["reject", "fileinto", "imapflags", "vacation", "notify"]; +require ["reject", "fileinto", "imapflags", "vacation", "notify", "vacation-seconds"]; #this is for the extra thigns we have added to sieve @@ -56,6 +56,17 @@ vacation :days 5 "I'll respond in a week or two, when i get back"; } +#VACATION-SECONDS +############################################# +if header :contains "subject" "vacation-seconds" +{ + +vacation :seconds 60 + :addresses ["m...@blah.com" , "m...@somewhereelse.com"] + :subject "i'm out of the room" + "I'll respond in a minute, when i get back"; +} + #NOTIFY and DENOTIFY ############################################# if header :contains "subject" "notify" -- 1.7.1