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