Skip to content

Commit

Permalink
lib-storage: Replace MAIL_STORAGE_SERVICE_FLAG_AUTOEXPUNGE with expli…
Browse files Browse the repository at this point in the history
…cit 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.
  • Loading branch information
sirainen committed Mar 27, 2017
1 parent b551e46 commit 70d0076
Show file tree
Hide file tree
Showing 10 changed files with 25 additions and 22 deletions.
10 changes: 7 additions & 3 deletions src/imap/imap-client.c
Expand Up @@ -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"
Expand Down Expand Up @@ -453,10 +454,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
Expand Down
3 changes: 1 addition & 2 deletions src/imap/main.c
Expand Up @@ -374,8 +374,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;

Expand Down
2 changes: 0 additions & 2 deletions src/lib-storage/mail-storage-service.c
Expand Up @@ -678,8 +678,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);

Expand Down
2 changes: 0 additions & 2 deletions src/lib-storage/mail-storage-service.h
Expand Up @@ -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 {
Expand Down
3 changes: 0 additions & 3 deletions src/lib-storage/mail-user.c
Expand Up @@ -189,9 +189,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
Expand Down
2 changes: 0 additions & 2 deletions src/lib-storage/mail-user.h
Expand Up @@ -95,8 +95,6 @@ struct mail_user {
unsigned int admin:1;
/* Enable all statistics gathering */
unsigned int stats_enabled:1;
/* Enable autoexpunging at deinit. */
unsigned int autoexpunge_enabled:1;
/* This session was restored (e.g. IMAP unhibernation) */
unsigned int session_restored:1;
};
Expand Down
11 changes: 8 additions & 3 deletions src/lmtp/commands.c
Expand Up @@ -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"
Expand Down Expand Up @@ -945,8 +946,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;
}
Expand Down Expand Up @@ -1034,9 +1037,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;
Expand Down Expand Up @@ -1065,6 +1069,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);
}

Expand Down
3 changes: 1 addition & 2 deletions src/lmtp/main.c
Expand Up @@ -88,8 +88,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;
int c;

if (IS_STANDALONE()) {
Expand Down
3 changes: 1 addition & 2 deletions src/pop3/main.c
Expand Up @@ -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;

Expand Down
8 changes: 7 additions & 1 deletion src/pop3/pop3-client.c
Expand Up @@ -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"
Expand Down Expand Up @@ -648,8 +649,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);

Expand Down

0 comments on commit 70d0076

Please sign in to comment.