diff options
Diffstat (limited to 'pigeonhole/src/lib-sieve/cmd-require.c')
-rw-r--r-- | pigeonhole/src/lib-sieve/cmd-require.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/pigeonhole/src/lib-sieve/cmd-require.c b/pigeonhole/src/lib-sieve/cmd-require.c new file mode 100644 index 0000000..93a2a26 --- /dev/null +++ b/pigeonhole/src/lib-sieve/cmd-require.c @@ -0,0 +1,86 @@ +/* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file + */ + +#include "lib.h" + +#include "sieve-common.h" +#include "sieve-commands.h" +#include "sieve-extensions.h" +#include "sieve-validator.h" +#include "sieve-generator.h" + +/* + * Require command + * + * Syntax + * Syntax: require <capabilities: string-list> + */ + +static bool cmd_require_validate + (struct sieve_validator *valdtr, struct sieve_command *cmd); + +const struct sieve_command_def cmd_require = { + .identifier = "require", + .type = SCT_COMMAND, + .positional_args = 1, + .subtests = 0, + .block_allowed = FALSE, + .block_required = FALSE, + .validate = cmd_require_validate +}; + +/* + * Validation + */ + +static bool cmd_require_validate +(struct sieve_validator *valdtr, struct sieve_command *cmd) +{ + bool result = TRUE; + struct sieve_ast_argument *arg; + struct sieve_command *prev = sieve_command_prev(cmd); + + /* Check valid command placement */ + if ( !sieve_command_is_toplevel(cmd) || + ( !sieve_command_is_first(cmd) && prev != NULL && + !sieve_command_is(prev, cmd_require) ) ) + { + sieve_command_validate_error(valdtr, cmd, + "require commands can only be placed at top level " + "at the beginning of the file"); + return FALSE; + } + + /* Check argument and load specified extension(s) */ + + arg = cmd->first_positional; + if ( sieve_ast_argument_type(arg) == SAAT_STRING ) { + /* Single string */ + const struct sieve_extension *ext = sieve_validator_extension_load_by_name + (valdtr, cmd, arg, sieve_ast_argument_strc(arg)); + + if ( ext == NULL ) result = FALSE; + + } else if ( sieve_ast_argument_type(arg) == SAAT_STRING_LIST ) { + /* String list */ + struct sieve_ast_argument *stritem = sieve_ast_strlist_first(arg); + + while ( stritem != NULL ) { + const struct sieve_extension *ext = sieve_validator_extension_load_by_name + (valdtr, cmd, stritem, sieve_ast_strlist_strc(stritem)); + + if ( ext == NULL ) result = FALSE; + + stritem = sieve_ast_strlist_next(stritem); + } + } else { + /* Something else */ + sieve_argument_validate_error(valdtr, arg, + "the require command accepts a single string or string list argument, " + "but %s was found", + sieve_ast_argument_name(arg)); + return FALSE; + } + + return result; +} |