dovecot-2.2-pigeonhole: lib-sieve: Implemented the vnd.dovecot.e...

pigeonhole at rename-it.nl pigeonhole at rename-it.nl
Mon Aug 17 21:34:27 UTC 2015


details:   http://hg.rename-it.nl/dovecot-2.2-pigeonhole/rev/166279fd3fd3
changeset: 2086:166279fd3fd3
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Mon Aug 17 23:34:21 2015 +0200
description:
lib-sieve: Implemented the vnd.dovecot.environment extension.
This adds the vnd.dovecot.default-mailbox and vnd.dovecot.username environment items.
It creates the 'env' variables namespace through which all environment items can be accessed directly.
This extension is yet to be documented properly.
More environment items are under consideration.

diffstat:

 Makefile.am                                                |    2 +
 configure.ac                                               |    1 +
 src/lib-sieve/Makefile.am                                  |    1 +
 src/lib-sieve/plugins/environment/ext-environment-common.c |  180 ++++++++----
 src/lib-sieve/plugins/environment/ext-environment-common.h |    7 +-
 src/lib-sieve/plugins/environment/ext-environment.c        |   16 +-
 src/lib-sieve/plugins/environment/sieve-ext-environment.h  |   33 ++-
 src/lib-sieve/plugins/environment/tst-environment.c        |    2 +-
 src/lib-sieve/plugins/vnd.dovecot/Makefile.am              |    2 +-
 src/lib-sieve/sieve-extensions.c                           |    3 +-
 10 files changed, 165 insertions(+), 82 deletions(-)

diffs (truncated from 431 to 300 lines):

diff -r 469f9794408b -r 166279fd3fd3 Makefile.am
--- a/Makefile.am	Sun Aug 16 19:00:29 2015 +0200
+++ b/Makefile.am	Mon Aug 17 23:34:21 2015 +0200
@@ -162,6 +162,8 @@
 	tests/extensions/metadata/execute.svtest \
 	tests/extensions/metadata/errors.svtest \
 	tests/extensions/vnd.dovecot/debug/execute.svtest \
+	tests/extensions/vnd.dovecot/environment/basic.svtest \
+	tests/extensions/vnd.dovecot/environment/variables.svtest \
 	tests/deprecated/notify/basic.svtest \
 	tests/deprecated/notify/mailto.svtest \
 	tests/deprecated/notify/errors.svtest \
diff -r 469f9794408b -r 166279fd3fd3 configure.ac
--- a/configure.ac	Sun Aug 16 19:00:29 2015 +0200
+++ b/configure.ac	Mon Aug 17 23:34:21 2015 +0200
@@ -211,6 +211,7 @@
 src/lib-sieve/plugins/index/Makefile
 src/lib-sieve/plugins/vnd.dovecot/Makefile
 src/lib-sieve/plugins/vnd.dovecot/debug/Makefile
+src/lib-sieve/plugins/vnd.dovecot/environment/Makefile
 src/lib-sieve-tool/Makefile
 src/lib-managesieve/Makefile
 src/plugins/Makefile
diff -r 469f9794408b -r 166279fd3fd3 src/lib-sieve/Makefile.am
--- a/src/lib-sieve/Makefile.am	Sun Aug 16 19:00:29 2015 +0200
+++ b/src/lib-sieve/Makefile.am	Mon Aug 17 23:34:21 2015 +0200
@@ -78,6 +78,7 @@
 	$(extdir)/index/libsieve_ext_index.la \
 	$(extdir)/metadata/libsieve_ext_metadata.la \
 	$(extdir)/vnd.dovecot/debug/libsieve_ext_debug.la \
+	$(extdir)/vnd.dovecot/environment/libsieve_ext_vnd_environment.la \
 	$(unfinished_plugins)
 
 libdovecot_sieve_la_DEPENDENCIES = \
diff -r 469f9794408b -r 166279fd3fd3 src/lib-sieve/plugins/environment/ext-environment-common.c
--- a/src/lib-sieve/plugins/environment/ext-environment-common.c	Sun Aug 16 19:00:29 2015 +0200
+++ b/src/lib-sieve/plugins/environment/ext-environment-common.c	Mon Aug 17 23:34:21 2015 +0200
@@ -6,14 +6,10 @@
 
 #include "sieve-common.h"
 #include "sieve-extensions.h"
