diff --git a/TODO b/TODO index ce4533369b0ab7cdbd70f05f443a52cb203cfc7a..6f2d23202dbf12cc80bbc9df98801d789b108305 100644 --- a/TODO +++ b/TODO @@ -91,8 +91,6 @@ Next (in order of descending priority/precedence): through IMAP (no specification for something like this is available; we will have to provide our own) * Variables extension: implement compile time evaluation of constant values -* Make the engine and its extensions much more configurable. Possibly this can - be merged with Dovecot's new master config implementation. * Add development documentation, i.e. comment on library functions and document the binary and byte-code format. * Give the byte code format some more thought, it is currently quite rough and diff --git a/src/lib-sieve-tool/sieve-tool.c b/src/lib-sieve-tool/sieve-tool.c index 61d95f0e25ffca12527b71923d50a4092189bf01..a14d6c059da100dbd24f83d8efdeba181596d97f 100644 --- a/src/lib-sieve-tool/sieve-tool.c +++ b/src/lib-sieve-tool/sieve-tool.c @@ -31,13 +31,20 @@ struct sieve_instance *sieve_instance; * Settings management */ -static const char *sieve_tool_get_setting +const char *sieve_tool_get_setting (void *context ATTR_UNUSED, const char *identifier) { return getenv(t_str_ucase(identifier)); } -static const struct sieve_callbacks sieve_tool_callbacks = { +const char *sieve_tool_get_homedir +(void *context ATTR_UNUSED) +{ + return getenv("HOME"); +} + +const struct sieve_callbacks sieve_tool_callbacks = { + sieve_tool_get_homedir, sieve_tool_get_setting }; diff --git a/src/lib-sieve-tool/sieve-tool.h b/src/lib-sieve-tool/sieve-tool.h index dacda5e51502f7ebd7db4f71f169205238ea0157..0958aa2c4a7e492874526b05474afc9cc8a0cbea 100644 --- a/src/lib-sieve-tool/sieve-tool.h +++ b/src/lib-sieve-tool/sieve-tool.h @@ -14,6 +14,11 @@ struct sieve_instance *sieve_instance; +const char *sieve_tool_get_setting(void *context, const char *identifier); +const char *sieve_tool_get_homedir(void *context); + +const struct sieve_callbacks sieve_tool_callbacks; + /* * Initialization */ diff --git a/src/lib-sieve/plugins/include/ext-include-common.c b/src/lib-sieve/plugins/include/ext-include-common.c index 0941f9d068227c5825d8c9b2ea6176541afe56ce..ce0a7f7165920bf6a6b7ffd1a90bf0e4738fcc53 100644 --- a/src/lib-sieve/plugins/include/ext-include-common.c +++ b/src/lib-sieve/plugins/include/ext-include-common.c @@ -79,9 +79,7 @@ const char *ext_include_get_script_directory case EXT_INCLUDE_LOCATION_PERSONAL: sieve_dir = sieve_get_setting(svinst, "sieve_dir"); - home = sieve_get_setting(svinst, "home"); - - if ( home == NULL ) home = getenv("HOME"); + home = sieve_get_homedir(svinst); if ( sieve_dir == NULL ) { if ( home == NULL ) { diff --git a/src/lib-sieve/sieve-settings.h b/src/lib-sieve/sieve-settings.h index e0cd91187c9ca2fcc1e7e8f85042296325930a6a..2acf1f487f6e4a36533e3785a23c56ccd03c7141 100644 --- a/src/lib-sieve/sieve-settings.h +++ b/src/lib-sieve/sieve-settings.h @@ -6,6 +6,10 @@ #include "sieve-common.h" +/* + * Settings + */ + static inline const char *sieve_get_setting (struct sieve_instance *svinst, const char *identifier) { @@ -25,4 +29,19 @@ bool sieve_get_int_setting (struct sieve_instance *svinst, const char *identifier, long long int *value_r); +/* + * Home directory + */ + +static inline const char *sieve_get_homedir +(struct sieve_instance *svinst) +{ + const struct sieve_callbacks *callbacks = svinst->callbacks; + + if ( callbacks == NULL || callbacks->get_homedir == NULL ) + return NULL; + + return callbacks->get_homedir(svinst->context); +} + #endif /* __SIEVE_SETTINGS_H */ diff --git a/src/lib-sieve/sieve-types.h b/src/lib-sieve/sieve-types.h index ea4445b99ebc8efaa174b7ee45b3077826a3e05b..519d2354d0a3355d801825932c7cac858fd1aae3 100644 --- a/src/lib-sieve/sieve-types.h +++ b/src/lib-sieve/sieve-types.h @@ -30,6 +30,7 @@ struct sieve_exec_status; */ struct sieve_callbacks { + const char *(*get_homedir)(void *context); const char *(*get_setting)(void *context, const char *identifier); }; diff --git a/src/plugins/lda-sieve/lda-sieve-plugin.c b/src/plugins/lda-sieve/lda-sieve-plugin.c index 6f615c1db3ae4a7b5872a1be1d0cd722e87a8145..9f99a4ec14482d77a8d2aea4288e9d288123db53 100644 --- a/src/plugins/lda-sieve/lda-sieve-plugin.c +++ b/src/plugins/lda-sieve/lda-sieve-plugin.c @@ -38,6 +38,21 @@ static deliver_mail_func_t *next_deliver_mail; * Settings handling */ +static const char *lda_sieve_get_homedir +(void *context) +{ + struct mail_user *mail_user = (struct mail_user *) context; + const char *home = NULL; + + if ( mail_user == NULL ) + return NULL; + + if ( mail_user_get_home(mail_user, &home) <= 0 ) + return NULL; + + return home; +} + static const char *lda_sieve_get_setting (void *context, const char *identifier) { @@ -50,6 +65,7 @@ static const char *lda_sieve_get_setting } static const struct sieve_callbacks lda_sieve_callbacks = { + lda_sieve_get_homedir, lda_sieve_get_setting }; diff --git a/src/testsuite/testsuite.c b/src/testsuite/testsuite.c index 3c6a4ee2e91a32580008b746c078e4f74f03e5b9..4e5b638bb1bed02fc479a1fad79d757c4eeb01f7 100644 --- a/src/testsuite/testsuite.c +++ b/src/testsuite/testsuite.c @@ -51,6 +51,7 @@ const struct sieve_script_env *testsuite_scriptenv; */ static const struct sieve_callbacks testsuite_sieve_callbacks = { + sieve_tool_get_homedir, testsuite_setting_get };