From 55f2956ec7f4f012a777746312455909d70d47a9 Mon Sep 17 00:00:00 2001 From: Stephan Bosch <stephan@rename-it.nl> Date: Sun, 11 Sep 2011 10:51:40 +0200 Subject: [PATCH] include extension: implemented proper configuration handling Configuration is now only read once at extension initialization. --- .../plugins/include/ext-include-common.c | 108 ++++++++++++++---- .../plugins/include/ext-include-common.h | 9 ++ src/lib-sieve/plugins/include/ext-include.c | 33 ------ src/testsuite/testsuite.c | 21 ++-- .../included/action-fileinto.sieve | 0 .../{errors => }/included/action-reject.sieve | 0 .../included/actions-fileinto1.sieve | 0 .../included/actions-fileinto2.sieve | 0 .../included/actions-fileinto3.sieve | 0 .../{errors => }/included/circular-one.sieve | 0 .../included/circular-three-2.sieve | 0 .../included/circular-three-3.sieve | 0 .../included/circular-three.sieve | 0 .../included/circular-two-2.sieve | 0 .../{errors => }/included/circular-two.sieve | 0 15 files changed, 104 insertions(+), 67 deletions(-) rename tests/extensions/include/{errors => }/included/action-fileinto.sieve (100%) rename tests/extensions/include/{errors => }/included/action-reject.sieve (100%) rename tests/extensions/include/{execute => }/included/actions-fileinto1.sieve (100%) rename tests/extensions/include/{execute => }/included/actions-fileinto2.sieve (100%) rename tests/extensions/include/{execute => }/included/actions-fileinto3.sieve (100%) rename tests/extensions/include/{errors => }/included/circular-one.sieve (100%) rename tests/extensions/include/{errors => }/included/circular-three-2.sieve (100%) rename tests/extensions/include/{errors => }/included/circular-three-3.sieve (100%) rename tests/extensions/include/{errors => }/included/circular-three.sieve (100%) rename tests/extensions/include/{errors => }/included/circular-two-2.sieve (100%) rename tests/extensions/include/{errors => }/included/circular-two.sieve (100%) diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c index 56c96a1d7..6317b0db7 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.c +++ b/src/lib-sieve/plugins/include/ext-include-common.c @@ -65,6 +65,74 @@ struct ext_include_interpreter_context { bool returned; }; +/* + * Extension configuration + */ + +/* Extension hooks */ + +bool ext_include_load +(const struct sieve_extension *ext, void **context) +{ + struct sieve_instance *svinst = ext->svinst; + struct ext_include_context *ctx; + const char *global_dir, *personal_dir, *home; + + if ( *context != NULL ) { + ext_include_unload(ext); + } + + /* Get directory for :global scripts */ + global_dir = sieve_setting_get(svinst, "sieve_global_dir"); + + if ( global_dir == NULL && svinst->debug ) { + sieve_sys_debug(svinst, "include: sieve_global_dir is not set; " + "it is currently not possible to include `:global' scripts."); + } + + /* Get directory for :personal scripts */ + personal_dir = sieve_setting_get(svinst, "sieve_dir"); + + home = sieve_environment_get_homedir(svinst); + + if ( personal_dir == NULL ) { + if ( home == NULL ) { + if ( svinst->debug ) { + sieve_sys_debug(svinst, "include: sieve_dir is not set " + "and no home directory is set for the default `~/sieve'; " + "it is currently not possible to include `:personal' scripts."); + } + } else { + personal_dir = "~/sieve"; + } + } + + if ( home != NULL ) + personal_dir = home_expand_tilde(personal_dir, home); + + ctx = i_new(struct ext_include_context, 1); + ctx->personal_dir = i_strdup(personal_dir); + ctx->global_dir = i_strdup(global_dir); + + /* Extension dependencies */ + ctx->var_ext = sieve_ext_variables_get_extension(ext->svinst); + + *context = (void *)ctx; + + return TRUE; +} + +void ext_include_unload +(const struct sieve_extension *ext) +{ + struct ext_include_context *ctx = + (struct ext_include_context *) ext->context; + + i_free(ctx->personal_dir); + i_free(ctx->global_dir); + i_free(ctx); +} + /* * Script access */ @@ -74,42 +142,36 @@ const char *ext_include_get_script_directory const char *script_name) { struct sieve_instance *svinst = ext->svinst; - const char *home = NULL, *sieve_dir = NULL; + struct ext_include_context *ctx = + (struct ext_include_context *) ext->context; + const char *sieve_dir; switch ( location ) { case EXT_INCLUDE_LOCATION_PERSONAL: - sieve_dir = sieve_setting_get(svinst, "sieve_dir"); - home = sieve_environment_get_homedir(svinst); - - if ( sieve_dir == NULL ) { - if ( home == NULL ) { - sieve_sys_error(svinst, - "include: sieve_dir and home not set for :personal script include " - "(wanted script '%s')", str_sanitize(script_name, 80)); - return NULL; - } - - sieve_dir = "~/sieve"; + if ( ctx->personal_dir == NULL ) { + sieve_sys_error(svinst, "include: sieve_dir is unconfigured; " + "include of `:personal' script `%s' is therefore not possible", + str_sanitize(script_name, 80)); + return NULL; } - if ( home != NULL ) - sieve_dir = home_expand_tilde(sieve_dir, home); - + sieve_dir = ctx->personal_dir; break; - case EXT_INCLUDE_LOCATION_GLOBAL: - sieve_dir = sieve_setting_get(svinst, "sieve_global_dir"); - if (sieve_dir == NULL) { - sieve_sys_error(svinst, - "include: sieve_global_dir not set for :global script include " - "(wanted script '%s')", str_sanitize(script_name, 80)); + case EXT_INCLUDE_LOCATION_GLOBAL: + + if ( ctx->global_dir == NULL ) { + sieve_sys_error(svinst, "include: sieve_global_dir is unconfigured; " + "include of `:global' script `%s' is therefore not possible", + str_sanitize(script_name, 80)); return NULL; } + sieve_dir = ctx->global_dir; break; default: - break; + i_unreached(); } return sieve_dir; diff --git a/src/lib-sieve/plugins/include/ext-include-common.h b/src/lib-sieve/plugins/include/ext-include-common.h index 6e7659d22..74d906d0a 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.h +++ b/src/lib-sieve/plugins/include/ext-include-common.h @@ -52,6 +52,11 @@ static inline const char *ext_include_script_location_name extern const struct sieve_extension_def include_extension; extern const struct sieve_binary_extension include_binary_ext; +bool ext_include_load + (const struct sieve_extension *ext, void **context); +void ext_include_unload + (const struct sieve_extension *ext); + /* * Commands */ @@ -95,6 +100,10 @@ const char *ext_include_get_script_directory struct ext_include_context { /* Extension dependencies */ const struct sieve_extension *var_ext; + + /* Configuration */ + char *global_dir; + char *personal_dir; }; static inline struct ext_include_context *ext_include_get_context diff --git a/src/lib-sieve/plugins/include/ext-include.c b/src/lib-sieve/plugins/include/ext-include.c index 2aeefa5c6..120874722 100644 --- a/src/lib-sieve/plugins/include/ext-include.c +++ b/src/lib-sieve/plugins/include/ext-include.c @@ -50,10 +50,6 @@ static const struct sieve_operation_def *ext_include_operations[] = { /* Forward declaration */ -static bool ext_include_load - (const struct sieve_extension *ext, void **context); -static void ext_include_unload - (const struct sieve_extension *ext); static bool ext_include_validator_load (const struct sieve_extension *ext, struct sieve_validator *validator); static bool ext_include_generator_load @@ -80,35 +76,6 @@ const struct sieve_extension_def include_extension = { SIEVE_EXT_DEFINE_NO_OPERANDS }; -/* Extension hooks */ - -static bool ext_include_load -(const struct sieve_extension *ext, void **context) -{ - struct ext_include_context *ctx; - - if ( *context != NULL ) { - ctx = (struct ext_include_context *) ext->context; - } else { - ctx = i_new(struct ext_include_context, 1); - } - - /* Extension dependencies */ - ctx->var_ext = sieve_ext_variables_get_extension(ext->svinst); - - *context = ctx; - - return TRUE; -} - -static void ext_include_unload -(const struct sieve_extension *ext) -{ - struct ext_include_context *ctx = (struct ext_include_context *) ext->context; - - i_free(ctx); -} - static bool ext_include_validator_load (const struct sieve_extension *ext, struct sieve_validator *valdtr) { diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c index 966e430c5..5d2c2b88c 100644 --- a/src/testsuite/testsuite.c +++ b/src/testsuite/testsuite.c @@ -49,7 +49,7 @@ const struct sieve_script_env *testsuite_scriptenv; static void print_help(void) { printf( -"Usage: testsuite [-E] [-d <dump-filename>]\n" +"Usage: testsuite [-D] [-E] [-d <dump-filename>]\n" " [-t <trace-filename>] [-T <trace-option>]\n" " [-P <plugin>] [-x <extensions>]\n" " <scriptfile>\n" @@ -91,7 +91,7 @@ int main(int argc, char **argv) int ret, c; sieve_tool = sieve_tool_init - ("testsuite", &argc, &argv, "d:t:T:EP:", TRUE); + ("testsuite", &argc, &argv, "d:t:T:EDP:", TRUE); /* Parse arguments */ scriptfile = dumpfile = tracefile = NULL; @@ -136,16 +136,10 @@ int main(int argc, char **argv) /* Initialize mail user */ sieve_tool_set_homedir(sieve_tool, t_abspath("")); - /* Finish tool initialization */ - svinst = sieve_tool_init_finish(sieve_tool, FALSE); - - testsuite_init(svinst, log_stdout); + /* Initialize settings environment */ testsuite_settings_init(); - printf("Test case: %s:\n\n", scriptfile); - - /* Initialize environment */ - + /* Currently needed for include (FIXME) */ sieve_dir = strrchr(scriptfile, '/'); if ( sieve_dir == NULL ) sieve_dir= "./"; @@ -153,12 +147,17 @@ int main(int argc, char **argv) sieve_dir = t_strdup_until(scriptfile, sieve_dir+1); } - /* Currently needed for include (FIXME) */ testsuite_setting_set ("sieve_dir", t_strconcat(sieve_dir, "included", NULL)); testsuite_setting_set ("sieve_global_dir", t_strconcat(sieve_dir, "included-global", NULL)); + /* Finish testsuite initialization */ + svinst = sieve_tool_init_finish(sieve_tool, FALSE); + testsuite_init(svinst, log_stdout); + + printf("Test case: %s:\n\n", scriptfile); + /* Compile sieve script */ if ( (sbin = sieve_compile (svinst, scriptfile, NULL, testsuite_log_main_ehandler, NULL)) != NULL ) { diff --git a/tests/extensions/include/errors/included/action-fileinto.sieve b/tests/extensions/include/included/action-fileinto.sieve similarity index 100% rename from tests/extensions/include/errors/included/action-fileinto.sieve rename to tests/extensions/include/included/action-fileinto.sieve diff --git a/tests/extensions/include/errors/included/action-reject.sieve b/tests/extensions/include/included/action-reject.sieve similarity index 100% rename from tests/extensions/include/errors/included/action-reject.sieve rename to tests/extensions/include/included/action-reject.sieve diff --git a/tests/extensions/include/execute/included/actions-fileinto1.sieve b/tests/extensions/include/included/actions-fileinto1.sieve similarity index 100% rename from tests/extensions/include/execute/included/actions-fileinto1.sieve rename to tests/extensions/include/included/actions-fileinto1.sieve diff --git a/tests/extensions/include/execute/included/actions-fileinto2.sieve b/tests/extensions/include/included/actions-fileinto2.sieve similarity index 100% rename from tests/extensions/include/execute/included/actions-fileinto2.sieve rename to tests/extensions/include/included/actions-fileinto2.sieve diff --git a/tests/extensions/include/execute/included/actions-fileinto3.sieve b/tests/extensions/include/included/actions-fileinto3.sieve similarity index 100% rename from tests/extensions/include/execute/included/actions-fileinto3.sieve rename to tests/extensions/include/included/actions-fileinto3.sieve diff --git a/tests/extensions/include/errors/included/circular-one.sieve b/tests/extensions/include/included/circular-one.sieve similarity index 100% rename from tests/extensions/include/errors/included/circular-one.sieve rename to tests/extensions/include/included/circular-one.sieve diff --git a/tests/extensions/include/errors/included/circular-three-2.sieve b/tests/extensions/include/included/circular-three-2.sieve similarity index 100% rename from tests/extensions/include/errors/included/circular-three-2.sieve rename to tests/extensions/include/included/circular-three-2.sieve diff --git a/tests/extensions/include/errors/included/circular-three-3.sieve b/tests/extensions/include/included/circular-three-3.sieve similarity index 100% rename from tests/extensions/include/errors/included/circular-three-3.sieve rename to tests/extensions/include/included/circular-three-3.sieve diff --git a/tests/extensions/include/errors/included/circular-three.sieve b/tests/extensions/include/included/circular-three.sieve similarity index 100% rename from tests/extensions/include/errors/included/circular-three.sieve rename to tests/extensions/include/included/circular-three.sieve diff --git a/tests/extensions/include/errors/included/circular-two-2.sieve b/tests/extensions/include/included/circular-two-2.sieve similarity index 100% rename from tests/extensions/include/errors/included/circular-two-2.sieve rename to tests/extensions/include/included/circular-two-2.sieve diff --git a/tests/extensions/include/errors/included/circular-two.sieve b/tests/extensions/include/included/circular-two.sieve similarity index 100% rename from tests/extensions/include/errors/included/circular-two.sieve rename to tests/extensions/include/included/circular-two.sieve -- GitLab