/src/pigeonhole/src/lib-sieve/plugins/mime/ext-extracttext.c
Line | Count | Source |
1 | | /* Copyright (c) Pigeonhole authors, see top-level COPYING file */ |
2 | | |
3 | | /* Extension extracttext |
4 | | * --------------------- |
5 | | * |
6 | | * Authors: Stephan Bosch |
7 | | * Specification: RFC 5703, Section 7 |
8 | | * Implementation: full |
9 | | * Status: experimental |
10 | | * |
11 | | */ |
12 | | |
13 | | #include "sieve-common.h" |
14 | | |
15 | | #include "sieve-code.h" |
16 | | #include "sieve-extensions.h" |
17 | | #include "sieve-actions.h" |
18 | | #include "sieve-commands.h" |
19 | | #include "sieve-validator.h" |
20 | | #include "sieve-generator.h" |
21 | | #include "sieve-interpreter.h" |
22 | | #include "sieve-result.h" |
23 | | |
24 | | #include "sieve-ext-variables.h" |
25 | | |
26 | | #include "ext-mime-common.h" |
27 | | |
28 | | /* |
29 | | * Extension |
30 | | */ |
31 | | |
32 | | static int |
33 | | ext_extracttext_load(const struct sieve_extension *ext, void **context_r); |
34 | | static void |
35 | | ext_extracttext_unload(const struct sieve_extension *ext); |
36 | | static bool |
37 | | ext_extracttext_validator_load(const struct sieve_extension *ext, |
38 | | struct sieve_validator *valdtr); |
39 | | |
40 | | const struct sieve_extension_def extracttext_extension = { |
41 | | .name = "extracttext", |
42 | | .load = ext_extracttext_load, |
43 | | .unload = ext_extracttext_unload, |
44 | | .validator_load = ext_extracttext_validator_load, |
45 | | SIEVE_EXT_DEFINE_OPERATION(extracttext_operation), |
46 | | }; |
47 | | |
48 | | static int |
49 | | ext_extracttext_load(const struct sieve_extension *ext, void **context_r) |
50 | 0 | { |
51 | 0 | struct sieve_instance *svinst = ext->svinst; |
52 | 0 | const struct sieve_extension *var_ext; |
53 | 0 | const struct sieve_extension *fep_ext; |
54 | 0 | struct ext_extracttext_context *extctx; |
55 | |
|
56 | 0 | if (sieve_ext_variables_get_extension(ext->svinst, &var_ext) < 0) |
57 | 0 | return -1; |
58 | 0 | if (sieve_extension_register(svinst, &foreverypart_extension, FALSE, |
59 | 0 | &fep_ext) < 0) |
60 | 0 | return -1; |
61 | | |
62 | 0 | extctx = i_new(struct ext_extracttext_context, 1); |
63 | 0 | extctx->var_ext = var_ext; |
64 | 0 | extctx->fep_ext = fep_ext; |
65 | |
|
66 | 0 | *context_r = extctx; |
67 | 0 | return 0; |
68 | 0 | } |
69 | | |
70 | | static void ext_extracttext_unload(const struct sieve_extension *ext) |
71 | 0 | { |
72 | 0 | struct ext_extracttext_context *extctx = ext->context; |
73 | |
|
74 | 0 | i_free(extctx); |
75 | 0 | } |
76 | | |
77 | | /* |
78 | | * Extension validation |
79 | | */ |
80 | | |
81 | | static bool |
82 | | ext_extracttext_validator_validate( |
83 | | const struct sieve_extension *ext, struct sieve_validator *valdtr, |
84 | | void *context, struct sieve_ast_argument *require_arg, bool required); |
85 | | |
86 | | const struct sieve_validator_extension |
87 | | extracttext_validator_extension = { |
88 | | .ext = &extracttext_extension, |
89 | | .validate = ext_extracttext_validator_validate, |
90 | | }; |
91 | | |
92 | | static bool |
93 | | ext_extracttext_validator_load(const struct sieve_extension *ext, |
94 | | struct sieve_validator *valdtr) |
95 | 0 | { |
96 | | /* Register validator extension to check for conflict with eextracttext. |
97 | | */ |
98 | 0 | sieve_validator_extension_register( |
99 | 0 | valdtr, ext, &extracttext_validator_extension, NULL); |
100 | | |
101 | | /* Register new commands */ |
102 | 0 | sieve_validator_register_command(valdtr, ext, &cmd_extracttext); |
103 | |
|
104 | 0 | return TRUE; |
105 | 0 | } |
106 | | |
107 | | static bool |
108 | | ext_extracttext_validator_validate(const struct sieve_extension *ext, |
109 | | struct sieve_validator *valdtr, |
110 | | void *context ATTR_UNUSED, |
111 | | struct sieve_ast_argument *require_arg, |
112 | | bool required ATTR_UNUSED) |
113 | 0 | { |
114 | 0 | struct ext_extracttext_context *extctx = ext->context; |
115 | |
|
116 | 0 | if (extctx->var_ext == NULL || |
117 | 0 | !sieve_ext_variables_is_active(extctx->var_ext, valdtr) ) { |
118 | 0 | sieve_argument_validate_error( |
119 | 0 | valdtr, require_arg, |
120 | 0 | "extracttext extension cannot be used " |
121 | 0 | "without variables extension"); |
122 | 0 | return FALSE; |
123 | 0 | } |
124 | 0 | if (extctx->fep_ext == NULL || |
125 | 0 | !sieve_validator_extension_loaded(valdtr, extctx->fep_ext) ) { |
126 | 0 | sieve_argument_validate_error( |
127 | 0 | valdtr, require_arg, |
128 | 0 | "extracttext extension cannot be used " |
129 | 0 | "without foreverypart extension"); |
130 | 0 | return FALSE; |
131 | 0 | } |
132 | 0 | return TRUE; |
133 | 0 | } |