1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
/* Copyright (c) 2002-2016 Pigeonhole authors, see the included COPYING file
*/
#include "lib.h"
#include "doveadm-mail.h"
#include "sieve.h"
#include "sieve-script.h"
#include "sieve-storage.h"
#include "doveadm-sieve-cmd.h"
struct doveadm_sieve_activate_cmd_context {
struct doveadm_sieve_cmd_context ctx;
const char *scriptname;
};
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;
}
static int cmd_sieve_deactivate_run
(struct doveadm_sieve_cmd_context *_ctx)
{
struct sieve_storage *storage = _ctx->storage;
enum sieve_error error;
if (sieve_storage_deactivate(storage, (time_t)-1) < 0) {
i_error("Failed to deactivate Sieve script: %s",
sieve_storage_get_last_error(storage, &error));
doveadm_sieve_cmd_failed_error(_ctx, error);
return -1;
}
return 0;
}
static void cmd_sieve_activate_init
(struct doveadm_mail_cmd_context *_ctx,
const char *const args[])
{
struct doveadm_sieve_activate_cmd_context *ctx =
(struct doveadm_sieve_activate_cmd_context *)_ctx;
if (str_array_length(args) != 1)
doveadm_mail_help_name("sieve activate");
doveadm_sieve_cmd_scriptnames_check(args);
ctx->scriptname = p_strdup(ctx->ctx.ctx.pool, args[0]);
}
static struct doveadm_mail_cmd_context *
cmd_sieve_activate_alloc(void)
{
struct doveadm_sieve_activate_cmd_context *ctx;
ctx = doveadm_sieve_cmd_alloc(struct doveadm_sieve_activate_cmd_context);
ctx->ctx.ctx.v.init = cmd_sieve_activate_init;
ctx->ctx.v.run = cmd_sieve_activate_run;
return &ctx->ctx.ctx;
}
static struct doveadm_mail_cmd_context *
cmd_sieve_deactivate_alloc(void)
{
struct doveadm_sieve_cmd_context *ctx;
ctx = doveadm_sieve_cmd_alloc(struct doveadm_sieve_cmd_context);
ctx->v.run = cmd_sieve_deactivate_run;
return &ctx->ctx;
}
struct doveadm_cmd_ver2 doveadm_sieve_cmd_activate = {
.name = "sieve activate",
.mail_cmd = cmd_sieve_activate_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX"<scriptname>",
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAM('\0',"scriptname",CMD_PARAM_STR,CMD_PARAM_FLAG_POSITIONAL)
DOVEADM_CMD_PARAMS_END
};
struct doveadm_cmd_ver2 doveadm_sieve_cmd_deactivate = {
.name = "sieve deactivate",
.mail_cmd = cmd_sieve_deactivate_alloc,
.usage = DOVEADM_CMD_MAIL_USAGE_PREFIX,
DOVEADM_CMD_PARAMS_START
DOVEADM_CMD_MAIL_COMMON
DOVEADM_CMD_PARAMS_END
};
|