89 |
int |
int |
90 |
sieve_test_address (sieve_machine_t mach, list_t args, list_t tags) |
sieve_test_address (sieve_machine_t mach, list_t args, list_t tags) |
91 |
{ |
{ |
92 |
sieve_value_t *h, *v; |
sieve_value_t *h, *v, *arg; |
93 |
header_t header = NULL; |
header_t header = NULL; |
94 |
sieve_comparator_t comp = sieve_get_comparator (mach, tags); |
sieve_comparator_t comp = sieve_get_comparator (mach, tags); |
95 |
|
sieve_relcmp_t test = sieve_get_relcmp (mach, tags); |
96 |
struct address_closure clos; |
struct address_closure clos; |
97 |
int rc; |
int rc; |
98 |
|
size_t count; |
99 |
|
|
100 |
if (mach->debug_level & MU_SIEVE_DEBUG_TRACE) |
if (mach->debug_level & MU_SIEVE_DEBUG_TRACE) |
101 |
sieve_debug (mach, "ADDRESS\n"); |
sieve_debug (mach, "ADDRESS\n"); |
117 |
clos.data = header; |
clos.data = header; |
118 |
clos.aget = sieve_get_address_part (tags); |
clos.aget = sieve_get_address_part (tags); |
119 |
clos.addr = NULL; |
clos.addr = NULL; |
120 |
rc = sieve_vlist_compare (h, v, comp, retrieve_address, &clos); |
rc = sieve_vlist_compare (h, v, comp, test, retrieve_address, &clos, &count); |
121 |
address_destroy (&clos.addr); |
address_destroy (&clos.addr); |
122 |
|
|
123 |
|
if (sieve_tag_lookup (tags, "count", &arg)) |
124 |
|
{ |
125 |
|
size_t limit; |
126 |
|
char *str; |
127 |
|
sieve_value_t *val; |
128 |
|
sieve_relcmpn_t stest; |
129 |
|
|
130 |
|
val = sieve_value_get (args, 1); |
131 |
|
list_get (val->v.list, 0, (void **) &str); |
132 |
|
limit = strtoul (str, &str, 10); |
133 |
|
|
134 |
|
sieve_str_to_relcmp (arg->v.string, NULL, &stest); |
135 |
|
return stest (count, limit); |
136 |
|
} |
137 |
|
|
138 |
return rc; |
return rc; |
139 |
} |
} |
140 |
|
|
149 |
int |
int |
150 |
sieve_test_header (sieve_machine_t mach, list_t args, list_t tags) |
sieve_test_header (sieve_machine_t mach, list_t args, list_t tags) |
151 |
{ |
{ |
152 |
sieve_value_t *h, *v; |
sieve_value_t *h, *v, *arg; |
153 |
header_t header = NULL; |
header_t header = NULL; |
154 |
sieve_comparator_t comp = sieve_get_comparator (mach, tags); |
sieve_comparator_t comp = sieve_get_comparator (mach, tags); |
155 |
|
sieve_relcmp_t test = sieve_get_relcmp (mach, tags); |
156 |
|
size_t count, mcount = 0; |
157 |
|
|
158 |
if (mach->debug_level & MU_SIEVE_DEBUG_TRACE) |
if (mach->debug_level & MU_SIEVE_DEBUG_TRACE) |
159 |
sieve_debug (mach, "HEADER\n"); |
sieve_debug (mach, "HEADER\n"); |
188 |
if (message_get_part (mach->msg, i, &message) == 0) |
if (message_get_part (mach->msg, i, &message) == 0) |
189 |
{ |
{ |
190 |
message_get_header (message, &header); |
message_get_header (message, &header); |
191 |
if (sieve_vlist_compare (h, v, comp, |
if (sieve_vlist_compare (h, v, comp, test, |
192 |
retrieve_header, header)) |
retrieve_header, header, &mcount)) |
193 |
return 1; |
return 1; |
194 |
} |
} |
195 |
} |
} |
196 |
} |
} |
197 |
} |
} |
198 |
message_get_header (mach->msg, &header); |
message_get_header (mach->msg, &header); |
199 |
return sieve_vlist_compare (h, v, comp, retrieve_header, header); |
if (sieve_vlist_compare (h, v, comp, test, retrieve_header, header, &count)) |
200 |
|
return 1; |
201 |
|
|
202 |
|
if (sieve_tag_lookup (tags, "count", &arg)) |
203 |
|
{ |
204 |
|
size_t limit; |
205 |
|
char *str; |
206 |
|
sieve_value_t *val; |
207 |
|
sieve_relcmpn_t stest; |
208 |
|
|
209 |
|
val = sieve_value_get (args, 1); |
210 |
|
list_get (val->v.list, 0, (void **) &str); |
211 |
|
limit = strtoul (str, &str, 10); |
212 |
|
|
213 |
|
sieve_str_to_relcmp (arg->v.string, NULL, &stest); |
214 |
|
return stest (count + mcount, limit); |
215 |
|
} |
216 |
|
|
217 |
|
return 0; |
218 |
} |
} |
219 |
|
|
220 |
int |
int |
250 |
{ |
{ |
251 |
sieve_value_t *h, *v; |
sieve_value_t *h, *v; |
252 |
sieve_comparator_t comp = sieve_get_comparator (mach, tags); |
sieve_comparator_t comp = sieve_get_comparator (mach, tags); |
253 |
|
sieve_relcmp_t test = sieve_get_relcmp (mach, tags); |
254 |
struct address_closure clos; |
struct address_closure clos; |
255 |
int rc; |
int rc; |
256 |
|
|
273 |
message_get_envelope (sieve_get_message (mach), (envelope_t*)&clos.data); |
message_get_envelope (sieve_get_message (mach), (envelope_t*)&clos.data); |
274 |
clos.aget = sieve_get_address_part (tags); |
clos.aget = sieve_get_address_part (tags); |
275 |
clos.addr = NULL; |
clos.addr = NULL; |
276 |
rc = sieve_vlist_compare (h, v, comp, retrieve_envelope, &clos); |
rc = sieve_vlist_compare (h, v, comp, test, retrieve_envelope, &clos, NULL); |
277 |
address_destroy (&clos.addr); |
address_destroy (&clos.addr); |
278 |
return rc; |
return rc; |
279 |
} |
} |
361 |
{ "contains", SVT_VOID }, |
{ "contains", SVT_VOID }, |
362 |
{ "matches", SVT_VOID }, |
{ "matches", SVT_VOID }, |
363 |
{ "regex", SVT_VOID }, |
{ "regex", SVT_VOID }, |
364 |
|
{ "count", SVT_STRING }, |
365 |
|
{ "value", SVT_STRING }, |
366 |
{ "comparator", SVT_STRING }, |
{ "comparator", SVT_STRING }, |
367 |
{ NULL } |
{ NULL } |
368 |
}; |
}; |