diff --git a/src/lib-sieve/ext-envelope.c b/src/lib-sieve/ext-envelope.c index 814f4b4f95f6dd7693758ce15e72aad36d737e21..82e5c1e2b2d6ff6a7aa22537cd2e7ee698d8d772 100644 --- a/src/lib-sieve/ext-envelope.c +++ b/src/lib-sieve/ext-envelope.c @@ -151,23 +151,23 @@ static bool ext_envelope_opcode_dump printf("ENVELOPE\n"); /* Handle any optional arguments */ - if ( sieve_operand_optional_present(sbin, address) ) { - while ( (opt_code=sieve_operand_optional_read(sbin, address)) ) { - switch ( opt_code ) { - case OPT_COMPARATOR: - sieve_opr_comparator_dump(interp, sbin, address); - break; - case OPT_MATCH_TYPE: - sieve_opr_match_type_dump(interp, sbin, address); - break; + if ( sieve_operand_optional_present(sbin, address) ) { + while ( (opt_code=sieve_operand_optional_read(sbin, address)) ) { + switch ( opt_code ) { + case OPT_COMPARATOR: + sieve_opr_comparator_dump(interp, sbin, address); + break; + case OPT_MATCH_TYPE: + sieve_opr_match_type_dump(interp, sbin, address); + break; case OPT_ADDRESS_PART: - sieve_opr_address_part_dump(interp, sbin, address); + sieve_opr_address_part_dump(interp, sbin, address); break; - default: - return FALSE; - } - } - } + default: + return FALSE; + } + } + } return sieve_opr_stringlist_dump(sbin, address) && diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h index eecbf3eec7a62c667d18c3a84b1fbedb1d766dfb..03a6dad95ef57f80cf6777495f2ce1f60d306c2c 100644 --- a/src/lib-sieve/sieve-common.h +++ b/src/lib-sieve/sieve-common.h @@ -4,6 +4,8 @@ #include <sys/types.h> #include <stdint.h> +#include "sieve.h" + /* * Types */ diff --git a/src/lib-sieve/sieve-interpreter.c b/src/lib-sieve/sieve-interpreter.c index defabf3d39d7b8c2f491341ede01a5b8f63434e5..9710d04d67990e2b8bf2c9ccc6263608d2f8bad2 100644 --- a/src/lib-sieve/sieve-interpreter.c +++ b/src/lib-sieve/sieve-interpreter.c @@ -30,7 +30,7 @@ struct sieve_interpreter { struct sieve_result *result; /* Execution environment */ - struct mail *mail; + struct sieve_message_data *msgdata; }; struct sieve_interpreter *sieve_interpreter_create(struct sieve_binary *binary) @@ -108,9 +108,10 @@ inline const void *sieve_interpreter_extension_get_context /* Accessing runtinme environment */ -inline struct mail *sieve_interpreter_get_mail(struct sieve_interpreter *interpreter) +inline struct sieve_message_data * + sieve_interpreter_get_msgdata(struct sieve_interpreter *interpreter) { - return interpreter->mail; + return interpreter->msgdata; } /* Program counter */ @@ -194,7 +195,7 @@ void sieve_interpreter_dump_code(struct sieve_interpreter *interpreter) sieve_interpreter_reset(interpreter); interpreter->result = NULL; - interpreter->mail = NULL; + interpreter->msgdata = NULL; while ( interpreter->pc < sieve_binary_get_code_size(interpreter->binary) ) { if ( !sieve_interpreter_dump_operation(interpreter) ) { @@ -226,14 +227,14 @@ bool sieve_interpreter_execute_operation } struct sieve_result *sieve_interpreter_run - (struct sieve_interpreter *interp, struct mail *mail) + (struct sieve_interpreter *interp, struct sieve_message_data *msgdata) { struct sieve_result *result; sieve_interpreter_reset(interp); result = sieve_result_create(); interp->result = result; - interp->mail = mail; + interp->msgdata = msgdata; while ( interp->pc < sieve_binary_get_code_size(interp->binary) ) { printf("%08x: ", interp->pc); diff --git a/src/lib-sieve/sieve-interpreter.h b/src/lib-sieve/sieve-interpreter.h index ce339320b68068136cf4b7ade91af62d7c87e3c1..f1aac73fb1a93e7183afa8fe09e9136c361ba02c 100644 --- a/src/lib-sieve/sieve-interpreter.h +++ b/src/lib-sieve/sieve-interpreter.h @@ -43,7 +43,8 @@ bool sieve_interpreter_read_offset_operand /* Accessing runtime information */ -inline struct mail *sieve_interpreter_get_mail(struct sieve_interpreter *interpreter); +inline struct sieve_message_data * + sieve_interpreter_get_msgdata(struct sieve_interpreter *interpreter); /* Code dump (debugging purposes) */ @@ -53,7 +54,7 @@ void sieve_interpreter_dump_code(struct sieve_interpreter *interp); bool sieve_interpreter_execute_operation(struct sieve_interpreter *interp); struct sieve_result *sieve_interpreter_run - (struct sieve_interpreter *interp, struct mail *mail); + (struct sieve_interpreter *interp, struct sieve_message_data *message); #endif /* __SIEVE_INTERPRETER_H */ diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index 11fd336c1ed99aa60bb4300c01ddad5e0181d214..1416ee2694ce171257cb1a1a8742e9286deb032b 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -139,13 +139,14 @@ void sieve_dump(struct sieve_binary *binary) sieve_interpreter_free(interpreter); } -bool sieve_execute(struct sieve_binary *binary, struct mail *mail) +bool sieve_execute + (struct sieve_binary *binary, struct sieve_message_data *msgdata) { struct sieve_interpreter *interpreter = sieve_interpreter_create(binary); bool result = TRUE; printf("Code Execute:\n\n"); - if ( sieve_interpreter_run(interpreter, mail) == NULL ) { + if ( sieve_interpreter_run(interpreter, msgdata) == NULL ) { result = FALSE; } diff --git a/src/lib-sieve/sieve.h b/src/lib-sieve/sieve.h index 049b8675d33f10e0841b1bd6924a55259b1a77b8..e7b10fcbb8b81e66b0de98946c7afed1b28f2d21 100644 --- a/src/lib-sieve/sieve.h +++ b/src/lib-sieve/sieve.h @@ -1,15 +1,24 @@ #ifndef __SIEVE_H #define __SIEVE_H +#include "lib.h" #include "mail-storage.h" struct sieve_binary; +struct sieve_message_data { + struct mail *mail; + const char *return_path; + const char *rcpt_address; + const char *auth_user; +}; + bool sieve_init(const char *plugins); void sieve_deinit(void); struct sieve_binary *sieve_compile(int fd); void sieve_dump(struct sieve_binary *binary); -bool sieve_execute(struct sieve_binary *binary, struct mail *mail); +bool sieve_execute + (struct sieve_binary *binary, struct sieve_message_data *msgdata); #endif diff --git a/src/lib-sieve/tst-address.c b/src/lib-sieve/tst-address.c index b53356a0fd25b41d4d503afd1f95bfc9a179273e..d0aef5d484d7017abc06bdb09de9d7b853896d40 100644 --- a/src/lib-sieve/tst-address.c +++ b/src/lib-sieve/tst-address.c @@ -151,7 +151,7 @@ static bool tst_address_opcode_dump static bool tst_address_opcode_execute (struct sieve_interpreter *interp, struct sieve_binary *sbin, sieve_size_t *address) { - struct mail *mail = sieve_interpreter_get_mail(interp); + struct sieve_message_data *msgdata = sieve_interpreter_get_msgdata(interp); const struct sieve_comparator *cmp = &i_octet_comparator; const struct sieve_match_type *mtch = &is_match_type; @@ -202,7 +202,7 @@ static bool tst_address_opcode_execute } /* Initialize match context */ - mctx = sieve_match_begin(mtch, cmp, key_list); + mctx = sieve_match_begin(mtch, cmp, key_list); /* Iterate through all requested headers to match */ hdr_item = NULL; @@ -210,7 +210,7 @@ static bool tst_address_opcode_execute while ( !matched && sieve_coded_stringlist_next_item(hdr_list, &hdr_item) && hdr_item != NULL ) { const char *const *headers; - if ( mail_get_headers_utf8(mail, str_c(hdr_item), &headers) >= 0 ) { + if ( mail_get_headers_utf8(msgdata->mail, str_c(hdr_item), &headers) >= 0 ) { int i; for ( i = 0; !matched && headers[i] != NULL; i++ ) { @@ -220,7 +220,7 @@ static bool tst_address_opcode_execute } } - matched = sieve_match_end(mctx) || matched; + matched = sieve_match_end(mctx) || matched; t_pop(); diff --git a/src/lib-sieve/tst-exists.c b/src/lib-sieve/tst-exists.c index ca81fffc1672b483e1b95af231cdf936ffc8725b..523d4aa942a9bfa6ceed4a245830d09326fbfaa2 100644 --- a/src/lib-sieve/tst-exists.c +++ b/src/lib-sieve/tst-exists.c @@ -87,7 +87,7 @@ static bool tst_exists_opcode_dump static bool tst_exists_opcode_execute (struct sieve_interpreter *interp, struct sieve_binary *sbin, sieve_size_t *address) { - struct mail *mail = sieve_interpreter_get_mail(interp); + struct sieve_message_data *msgdata = sieve_interpreter_get_msgdata(interp); struct sieve_coded_stringlist *hdr_list; string_t *hdr_item; bool matched; @@ -105,10 +105,12 @@ static bool tst_exists_opcode_execute /* Iterate through all requested headers to match */ hdr_item = NULL; matched = FALSE; - while ( !matched && sieve_coded_stringlist_next_item(hdr_list, &hdr_item) && hdr_item != NULL ) { + while ( !matched && sieve_coded_stringlist_next_item(hdr_list, &hdr_item) && + hdr_item != NULL ) { const char *const *headers; - if ( mail_get_headers_utf8(mail, str_c(hdr_item), &headers) >= 0 && headers[0] != NULL ) { + if ( mail_get_headers_utf8(msgdata->mail, str_c(hdr_item), &headers) >= 0 && + headers[0] != NULL ) { matched = TRUE; } } diff --git a/src/lib-sieve/tst-header.c b/src/lib-sieve/tst-header.c index 38e7e283de45f0aed464fec769cb0ee2ecb64672..791cb8ca6fe8d644600c5ac4514c6fd1ae7660ce 100644 --- a/src/lib-sieve/tst-header.c +++ b/src/lib-sieve/tst-header.c @@ -140,7 +140,7 @@ static bool tst_header_opcode_dump static bool tst_header_opcode_execute (struct sieve_interpreter *interp, struct sieve_binary *sbin, sieve_size_t *address) { - struct mail *mail = sieve_interpreter_get_mail(interp); + struct sieve_message_data *msgdata = sieve_interpreter_get_msgdata(interp); unsigned int opt_code; const struct sieve_comparator *cmp = &i_octet_comparator; const struct sieve_match_type *mtch = &is_match_type; @@ -190,7 +190,7 @@ static bool tst_header_opcode_execute while ( !matched && sieve_coded_stringlist_next_item(hdr_list, &hdr_item) && hdr_item != NULL ) { const char *const *headers; - if ( mail_get_headers_utf8(mail, str_c(hdr_item), &headers) >= 0 ) { + if ( mail_get_headers_utf8(msgdata->mail, str_c(hdr_item), &headers) >= 0 ) { int i; for ( i = 0; !matched && headers[i] != NULL; i++ ) { diff --git a/src/lib-sieve/tst-size.c b/src/lib-sieve/tst-size.c index 3e85a39588795a494b00f190f722f59ff5292a4c..07ab7b10d23b905d6465efe95e51fb541da58350 100644 --- a/src/lib-sieve/tst-size.c +++ b/src/lib-sieve/tst-size.c @@ -195,10 +195,10 @@ static bool tst_size_under_opcode_dump static bool tst_size_get(struct sieve_interpreter *interp, sieve_size_t *size) { - struct mail *mail = sieve_interpreter_get_mail(interp); + struct sieve_message_data *msgdata = sieve_interpreter_get_msgdata(interp); uoff_t psize; - if ( mail_get_physical_size(mail, &psize) < 0 ) + if ( mail_get_physical_size(msgdata->mail, &psize) < 0 ) return FALSE; *size = psize; diff --git a/src/sieve-bin/sieve_test.c b/src/sieve-bin/sieve_test.c index c8c57d3a8222d8c2494ae14824077a335cd500f8..83498fe5bfb9e11e928f116a53d0131e34d12381 100644 --- a/src/sieve-bin/sieve_test.c +++ b/src/sieve-bin/sieve_test.c @@ -117,19 +117,20 @@ static struct istream *create_raw_stream(int fd) return input; } -static void sieve_test(struct sieve_binary *sbin, struct mail *mail) +static void sieve_test + (struct sieve_binary *sbin, struct sieve_message_data *msgdata) { const char *const *headers; printf("HEADERS\n"); - if (mail_get_headers_utf8(mail, "from", &headers) >= 0) { + if (mail_get_headers_utf8(msgdata->mail, "from", &headers) >= 0) { int i; for ( i = 0; headers[i] != NULL; i++ ) { printf("HEADER: From: %s\n", headers[i]); } } - sieve_execute(sbin, mail); + sieve_execute(sbin, msgdata); } int main(int argc, char **argv) @@ -149,6 +150,7 @@ int main(int argc, char **argv) pool_t namespace_pool; int fd; struct sieve_binary *sbin; + struct sieve_message_data msgdata; lib_init(); ioloop = io_loop_create(); @@ -233,7 +235,11 @@ int main(int argc, char **argv) /* */ i_stream_seek(input, 0); - sieve_test(sbin, mail); + msgdata.mail = mail; + msgdata.return_path = "nico@example.com"; + msgdata.rcpt_address = "sirius+sieve@rename-it.nl"; + msgdata.auth_user = "stephan"; + sieve_test(sbin, &msgdata); sieve_deinit(); //ret = deliver_save(ns, &storage, mailbox, mail, 0, NULL);