struct sieve_extprograms_config *sieve_extprograms_config_init (const struct sieve_extension *ext) { struct sieve_instance *svinst = ext->svinst; struct sieve_extprograms_config *ext_config; const char *extname = sieve_extension_name(ext); const char *bin_dir, *socket_dir, *input_eol; sieve_number_t execute_timeout; extname = strrchr(extname, '.'); i_assert(extname != NULL); extname++; bin_dir = sieve_setting_get (svinst, t_strdup_printf("sieve_%s_bin_dir", extname)); socket_dir = sieve_setting_get (svinst, t_strdup_printf("sieve_%s_socket_dir", extname)); input_eol = sieve_setting_get (svinst, t_strdup_printf("sieve_%s_input_eol", extname)); ext_config = i_new(struct sieve_extprograms_config, 1); ext_config->execute_timeout = SIEVE_EXTPROGRAMS_DEFAULT_EXEC_TIMEOUT_SECS; if ( bin_dir == NULL && socket_dir == NULL ) { if ( svinst->debug ) { sieve_sys_debug(svinst, "%s extension: " "no bin or socket directory specified; extension is unconfigured " "(both sieve_%s_bin_dir and sieve_%s_socket_dir are not set)", sieve_extension_name(ext), extname, extname); } } else { ext_config->bin_dir = i_strdup(bin_dir); ext_config->socket_dir = i_strdup(socket_dir); if (sieve_setting_get_duration_value (svinst, t_strdup_printf("sieve_%s_exec_timeout", extname), &execute_timeout)) { ext_config->execute_timeout = execute_timeout; } ext_config->default_input_eol = SIEVE_EXTPROGRAMS_EOL_CRLF; if (input_eol != NULL && strcasecmp(input_eol, "lf") == 0) ext_config->default_input_eol = SIEVE_EXTPROGRAMS_EOL_LF; } if ( sieve_extension_is(ext, vnd_pipe_extension) ) ext_config->copy_ext = sieve_ext_copy_get_extension(ext->svinst); if ( sieve_extension_is(ext, vnd_execute_extension) ) ext_config->var_ext = sieve_ext_variables_get_extension(ext->svinst); return ext_config; }
static bool tst_spamvirustest_registered (struct sieve_validator *valdtr, const struct sieve_extension *ext, struct sieve_command_registration *cmd_reg) { sieve_comparators_link_tag(valdtr, cmd_reg, SIEVE_MATCH_OPT_COMPARATOR); sieve_match_types_link_tags(valdtr, cmd_reg, SIEVE_MATCH_OPT_MATCH_TYPE); if ( sieve_extension_is(ext, spamtestplus_extension) || sieve_extension_is(ext, spamtest_extension) ) { sieve_validator_register_tag (valdtr, cmd_reg, ext, &spamtest_percent_tag, OPT_SPAMTEST_PERCENT); } return TRUE; }
static bool ext_spamvirustest_validator_load (const struct sieve_extension *ext, struct sieve_validator *valdtr) { /* Register new test */ if ( sieve_extension_is(ext, virustest_extension) ) { sieve_validator_register_command(valdtr, ext, &virustest_test); } else { if ( sieve_extension_is(ext, spamtest_extension) ) { /* Register validator extension to warn for duplicate */ sieve_validator_extension_register (valdtr, ext, &spamtest_validator_extension, NULL); } sieve_validator_register_command(valdtr, ext, &spamtest_test); } return TRUE; }
static bool ext_duplicate_validator_load (const struct sieve_extension *ext, struct sieve_validator *valdtr) { /* Register validator extension to check for conflict between vnd.dovecot.duplicate and duplicate extensions */ if ( sieve_extension_is(ext, vnd_duplicate_extension) ) { sieve_validator_extension_register (valdtr, ext, &duplicate_validator_extension, NULL); } /* Register duplicate test */ sieve_validator_register_command(valdtr, ext, &tst_duplicate); return TRUE; }
static bool tst_spamtest_validate_percent_tag (struct sieve_validator *valdtr, struct sieve_ast_argument **arg, struct sieve_command *tst) { if ( !sieve_extension_is(tst->ext, spamtestplus_extension) ) { sieve_argument_validate_error(valdtr, *arg, "the spamtest test only accepts the :percent argument when " "the spamtestplus extension is active"); return FALSE; } /* Skip tag */ *arg = sieve_ast_argument_next(*arg); return TRUE; }