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

Reply via email to