static bool cmd_include_validate_location_tag (struct sieve_validator *valdtr, struct sieve_ast_argument **arg, struct sieve_command *cmd) { struct cmd_include_context_data *ctx_data = (struct cmd_include_context_data *) cmd->data; if ( ctx_data->location_assigned) { sieve_argument_validate_error(valdtr, *arg, "include: cannot use location tags ':personal' and ':global' " "multiple times"); return FALSE; } if ( sieve_argument_is(*arg, include_personal_tag) ) ctx_data->location = EXT_INCLUDE_LOCATION_PERSONAL; else if ( sieve_argument_is(*arg, include_global_tag) ) ctx_data->location = EXT_INCLUDE_LOCATION_GLOBAL; else return FALSE; ctx_data->location_assigned = TRUE; /* Delete this tag (for now) */ *arg = sieve_ast_arguments_detach(*arg, 1); return TRUE; }
static bool cmd_vacation_validate_number_tag (struct sieve_validator *valdtr, struct sieve_ast_argument **arg, struct sieve_command *cmd) { const struct sieve_extension *ext = sieve_argument_ext(*arg); const struct ext_vacation_config *config = (const struct ext_vacation_config *) ext->context; struct sieve_ast_argument *tag = *arg; sieve_number_t period, seconds; /* Detach the tag itself */ *arg = sieve_ast_arguments_detach(*arg,1); /* Check syntax: * :days number */ if ( !sieve_validate_tag_parameter (valdtr, cmd, tag, *arg, NULL, 0, SAAT_NUMBER, FALSE) ) { return FALSE; } period = sieve_ast_argument_number(*arg); if ( sieve_argument_is(tag, vacation_days_tag) ) { seconds = period * (24*60*60); } else if ( sieve_argument_is(tag, vacation_seconds_tag) ) { seconds = period; } else { i_unreached(); } /* Enforce :seconds >= min_period */ if ( seconds < config->min_period ) { seconds = config->min_period; sieve_argument_validate_warning(valdtr, *arg, "specified :%s value '%lu' is under the minimum", sieve_argument_identifier(tag), (unsigned long) period); /* Enforce :days <= max_period */ } else if ( config->max_period > 0 && seconds > config->max_period ) { seconds = config->max_period; sieve_argument_validate_warning(valdtr, *arg, "specified :%s value '%lu' is over the maximum", sieve_argument_identifier(tag), (unsigned long) period); } sieve_ast_argument_number_set(*arg, seconds); /* Skip parameter */ *arg = sieve_ast_argument_next(*arg); return TRUE; }
static bool tag_body_transform_validate (struct sieve_validator *valdtr, struct sieve_ast_argument **arg, struct sieve_command *cmd) { enum tst_body_transform transform; struct sieve_ast_argument *tag = *arg; /* BODY-TRANSFORM: * :raw * / :content <content-types: string-list> * / :text */ if ( (bool) cmd->data ) { sieve_argument_validate_error(valdtr, *arg, "the :raw, :content and :text arguments for the body test are mutually " "exclusive, but more than one was specified"); return FALSE; } /* Skip tag */ *arg = sieve_ast_argument_next(*arg); /* :content tag has a string-list argument */ if ( sieve_argument_is(tag, body_raw_tag) ) transform = TST_BODY_TRANSFORM_RAW; else if ( sieve_argument_is(tag, body_text_tag) ) transform = TST_BODY_TRANSFORM_TEXT; else if ( sieve_argument_is(tag, body_content_tag) ) { /* Check syntax: * :content <content-types: string-list> */ if ( !sieve_validate_tag_parameter (valdtr, cmd, tag, *arg, NULL, 0, SAAT_STRING_LIST, FALSE) ) { return FALSE; } /* Assign tag parameters */ tag->parameters = *arg; *arg = sieve_ast_arguments_detach(*arg,1); transform = TST_BODY_TRANSFORM_CONTENT; } else return FALSE; /* Signal the presence of this tag */ cmd->data = (void *) TRUE; /* Assign context data */ tag->argument->data = (void *) transform; return TRUE; }
static bool cmd_execute_validate_input_tag (struct sieve_validator *valdtr, struct sieve_ast_argument **arg, struct sieve_command *cmd) { struct sieve_ast_argument *tag = *arg; if ( (bool) cmd->data ) { sieve_argument_validate_error(valdtr, *arg, "multiple :input or :pipe arguments specified for the %s %s", sieve_command_identifier(cmd), sieve_command_type_name(cmd)); return FALSE; } cmd->data = (void *) TRUE; /* Skip tag */ *arg = sieve_ast_argument_next(*arg); if ( sieve_argument_is(tag, execute_input_tag) ) { /* Check syntax: * :input <input-data: string> */ if ( !sieve_validate_tag_parameter (valdtr, cmd, tag, *arg, NULL, 0, SAAT_STRING, FALSE) ) { return FALSE; } /* Assign tag parameters */ tag->parameters = *arg; *arg = sieve_ast_arguments_detach(*arg,1); } return TRUE; }