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