1
/* Copyright (c) 2002-2009 Dovecot Sieve authors, see the included COPYING file
4
#include "sieve-common.h"
5
#include "sieve-commands.h"
6
#include "sieve-code.h"
7
#include "sieve-comparators.h"
8
#include "sieve-match-types.h"
9
#include "sieve-validator.h"
10
#include "sieve-generator.h"
11
#include "sieve-interpreter.h"
12
#include "sieve-dump.h"
13
#include "sieve-match.h"
15
#include "ext-enotify-common.h"
18
* Valid_notify_method test
21
* valid_notify_method <notification-uris: string-list>
24
static bool tst_vnotifym_validate
25
(struct sieve_validator *validator, struct sieve_command_context *tst);
26
static bool tst_vnotifym_generate
27
(const struct sieve_codegen_env *cgenv, struct sieve_command_context *ctx);
29
const struct sieve_command valid_notify_method_test = {
30
"valid_notify_method",
34
tst_vnotifym_validate,
35
tst_vnotifym_generate,
40
* Valid_notify_method operation
43
static bool tst_vnotifym_operation_dump
44
(const struct sieve_operation *op,
45
const struct sieve_dumptime_env *denv, sieve_size_t *address);
46
static int tst_vnotifym_operation_execute
47
(const struct sieve_operation *op,
48
const struct sieve_runtime_env *renv, sieve_size_t *address);
50
const struct sieve_operation valid_notify_method_operation = {
51
"VALID_NOTIFY_METHOD",
53
EXT_ENOTIFY_OPERATION_VALID_NOTIFY_METHOD,
54
tst_vnotifym_operation_dump,
55
tst_vnotifym_operation_execute
62
static bool tst_vnotifym_validate
63
(struct sieve_validator *validator, struct sieve_command_context *tst)
65
struct sieve_ast_argument *arg = tst->first_positional;
67
if ( !sieve_validate_positional_argument
68
(validator, tst, arg, "notification-uris", 1, SAAT_STRING_LIST) ) {
72
return sieve_validator_argument_activate(validator, tst, arg, FALSE);
79
static bool tst_vnotifym_generate
80
(const struct sieve_codegen_env *cgenv, struct sieve_command_context *ctx)
82
sieve_operation_emit_code(cgenv->sbin, &valid_notify_method_operation);
84
/* Generate arguments */
85
return sieve_generate_arguments(cgenv, ctx, NULL);
92
static bool tst_vnotifym_operation_dump
93
(const struct sieve_operation *op ATTR_UNUSED,
94
const struct sieve_dumptime_env *denv, sieve_size_t *address)
96
sieve_code_dumpf(denv, "VALID_NOTIFY_METHOD");
97
sieve_code_descend(denv);
100
sieve_opr_stringlist_dump(denv, address, "notify-uris");
107
static int tst_vnotifym_operation_execute
108
(const struct sieve_operation *op ATTR_UNUSED,
109
const struct sieve_runtime_env *renv, sieve_size_t *address)
111
struct sieve_coded_stringlist *notify_uris;
113
bool result = TRUE, all_valid = TRUE;
119
/* Read notify uris */
120
if ( (notify_uris=sieve_opr_stringlist_read(renv, address)) == NULL ) {
121
sieve_runtime_trace_error(renv, "invalid notify-uris operand");
122
return SIEVE_EXEC_BIN_CORRUPT;
129
sieve_runtime_trace(renv, "VALID_NOTIFY_METHOD test");
132
while ( (result=sieve_coded_stringlist_next_item(notify_uris, &uri_item))
133
&& uri_item != NULL ) {
135
if ( !ext_enotify_runtime_method_validate(renv, 0 /* FIXME */, uri_item) ) {
142
sieve_runtime_trace_error(renv, "invalid method uri item");
143
return SIEVE_EXEC_BIN_CORRUPT;
146
sieve_interpreter_set_test_result(renv->interp, all_valid);
147
return SIEVE_EXEC_OK;