diff --git a/src/lib-sieve/Makefile.am b/src/lib-sieve/Makefile.am index 10d3818e9ab4e7369eb7195358f2e31538b4a85a..9bffcf1eb9f34d148e53b9f8da40bd6097a693b5 100644 --- a/src/lib-sieve/Makefile.am +++ b/src/lib-sieve/Makefile.am @@ -71,7 +71,7 @@ libdovecot_sieve_la_LIBADD = $(plugins) libdovecot_sieve_la_SOURCES = \ rfc2822.c \ - sieve-limits.c \ + sieve-settings.c \ sieve-message.c \ sieve-smtp.c \ sieve-lexer.c \ @@ -109,6 +109,7 @@ headers = \ sieve-types.h \ sieve-common.h \ sieve-limits.h \ + sieve-settings.h \ sieve-message.h \ sieve-smtp.h \ sieve-lexer.h \ diff --git a/src/lib-sieve/cmd-redirect.c b/src/lib-sieve/cmd-redirect.c index d035a2212222c7a1465c3d731e77113c8826ed71..3bc201d70d6e863a30936dbac72f3e391bbb7c3b 100644 --- a/src/lib-sieve/cmd-redirect.c +++ b/src/lib-sieve/cmd-redirect.c @@ -196,6 +196,7 @@ static bool cmd_redirect_operation_dump static int cmd_redirect_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { + struct sieve_instance *svinst = renv->svinst; struct sieve_side_effects_list *slist = NULL; struct act_redirect_context *act; string_t *redirect; @@ -234,7 +235,7 @@ static int cmd_redirect_operation_execute ret = sieve_result_add_action (renv, NULL, &act_redirect, slist, source_line, (void *) act, - sieve_max_redirects); + svinst->max_redirects); return ( ret >= 0 ); } diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c index d6715932f44a5c7227909852779024957746d731..0941f9d068227c5825d8c9b2ea6176541afe56ce 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.c +++ b/src/lib-sieve/plugins/include/ext-include-common.c @@ -7,6 +7,7 @@ #include "home-expand.h" #include "sieve-common.h" +#include "sieve-settings.h" #include "sieve-error.h" #include "sieve-script.h" #include "sieve-ast.h" diff --git a/src/lib-sieve/plugins/subaddress/ext-subaddress.c b/src/lib-sieve/plugins/subaddress/ext-subaddress.c index d7f714b3e4794ecaf06be429d7d6ff2bbd5f1cc9..17de8d5e16d9e45636eeecebcfaae2cc9db02aeb 100644 --- a/src/lib-sieve/plugins/subaddress/ext-subaddress.c +++ b/src/lib-sieve/plugins/subaddress/ext-subaddress.c @@ -13,6 +13,7 @@ #include "sieve-common.h" +#include "sieve-settings.h" #include "sieve-code.h" #include "sieve-address.h" #include "sieve-extensions.h" diff --git a/src/lib-sieve/sieve-common.h b/src/lib-sieve/sieve-common.h index e92f83d4be96d3a61fc11864d312acde8e91a204..80d9dc0563277dac02f6b993166ed312b332a441 100644 --- a/src/lib-sieve/sieve-common.h +++ b/src/lib-sieve/sieve-common.h @@ -10,6 +10,7 @@ #include "sieve-types.h" #include <sys/types.h> +#include <stdlib.h> /* * Types @@ -144,21 +145,10 @@ struct sieve_instance { /* Extension registry */ struct sieve_extension_registry *ext_reg; -}; - -/* - * Settings - */ -static inline const char *sieve_get_setting -(struct sieve_instance *svinst, const char *identifier) -{ - const struct sieve_callbacks *callbacks = svinst->callbacks; - - if ( callbacks == NULL || callbacks->get_setting == NULL ) - return NULL; - - return callbacks->get_setting(svinst->context, identifier); -} + /* Limits */ + unsigned int max_actions; + unsigned int max_redirects; +}; #endif /* __SIEVE_COMMON_H */ diff --git a/src/lib-sieve/sieve-limits.c b/src/lib-sieve/sieve-limits.c deleted file mode 100644 index dcc664f24727f06964b5b1b809c9ed4a7996eb57..0000000000000000000000000000000000000000 --- a/src/lib-sieve/sieve-limits.c +++ /dev/null @@ -1,9 +0,0 @@ -/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file - */ - -#include "sieve-common.h" -#include "sieve-limits.h" - -unsigned int sieve_max_actions = SIEVE_DEFAULT_MAX_ACTIONS; -unsigned int sieve_max_redirects = SIEVE_DEFAULT_MAX_REDIRECTS; - diff --git a/src/lib-sieve/sieve-limits.h b/src/lib-sieve/sieve-limits.h index 94f6a2ad1b55899aa16cd554b89d4ae88552741b..7ac4ba6f89e163a014b9da61072352612e39b72d 100644 --- a/src/lib-sieve/sieve-limits.h +++ b/src/lib-sieve/sieve-limits.h @@ -32,7 +32,4 @@ #define SIEVE_DEFAULT_MAX_ACTIONS 32 #define SIEVE_DEFAULT_MAX_REDIRECTS 4 -extern unsigned int sieve_max_actions; -extern unsigned int sieve_max_redirects; - #endif /* __SIEVE_LIMITS_H */ diff --git a/src/lib-sieve/sieve-result.c b/src/lib-sieve/sieve-result.c index 5476b95de7e7ec89c7cbfb85b322dae0fe64c038..ff875591ce1b0f89d96ee0b7d8e1c79308e5bcd6 100644 --- a/src/lib-sieve/sieve-result.c +++ b/src/lib-sieve/sieve-result.c @@ -491,6 +491,7 @@ static int _sieve_result_add_action { int ret = 0; unsigned int instance_count = 0; + struct sieve_instance *svinst = renv->svinst; struct sieve_result *result = renv->result; struct sieve_result_action *raction = NULL, *kaction = NULL; struct sieve_action action; @@ -591,7 +592,8 @@ static int _sieve_result_add_action } /* Check policy limit on total number of actions */ - if ( sieve_max_actions > 0 && result->action_count >= sieve_max_actions ) { + if ( svinst->max_actions > 0 && result->action_count >= svinst->max_actions ) + { sieve_runtime_error(renv, action.location, "total number of actions exceeds policy limit"); return -1; diff --git a/src/lib-sieve/sieve-settings.c b/src/lib-sieve/sieve-settings.c new file mode 100644 index 0000000000000000000000000000000000000000..45061cd0d374915f8a7124698fac1404e053e187 --- /dev/null +++ b/src/lib-sieve/sieve-settings.c @@ -0,0 +1,49 @@ +/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file + */ + +#include "lib.h" + +#include "sieve-common.h" +#include "sieve-settings.h" + +#include <stdlib.h> + +bool sieve_get_uint_setting +(struct sieve_instance *svinst, const char *identifier, + unsigned long long int *value_r) +{ + const char *str_value; + char *endp; + + str_value = sieve_get_setting(svinst, identifier); + + if ( str_value == NULL || *str_value == '\0' ) + return FALSE; + + *value_r = strtoull(str_value, &endp, 10); + + if ( *endp != '\0' ) + return FALSE; + + return TRUE; +} + +bool sieve_get_int_setting +(struct sieve_instance *svinst, const char *identifier, + long long int *value_r) +{ + const char *str_value; + char *endp; + + str_value = sieve_get_setting(svinst, identifier); + + if ( str_value == NULL || *str_value == '\0' ) + return FALSE; + + *value_r = strtoll(str_value, &endp, 10); + + if ( *endp != '\0' ) + return FALSE; + + return TRUE; +} diff --git a/src/lib-sieve/sieve-settings.h b/src/lib-sieve/sieve-settings.h new file mode 100644 index 0000000000000000000000000000000000000000..e0cd91187c9ca2fcc1e7e8f85042296325930a6a --- /dev/null +++ b/src/lib-sieve/sieve-settings.h @@ -0,0 +1,28 @@ +/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file + */ + +#ifndef __SIEVE_SETTINGS_H +#define __SIEVE_SETTINGS_H + +#include "sieve-common.h" + +static inline const char *sieve_get_setting +(struct sieve_instance *svinst, const char *identifier) +{ + const struct sieve_callbacks *callbacks = svinst->callbacks; + + if ( callbacks == NULL || callbacks->get_setting == NULL ) + return NULL; + + return callbacks->get_setting(svinst->context, identifier); +} + +bool sieve_get_uint_setting +(struct sieve_instance *svinst, const char *identifier, + unsigned long long int *value_r); + +bool sieve_get_int_setting +(struct sieve_instance *svinst, const char *identifier, + long long int *value_r); + +#endif /* __SIEVE_SETTINGS_H */ diff --git a/src/lib-sieve/sieve.c b/src/lib-sieve/sieve.c index f5d2879a9d8047d44dc85d4632ff9d0d057c3487..e4c69a19d7f9d995502f889c9a0ec41f115acf25 100644 --- a/src/lib-sieve/sieve.c +++ b/src/lib-sieve/sieve.c @@ -6,6 +6,8 @@ #include "istream.h" #include "buffer.h" +#include "sieve-limits.h" +#include "sieve-settings.h" #include "sieve-extensions.h" #include "sieve-script.h" @@ -39,14 +41,32 @@ struct sieve_instance *sieve_init (const struct sieve_callbacks *callbacks, void *context) { struct sieve_instance *svinst; + unsigned long long int uint_setting; pool_t pool; + /* Create Sieve engine instance */ pool = pool_alloconly_create("sieve", 8192); svinst = p_new(pool, struct sieve_instance, 1); svinst->pool = pool; svinst->callbacks = callbacks; svinst->context = context; + /* Read limits from configuration */ + + svinst->max_actions = SIEVE_DEFAULT_MAX_ACTIONS; + svinst->max_redirects = SIEVE_DEFAULT_MAX_REDIRECTS; + + if ( sieve_get_uint_setting + (svinst, "sieve_max_actions", &uint_setting) ) { + svinst->max_actions = (unsigned int) uint_setting; + } + + if ( sieve_get_uint_setting + (svinst, "sieve_max_redirects", &uint_setting) ) { + svinst->max_redirects = (unsigned int) uint_setting; + } + + /* Initialize extensions */ if ( !sieve_extensions_init(svinst) ) { sieve_deinit(&svinst); return NULL;