Skip to content

Conversation

@iequidoo
Copy link
Collaborator

@iequidoo iequidoo commented Nov 5, 2025

feat: imap: Don't prefetch Chat-Version; try to find out message encryption state instead

Instead, prefetch Secure-Join, Content-Type and Subject headers, try to find out if the message is encrypted, i.e.:

  • if its Content-Type is "multipart/encrypted"
  • or Subject is "..." or "[...]" as some MUAs use "multipart/mixed"; we can't only look at Subject
    as it's not mandatory;

and depending on this decide on the target folder.

Changed behavior: before, "Chat-Version"-containing messages were moved from INBOX to DeltaChat, now
such encrypted messages may remain in INBOX -- if there's no parent message or it's not
MessengerMessage. We can't unconditionally move encrypted messages because the account may be
shared with other software which doesn't and shouldn't look into DeltaChat.


feat: Do not copy Chat-Version header into outer part

Chat-Version is used sometimes by Sieve filters to move messages to DeltaChat folder:
https://github.com/mailcow/mailcow-dockerized/blob/37beed6ad93f259b97cad41877982bce95295629/data/conf/dovecot/global_sieve_before
This probably prevents notifications to MUAs that don't watch DeltaChat but watch INBOX.

There are however disadvantages to exposing Chat-Version:

  1. Spam filters may not like this header and it is difficult or impossible to tell if Chat-Version
    plays role in rejecting the message or delivering it into Spam folder. If there is no such header
    visible to the spam filter, this possibility can be ruled out.
  2. Replies to chat messages may have no Chat-Version but have to be moved anyway.
  3. The user may have no control over the Sieve filter, but it comes preconfigured in mailcow, so it
    is not possible to disable it on the client.

Thanks to @link2xt for providing this motivation.

@iequidoo iequidoo force-pushed the iequidoo/hide-chat-version branch from 0d76982 to 9f9beb2 Compare November 5, 2025 22:50
@iequidoo iequidoo marked this pull request as draft November 5, 2025 23:00
…yption state instead

Instead, prefetch Secure-Join, Content-Type and Subject headers, try to find out if the message is encrypted, i.e.:
- if its Content-Type is "multipart/encrypted"
- or Subject is "..." or "[...]" as some MUAs use "multipart/mixed"; we can't only look at Subject
  as it's not mandatory;
and depending on this decide on the target folder and whether the message should be
downloaded. There's no much sense in downloading unencrypted "Chat-Version"-containing messages if
`ShowEmails` is `Off` or `AcceptedContacts`, unencrypted Delta Chat messages should be considered as
usual emails, there's even the "New E-Mail" feature in UIs nowadays which sends such messages.

Changed behavior: before, "Chat-Version"-containing messages were moved from INBOX to DeltaChat, now
such encrypted messages may remain in INBOX -- if there's no parent message or it's not
`MessengerMessage`. Don't unconditionally move encrypted messages yet because the account may be
shared with other software which doesn't and shouldn't look into the DeltaChat folder.
There was a comment that group messages should always be downloaded to avoid inconsistent group
state, but this is solved by the group consistency algo nowadays in the sense that inconsistent
group state won't spread to other members if we send to the group. Moreover, encrypted messages are
now always downloaded, and unencrypted chat replies too, and as for ad-hoc groups,
`Config::ShowEmails` controls everything.
Before, only replies to chat messages were moved to the mvbox because we're removing Chat-Version
from outer headers, but there's no much sense in moving only replies and not moving original
messages and MDNs. Instead, move all encrypted messages. Users should be informed about this in UIs,
so if a user has another PGP-capable MUA, probably they should disable MvboxMove. Moreover, untying
this logic from References and In-Reply-To allows to remove them from outer headers too, the "Header
Protection for Cryptographically Protected Email" RFC even suggests such a behavior:
https://datatracker.ietf.org/doc/html/rfc9788#name-offering-more-ambitious-hea.
Chat-Version is used sometimes by Sieve filters to move messages to DeltaChat folder:
https://github.com/mailcow/mailcow-dockerized/blob/37beed6ad93f259b97cad41877982bce95295629/data/conf/dovecot/global_sieve_before
This probably prevents notifications to MUAs that don't watch DeltaChat but watch INBOX.

There are however disadvantages to exposing Chat-Version:
1. Spam filters may not like this header and it is difficult or impossible to tell if `Chat-Version`
   plays role in rejecting the message or delivering it into Spam folder. If there is no such header
   visible to the spam filter, this possibility can be ruled out.
2. Replies to chat messages may have no `Chat-Version` but have to be moved anyway.
3. The user may have no control over the Sieve filter, but it comes preconfigured in mailcow, so it
   is not possible to disable it on the client.

Thanks to link2xt for providing this motivation.
@iequidoo iequidoo force-pushed the iequidoo/hide-chat-version branch from 9f9beb2 to 9a58b69 Compare November 9, 2025 08:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants