From: Timo Sirainen Date: Thu, 23 Mar 2017 12:15:49 +0000 (+0200) Subject: lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_au... X-Git-Tag: 2.3.0.rc1~1875 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=646817f0cfb39b0e0eb545900f1566b76a851b20;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with explicit mail_user_autoexpunge() This allows better control of which users are being autoexpunged. This patch changes behavior at least in two ways now: 1) After shared folder access, the owner user isn't autoexpunged at deinit. Although this is a bit questionable of whether it should be or not. 2) LMTP's quota check at RCPT TO stage doesn't trigger autoexpunging. --- diff --git a/src/imap/imap-client.c b/src/imap/imap-client.c index e53eb6b314..ccedbdcd88 100644 --- a/src/imap/imap-client.c +++ b/src/imap/imap-client.c @@ -19,6 +19,7 @@ #include "mail-error.h" #include "mail-namespace.h" #include "mail-storage-service.h" +#include "mail-autoexpunge.h" #include "imap-state.h" #include "imap-search.h" #include "imap-notify.h" @@ -448,10 +449,13 @@ static void client_default_destroy(struct client *client, const char *reason) /* i/ostreams are already closed at this stage, so fd can be closed */ fd_close_maybe_stdio(&client->fd_in, &client->fd_out); - /* refresh proctitle before a potentially long-running user unref */ + /* Autoexpunging might run for a long time. Disconnect the client + before it starts, and refresh proctitle so it's clear that it's + doing autoexpunging. We've also sent DISCONNECT to anvil already, + because this is background work and shouldn't really be counted + as an active IMAP session for the user. */ imap_refresh_proctitle(); - /* Free the user after client is already disconnected. It may start - some background work like autoexpunging. */ + mail_user_autoexpunge(client->user); mail_user_unref(&client->user); /* free the i/ostreams after mail_user_unref(), which could trigger diff --git a/src/imap/main.c b/src/imap/main.c index 583086b728..1edca743fa 100644 --- a/src/imap/main.c +++ b/src/imap/main.c @@ -381,8 +381,7 @@ int main(int argc, char *argv[]) }; struct master_login_settings login_set; enum master_service_flags service_flags = 0; - enum mail_storage_service_flags storage_service_flags = - MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE; + enum mail_storage_service_flags storage_service_flags = 0; const char *username = NULL, *auth_socket_path = "auth-master"; int c; diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 815e89b914..b37b7b73e4 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -689,8 +689,6 @@ mail_storage_service_init_post(struct mail_storage_service_ctx *ctx, } mail_user->userdb_fields = user->input.userdb_fields == NULL ? NULL : p_strarray_dup(mail_user->pool, user->input.userdb_fields); - mail_user->autoexpunge_enabled = - (user->flags & MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE) != 0; mail_set = mail_user_set_get_storage_set(mail_user); diff --git a/src/lib-storage/mail-storage-service.h b/src/lib-storage/mail-storage-service.h index d21667f634..22f5b04034 100644 --- a/src/lib-storage/mail-storage-service.h +++ b/src/lib-storage/mail-storage-service.h @@ -34,8 +34,6 @@ enum mail_storage_service_flags { MAIL_STORAGE_SERVICE_FLAG_USE_SYSEXITS = 0x400, /* Don't create namespaces, only the user. */ MAIL_STORAGE_SERVICE_FLAG_NO_NAMESPACES = 0x800, - /* Enable autoexpunging at deinit. */ - MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE = 0x1000 }; struct mail_storage_service_input { diff --git a/src/lib-storage/mail-user.c b/src/lib-storage/mail-user.c index 7221c79cca..ba47897026 100644 --- a/src/lib-storage/mail-user.c +++ b/src/lib-storage/mail-user.c @@ -199,9 +199,6 @@ void mail_user_unref(struct mail_user **_user) return; } - if (user->autoexpunge_enabled && user->namespaces_created) - mail_user_autoexpunge(user); - user->deinitializing = TRUE; /* call deinit() with refcount=1, otherwise we may assert-crash in diff --git a/src/lib-storage/mail-user.h b/src/lib-storage/mail-user.h index 40731f772e..d6e3fb66e2 100644 --- a/src/lib-storage/mail-user.h +++ b/src/lib-storage/mail-user.h @@ -95,8 +95,6 @@ struct mail_user { bool admin:1; /* Enable all statistics gathering */ bool stats_enabled:1; - /* Enable autoexpunging at deinit. */ - bool autoexpunge_enabled:1; /* This session was restored (e.g. IMAP unhibernation) */ bool session_restored:1; }; diff --git a/src/lmtp/commands.c b/src/lmtp/commands.c index e28e0f0a6f..18c97965d6 100644 --- a/src/lmtp/commands.c +++ b/src/lmtp/commands.c @@ -27,6 +27,7 @@ #include "index/raw/raw-storage.h" #include "lda-settings.h" #include "lmtp-settings.h" +#include "mail-autoexpunge.h" #include "mail-namespace.h" #include "mail-deliver.h" #include "main.h" @@ -968,8 +969,10 @@ static bool client_deliver_next(struct client *client, struct mail *src_mail, if (ret == 0) return TRUE; /* failed. try the next one. */ - if (client->state.dest_user != NULL) + if (client->state.dest_user != NULL) { + mail_user_autoexpunge(client->state.dest_user); mail_user_unref(&client->state.dest_user); + } } return FALSE; } @@ -1056,9 +1059,10 @@ client_input_data_write_local(struct client *client, struct istream *input) src_mail = client->state.raw_mail; while (client_deliver_next(client, src_mail, session)) { if (client->state.first_saved_mail == NULL || - client->state.first_saved_mail == src_mail) + client->state.first_saved_mail == src_mail) { + mail_user_autoexpunge(client->state.dest_user); mail_user_unref(&client->state.dest_user); - else { + } else { /* use the first saved message to save it elsewhere too. this might allow hard linking the files. */ client->state.dest_user = NULL; @@ -1087,6 +1091,7 @@ client_input_data_write_local(struct client *client, struct istream *input) mail_free(&mail); mailbox_transaction_rollback(&trans); mailbox_free(&box); + mail_user_autoexpunge(user); mail_user_unref(&user); } diff --git a/src/lmtp/main.c b/src/lmtp/main.c index 2ef0dd81d8..232c5006aa 100644 --- a/src/lmtp/main.c +++ b/src/lmtp/main.c @@ -95,8 +95,7 @@ int main(int argc, char *argv[]) MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP | MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP | MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT | - MAIL_STORAGE_SERVICE_FLAG_NO_IDLE_TIMEOUT | - MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE; + MAIL_STORAGE_SERVICE_FLAG_NO_IDLE_TIMEOUT; const char *tmp_base_dir; int c; diff --git a/src/pop3/main.c b/src/pop3/main.c index ea846457fa..e12d3da43e 100644 --- a/src/pop3/main.c +++ b/src/pop3/main.c @@ -215,8 +215,7 @@ int main(int argc, char *argv[]) }; struct master_login_settings login_set; enum master_service_flags service_flags = 0; - enum mail_storage_service_flags storage_service_flags = - MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE; + enum mail_storage_service_flags storage_service_flags = 0; const char *username = NULL, *auth_socket_path = "auth-master"; int c; diff --git a/src/pop3/pop3-client.c b/src/pop3/pop3-client.c index 0a8aad6f34..2d64a7ed84 100644 --- a/src/pop3/pop3-client.c +++ b/src/pop3/pop3-client.c @@ -17,6 +17,7 @@ #include "master-service.h" #include "mail-storage.h" #include "mail-storage-service.h" +#include "mail-autoexpunge.h" #include "pop3-commands.h" #include "mail-search-build.h" #include "mail-namespace.h" @@ -636,8 +637,13 @@ static void client_default_destroy(struct client *client, const char *reason) fd_close_maybe_stdio(&client->fd_in, &client->fd_out); - /* refresh proctitle before a potentially long-running user unref */ + /* Autoexpunging might run for a long time. Disconnect the client + before it starts, and refresh proctitle so it's clear that it's + doing autoexpunging. We've also sent DISCONNECT to anvil already, + because this is background work and shouldn't really be counted + as an active POP3 session for the user. */ pop3_refresh_proctitle(); + mail_user_autoexpunge(client->user); mail_user_unref(&client->user); mail_storage_service_user_unref(&client->service_user);