]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
pop3: Do not expunge \Deleted mails without QUIT
authorAki Tuomi <aki.tuomi@dovecot.fi>
Wed, 5 Sep 2018 16:34:20 +0000 (19:34 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Fri, 25 Jan 2019 09:52:57 +0000 (11:52 +0200)
Prevents loss of email if connection
is unexpectedly terminated.

src/pop3/pop3-client.h
src/pop3/pop3-commands.c

index d2c6c0eda85e4d76707e810e682bbe49eeb0dd15..d1116cfa792801414e7aa506e5f03c6cc7e8f198 100644 (file)
@@ -103,6 +103,7 @@ struct client {
        unsigned int anvil_sent:1;
        unsigned int message_uidls_save:1;
        unsigned int delete_success:1;
+       unsigned int quit_seen:1;
 };
 
 struct pop3_module_register {
index f4375d512b6c7c48f32b30c30daaecc1e81aebd5..c09a85e414f67bdace76ddb81cc4dc7f33fc4340 100644 (file)
@@ -268,7 +268,7 @@ bool client_update_mails(struct client *client)
        mail_search_args_unref(&search_args);
 
        while (mailbox_search_next(ctx, &mail)) {
-               if (seq_range_exists(&deleted_msgs, mail->seq))
+               if (client->quit_seen && seq_range_exists(&deleted_msgs, mail->seq))
                        client_expunge(client, mail);
                else if (seq_range_exists(&seen_msgs, mail->seq))
                        mail_update_flags(mail, MODIFY_ADD, MAIL_SEEN);
@@ -282,6 +282,7 @@ bool client_update_mails(struct client *client)
 
 static int cmd_quit(struct client *client, const char *args ATTR_UNUSED)
 {
+       client->quit_seen = TRUE;
        if (client->deleted || client->seen_bitmask != NULL) {
                if (!client_update_mails(client)) {
                        client_send_storage_error(client);