+#include "sieve-interpreter.h"
 
 #include "ext-environment-common.h"
 
-struct ext_environment_context {
-	HASH_TABLE(const char *,
-		   const struct sieve_environment_item *) environment_items;
-};
-
 /*
  * Core environment items
  */
@@ -30,71 +26,121 @@
 static unsigned int core_env_items_count = N_ELEMENTS(core_env_items);
 
 /*
+ * Validator context
+ */
+
+struct ext_environment_interpreter_context {
+	HASH_TABLE(const char *,
+		   const struct sieve_environment_item *) environment_items;
+
+	unsigned int active:1;
+};
+
+static void ext_environment_interpreter_extension_free
+	(const struct sieve_extension *ext, struct sieve_interpreter *interp,
+		void *context);
+
+struct sieve_interpreter_extension environment_interpreter_extension = {
+	.ext_def = &environment_extension,
+	.free = ext_environment_interpreter_extension_free,
+};
+
+static struct ext_environment_interpreter_context *
+ext_environment_interpreter_context_create
+(const struct sieve_extension *this_ext, struct sieve_interpreter *interp)
+{
+	pool_t pool = sieve_interpreter_pool(interp);
+	struct ext_environment_interpreter_context *ctx;
+
+	ctx = p_new(pool, struct ext_environment_interpreter_context, 1);
+
+	hash_table_create
+		(&ctx->environment_items, default_pool, 0, str_hash, strcmp);
+
+	sieve_interpreter_extension_register
+		(interp, this_ext, &environment_interpreter_extension, (void *)ctx);
+	return ctx;
+}
+
+static void ext_environment_interpreter_extension_free
+(const struct sieve_extension *ext ATTR_UNUSED,
+	struct sieve_interpreter *interp ATTR_UNUSED, 	void *context)
+{
+	struct ext_environment_interpreter_context *ctx =
+		(struct ext_environment_interpreter_context *)context;
+
+	hash_table_destroy(&ctx->environment_items);
+}
+
+static struct ext_environment_interpreter_context *
+ext_environment_interpreter_context_get
+(const struct sieve_extension *this_ext, struct sieve_interpreter *interp)
+{
+	struct ext_environment_interpreter_context *ctx =
+		(struct ext_environment_interpreter_context *)
+		sieve_interpreter_extension_get_context(interp, this_ext);
+
+	if ( ctx == NULL )
+		ctx = ext_environment_interpreter_context_create(this_ext, interp);
+
+	return ctx;
+}
+
+void ext_environment_interpreter_init
+(const struct sieve_extension *this_ext, struct sieve_interpreter *interp)
+{
+	struct ext_environment_interpreter_context *ctx;
+	unsigned int i;
+
+	/* Create our context */
+	ctx = ext_environment_interpreter_context_get(this_ext, interp);
+
+	for ( i = 0; i < core_env_items_count; i++ ) {
+		const struct sieve_environment_item *item = core_env_items[i];
+		hash_table_insert(ctx->environment_items, item->name, item);
+	}
+
+	ctx->active = TRUE;
+}
+
+bool sieve_ext_environment_is_active
+(const struct sieve_extension *env_ext, struct sieve_interpreter *interp)
+{
+	struct ext_environment_interpreter_context *ctx =
+		ext_environment_interpreter_context_get(env_ext, interp);
+
+	return ( ctx != NULL && ctx->active );
+}
+
+/*
  * Registration
  */
 
