40
40
const struct sieve_operation_def envelope_operation;
41
41
const struct sieve_extension_def envelope_extension;
47
47
static bool ext_envelope_validator_load
48
48
(const struct sieve_extension *ext, struct sieve_validator *valdtr);
50
const struct sieve_extension_def envelope_extension = {
53
ext_envelope_validator_load,
54
NULL, NULL, NULL, NULL, NULL,
55
SIEVE_EXT_DEFINE_OPERATION(envelope_operation),
56
SIEVE_EXT_DEFINE_NO_OPERANDS
50
const struct sieve_extension_def envelope_extension = {
52
.validator_load = ext_envelope_validator_load,
53
SIEVE_EXT_DEFINE_OPERATION(envelope_operation)
59
56
static bool ext_envelope_validator_load
81
78
static bool tst_envelope_generate
82
79
(const struct sieve_codegen_env *cgenv, struct sieve_command *ctx);
84
static const struct sieve_command_def envelope_test = {
81
static const struct sieve_command_def envelope_test = {
87
84
2, 0, FALSE, FALSE,
88
tst_envelope_registered,
85
tst_envelope_registered,
90
87
tst_envelope_validate,
92
tst_envelope_generate,
89
tst_envelope_generate,
100
97
static bool ext_envelope_operation_dump
102
99
static int ext_envelope_operation_execute
103
100
(const struct sieve_runtime_env *renv, sieve_size_t *address);
105
const struct sieve_operation_def envelope_operation = {
102
const struct sieve_operation_def envelope_operation = {
107
104
&envelope_extension,
109
ext_envelope_operation_dump,
110
ext_envelope_operation_execute
106
ext_envelope_operation_dump,
107
ext_envelope_operation_execute
183
180
static const struct sieve_address *const *_from_part_get_addresses
184
181
(const struct sieve_runtime_env *renv)
186
ARRAY_DEFINE(envelope_values, const struct sieve_address *);
183
ARRAY(const struct sieve_address *) envelope_values;
187
184
const struct sieve_address *address =
188
185
sieve_message_get_sender_address(renv->msgctx);
190
187
if ( address != NULL ) {
191
188
t_array_init(&envelope_values, 2);
202
199
static const char *const *_from_part_get_values
203
200
(const struct sieve_runtime_env *renv)
205
ARRAY_DEFINE(envelope_values, const char *);
202
ARRAY(const char *) envelope_values;
207
204
t_array_init(&envelope_values, 2);
218
215
static const struct sieve_address *const *_to_part_get_addresses
219
216
(const struct sieve_runtime_env *renv)
221
ARRAY_DEFINE(envelope_values, const struct sieve_address *);
222
const struct sieve_address *address =
223
sieve_message_get_orig_recipient_address(renv->msgctx);
218
ARRAY(const struct sieve_address *) envelope_values;
219
const struct sieve_address *address =
220
sieve_message_get_orig_recipient_address(renv->msgctx);
225
222
if ( address != NULL && address->local_part != NULL ) {
226
223
t_array_init(&envelope_values, 2);
237
234
static const char *const *_to_part_get_values
238
235
(const struct sieve_runtime_env *renv)
240
ARRAY_DEFINE(envelope_values, const char *);
237
ARRAY(const char *) envelope_values;
242
239
t_array_init(&envelope_values, 2);
253
250
static const char *const *_auth_part_get_values
254
251
(const struct sieve_runtime_env *renv)
256
ARRAY_DEFINE(envelope_values, const char *);
253
ARRAY(const char *) envelope_values;
258
255
t_array_init(&envelope_values, 2);
274
271
static int sieve_envelope_address_list_next_string_item
275
272
(struct sieve_stringlist *_strlist, string_t **str_r);
276
273
static int sieve_envelope_address_list_next_item
277
(struct sieve_address_list *_addrlist, struct sieve_address *addr_r,
274
(struct sieve_address_list *_addrlist, struct sieve_address *addr_r,
278
275
string_t **unparsed_r);
279
276
static void sieve_envelope_address_list_reset
280
277
(struct sieve_stringlist *_strlist);
289
286
const struct sieve_address *const *cur_addresses;
290
287
const char * const *cur_values;
295
292
static struct sieve_address_list *sieve_envelope_address_list_create
296
293
(const struct sieve_runtime_env *renv, struct sieve_stringlist *env_parts)
298
295
struct sieve_envelope_address_list *addrlist;
300
297
addrlist = t_new(struct sieve_envelope_address_list, 1);
301
298
addrlist->addrlist.strlist.runenv = renv;
302
299
addrlist->addrlist.strlist.exec_status = SIEVE_EXEC_OK;
303
addrlist->addrlist.strlist.next_item =
300
addrlist->addrlist.strlist.next_item =
304
301
sieve_envelope_address_list_next_string_item;
305
302
addrlist->addrlist.strlist.reset = sieve_envelope_address_list_reset;
306
303
addrlist->addrlist.next_item = sieve_envelope_address_list_next_item;
307
304
addrlist->env_parts = env_parts;
309
306
return &addrlist->addrlist;
312
309
static int sieve_envelope_address_list_next_item
313
(struct sieve_address_list *_addrlist, struct sieve_address *addr_r,
310
(struct sieve_address_list *_addrlist, struct sieve_address *addr_r,
314
311
string_t **unparsed_r)
316
struct sieve_envelope_address_list *addrlist =
317
(struct sieve_envelope_address_list *) _addrlist;
313
struct sieve_envelope_address_list *addrlist =
314
(struct sieve_envelope_address_list *) _addrlist;
318
315
const struct sieve_runtime_env *renv = _addrlist->strlist.runenv;
320
317
if ( addr_r != NULL ) addr_r->local_part = NULL;
363
360
/* Return next item */
364
361
if ( addrlist->cur_addresses != NULL ) {
365
const struct sieve_address *addr =
362
const struct sieve_address *addr =
366
363
addrlist->cur_addresses[addrlist->value_index];
368
365
if ( addr->local_part == NULL ) {
369
366
/* Null path <> */
370
if ( unparsed_r != NULL )
367
if ( unparsed_r != NULL )
371
368
*unparsed_r = t_str_new_const("", 0);
373
370
if ( addr_r != NULL )
420
418
static void sieve_envelope_address_list_reset
421
419
(struct sieve_stringlist *_strlist)
423
struct sieve_envelope_address_list *addrlist =
421
struct sieve_envelope_address_list *addrlist =
424
422
(struct sieve_envelope_address_list *)_strlist;
426
424
sieve_stringlist_reset(addrlist->env_parts);
429
427
addrlist->value_index = 0;
433
* Command Registration
431
* Command Registration
436
434
static bool tst_envelope_registered
437
435
(struct sieve_validator *valdtr, const struct sieve_extension *ext ATTR_UNUSED,
438
struct sieve_command_registration *cmd_reg)
436
struct sieve_command_registration *cmd_reg)
440
438
/* The order of these is not significant */
441
439
sieve_comparators_link_tag(valdtr, cmd_reg, SIEVE_AM_OPT_COMPARATOR);
442
440
sieve_address_parts_link_tags(valdtr, cmd_reg, SIEVE_AM_OPT_ADDRESS_PART);
443
441
sieve_match_types_link_tags(valdtr, cmd_reg, SIEVE_AM_OPT_MATCH_TYPE);
452
450
static int _envelope_part_is_supported
453
451
(void *context, struct sieve_ast_argument *arg)
463
461
if ( *not_address == NULL )
464
462
*not_address = epart;
473
471
return TRUE; /* Can't check at compile time */
476
474
static bool tst_envelope_validate
477
(struct sieve_validator *valdtr, struct sieve_command *tst)
475
(struct sieve_validator *valdtr, struct sieve_command *tst)
479
477
struct sieve_ast_argument *arg = tst->first_positional;
480
478
struct sieve_ast_argument *epart;
481
struct sieve_comparator cmp_default =
479
struct sieve_comparator cmp_default =
482
480
SIEVE_COMPARATOR_DEFAULT(i_ascii_casemap_comparator);
483
struct sieve_match_type mcht_default =
481
struct sieve_match_type mcht_default =
484
482
SIEVE_MATCH_TYPE_DEFAULT(is_match_type);
485
483
const struct sieve_envelope_part *not_address = NULL;
487
485
if ( !sieve_validate_positional_argument
488
486
(valdtr, tst, arg, "envelope part", 1, SAAT_STRING_LIST) ) {
492
490
if ( !sieve_validator_argument_activate(valdtr, tst, arg, FALSE) )
495
493
/* Check whether supplied envelope parts are supported
496
* FIXME: verify dynamic envelope parts at runtime
494
* FIXME: verify dynamic envelope parts at runtime
499
if ( !sieve_ast_stringlist_map(&epart, (void *) ¬_address,
500
_envelope_part_is_supported) ) {
502
sieve_argument_validate_error(valdtr, epart,
503
"specified envelope part '%s' is not supported by the envelope test",
497
if ( !sieve_ast_stringlist_map(&epart, (void *) ¬_address,
498
_envelope_part_is_supported) ) {
500
sieve_argument_validate_error(valdtr, epart,
501
"specified envelope part '%s' is not supported by the envelope test",
504
502
str_sanitize(sieve_ast_strlist_strc(epart), 64));
508
506
if ( not_address != NULL ) {
509
struct sieve_ast_argument *addrp_arg =
507
struct sieve_ast_argument *addrp_arg =
510
508
sieve_command_find_argument(tst, &address_part_tag);
512
510
if ( addrp_arg != NULL ) {
521
519
arg = sieve_ast_argument_next(arg);
523
521
if ( !sieve_validate_positional_argument
524
522
(valdtr, tst, arg, "key list", 2, SAAT_STRING_LIST) ) {
528
526
if ( !sieve_validator_argument_activate(valdtr, tst, arg, FALSE) )
537
535
* Code generation
540
538
static bool tst_envelope_generate
541
(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd)
539
(const struct sieve_codegen_env *cgenv, struct sieve_command *cmd)
543
541
(void)sieve_operation_emit(cgenv->sblock, cmd->ext, &envelope_operation);
575
573
static int ext_envelope_operation_execute
576
574
(const struct sieve_runtime_env *renv, sieve_size_t *address)
578
struct sieve_comparator cmp =
576
struct sieve_comparator cmp =
579
577
SIEVE_COMPARATOR_DEFAULT(i_ascii_casemap_comparator);
580
struct sieve_match_type mcht =
578
struct sieve_match_type mcht =
581
579
SIEVE_MATCH_TYPE_DEFAULT(is_match_type);
582
struct sieve_address_part addrp =
580
struct sieve_address_part addrp =
583
581
SIEVE_ADDRESS_PART_DEFAULT(all_address_part);
584
582
struct sieve_stringlist *env_part_list, *value_list, *key_list;
585
583
struct sieve_address_list *addr_list;