#3966: IMAP delete unread message
--------------------+---------------------
Reporter: anton | Owner: brendan
Type: defect | Status: new
Priority: major | Milestone:
Component: IMAP | Version:
Keywords: |
--------------------+---------------------
Hi,
While invoking delete-message on a unread message and then syncing the
IMAP mailbox the message ends up being copied to the trash but not
deleted from my local cache until I issue a second sync. Running `mutt
-d5` reveals the following communication between the client and server:
{{{
Copying 1 messages to Trash...
4> a0018 UID STORE 90 +FLAGS.SILENT (\Seen)
a0019 UID COPY 90 "Trash"
4< * 6 FETCH (FLAGS (\Seen $X-ME-Annot-2) UID 90)
Handling FETCH
Message UID 90 updated
4< a0016 OK Completed
4< a0017 OK [COPYUID 1503661657 90 184] Completed
IMAP queue drained
}}}
I initially thought something was wrong with the IMAP-server since
according to RFC 3501:
> +FLAGS.SILENT <flag list>
> Equivalent to +FLAGS, but without returning a new value.
... but it also states:
> Note: Regardless of whether or not the ".SILENT" suffix was used, the
> server SHOULD send an untagged FETCH response if a change to a
> message's flags from an external source is observed.
After all this looks like a documented and valid behavior.
According to my understanding of the source code, the following is
triggering the behavior I'm seeing:
1. The unanticipated FETCH is handled by cmd_parse_fetch(). Since
`h->changed` is true (due to the deleted flag being set and yet not
synced) the IMAP context is flagged as IMAP_EXPUNGE_PENDING.
2. imap_sync_mailbox() will not end up deleting the message since
imap_check_mailbox() doesn't return 0 due to the
IMAP_EXPUNGE_PENDING flag being set.
3. Issuing a second sync will cause the message to be deleted since the
local flags are in sync with the server. But this will copy the
message to the trash again so I will end up with two copies of the
same message in the trash.
I've been tinkering with different approaches on how to solve this
issue. Here's a couple of insights and ideas:
1. Ignoring the unanticipated FETCH inside cmd_parse_fetch() if
`compare_flags() == 0` doesn't work since the local flags and server
flags differs.
2. Setting `h->active = 0` prior issuing the STORE/COPY IMAP-commands
will cause the unanticipated FETCH to be ignored similar to what's
done at the end of the imap_sync_mailbox(). With my limited knowledge
of the mutt source code I cant' deduce the implications of setting
active at an earlier stage.
3. Adding a flag ignore_fetch (just as an example) to the IMAP_DATA
structure
and setting it 1 prior issuing the STORE/COPY could inform
cmd_parse_fetch() that any FETCH should be ignored. Not the cleanest
solution since it adds more state handling.
Any thoughts and ideas on how to solve this would be much appreciated.
{{{
$ mutt -v
Mutt 1.9+10 (0e0a4b7e9dd1) (2017-09-02)
Copyright (C) 1996-2016 Michael R. Elkins and others.
Mutt comes with ABSOLUTELY NO WARRANTY; for details type `mutt -vv'.
Mutt is free software, and you are welcome to redistribute it
under certain conditions; type `mutt -vv' for details.
System: OpenBSD 6.2 (amd64)
ncurses: ncurses 5.7.20081102 (compiled with 5.7)
Compiler:
Reading specs from /usr/lib/gcc-lib/amd64-unknown-openbsd6.2/4.2.1/specs
Target: amd64-unknown-openbsd6.2
Configured with: OpenBSD/amd64 system compiler
Thread model: posix
gcc version 4.2.1 20070719
Configure options: '--enable-debug' '--enable-imap' '--enable-sidebar'
'--with-ssl' 'CFLAGS=-g'
Compilation CFLAGS: -Wall -pedantic -Wno-long-long -g
Compile options:
-DOMAIN
+DEBUG
-HOMESPOOL -USE_SETGID -USE_DOTLOCK -DL_STANDALONE +USE_FCNTL
-USE_FLOCK
-USE_POP +USE_IMAP -USE_SMTP
+USE_SSL_OPENSSL -USE_SSL_GNUTLS -USE_SASL -USE_GSS +HAVE_GETADDRINFO
+HAVE_REGCOMP -USE_GNU_REGEX
+HAVE_COLOR +HAVE_START_COLOR +HAVE_TYPEAHEAD +HAVE_BKGDSET
+HAVE_CURS_SET +HAVE_META +HAVE_RESIZETERM
+CRYPT_BACKEND_CLASSIC_PGP +CRYPT_BACKEND_CLASSIC_SMIME
-CRYPT_BACKEND_GPGME
-EXACT_ADDRESS -SUN_ATTACHMENT
+ENABLE_NLS -LOCALES_HACK +HAVE_WC_FUNCS +HAVE_LANGINFO_CODESET
+HAVE_LANGINFO_YESEXPR
-HAVE_ICONV -ICONV_NONTRANS -HAVE_LIBIDN +HAVE_GETSID -USE_HCACHE
+USE_SIDEBAR -USE_COMPRESSED
-ISPELL
SENDMAIL="/usr/sbin/sendmail"
MAILPATH="/var/mail"
PKGDATADIR="/usr/local/share/mutt"
SYSCONFDIR="/usr/local/etc"
EXECSHELL="/bin/sh"
-MIXMASTER
To contact the developers, please mail to <[email protected]>.
To report a bug, please visit http://bugs.mutt.org/.
}}}
--
Ticket URL: <https://dev.mutt.org/trac/ticket/3966>
Mutt <http://www.mutt.org/>
The Mutt mail user agent