static int tst_exists_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { struct sieve_stringlist *hdr_list; struct mail *mail = sieve_message_get_mail(renv->msgctx); string_t *hdr_item; bool matched; int ret; /* * Read operands */ /* Read header-list */ if ( (ret=sieve_opr_stringlist_read(renv, address, "header-list", &hdr_list)) <= 0 ) return ret; /* * Perfrom test */ sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "exists test"); sieve_runtime_trace_descend(renv); /* Iterate through all requested headers to match (must find all specified) */ hdr_item = NULL; matched = TRUE; while ( matched && (ret=sieve_stringlist_next_item(hdr_list, &hdr_item)) > 0 ) { const char *const *headers; if ( mail_get_headers(mail, str_c(hdr_item), &headers) < 0 || headers[0] == NULL ) { matched = FALSE; } sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING, "header `%s' %s", str_sanitize(str_c(hdr_item), 80), ( matched ? "exists" : "is missing" )); } if ( matched ) sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING, "all headers exist"); else sieve_runtime_trace(renv, SIEVE_TRLVL_MATCHING, "headers are missing"); /* Set test result for subsequent conditional jump */ if ( ret >= 0 ) { sieve_interpreter_set_test_result(renv->interp, matched); return SIEVE_EXEC_OK; } sieve_runtime_trace_error(renv, "invalid header-list item"); return SIEVE_EXEC_BIN_CORRUPT; }
static int tst_test_multiscript_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { struct sieve_stringlist *scripts_list; string_t *script_name; ARRAY_TYPE (const_string) scriptfiles; bool result = TRUE; int ret; /* * Read operands */ if ( (ret=sieve_opr_stringlist_read(renv, address, "scripts", &scripts_list)) <= 0 ) return ret; /* * Perform operation */ sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "testsuite: test_multiscript test"); sieve_runtime_trace_descend(renv); t_array_init(&scriptfiles, 16); script_name = NULL; while ( result && (ret=sieve_stringlist_next_item(scripts_list, &script_name)) > 0 ) { const char *script = t_strdup(str_c(script_name)); array_append(&scriptfiles, &script, 1); } result = result && (ret >= 0) && testsuite_script_multiscript(renv, &scriptfiles); /* Set result */ sieve_interpreter_set_test_result(renv->interp, result); return SIEVE_EXEC_OK; }
static int tst_vnotifym_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { struct sieve_stringlist *notify_uris; string_t *uri_item; bool all_valid = TRUE; int ret; /* * Read operands */ /* Read notify uris */ if ( (ret=sieve_opr_stringlist_read (renv, address, "notify-uris", ¬ify_uris)) <= 0 ) return ret; /* * Perform operation */ sieve_runtime_trace(renv, SIEVE_TRLVL_TESTS, "valid_notify_method test"); uri_item = NULL; while ( (ret=sieve_stringlist_next_item(notify_uris, &uri_item)) > 0 ) { if ( !ext_enotify_runtime_method_validate(renv, uri_item) ) { all_valid = FALSE; break; } } if ( ret < 0 ) { sieve_runtime_trace_error(renv, "invalid method uri item"); return SIEVE_EXEC_BIN_CORRUPT; } sieve_interpreter_set_test_result(renv->interp, all_valid); return SIEVE_EXEC_OK; }
static int tst_mailboxexists_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { struct sieve_stringlist *mailbox_names; string_t *mailbox_item; bool trace = FALSE; bool all_exist = TRUE; int ret; /* * Read operands */ /* Read notify uris */ if ( (ret=sieve_opr_stringlist_read (renv, address, "mailbox-names", &mailbox_names)) <= 0 ) return ret; /* * Perform operation */ if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_TESTS) ) { sieve_runtime_trace(renv, 0, "mailboxexists test"); sieve_runtime_trace_descend(renv); trace = sieve_runtime_trace_active(renv, SIEVE_TRLVL_MATCHING); } if ( renv->scriptenv->user != NULL ) { int ret; mailbox_item = NULL; while ( (ret=sieve_stringlist_next_item(mailbox_names, &mailbox_item)) > 0 ) { struct mail_namespace *ns; const char *mailbox = str_c(mailbox_item); struct mailbox *box; /* Find the namespace */ ns = mail_namespace_find(renv->scriptenv->user->namespaces, mailbox); if ( ns == NULL) { if ( trace ) { sieve_runtime_trace(renv, 0, "mailbox `%s' not found", str_sanitize(mailbox, 80)); } all_exist = FALSE; break; } /* Open the box */ box = mailbox_alloc(ns->list, mailbox, 0); if ( mailbox_open(box) < 0 ) { if ( trace ) { sieve_runtime_trace(renv, 0, "mailbox `%s' cannot be opened", str_sanitize(mailbox, 80)); } all_exist = FALSE; mailbox_free(&box); break; } /* Also fail when it is readonly */ if ( mailbox_is_readonly(box) ) { if ( trace ) { sieve_runtime_trace(renv, 0, "mailbox `%s' is read-only", str_sanitize(mailbox, 80)); } all_exist = FALSE; mailbox_free(&box); break; } /* FIXME: check acl for 'p' or 'i' ACL permissions as required by RFC */ if ( trace ) { sieve_runtime_trace(renv, 0, "mailbox `%s' exists", str_sanitize(mailbox, 80)); } /* Close mailbox */ mailbox_free(&box); } if ( ret < 0 ) { sieve_runtime_trace_error(renv, "invalid mailbox name item"); return SIEVE_EXEC_BIN_CORRUPT; } } if ( trace ) { if ( all_exist ) sieve_runtime_trace(renv, 0, "all mailboxes are available"); else sieve_runtime_trace(renv, 0, "some mailboxes are unavailable"); } sieve_interpreter_set_test_result(renv->interp, all_exist); return SIEVE_EXEC_OK; }
static int tst_spamvirustest_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { const struct sieve_operation *op = renv->oprtn; const struct sieve_extension *this_ext = op->ext; int opt_code = 0; struct sieve_match_type mcht = SIEVE_MATCH_TYPE_DEFAULT(is_match_type); struct sieve_comparator cmp = SIEVE_COMPARATOR_DEFAULT(i_ascii_casemap_comparator); bool percent = FALSE; struct sieve_stringlist *value_list, *key_list; const char *score_value; int match, ret; /* Read optional operands */ for (;;) { int opt; if ( (opt=sieve_match_opr_optional_read (renv, address, &opt_code, &ret, &cmp, &mcht)) < 0 ) return ret; if ( opt == 0 ) break; switch ( opt_code ) { case OPT_SPAMTEST_PERCENT: percent = TRUE; break; default: sieve_runtime_trace_error(renv, "unknown optional operand"); return SIEVE_EXEC_BIN_CORRUPT; } } /* Read value part */ if ( (ret=sieve_opr_stringlist_read(renv, address, "value", &key_list)) <= 0 ) return ret; /* Perform test */ if ( sieve_operation_is(op, spamtest_operation) ) { sieve_runtime_trace (renv, SIEVE_TRLVL_TESTS, "spamtest test [percent=%s]", ( percent ? "true" : "false" )); } else { sieve_runtime_trace (renv, SIEVE_TRLVL_TESTS, "virustest test"); } /* Get score value */ sieve_runtime_trace_descend(renv); if ( (ret=ext_spamvirustest_get_value (renv, this_ext, percent, &score_value)) <= 0 ) return ret; sieve_runtime_trace_ascend(renv); /* Construct value list */ value_list = sieve_single_stringlist_create_cstr(renv, score_value, TRUE); /* Perform match */ if ( (match=sieve_match(renv, &mcht, &cmp, value_list, key_list, &ret)) < 0 ) return ret; /* Set test result for subsequent conditional jump */ sieve_interpreter_set_test_result(renv->interp, match > 0); return SIEVE_EXEC_OK; }