-static void ext_environment_item_register
-(struct ext_environment_context *ectx,
+void sieve_environment_item_register
+(const struct sieve_extension *env_ext, struct sieve_interpreter *interp,
 	const struct sieve_environment_item *item)
 {
-	hash_table_insert(ectx->environment_items, item->name, item);
+	struct ext_environment_interpreter_context *ctx;
+
+	i_assert( sieve_extension_is(env_ext, environment_extension) );
+	ctx = ext_environment_interpreter_context_get(env_ext, interp);
+	hash_table_insert(ctx->environment_items, item->name, item);
 }
 
-void sieve_ext_environment_item_register
-(const struct sieve_extension *ext, const struct sieve_environment_item *item)
-{
-	struct ext_environment_context *ectx =
-		(struct ext_environment_context *) ext->context;
-
-	ext_environment_item_register(ectx, item);
-}
-
-/*
- * Initialization
- */
-
-bool ext_environment_init
-(const struct sieve_extension *ext ATTR_UNUSED, void **context)
-{
-	struct ext_environment_context *ectx =
-		i_new(struct ext_environment_context, 1);
-
-	unsigned int i;
-
-	hash_table_create
-		(&ectx->environment_items, default_pool, 0, str_hash, strcmp);
-
-	for ( i = 0; i < core_env_items_count; i++ ) {
-		ext_environment_item_register(ectx, core_env_items[i]);
-	}
-
-	*context = (void *) ectx;
-
-	return TRUE;
-}
-
-void ext_environment_deinit(const struct sieve_extension *ext)
-{
-	struct ext_environment_context *ectx =
-		(struct ext_environment_context *) ext->context;
-
-	hash_table_destroy(&ectx->environment_items);
-	i_free(ectx);
-}
-
-
 /*
  * Retrieval
  */
 
 const char *ext_environment_item_get_value
-(const struct sieve_extension *ext, const char *name,
-	const struct sieve_script_env *senv)
+(const struct sieve_extension *env_ext,
+	const struct sieve_runtime_env *renv, const char *name)
 {
-	struct ext_environment_context *ectx =
-		(struct ext_environment_context *) ext->context;
+	struct ext_environment_interpreter_context *ctx =
+		ext_environment_interpreter_context_get(env_ext, renv->interp);
 	const struct sieve_environment_item *item =
-		hash_table_lookup(ectx->environment_items, name);
+		hash_table_lookup(ctx->environment_items, name);
+
+	i_assert( sieve_extension_is(env_ext, environment_extension) );
 
 	if ( item == NULL )
 		return NULL;
@@ -103,7 +149,7 @@
 		return item->value;
 
 	if ( item->get_value != NULL )
-		return item->get_value(ext->svinst, senv);
+		return item->get_value(renv);
 
 	return NULL;
 }
@@ -119,10 +165,9 @@
  */
 
 static const char *envit_domain_get_value
-(struct sieve_instance *svinst,
-	const struct sieve_script_env *senv ATTR_UNUSED)
+(const struct sieve_runtime_env *renv)
 {
-	return svinst->domainname;
+	return renv->svinst->domainname;
 }
 
 const struct sieve_environment_item domain_env_item = {
@@ -137,10 +182,9 @@
  */
 
 static const char *envit_host_get_value
-(struct sieve_instance *svinst,
-	const struct sieve_script_env *senv ATTR_UNUSED)
+(const struct sieve_runtime_env *renv)
 {
-	return svinst->hostname;
+	return renv->svinst->hostname;
 }
 
 const struct sieve_environment_item host_env_item = {
@@ -160,10 +204,9 @@
  */
 
 static const char *envit_location_get_value
-(struct sieve_instance *svinst,
-	const struct sieve_script_env *senv ATTR_UNUSED)
+(const struct sieve_runtime_env *renv)
 {
-	switch ( svinst->env_location ) {
+	switch ( renv->svinst->env_location ) {
 	case SIEVE_ENV_LOCATION_MDA:
 		return "MDA";
 	case SIEVE_ENV_LOCATION_MTA:
@@ -190,10 +233,9 @@
  */
 
 static const char *envit_phase_get_value
-(struct sieve_instance *svinst,
-	const struct sieve_script_env *senv ATTR_UNUSED)
+(const struct sieve_runtime_env *renv)
 {
-	switch ( svinst->delivery_phase ) {
+	switch ( renv->svinst->delivery_phase ) {
 	case SIEVE_DELIVERY_PHASE_PRE:
 		return "pre";
 	case SIEVE_DELIVERY_PHASE_DURING:
diff -r 469f9794408b -r 166279fd3fd3 src/lib-sieve/plugins/environment/ext-environment-common.h
--- a/src/lib-sieve/plugins/environment/ext-environment-common.h	Sun Aug 16 19:00:29 2015 +0200
+++ b/src/lib-sieve/plugins/environment/ext-environment-common.h	Mon Aug 17 23:34:21 2015 +0200
@@ -47,11 +47,10 @@
 void ext_environment_deinit(const struct sieve_extension *ext);
 
 /*
- * Environment item retrieval
+ * Validator context
  */
 
-const char *ext_environment_item_get_value
-	(const struct sieve_extension *ext, const char *name,


More information about the dovecot-cvs mailing list