mail-log-plugin.c revision 1f6c210c30992e95b806d2f517e2b3625ed941c5
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi/* Copyright (c) 2007-2008 Dovecot authors, see the included COPYING file */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi (MAIL_LOG_EVENT_DELETE | MAIL_LOG_EVENT_UNDELETE | \
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi MAIL_LOG_EVENT_MAILBOX_DELETE | MAIL_LOG_EVENT_MAILBOX_RENAME)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic const char *field_names[] = {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic const char *event_names[] = {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi "mailbox_delete",
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi "mailbox_rename",
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi "flag_change",
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *data;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi union mailbox_transaction_module_context module_ctx;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi ARRAY_DEFINE(group_changes, struct mail_log_group_changes);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int changes;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomiconst char *mail_log_plugin_version = PACKAGE_VERSION;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void (*mail_log_next_hook_mail_storage_created)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void (*mail_log_next_hook_mailbox_list_created)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic MODULE_CONTEXT_DEFINE_INIT(mail_log_storage_module,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic MODULE_CONTEXT_DEFINE_INIT(mail_log_mail_module, &mail_module_register);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic MODULE_CONTEXT_DEFINE_INIT(mail_log_mailbox_list_module,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic enum mail_log_field mail_log_field_find(const char *name)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int i;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi return 1 << i;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic enum mail_log_event mail_log_event_find(const char *name)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int i;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi return 1 << i;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic const char *mail_log_event_get_name(enum mail_log_event event)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int i;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_log_action_get_group(struct mail_log_transaction_context *lt,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int i, count;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi group = array_get_modifiable(<->group_changes, &count);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi for (i = 0; i < count; i++) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_log_action_add_group(struct mail_log_transaction_context *lt,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *data)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi group = mail_log_action_get_group(lt, event, data);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_UID) != 0) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_PSIZE) != 0 &&
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi (event & (MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY)) != 0) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_VSIZE) != 0 &&
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi (event & (MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY)) != 0) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void mail_log_append_mailbox_name(string_t *str, struct mailbox *box)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi /* most operations are for INBOX, and POP3 has only INBOX,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi so don't add it. */
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_log_group(struct mailbox *box, const struct mail_log_group_changes *group)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int i, count;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi str_printfa(str, "%s: ", mail_log_event_get_name(group->event));
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_UID) != 0 &&
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi for (i = 0; i < count; i++) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_BOX) != 0)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi str_printfa(str, "size=%"PRIuUOFF_T", ", group->psize_total);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi str_printfa(str, "size=%"PRIuUOFF_T", ", group->vsize_total);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi unsigned int i, count;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi for (i = 0; i < count; i++) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void mail_log_add_hdr(struct mail *mail, string_t *str,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *value;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if (mail_get_first_header(mail, header, &value) <= 0)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi str_printfa(str, "%s=%s, ", name, str_sanitize(value, HEADER_LOG_LEN));
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void mail_log_action(struct mailbox_transaction_context *dest_trans,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi const char *data)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi struct mail_log_transaction_context *lt = MAIL_LOG_CONTEXT(dest_trans);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi str_printfa(str, "%s: ", mail_log_event_get_name(event));
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_UID) != 0 && mail->uid != 0)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_BOX) != 0)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_FLAGS) != 0) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_MSGID) != 0)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi mail_log_add_hdr(mail, str, "msgid", "Message-ID");
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_FROM) != 0)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_SUBJECT) != 0)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi mail_log_add_hdr(mail, str, "subject", "Subject");
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_PSIZE) != 0 &&
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi (event & (MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY)) != 0) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi if ((mail_log_set.fields & MAIL_LOG_FIELD_VSIZE) != 0 &&
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi (event & (MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY)) != 0) {
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomistatic void mail_log_mail_expunge(struct mail *_mail)
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi struct mail_private *mail = (struct mail_private *)_mail;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi union mail_module_context *lmail = MAIL_LOG_MAIL_CONTEXT(mail);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomimail_log_mail_update_flags(struct mail *_mail, enum modify_type modify_type,
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi struct mail_private *mail = (struct mail_private *)_mail;
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi union mail_module_context *lmail = MAIL_LOG_MAIL_CONTEXT(mail);
1de7b73a11afda43323410a4481d866930b1e632Aki Tuomi lmail->super.update_flags(_mail, modify_type, flags);
} T_END;
static struct mail *
return _mail;
const char *name;
T_BEGIN {
} T_END;
T_BEGIN {
} T_END;
static struct mailbox_transaction_context *
struct mailbox_transaction_context *t;
static struct mailbox *
return NULL;
return box;
const char *newname)
const char *const *tmp;
if (field == 0)
return fields;
const char *const *tmp;
if (event == 0)
return events;
const char *str;
void mail_log_plugin_init(void)
void mail_log_plugin_deinit(void)