diff --git a/src/lib-sieve/plugins/imapflags/cmd-addflag.c b/src/lib-sieve/plugins/imapflags/cmd-addflag.c index b5900a758af5be681f793eb84c0ed6ade4209f1d..0ee8b0e3fc86836b5ee15addb88ae5c49bbe071f 100644 --- a/src/lib-sieve/plugins/imapflags/cmd-addflag.c +++ b/src/lib-sieve/plugins/imapflags/cmd-addflag.c @@ -11,6 +11,11 @@ static bool cmd_addflag_generate (struct sieve_generator *generator, struct sieve_command_context *ctx); + +static bool cmd_addflag_opcode_execute + (const struct sieve_opcode *opcode, struct sieve_interpreter *interp, + struct sieve_binary *sbin, sieve_size_t *address); + /* Addflag command * @@ -36,8 +41,8 @@ const struct sieve_opcode addflag_opcode = { SIEVE_OPCODE_CUSTOM, &imapflags_extension, EXT_IMAPFLAGS_OPCODE_ADDFLAG, - NULL, - NULL + sieve_opcode_string_dump, + cmd_addflag_opcode_execute }; @@ -56,4 +61,26 @@ static bool cmd_addflag_generate return TRUE; } +/* + * Execution + */ + +static bool cmd_addflag_opcode_execute +(const struct sieve_opcode *opcode ATTR_UNUSED, + struct sieve_interpreter *interp ATTR_UNUSED, + struct sieve_binary *sbin, sieve_size_t *address) +{ + string_t *redirect; + + t_push(); + if ( !sieve_opr_string_read(sbin, address, &redirect) ) { + t_pop(); + return FALSE; + } + + printf(">> ADDFLAG \"%s\"\n", str_c(redirect)); + + t_pop(); + return TRUE; +} diff --git a/src/lib-sieve/plugins/imapflags/cmd-removeflag.c b/src/lib-sieve/plugins/imapflags/cmd-removeflag.c index 33e2fd2728a840466ac11ec35c944b9e16c1224f..1d2aebdc9190938f93a13f4396c9f2ab81de5b57 100644 --- a/src/lib-sieve/plugins/imapflags/cmd-removeflag.c +++ b/src/lib-sieve/plugins/imapflags/cmd-removeflag.c @@ -13,14 +13,9 @@ static bool cmd_removeflag_generate (struct sieve_generator *generator, struct sieve_command_context *ctx); -static bool cmd_removeflag_opcode_dump - (const struct sieve_opcode *opcode ATTR_UNUSED, - struct sieve_interpreter *interp ATTR_UNUSED, struct sieve_binary *sbin, - sieve_size_t *address); static bool cmd_removeflag_opcode_execute - (const struct sieve_opcode *opcode ATTR_UNUSED, - struct sieve_interpreter *interp ATTR_UNUSED, struct sieve_binary *sbin, - sieve_size_t *address); + (const struct sieve_opcode *opcode, struct sieve_interpreter *interp, + struct sieve_binary *sbin, sieve_size_t *address); /* Removeflag command * @@ -46,7 +41,7 @@ const struct sieve_opcode removeflag_opcode = { SIEVE_OPCODE_CUSTOM, &imapflags_extension, EXT_IMAPFLAGS_OPCODE_REMOVEFLAG, - cmd_removeflag_opcode_dump, + sieve_opcode_string_dump, cmd_removeflag_opcode_execute }; @@ -66,22 +61,7 @@ static bool cmd_removeflag_generate return TRUE; } - -/* - * Code dump - */ -static bool cmd_removeflag_opcode_dump -(const struct sieve_opcode *opcode ATTR_UNUSED, - struct sieve_interpreter *interp ATTR_UNUSED, - struct sieve_binary *sbin, sieve_size_t *address) -{ - printf("REMOVEFLAG\n"); - - return - sieve_opr_string_dump(sbin, address); -} - /* * Execution */ diff --git a/src/lib-sieve/plugins/imapflags/cmd-setflag.c b/src/lib-sieve/plugins/imapflags/cmd-setflag.c index 568c46933d35c9c3b0b7caa3a84089d2423dbbb3..7ac5a899beb6a7d4687134d78a042e860a814d52 100644 --- a/src/lib-sieve/plugins/imapflags/cmd-setflag.c +++ b/src/lib-sieve/plugins/imapflags/cmd-setflag.c @@ -12,6 +12,10 @@ static bool cmd_setflag_generate (struct sieve_generator *generator, struct sieve_command_context *ctx); +static bool cmd_setflag_opcode_execute + (const struct sieve_opcode *opcode, struct sieve_interpreter *interp, + struct sieve_binary *sbin, sieve_size_t *address); + /* Setflag command * * Syntax: @@ -36,8 +40,8 @@ const struct sieve_opcode setflag_opcode = { SIEVE_OPCODE_CUSTOM, &imapflags_extension, EXT_IMAPFLAGS_OPCODE_SETFLAG, - NULL, - NULL + sieve_opcode_string_dump, + cmd_setflag_opcode_execute }; /* Code generation */ @@ -55,4 +59,28 @@ static bool cmd_setflag_generate return TRUE; } +/* + * Execution + */ + +static bool cmd_setflag_opcode_execute +(const struct sieve_opcode *opcode ATTR_UNUSED, + struct sieve_interpreter *interp ATTR_UNUSED, + struct sieve_binary *sbin, sieve_size_t *address) +{ + string_t *redirect; + + t_push(); + + if ( !sieve_opr_string_read(sbin, address, &redirect) ) { + t_pop(); + return FALSE; + } + + printf(">> SETFLAG \"%s\"\n", str_c(redirect)); + + t_pop(); + return TRUE; +} + diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c index 9c21edeb1bfaf4ceadf5920c07bed7625ff4aee6..a224e3c05f14eb1e39ac72515b7c7795515b9c93 100644 --- a/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c +++ b/src/lib-sieve/plugins/imapflags/ext-imapflags-common.c @@ -32,7 +32,7 @@ bool ext_imapflags_command_validate cmd->command->identifier, sieve_ast_argument_name(arg)); return FALSE; } - //sieve_validator_argument_activate(validator, arg); + sieve_validator_argument_activate(validator, arg); arg2 = sieve_ast_argument_next(arg); @@ -70,7 +70,7 @@ bool ext_imapflags_command_validate return FALSE; } - //sieve_validator_argument_activate(validator, arg2); + sieve_validator_argument_activate(validator, arg2); } return TRUE; } diff --git a/src/lib-sieve/plugins/imapflags/ext-imapflags.c b/src/lib-sieve/plugins/imapflags/ext-imapflags.c index 88b7cdb8b1aed19388b8b1211acc63b4fb678116..789685e0408810ab267ead5fb38a1e21224ee3df 100644 --- a/src/lib-sieve/plugins/imapflags/ext-imapflags.c +++ b/src/lib-sieve/plugins/imapflags/ext-imapflags.c @@ -41,7 +41,7 @@ extern const struct sieve_opcode addflag_opcode; extern const struct sieve_opcode removeflag_opcode; const struct sieve_opcode *imapflags_opcodes[] = - { &setflag_opcode, &addflag_opcode }; + { &setflag_opcode, &addflag_opcode, &removeflag_opcode }; const struct sieve_extension imapflags_extension = { "imapflags", ext_imapflags_load, diff --git a/src/lib-sieve/plugins/imapflags/imapflags.sieve b/src/lib-sieve/plugins/imapflags/imapflags.sieve index 28fc9f645ab0f002ff23bda7bf3ea25a6f565431..0edd3fc22c47e3afb12c29e1ae9aafce3c0cb890 100644 --- a/src/lib-sieve/plugins/imapflags/imapflags.sieve +++ b/src/lib-sieve/plugins/imapflags/imapflags.sieve @@ -1,6 +1,10 @@ require "imapflags"; require "fileinto"; +setflag "\\Seen"; +addflag "$DSNRequired"; +removeflag "$DSNRequired"; + if header :contains "from" "boss@frobnitzm.example.edu" { setflag "\\Flagged"; fileinto "INBOX.From Boss"; diff --git a/src/lib-sieve/sieve-code.c b/src/lib-sieve/sieve-code.c index 26f488c3df86e0549c70907b8576f7da1c891450..e398b79782d62dc12f6d5e5c5220763323d50562 100644 --- a/src/lib-sieve/sieve-code.c +++ b/src/lib-sieve/sieve-code.c @@ -695,6 +695,8 @@ static bool opc_jmp_dump( return TRUE; } +/* Code dump for trivial opcodes */ + bool sieve_opcode_trivial_dump (const struct sieve_opcode *opcode, struct sieve_interpreter *interp ATTR_UNUSED, @@ -705,6 +707,18 @@ bool sieve_opcode_trivial_dump return TRUE; } +bool sieve_opcode_string_dump +(const struct sieve_opcode *opcode, + struct sieve_interpreter *interp ATTR_UNUSED, + struct sieve_binary *sbin, sieve_size_t *address) +{ + printf("%s\n", opcode->mnemonic); + + return + sieve_opr_string_dump(sbin, address); +} + + /* Code execution for core commands */ static bool opc_jmp_execute diff --git a/src/lib-sieve/sieve-code.h b/src/lib-sieve/sieve-code.h index d8dd2948f8b1037d21ac0d1b16d693f3f339a11e..72d68e03eca38cac045ee04c5c31b6fa72e83d57 100644 --- a/src/lib-sieve/sieve-code.h +++ b/src/lib-sieve/sieve-code.h @@ -154,6 +154,9 @@ const struct sieve_opcode *sieve_operation_read bool sieve_opcode_trivial_dump (const struct sieve_opcode *opcode, struct sieve_interpreter *interp, struct sieve_binary *sbin, sieve_size_t *address); +bool sieve_opcode_string_dump + (const struct sieve_opcode *opcode, struct sieve_interpreter *interp, + struct sieve_binary *sbin, sieve_size_t *address); /* Core operands */