]> 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>
Tue, 13 Nov 2018 10:59:48 +0000 (12:59 +0200)
Prevents loss of email if connection
is unexpectedly terminated.

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

index a785ef4638affce094d1418b92cf422345c6f751..51af0793ceeae29986c2fd824abe97734038e711 100644 (file)
@@ -103,6 +103,7 @@ struct client {
        bool anvil_sent:1;
        bool message_uidls_save:1;
        bool delete_success:1;
+       bool quit_seen:1;
 };
 
 struct pop3_module_register {
index 2dbdec55214ad73acdeb8821a818387506b6bceb..dcbced35897dd316ae7123c4f695aa0e58bd6a98 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);