mail-log-plugin.c revision 39afc7584d935b2dc7332c21966a7b20da03f1ec
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen/* Copyright (c) 2007-2008 Dovecot authors, see the included COPYING file */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen MODULE_CONTEXT(obj, mail_log_mailbox_list_module)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen (MAIL_LOG_EVENT_DELETE | MAIL_LOG_EVENT_UNDELETE | \
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY | \
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen MAIL_LOG_EVENT_MAILBOX_DELETE | MAIL_LOG_EVENT_MAILBOX_RENAME)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic const char *field_names[] = {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic const char *event_names[] = {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen "mailbox_delete",
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen "mailbox_rename",
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen "flag_change",
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen union mailbox_transaction_module_context module_ctx;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen ARRAY_DEFINE(group_changes, struct mail_log_group_changes);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen unsigned int changes;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenconst char *mail_log_plugin_version = PACKAGE_VERSION;
4d2211dac61c615c5bdfd501ea54d46c89d41b0fTimo Sirainenstatic void (*mail_log_next_hook_mail_storage_created)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic void (*mail_log_next_hook_mailbox_list_created)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(mail_log_storage_module,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(mail_log_mail_module, &mail_module_register);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(mail_log_mailbox_list_module,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic enum mail_log_field mail_log_field_find(const char *name)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen unsigned int i;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen return 1 << i;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic enum mail_log_event mail_log_event_find(const char *name)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen unsigned int i;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen return 1 << i;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic const char *mail_log_event_get_name(enum mail_log_event event)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen unsigned int i;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenmail_log_action_get_group(struct mail_log_transaction_context *lt,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen unsigned int i, count;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen p_array_init(<->group_changes, lt->pool, 8);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen group = array_get_modifiable(<->group_changes, &count);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen for (i = 0; i < count; i++) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen group = array_append_space(<->group_changes);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenmail_log_action_add_group(struct mail_log_transaction_context *lt,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen group = mail_log_action_get_group(lt, event, data);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_UID) != 0) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen seq_range_array_add(&group->uids, 0, mail->uid);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_PSIZE) != 0 &&
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen (event & (MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY)) != 0) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_VSIZE) != 0 &&
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen (event & (MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY)) != 0) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic void mail_log_append_mailbox_name(string_t *str, struct mailbox *box)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen /* most operations are for INBOX, and POP3 has only INBOX,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen so don't add it. */
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen str_sanitize(mailbox_str, MAILBOX_NAME_LOG_LEN));
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenmail_log_group(struct mailbox *box, const struct mail_log_group_changes *group)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen unsigned int i, count;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen str_printfa(str, "%s: ", mail_log_event_get_name(group->event));
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_UID) != 0 &&
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen for (i = 0; i < count; i++) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_BOX) != 0)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen str_printfa(str, "size=%"PRIuUOFF_T", ", group->psize_total);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen str_printfa(str, "size=%"PRIuUOFF_T", ", group->vsize_total);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen unsigned int i, count;
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen group = array_get(<->group_changes, &count);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen for (i = 0; i < count; i++) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic void mail_log_add_hdr(struct mail *mail, string_t *str,
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if (mail_get_first_header(mail, header, &value) <= 0)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen str_printfa(str, "%s=%s, ", name, str_sanitize(value, HEADER_LOG_LEN));
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainenstatic void mail_log_action(struct mailbox_transaction_context *dest_trans,
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen struct mail_log_transaction_context *lt = MAIL_LOG_CONTEXT(dest_trans);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen pool = pool_alloconly_create("mail log transaction", 1024);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen lt = p_new(pool, struct mail_log_transaction_context, 1);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen MODULE_CONTEXT_SET(dest_trans, mail_log_storage_module, lt);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen mail_log_action_add_group(lt, mail, event, data);
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen str_printfa(str, "%s: ", mail_log_event_get_name(event));
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_UID) != 0)
8e371a3ce32bd64288786855b8ce0cb63f19f7d1Timo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_BOX) != 0)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_FLAGS) != 0) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_MSGID) != 0)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen mail_log_add_hdr(mail, str, "msgid", "Message-ID");
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_FROM) != 0)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_SUBJECT) != 0)
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen mail_log_add_hdr(mail, str, "subject", "Subject");
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_PSIZE) != 0 &&
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen (event & (MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY)) != 0) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen str_printfa(str, "size=%"PRIuUOFF_T", ", size);
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen if ((mail_log_set.fields & MAIL_LOG_FIELD_VSIZE) != 0 &&
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen (event & (MAIL_LOG_EVENT_EXPUNGE | MAIL_LOG_EVENT_COPY)) != 0) {
cf7164ece50797a67fc4bfb5889022ac93a36a8aTimo Sirainen str_printfa(str, "vsize=%"PRIuUOFF_T", ", size);
T_BEGIN {
} T_END;
switch (modify_type) {
case MODIFY_ADD:
case MODIFY_REMOVE:
case MODIFY_REPLACE:
} T_END;
static struct mail *
return _mail;
const char *name;
T_BEGIN {
} T_END;
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)