static int cmd_test_binary_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { const struct sieve_operation *oprtn = renv->oprtn; string_t *binary_name = NULL; int ret; /* * Read operands */ /* Binary Name */ if ( (ret=sieve_opr_string_read(renv, address, "binary-name", &binary_name)) <= 0 ) return ret; /* * Perform operation */ if ( sieve_operation_is(oprtn, test_binary_load_operation) ) { struct sieve_binary *sbin = testsuite_binary_load(str_c(binary_name)); if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) { sieve_runtime_trace(renv, 0, "testsuite: test_binary_load command"); sieve_runtime_trace_descend(renv); sieve_runtime_trace(renv, 0, "load binary `%s'", str_c(binary_name)); } if ( sbin != NULL ) { testsuite_script_set_binary(sbin); sieve_binary_unref(&sbin); } else { sieve_sys_error(testsuite_sieve_instance, "failed to load binary %s", str_c(binary_name)); return SIEVE_EXEC_FAILURE; } } else if ( sieve_operation_is(oprtn, test_binary_save_operation) ) { struct sieve_binary *sbin = testsuite_script_get_binary(); if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) { sieve_runtime_trace(renv, 0, "testsuite: test_binary_save command"); sieve_runtime_trace_descend(renv); sieve_runtime_trace(renv, 0, "save binary `%s'", str_c(binary_name)); } if ( sbin != NULL ) testsuite_binary_save(sbin, str_c(binary_name)); else { sieve_sys_error(testsuite_sieve_instance, "no compiled binary to save as %s", str_c(binary_name)); return SIEVE_EXEC_FAILURE; } } else { i_unreached(); } return SIEVE_EXEC_OK; }
static int cmd_test_imap_metadata_operation_execute (const struct sieve_runtime_env *renv, sieve_size_t *address) { const struct sieve_operation *oprtn = renv->oprtn; int opt_code = 0; string_t *mailbox = NULL, *annotation = NULL, *value = NULL; int ret; /* * Read operands */ /* Optional operands */ for (;;) { int opt; if ( (opt=sieve_opr_optional_read(renv, address, &opt_code)) < 0 ) return SIEVE_EXEC_BIN_CORRUPT; if ( opt == 0 ) break; switch ( opt_code ) { case OPT_MAILBOX: ret = sieve_opr_string_read(renv, address, "mailbox", &mailbox); break; default: sieve_runtime_trace_error(renv, "unknown optional operand"); ret = SIEVE_EXEC_BIN_CORRUPT; } if ( ret <= 0 ) return ret; } /* Fixed operands */ if ( (ret=sieve_opr_string_read (renv, address, "annotation", &annotation)) <= 0 ) return ret; if ( (ret=sieve_opr_string_read (renv, address, "value", &value)) <= 0 ) return ret; /* * Perform operation */ if ( sieve_operation_is(oprtn, test_imap_metadata_set_operation) ) { if ( sieve_runtime_trace_active(renv, SIEVE_TRLVL_COMMANDS) ) { sieve_runtime_trace(renv, 0, "testsuite/test_imap_metadata_set command"); sieve_runtime_trace_descend(renv); if (mailbox == NULL) { sieve_runtime_trace(renv, 0, "set server annotation `%s'", str_c(annotation)); } else { sieve_runtime_trace(renv, 0, "set annotation `%s' for mailbox `%s'", str_c(annotation), str_c(mailbox)); } } if (testsuite_mailstore_set_imap_metadata (( mailbox == NULL ? NULL : str_c(mailbox) ), str_c(annotation), str_c(value)) < 0) return SIEVE_EXEC_FAILURE; } 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; }