diff --git a/src/lib-sieve/plugins/special-use/tag-specialuse.c b/src/lib-sieve/plugins/special-use/tag-specialuse.c index d480764b07df049209fbdc30c1e6bab7bfe8acae..83473c71596d9e83f0f0d96aac770ace74d5a617 100644 --- a/src/lib-sieve/plugins/special-use/tag-specialuse.c +++ b/src/lib-sieve/plugins/special-use/tag-specialuse.c @@ -100,7 +100,6 @@ tag_specialuse_validate(struct sieve_validator *valdtr, struct sieve_command *cmd) { struct sieve_ast_argument *tag = *arg; - const char *use_flag; /* Detach the tag itself */ *arg = sieve_ast_argument_next(*arg); @@ -111,13 +110,16 @@ tag_specialuse_validate(struct sieve_validator *valdtr, if (!sieve_validate_tag_parameter(valdtr, cmd, tag, *arg, NULL, 0, SAAT_STRING, FALSE)) return FALSE; - use_flag = sieve_ast_argument_strc(*arg); - if (!ext_special_use_flag_valid(use_flag)) { - sieve_argument_validate_error( - valdtr, *arg, "specialuse tag: " - "invalid special-use flag `%s' specified", - str_sanitize(use_flag, 64)); - return FALSE; + if (sieve_argument_is_string_literal(*arg)) { + const char *use_flag = sieve_ast_argument_strc(*arg); + + if (!ext_special_use_flag_valid(use_flag)) { + sieve_argument_validate_error( + valdtr, *arg, "specialuse tag: " + "invalid special-use flag `%s' specified", + str_sanitize(use_flag, 64)); + return FALSE; + } } tag->parameters = *arg; diff --git a/tests/extensions/special-use/execute.svtest b/tests/extensions/special-use/execute.svtest index 746f1d3e6f33410330b83eca9b86f936a65ef44a..a2b637e3838191218e0c863fc0032b04fec44fda 100644 --- a/tests/extensions/special-use/execute.svtest +++ b/tests/extensions/special-use/execute.svtest @@ -1,6 +1,7 @@ require "vnd.dovecot.testsuite"; require "special-use"; require "fileinto"; +require "variables"; test "Specialuse_exists - None exist" { if specialuse_exists "\\Sent" { @@ -33,3 +34,21 @@ Frop! test_fail "execution of result failed"; } } + +test ":specialuse variable" { + test_set "message" text: +From: stephan@example.org +To: nico@frop.example.org +Subject: Frop 1 + +Frop! +. + ; + + set "use" "\\Junk"; + fileinto :specialuse "${use}" "frop"; + + if not test_result_execute { + test_fail "execution of result failed"; + } +}