1 /* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
2  */
3 
4 /* Extension vnd.dovecot.environment
5  * ---------------------------------
6  *
7  * Authors: Stephan Bosch
8  * Specification: vendor-defined;
9  *   spec-bosch-sieve-dovecot-environment
10  * Implementation: preliminary
11  * Status: experimental
12  *
13  */
14 
15 #include "lib.h"
16 #include "array.h"
17 
18 #include "sieve-extensions.h"
19 #include "sieve-commands.h"
20 #include "sieve-comparators.h"
21 #include "sieve-match-types.h"
22 #include "sieve-address-parts.h"
23 
24 #include "sieve-validator.h"
25 #include "sieve-generator.h"
26 #include "sieve-binary.h"
27 #include "sieve-interpreter.h"
28 #include "sieve-dump.h"
29 
30 #include "sieve-ext-variables.h"
31 
32 #include "ext-vnd-environment-common.h"
33 
34 /*
35  * Extension
36  */
37 
38 static bool ext_vnd_environment_load
39 	(const struct sieve_extension *ext, void **context);
40 static void ext_vnd_environment_unload
41 	(const struct sieve_extension *ext);
42 static bool ext_vnd_environment_validator_load
43 	(const struct sieve_extension *ext, struct sieve_validator *valdtr);
44 static bool ext_vnd_environment_interpreter_load
45 	(const struct sieve_extension *ext, const struct sieve_runtime_env *renv,
46 		sieve_size_t *address);
47 
48 const struct sieve_extension_def vnd_environment_extension = {
49 	.name = "vnd.dovecot.environment",
50 	.load = ext_vnd_environment_load,
51 	.unload = ext_vnd_environment_unload,
52 	.validator_load = ext_vnd_environment_validator_load,
53 	.interpreter_load = ext_vnd_environment_interpreter_load,
54 	SIEVE_EXT_DEFINE_OPERAND(environment_namespace_operand)
55 };
56 
ext_vnd_environment_load(const struct sieve_extension * ext,void ** context)57 static bool ext_vnd_environment_load
58 (const struct sieve_extension *ext, void **context)
59 {
60 	struct ext_vnd_environment_context *ectx;
61 
62 	if ( *context != NULL )
63 		ext_vnd_environment_unload(ext);
64 
65 	ectx = i_new(struct ext_vnd_environment_context, 1);
66 	ectx->env_ext = sieve_ext_environment_require_extension(ext->svinst);
67 	ectx->var_ext = sieve_ext_variables_get_extension(ext->svinst);
68 	*context = (void *) ectx;
69 
70 	return TRUE;
71 }
72 
ext_vnd_environment_unload(const struct sieve_extension * ext)73 static void ext_vnd_environment_unload
74 (const struct sieve_extension *ext)
75 {
76 	struct ext_vnd_environment_context *ectx =
77 		(struct ext_vnd_environment_context *) ext->context;
78 
79 	i_free(ectx);
80 }
81 
82 /*
83  * Validator
84  */
85 
ext_vnd_environment_validator_load(const struct sieve_extension * ext,struct sieve_validator * valdtr)86 static bool ext_vnd_environment_validator_load
87 (const struct sieve_extension *ext, struct sieve_validator *valdtr)
88 {
89 	const struct sieve_extension *env_ext;
90 
91 	/* Load environment extension implicitly */
92 
93 	env_ext = sieve_validator_extension_load_implicit
94 		(valdtr, environment_extension.name);
95 	if ( env_ext == NULL )
96 		return FALSE;
97 
98 	ext_environment_variables_init(ext, valdtr);
99 	return TRUE;
100 }
101 
102 /*
103  * Interpreter
104  */
105 
ext_vnd_environment_interpreter_load(const struct sieve_extension * ext,const struct sieve_runtime_env * renv,sieve_size_t * address ATTR_UNUSED)106 static bool ext_vnd_environment_interpreter_load
107 (const struct sieve_extension *ext, const struct sieve_runtime_env *renv,
108 	sieve_size_t *address ATTR_UNUSED)
109 {
110 	ext_vnd_environment_items_register(ext, renv);
111 	return TRUE;
112 }
113