diff --git a/src/lib-sieve/plugins/variables/ext-variables-arguments.c b/src/lib-sieve/plugins/variables/ext-variables-arguments.c index 9988cbe8ff5ed6ae222bc48de0395baba54c1388..c0abb4a10ad1420579f2428c19945563fa86e214 100644 --- a/src/lib-sieve/plugins/variables/ext-variables-arguments.c +++ b/src/lib-sieve/plugins/variables/ext-variables-arguments.c @@ -299,11 +299,12 @@ static bool arg_variable_string_validate strstart = p + 1; substart = strstart; + + p++; } /* Finished, reset for the next substitution */ state = ST_NONE; - p++; } } diff --git a/tests/extensions/variables/basic.svtest b/tests/extensions/variables/basic.svtest index fbcf5d4ca65c5d9bcf8d1b9825b5cba7da30027d..c35694337b7c94424933d1498c2a3430526b5025 100644 --- a/tests/extensions/variables/basic.svtest +++ b/tests/extensions/variables/basic.svtest @@ -21,7 +21,14 @@ test "Unknown variables" { set "qwer" "dddd"; set "qwert" "ccc"; - if not string "[${qwerty}]" "[]" { + if anyof ( + not string "[${qwerty}]" "[]", + not string "[${5000}]" "[]", + not string "[${qwerty.asdf}]" "[]", + not string "[${qwerty.asdf.0.1.34.5}]" "[]", + not string "[${qwerty.asdf.hokey.pokey}]" "[]", + not string "[${qwerty.asdf.0.frop}]" "[]" + ) { test_fail "unknown variable not substituted with empty string"; } } @@ -48,12 +55,43 @@ test "Syntax errors" { not string "${" "${s}{", not string "${a" "${s}{a", not string "${$}" "${s}{$}", - not string "${%%%%}" "${s}{%%%%}" ) + not string "${%%%%}" "${s}{%%%%}", + not string "${0.s}" "${s}{0.s}", + not string "&%${}!" "&%${s}{}!", + not string "${doh!}" "${s}{doh!}" ) { test_fail "variables substitution changed substring not matching variable-ref"; } } +test "RFC syntax examples" { + # The variable "company" holds the value "ACME". No other variables + # are set. + set "company" "ACME"; + + # "${full}" => the empty string + if not string :is "${full}" "" { + test_fail "unknown variable did not yield empty string"; + } + + # "${company}" => "ACME" + if not string :is "${company}" "ACME" { + test_fail "assigned variable did not get substituted"; + } + + # "${BAD${Company}" => "${BADACME" + if not string :is "${BAD${Company}" "${BADACME" { + test_fail "'BADACME' test did not yield expected result"; + } + + #"${President, ${Company} Inc.}" + # => "${President, ACME Inc.}" + if not string "${President, ${Company} Inc.}" + "${President, ACME Inc.}" { + test_fail "'Company president' test did not yield expected result"; + } +} + /* * Variable assignments */