#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdlib.h>
#include <string.h>
#include "xmalloc.h"
#include "sieve_interface.h"
#include "interp.h"
#include "libconfig.h"
int sieve_interp_alloc(sieve_interp_t **interp, void *interp_context)
{
sieve_interp_t *i;
static int initonce;
if (!initonce) {
initialize_siev_error_table();
initonce = 1;
}
*interp = NULL;
i = (sieve_interp_t *) xmalloc(sizeof(sieve_interp_t));
if (i == NULL) {
return SIEVE_NOMEM;
}
i->redirect = i->discard = i->reject = i->fileinto = i->keep = NULL;
i->getsize = NULL;
i->getheader = NULL;
i->getenvelope = NULL;
i->getbody = NULL;
i->getinclude = NULL;
i->vacation = NULL;
i->notify = NULL;
i->markflags = NULL;
i->interp_context = interp_context;
i->err = NULL;
*interp = i;
return SIEVE_OK;
}
const char *sieve_listextensions(sieve_interp_t *i)
{
static int done = 0;
static char extensions[4096] = "";
if (!done++) {
unsigned long config_sieve_extensions =
config_getbitfield(IMAPOPT_SIEVE_EXTENSIONS);
strlcat(extensions, "comparator-i;ascii-numeric", sizeof(extensions));
if (i->fileinto &&
(config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_FILEINTO))
strlcat(extensions, " fileinto", sizeof(extensions));
if (i->reject &&
(config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_REJECT))
strlcat(extensions, " reject", sizeof(extensions));
if (i->vacation &&
(config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_VACATION))
strlcat(extensions, " vacation", sizeof(extensions));
if (i->markflags &&
(config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_IMAPFLAGS))
strlcat(extensions, " imapflags", sizeof(extensions));
if (i->notify &&
(config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_NOTIFY))
strlcat(extensions, " notify", sizeof(extensions));
if (i->getinclude &&
(config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_INCLUDE))
strlcat(extensions, " include", sizeof(extensions));
if (i->getenvelope &&
(config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_ENVELOPE))
strlcat(extensions, " envelope", sizeof(extensions));
if (i->getbody &&
(config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_BODY))
strlcat(extensions, " body", sizeof(extensions));
if (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_RELATIONAL)
strlcat(extensions, " relational", sizeof(extensions));
#ifdef ENABLE_REGEX
if (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_REGEX)
strlcat(extensions, " regex", sizeof(extensions));
#endif
if (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_SUBADDRESS)
strlcat(extensions, " subaddress", sizeof(extensions));
if (config_sieve_extensions & IMAP_ENUM_SIEVE_EXTENSIONS_COPY)
strlcat(extensions, " copy", sizeof(extensions));
}
return extensions;
}
int sieve_interp_free(sieve_interp_t **interp)
{
free(*interp);
return SIEVE_OK;
}
int sieve_register_redirect(sieve_interp_t *interp, sieve_callback *f)
{
interp->redirect = f;
return SIEVE_OK;
}
int sieve_register_discard(sieve_interp_t *interp, sieve_callback *f)
{
interp->discard = f;
return SIEVE_OK;
}
int sieve_register_reject(sieve_interp_t *interp, sieve_callback *f)
{
interp->reject = f;
return SIEVE_OK;
}
int sieve_register_fileinto(sieve_interp_t *interp, sieve_callback *f)
{
interp->fileinto = f;
return SIEVE_OK;
}
int sieve_register_keep(sieve_interp_t *interp, sieve_callback *f)
{
interp->keep = f;
return SIEVE_OK;
}
static char *default_markflags[] = { "\\flagged" };
static sieve_imapflags_t default_mark = { default_markflags, 1 };
int sieve_register_imapflags(sieve_interp_t *interp, sieve_imapflags_t *mark)
{
interp->markflags =
(mark && mark->flag && mark->nflags) ? mark : &default_mark;
return SIEVE_OK;
}
int sieve_register_notify(sieve_interp_t *interp, sieve_callback *f)
{
interp->notify = f;
return SIEVE_OK;
}
int sieve_register_size(sieve_interp_t *interp, sieve_get_size *f)
{
interp->getsize = f;
return SIEVE_OK;
}
int sieve_register_header(sieve_interp_t *interp, sieve_get_header *f)
{
interp->getheader = f;
return SIEVE_OK;
}
int sieve_register_envelope(sieve_interp_t *interp, sieve_get_envelope *f)
{
interp->getenvelope = f;
return SIEVE_OK;
}
int sieve_register_include(sieve_interp_t *interp, sieve_get_include *f)
{
interp->getinclude = f;
return SIEVE_OK;
}
int sieve_register_body(sieve_interp_t *interp, sieve_get_body *f)
{
interp->getbody = f;
return SIEVE_OK;
}
int sieve_register_vacation(sieve_interp_t *interp, sieve_vacation_t *v)
{
if (!interp->getenvelope) {
return SIEVE_NOT_FINALIZED;
}
if (v->min_response == 0) v->min_response = 3;
if (v->max_response == 0) v->max_response = 90;
if (v->min_response < 0 || v->max_response < 7 || !v->autorespond
|| !v->send_response) {
return SIEVE_FAIL;
}
interp->vacation = v;
return SIEVE_OK;
}
int sieve_register_parse_error(sieve_interp_t *interp, sieve_parse_error *f)
{
interp->err = f;
return SIEVE_OK;
}
int sieve_register_execute_error(sieve_interp_t *interp, sieve_execute_error *f)
{
interp->execute_err = f;
return SIEVE_OK;
}
int interp_verify(sieve_interp_t *i)
{
if (i->redirect && i->keep && i->getsize && i->getheader) {
return SIEVE_OK;
} else {
return SIEVE_NOT_FINALIZED;
}
}