diff --git a/src/lib-sieve/plugins/environment/ext-environment-common.c b/src/lib-sieve/plugins/environment/ext-environment-common.c index c7f5f625a6a58c18c18471b71605791bd1061fa2..382749f64efa0cf309e2bb56b30b835277163e7b 100644 --- a/src/lib-sieve/plugins/environment/ext-environment-common.c +++ b/src/lib-sieve/plugins/environment/ext-environment-common.c @@ -16,7 +16,7 @@ struct ext_environment_interpreter_context; * Core environment items */ -static const struct sieve_environment_item *core_env_items[] = { +static const struct sieve_environment_item_def *core_env_items[] = { &domain_env_item, &host_env_item, &location_env_item, @@ -28,8 +28,10 @@ static const struct sieve_environment_item *core_env_items[] = { static unsigned int core_env_items_count = N_ELEMENTS(core_env_items); static void -sieve_environment_item_insert(struct ext_environment_interpreter_context *ctx, - const struct sieve_environment_item *item); +sieve_environment_item_insert( + struct ext_environment_interpreter_context *ctx, + struct sieve_interpreter *interp, const struct sieve_extension *ext, + const struct sieve_environment_item_def *item_def); /* * Validator context @@ -108,8 +110,10 @@ void ext_environment_interpreter_init(const struct sieve_extension *this_ext, /* Create our context */ ctx = ext_environment_interpreter_context_get(this_ext, interp); - for (i = 0; i < core_env_items_count; i++) - sieve_environment_item_insert(ctx, core_env_items[i]); + for (i = 0; i < core_env_items_count; i++) { + sieve_environment_item_insert(ctx, interp, this_ext, + core_env_items[i]); + } ctx->active = TRUE; } @@ -128,25 +132,36 @@ bool sieve_ext_environment_is_active(const struct sieve_extension *env_ext, */ static void -sieve_environment_item_insert(struct ext_environment_interpreter_context *ctx, - const struct sieve_environment_item *item) +sieve_environment_item_insert( + struct ext_environment_interpreter_context *ctx, + struct sieve_interpreter *interp, const struct sieve_extension *ext, + const struct sieve_environment_item_def *item_def) { - if (!item->prefix) - hash_table_insert(ctx->name_items, item->name, item); + pool_t pool = sieve_interpreter_pool(interp); + struct sieve_environment_item *item_mod; + + item_mod = p_new(pool, struct sieve_environment_item, 1); + item_mod->def = item_def; + item_mod->ext = ext; + + const struct sieve_environment_item *item = item_mod; + if (!item_def->prefix) + hash_table_insert(ctx->name_items, item_def->name, item); else array_append(&ctx->prefix_items, &item, 1); } -void sieve_environment_item_register(const struct sieve_extension *env_ext, - struct sieve_interpreter *interp, - const struct sieve_environment_item *item) +void sieve_environment_item_register( + const struct sieve_extension *env_ext, struct sieve_interpreter *interp, + const struct sieve_extension *ext, + const struct sieve_environment_item_def *item_def) { struct ext_environment_interpreter_context *ctx; i_assert(sieve_extension_is(env_ext, environment_extension)); ctx = ext_environment_interpreter_context_get(env_ext, interp); - sieve_environment_item_insert(ctx, item); + sieve_environment_item_insert(ctx, interp, ext, item_def); } /* @@ -165,9 +180,9 @@ ext_environment_item_lookup(struct ext_environment_interpreter_context *ctx, return item; array_foreach_elem(&ctx->prefix_items, item) { - i_assert(item->prefix); + i_assert(item->def->prefix); - if (str_begins(name, item->name, &suffix)) { + if (str_begins(name, item->def->name, &suffix)) { if (*suffix == '.') ++suffix; @@ -193,10 +208,11 @@ ext_environment_item_get_value(const struct sieve_extension *env_ext, if (item == NULL) return NULL; - if (item->value != NULL) - return item->value; - if (item->get_value != NULL) - return item->get_value(renv, name); + i_assert(item->def != NULL); + if (item->def->value != NULL) + return item->def->value; + if (item->def->get_value != NULL) + return item->def->get_value(renv, item, name); return NULL; } @@ -212,6 +228,7 @@ ext_environment_item_get_value(const struct sieve_extension *env_ext, static const char * envit_domain_get_value(const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; @@ -219,7 +236,7 @@ envit_domain_get_value(const struct sieve_runtime_env *renv, return eenv->svinst->domainname; } -const struct sieve_environment_item domain_env_item = { +const struct sieve_environment_item_def domain_env_item = { .name = "domain", .get_value = envit_domain_get_value, }; @@ -232,6 +249,7 @@ const struct sieve_environment_item domain_env_item = { static const char * envit_host_get_value(const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; @@ -239,7 +257,7 @@ envit_host_get_value(const struct sieve_runtime_env *renv, return eenv->svinst->hostname; } -const struct sieve_environment_item host_env_item = { +const struct sieve_environment_item_def host_env_item = { .name = "host", .get_value = envit_host_get_value, }; @@ -257,6 +275,7 @@ const struct sieve_environment_item host_env_item = { static const char * envit_location_get_value(const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; @@ -274,7 +293,7 @@ envit_location_get_value(const struct sieve_runtime_env *renv, return NULL; } -const struct sieve_environment_item location_env_item = { +const struct sieve_environment_item_def location_env_item = { .name = "location", .get_value = envit_location_get_value }; @@ -289,6 +308,7 @@ const struct sieve_environment_item location_env_item = { static const char * envit_phase_get_value(const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; @@ -306,7 +326,7 @@ envit_phase_get_value(const struct sieve_runtime_env *renv, return NULL; } -const struct sieve_environment_item phase_env_item = { +const struct sieve_environment_item_def phase_env_item = { .name = "phase", .get_value = envit_phase_get_value }; @@ -316,7 +336,7 @@ const struct sieve_environment_item phase_env_item = { The product name associated with the Sieve interpreter. */ -const struct sieve_environment_item name_env_item = { +const struct sieve_environment_item_def name_env_item = { .name = "name", .value = PIGEONHOLE_NAME" Sieve" }; @@ -328,7 +348,7 @@ const struct sieve_environment_item name_env_item = { in the context of the product name given by the "name" item. */ -const struct sieve_environment_item version_env_item = { +const struct sieve_environment_item_def version_env_item = { .name = "version", .value = PIGEONHOLE_VERSION, }; diff --git a/src/lib-sieve/plugins/environment/ext-environment-common.h b/src/lib-sieve/plugins/environment/ext-environment-common.h index 288b82e378cb63076ce8b0f2e8d5fd6ec395d2d9..f7e7fa67461f70da848105e529d6b2a8ee846a1d 100644 --- a/src/lib-sieve/plugins/environment/ext-environment-common.h +++ b/src/lib-sieve/plugins/environment/ext-environment-common.h @@ -29,12 +29,12 @@ extern const struct sieve_operation_def tst_environment_operation; * Environment items */ -extern const struct sieve_environment_item domain_env_item; -extern const struct sieve_environment_item host_env_item; -extern const struct sieve_environment_item location_env_item; -extern const struct sieve_environment_item phase_env_item; -extern const struct sieve_environment_item name_env_item; -extern const struct sieve_environment_item version_env_item; +extern const struct sieve_environment_item_def domain_env_item; +extern const struct sieve_environment_item_def host_env_item; +extern const struct sieve_environment_item_def location_env_item; +extern const struct sieve_environment_item_def phase_env_item; +extern const struct sieve_environment_item_def name_env_item; +extern const struct sieve_environment_item_def version_env_item; /* * Initialization diff --git a/src/lib-sieve/plugins/environment/sieve-ext-environment.h b/src/lib-sieve/plugins/environment/sieve-ext-environment.h index e4a6ca6460bf443d9ff901eb505daf6d6c292420..c248d1e90e776e43fc76e768013bbd81a1880805 100644 --- a/src/lib-sieve/plugins/environment/sieve-ext-environment.h +++ b/src/lib-sieve/plugins/environment/sieve-ext-environment.h @@ -34,18 +34,27 @@ bool sieve_ext_environment_is_active(const struct sieve_extension *env_ext, * Environment item */ -struct sieve_environment_item { +struct sieve_environment_item; + +struct sieve_environment_item_def { const char *name; bool prefix; const char *value; const char *(*get_value)(const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item, const char *name); }; -void sieve_environment_item_register(const struct sieve_extension *env_ext, - struct sieve_interpreter *interp, - const struct sieve_environment_item *item); +struct sieve_environment_item { + const struct sieve_environment_item_def *def; + const struct sieve_extension *ext; +}; + +void sieve_environment_item_register( + const struct sieve_extension *env_ext, struct sieve_interpreter *interp, + const struct sieve_extension *ext, + const struct sieve_environment_item_def *item_def); const char * ext_environment_item_get_value(const struct sieve_extension *env_ext, const struct sieve_runtime_env *renv, diff --git a/src/lib-sieve/plugins/vnd.dovecot/environment/ext-vnd-environment-items.c b/src/lib-sieve/plugins/vnd.dovecot/environment/ext-vnd-environment-items.c index 87dd218a2602e1024fc11eb0e188f62a4c09fd1b..43361b438391ce65f6f0da7b45f03294e0fc241c 100644 --- a/src/lib-sieve/plugins/vnd.dovecot/environment/ext-vnd-environment-items.c +++ b/src/lib-sieve/plugins/vnd.dovecot/environment/ext-vnd-environment-items.c @@ -26,8 +26,10 @@ /* default_mailbox */ static const char * -envit_default_mailbox_get_value(const struct sieve_runtime_env *renv, - const char *name ATTR_UNUSED) +envit_default_mailbox_get_value( + const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; @@ -35,7 +37,7 @@ envit_default_mailbox_get_value(const struct sieve_runtime_env *renv, return eenv->scriptenv->default_mailbox; } -const struct sieve_environment_item default_mailbox_env_item = { +const struct sieve_environment_item_def default_mailbox_env_item = { .name = "vnd.dovecot.default-mailbox", .get_value = envit_default_mailbox_get_value, }; @@ -44,6 +46,7 @@ const struct sieve_environment_item default_mailbox_env_item = { static const char * envit_username_get_value(const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; @@ -51,7 +54,7 @@ envit_username_get_value(const struct sieve_runtime_env *renv, return eenv->svinst->username; } -const struct sieve_environment_item username_env_item = { +const struct sieve_environment_item_def username_env_item = { .name = "vnd.dovecot.username", .get_value = envit_username_get_value, }; @@ -59,7 +62,9 @@ const struct sieve_environment_item username_env_item = { /* config.* */ static const char * -envit_config_get_value(const struct sieve_runtime_env *renv, const char *name) +envit_config_get_value(const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name) { const struct sieve_execute_env *eenv = renv->exec_env; @@ -70,7 +75,7 @@ envit_config_get_value(const struct sieve_runtime_env *renv, const char *name) t_strconcat("sieve_env_", name, NULL)); } -const struct sieve_environment_item config_env_item = { +const struct sieve_environment_item_def config_env_item = { .name = "vnd.dovecot.config", .prefix = TRUE, .get_value = envit_config_get_value, @@ -85,10 +90,10 @@ void ext_vnd_environment_items_register(const struct sieve_extension *ext, { struct ext_vnd_environment_context *extctx = ext->context; - sieve_environment_item_register(extctx->env_ext, renv->interp, + sieve_environment_item_register(extctx->env_ext, renv->interp, ext, &default_mailbox_env_item); - sieve_environment_item_register(extctx->env_ext, renv->interp, + sieve_environment_item_register(extctx->env_ext, renv->interp, ext, &username_env_item); - sieve_environment_item_register(extctx->env_ext, renv->interp, + sieve_environment_item_register(extctx->env_ext, renv->interp, ext, &config_env_item); } diff --git a/src/plugins/imapsieve/ext-imapsieve-environment.c b/src/plugins/imapsieve/ext-imapsieve-environment.c index bc6958eec64334b65031511138b638582baa7264..79f851bd26187df21a7f40641c4b7e34bdb173c6 100644 --- a/src/plugins/imapsieve/ext-imapsieve-environment.c +++ b/src/plugins/imapsieve/ext-imapsieve-environment.c @@ -22,15 +22,17 @@ /* imap.user */ static const char * -envit_imap_user_get_value(const struct sieve_runtime_env *renv, - const char *name ATTR_UNUSED) +envit_imap_user_get_value( + const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; return eenv->svinst->username; } -const struct sieve_environment_item imap_user_env_item = { +const struct sieve_environment_item_def imap_user_env_item = { .name = "imap.user", .get_value = envit_imap_user_get_value }; @@ -38,8 +40,10 @@ const struct sieve_environment_item imap_user_env_item = { /* imap.email */ static const char * -envit_imap_email_get_value(const struct sieve_runtime_env *renv, - const char *name ATTR_UNUSED) +envit_imap_email_get_value( + const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; const struct smtp_address *user_email = @@ -50,7 +54,7 @@ envit_imap_email_get_value(const struct sieve_runtime_env *renv, return smtp_address_encode(user_email); } -const struct sieve_environment_item imap_email_env_item = { +const struct sieve_environment_item_def imap_email_env_item = { .name = "imap.email", .get_value = envit_imap_email_get_value }; @@ -58,8 +62,10 @@ const struct sieve_environment_item imap_email_env_item = { /* imap.cause */ static const char * -envit_imap_cause_get_value(const struct sieve_runtime_env *renv, - const char *name ATTR_UNUSED) +envit_imap_cause_get_value( + const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; const struct sieve_script_env *senv = eenv->scriptenv; @@ -69,7 +75,7 @@ envit_imap_cause_get_value(const struct sieve_runtime_env *renv, return isctx->event.cause; } -const struct sieve_environment_item imap_cause_env_item = { +const struct sieve_environment_item_def imap_cause_env_item = { .name = "imap.cause", .get_value = envit_imap_cause_get_value }; @@ -77,8 +83,10 @@ const struct sieve_environment_item imap_cause_env_item = { /* imap.mailbox */ static const char * -envit_imap_mailbox_get_value(const struct sieve_runtime_env *renv, - const char *name ATTR_UNUSED) +envit_imap_mailbox_get_value( + const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; const struct sieve_message_data *msgdata = eenv->msgdata; @@ -86,7 +94,7 @@ envit_imap_mailbox_get_value(const struct sieve_runtime_env *renv, return mailbox_get_vname(msgdata->mail->box); } -const struct sieve_environment_item imap_mailbox_env_item = { +const struct sieve_environment_item_def imap_mailbox_env_item = { .name = "imap.mailbox", .get_value = envit_imap_mailbox_get_value }; @@ -95,8 +103,10 @@ const struct sieve_environment_item imap_mailbox_env_item = { /* imap.changedflags */ static const char * -envit_imap_changedflags_get_value(const struct sieve_runtime_env *renv, - const char *name ATTR_UNUSED) +envit_imap_changedflags_get_value( + const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; const struct sieve_script_env *senv = eenv->scriptenv; @@ -106,7 +116,7 @@ envit_imap_changedflags_get_value(const struct sieve_runtime_env *renv, return isctx->event.changed_flags; } -const struct sieve_environment_item imap_changedflags_env_item = { +const struct sieve_environment_item_def imap_changedflags_env_item = { .name = "imap.changedflags", .get_value = envit_imap_changedflags_get_value }; @@ -114,8 +124,10 @@ const struct sieve_environment_item imap_changedflags_env_item = { /* vnd.dovecot.mailbox-from */ static const char * -envit_vnd_mailbox_from_get_value(const struct sieve_runtime_env *renv, - const char *name ATTR_UNUSED) +envit_vnd_mailbox_from_get_value( + const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; const struct sieve_script_env *senv = eenv->scriptenv; @@ -125,7 +137,7 @@ envit_vnd_mailbox_from_get_value(const struct sieve_runtime_env *renv, return mailbox_get_vname(isctx->event.src_mailbox); } -const struct sieve_environment_item vnd_mailbox_from_env_item = { +const struct sieve_environment_item_def vnd_mailbox_from_env_item = { .name = "vnd.dovecot.mailbox-from", .get_value = envit_vnd_mailbox_from_get_value }; @@ -133,8 +145,10 @@ const struct sieve_environment_item vnd_mailbox_from_env_item = { /* vnd.dovecot.mailbox-to */ static const char * -envit_vnd_mailbox_to_get_value(const struct sieve_runtime_env *renv, - const char *name ATTR_UNUSED) +envit_vnd_mailbox_to_get_value( + const struct sieve_runtime_env *renv, + const struct sieve_environment_item *item ATTR_UNUSED, + const char *name ATTR_UNUSED) { const struct sieve_execute_env *eenv = renv->exec_env; const struct sieve_script_env *senv = eenv->scriptenv; @@ -144,7 +158,7 @@ envit_vnd_mailbox_to_get_value(const struct sieve_runtime_env *renv, return mailbox_get_vname(isctx->event.dest_mailbox); } -const struct sieve_environment_item vnd_mailbox_to_env_item = { +const struct sieve_environment_item_def vnd_mailbox_to_env_item= { .name = "vnd.dovecot.mailbox-to", .get_value = envit_vnd_mailbox_to_get_value }; @@ -159,15 +173,15 @@ void ext_imapsieve_environment_items_register( struct ext_imapsieve_context *extctx = ext->context; const struct sieve_extension *env_ext = extctx->ext_environment; - sieve_environment_item_register(env_ext, renv->interp, + sieve_environment_item_register(env_ext, renv->interp, ext, &imap_user_env_item); - sieve_environment_item_register(env_ext, renv->interp, + sieve_environment_item_register(env_ext, renv->interp, ext, &imap_email_env_item); - sieve_environment_item_register(env_ext, renv->interp, + sieve_environment_item_register(env_ext, renv->interp, ext, &imap_cause_env_item); - sieve_environment_item_register(env_ext, renv->interp, + sieve_environment_item_register(env_ext, renv->interp, ext, &imap_mailbox_env_item); - sieve_environment_item_register(env_ext, renv->interp, + sieve_environment_item_register(env_ext, renv->interp, ext, &imap_changedflags_env_item); } @@ -177,8 +191,8 @@ void ext_imapsieve_environment_vendor_items_register( struct ext_imapsieve_context *extctx = ext->context; const struct sieve_extension *env_ext = extctx->ext_environment; - sieve_environment_item_register(env_ext, renv->interp, + sieve_environment_item_register(env_ext, renv->interp, ext, &vnd_mailbox_from_env_item); - sieve_environment_item_register(env_ext, renv->interp, + sieve_environment_item_register(env_ext, renv->interp, ext, &vnd_mailbox_to_env_item); }