bool cmd_setactive(struct client_command_context *cmd) { struct client *client = cmd->client; struct sieve_storage *storage = client->storage; const char *scriptname; struct sieve_script *script; int ret; /* <scriptname> */ if ( !client_read_string_args(cmd, TRUE, 1, &scriptname) ) return FALSE; /* Activate, or .. */ if ( *scriptname != '\0' ) { string_t *errors = NULL; const char *errormsg = NULL; bool warnings = FALSE; bool success = TRUE; script = sieve_storage_open_script (storage, scriptname, NULL); if ( script == NULL ) { client_send_storage_error(client, storage); return TRUE; } if ( sieve_script_is_active(script) <= 0 ) { /* Script is first being activated; compile it again without the UPLOAD * flag. */ T_BEGIN { struct sieve_error_handler *ehandler; enum sieve_compile_flags cpflags = SIEVE_COMPILE_FLAG_NOGLOBAL | SIEVE_COMPILE_FLAG_ACTIVATED; struct sieve_binary *sbin; enum sieve_error error; /* Prepare error handler */ errors = str_new(default_pool, 1024); ehandler = sieve_strbuf_ehandler_create(client->svinst, errors, TRUE, client->set->managesieve_max_compile_errors); /* Compile */ if ( (sbin=sieve_compile_script (script, ehandler, cpflags, &error)) == NULL ) { if (error != SIEVE_ERROR_NOT_VALID) { errormsg = sieve_script_get_last_error(script, &error); if ( error == SIEVE_ERROR_NONE ) errormsg = NULL; } success = FALSE; } else { sieve_close(&sbin); } warnings = ( sieve_get_warnings(ehandler) > 0 ); sieve_error_handler_unref(&ehandler); } T_END; }
static int cmd_sieve_activate_run(struct doveadm_sieve_cmd_context *_ctx) { struct doveadm_sieve_activate_cmd_context *ctx = (struct doveadm_sieve_activate_cmd_context *)_ctx; struct sieve_storage *storage = _ctx->storage; struct sieve_script *script; enum sieve_error error; int ret = 0; script = sieve_storage_open_script (storage, ctx->scriptname, NULL); if ( script == NULL ) { i_error("Failed to activate Sieve script: %s", sieve_storage_get_last_error(storage, &error)); doveadm_sieve_cmd_failed_error(_ctx, error); return -1; } if ( sieve_script_is_active(script) <= 0 ) { /* Script is first being activated; compile it again without the UPLOAD * flag. */ struct sieve_error_handler *ehandler; enum sieve_compile_flags cpflags = SIEVE_COMPILE_FLAG_NOGLOBAL | SIEVE_COMPILE_FLAG_ACTIVATED; struct sieve_binary *sbin; enum sieve_error error; /* Compile */ ehandler = sieve_master_ehandler_create(ctx->ctx.svinst, NULL, 0); if ( (sbin=sieve_compile_script (script, ehandler, cpflags, &error)) == NULL ) { doveadm_sieve_cmd_failed_error(_ctx, error); ret = -1; } else { sieve_close(&sbin); } sieve_error_handler_unref(&ehandler); } /* Activate only when script is valid (or already active) */ if ( ret == 0 ) { /* Refresh activation no matter what; this can also resolve some erroneous * situations. */ ret = sieve_script_activate(script, (time_t)-1); if ( ret < 0 ) { i_error("Failed to activate Sieve script: %s", sieve_storage_get_last_error(storage, &error)); doveadm_sieve_cmd_failed_error(_ctx, error); ret = -1; } } sieve_script_unref(&script); return ret; }