1 /* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
2 */
3
4 /* Extension imap4flags
5 * --------------------
6 *
7 * Authors: Stephan Bosch
8 * Specification: RFC 5232
9 * Implementation: full
10 * Status: testing
11 *
12 */
13
14 #include "lib.h"
15 #include "mempool.h"
16 #include "str.h"
17
18 #include "sieve-common.h"
19
20 #include "sieve-code.h"
21 #include "sieve-extensions.h"
22 #include "sieve-actions.h"
23 #include "sieve-commands.h"
24 #include "sieve-validator.h"
25 #include "sieve-generator.h"
26 #include "sieve-interpreter.h"
27
28 #include "ext-imap4flags-common.h"
29
30 /*
31 * Operations
32 */
33
34 const struct sieve_operation_def *imap4flags_operations[] = {
35 &setflag_operation,
36 &addflag_operation,
37 &removeflag_operation,
38 &hasflag_operation
39 };
40
41 /*
42 * Extension
43 */
44
45 static bool ext_imap4flags_validator_load
46 (const struct sieve_extension *ext, struct sieve_validator *valdtr);
47 static bool ext_imap4flags_interpreter_load
48 (const struct sieve_extension *ext, const struct sieve_runtime_env *renv,
49 sieve_size_t *address);
50
51 const struct sieve_extension_def imap4flags_extension = {
52 .name = "imap4flags",
53 .version = 1,
54 .validator_load = ext_imap4flags_validator_load,
55 .interpreter_load = ext_imap4flags_interpreter_load,
56 SIEVE_EXT_DEFINE_OPERATIONS(imap4flags_operations),
57 SIEVE_EXT_DEFINE_OPERAND(flags_side_effect_operand)
58 };
59
ext_imap4flags_validator_load(const struct sieve_extension * ext,struct sieve_validator * valdtr)60 static bool ext_imap4flags_validator_load
61 (const struct sieve_extension *ext, struct sieve_validator *valdtr)
62 {
63 /* Register commands */
64 sieve_validator_register_command(valdtr, ext, &cmd_setflag);
65 sieve_validator_register_command(valdtr, ext, &cmd_addflag);
66 sieve_validator_register_command(valdtr, ext, &cmd_removeflag);
67 sieve_validator_register_command(valdtr, ext, &tst_hasflag);
68
69 /* Attach :flags tag to keep and fileinto commands */
70 ext_imap4flags_attach_flags_tag(valdtr, ext, "keep");
71 ext_imap4flags_attach_flags_tag(valdtr, ext, "fileinto");
72
73 /* Attach flags side-effect to keep and fileinto actions */
74 sieve_ext_imap4flags_register_side_effect(valdtr, ext, "keep");
75 sieve_ext_imap4flags_register_side_effect(valdtr, ext, "fileinto");
76
77 return TRUE;
78 }
79
sieve_ext_imap4flags_interpreter_load(const struct sieve_extension * ext,const struct sieve_runtime_env * renv)80 void sieve_ext_imap4flags_interpreter_load
81 (const struct sieve_extension *ext, const struct sieve_runtime_env *renv)
82 {
83 sieve_interpreter_extension_register
84 (renv->interp, ext, &imap4flags_interpreter_extension, NULL);
85 }
86
ext_imap4flags_interpreter_load(const struct sieve_extension * ext,const struct sieve_runtime_env * renv,sieve_size_t * address ATTR_UNUSED)87 static bool ext_imap4flags_interpreter_load
88 (const struct sieve_extension *ext, const struct sieve_runtime_env *renv,
89 sieve_size_t *address ATTR_UNUSED)
90 {
91 sieve_ext_imap4flags_interpreter_load(ext, renv);
92 return TRUE;
93 }
94
95
96
97