Commit Graph

416 Commits

Author SHA1 Message Date
Floris Bruynooghe
785cc795e3 Resultify Contact::lookup_id_by_addr
Using a Contact ID as an error type is risky and a C leftover.
2021-01-27 21:42:05 +01:00
link2xt
564d681bca Try to extract group ID from In-Reply-To and References as a last resort
This should help if parent message can't be found because messages were
reordered or deleted.

This does not prevent group IDs from being removed from Message-IDs in
the future, in which case it will become dead code.
2021-01-26 03:00:13 +03:00
link2xt
c469798734 Assign classic replies to two-member groups to group chat
Previously it was assigned to 1:1 chat.

To keep "reply privately" working, old behavior is retained for chat messages.
2021-01-26 02:56:57 +03:00
Floris Bruynooghe
355e0145c0 Depend on anyhow directly
This removes the proxy via crate::error to depend on anyhow directly.
There is no benefit to this indirection and this makes it simpler to
see which error types are used.
2021-01-24 17:29:52 +03:00
link2xt
7b5a3a8346 Stop extracting group IDs from Message-IDs 2021-01-24 01:24:39 +03:00
link2xt
3d072a81b4 Assign replies to chats based on In-Reply-To and References 2021-01-24 01:24:39 +03:00
link2xt
3fe5eb31d4 Remove member list heuristic for ad-hoc groups
It is going to be replaced by simpler and more reliable
matching by the parent message.
2021-01-24 01:24:39 +03:00
link2xt
b938d5facd add_parts: call get_parent_message only once 2021-01-24 01:24:39 +03:00
bjoern
e9c582c4e4 forward html-messages properly (#2151)
* add failing tests for forwarding html-mails

* let MsgId.get_html() return an option

* write html-part to local database on forwarding

* add html-part to forwarded non-dc messages

* read HTML-parts from encrypted messages

* avoid clone()

* Received:-header is no longer needed since #2152

* Update src/html.rs

Co-authored-by: Floris Bruynooghe <flub@devork.be>

* Update src/html.rs

Co-authored-by: Floris Bruynooghe <flub@devork.be>

* Update src/mimeparser.rs

Co-authored-by: Floris Bruynooghe <flub@devork.be>

* prefer 'orig' over 'org' as abbreviation for 'original'

* improve comment on tests

* prefer 'try_into()' over 'as u32' to avoid panics on bad data

* simplify ffi

Co-authored-by: Floris Bruynooghe <flub@devork.be>
2021-01-23 23:21:18 +01:00
Hocuri
ccee289a5c Don't ignore incoming mails without Received-header
fix #2149
2021-01-17 18:17:19 +01:00
B. Petersen
e077ee9238 make clippy happy 2021-01-15 07:13:58 +03:00
B. Petersen
662735c233 word-encode group-name-changed if needed, use more meaningful names for the parameter 2021-01-15 07:13:58 +03:00
Hocuri
ebccdbbcb9 Improve onboarding by scanning all folders from time to time (#2067)
Start implementing #1994

TODO (in later PRs):

- Add a hint to the watch settings that all folders are fetched from time to time (to be done in the individual UIs)
- folder names are case-insensitive, so double-check that all comparisons are case-insensitive
- The `scan_folders.rs` file didn't get as large as I expected and it's probably not worth it having an extra file for it. But if there are no objections, I'll make another PR to rename it to `folders.rs` and also put into it `configure_folders()` from `imap/mod.rs` and `needs_move()` with all its tests from `message.rs`.

Done:

- Most mailboxes have a "Drafts" folder where constantly new emails appear but we don't actually want to show them, what do we do about this? The most reliable way to detect such messages that we found up to now is:
  If there is no `Received` header AND it's not in the `ConfiguredSentbox`, then ignore the email.
- before or after INBOX idle trigger a new "scan all folders for messages".  It does a "list folders" and then goes through all folders with select-statements, checking if "next-uid" was changed since checked last time.  This might be batchable but in any case should not consume a lot of traffic. We might debounce this scan activity to happen at most every N minutes 

- if next-uid changed for a folder, we "prefetch" and "fetch" DC-messages as as needed ("dc-messages" are not just those with "Chat-Version" headers, but can also be regular emails) 

- if we discover DC-messages in folders that have the "/Spam" flag (maybe excluding ContactRequests) we automatically move them to INBOX/DeltaChat folder to help  provider-spam-systems to regard this contact/mail as non-spam 

- for now, we do not change any user visible option, but introduce this "scan all" automatically and on top of what exists.   The DeltaChat folder-watching does not perform scan-all-folders (maybe with the exception to trigger scan-all also with DeltaChat if INBOX is not watched)

- Tests (except if you have ideas to improve them)
- all folders, their last uidvalidity, next-seen etc. are kept in a separate "imap-sync" sqlite table.  Maybe this can be used to streamline some of the "Sent" folder and "DeltaChat" folder detection code we already have. 

- We now also move self-sent messages from the Inbox to the Sent folder if `mvbox_move` is off, as this was very easy to do now. This way, we now behave more like a normal MUA if the user wants this.

FOR LATER PRs:

- maybe for the first 50 messages or so, we could reduce the IDLE-timeout (currently 23 minutes or so) to faster detect messages sent to non-inbox folders. However, on Android and iOS, we would likely trigger scan-all when the app moves to foreground, and so  it might not be neccessary to reduce the current idle-timeout at least for them.  We can leave this "faster discovery" question for the end, after we move to real-life testing. 

- (Later on, after the above works, we can consider heuristics on which folders to perform IDLE on, and remove the Watch-folder options (inbox, deltachat, sent). We tried to find a safe scheme for already doing it but failed to fine one, too many unknowns, also some questions regarding multi-device (you might have different settings with each of it, one moves, the other doesn't etc.) so we postponed this in favor of the above incremental suggestion.)




* Start implementing #1994

* Add debug logs, it seems like the SQL migration can go into another pr

* Let fetch_new_messages return whether there are new emails

* Code style

* Don't prefetch if there are no new emails

* clippy

* Even more debug logs

* If the folder was not newly selected, return always try to fetch as

uid_next is probably outdated

* Fix new bug

* Recognize spam folder

* if we discover DC-messages in folders that have the "/Spam" flag (excluding ContactRequests) we automatically move them to INBOX/DeltaChat folder to help provider-spam-systems to regard this contact/mail as non-spam

* Clippy, prioritize folder_meaning over folder_name_meaning

* Add a first test, for the first day after installation only debounce to 2s

* Start adding two tests (both of them fail)

* Don't abort folder scan if one folder fails

* More consts

* Replace bool return value by enum

* Split test up into multiple tests

* Print logs during rust tests

* Rust tests pass now

* .

* One of the Python tests passes now - reconfigure folders during scanning

* Make the last test pass - Delete emails in all folders when starting the test, not only inbox and mvbox

The problem had been that emails were left in the folder "xyz"

* lint

* DB migration (untested)

* Store uid_next in SQL instead of lastseen in a config

* Revert "If Inbox-watch is disabled and enabled again, do not fetch emails from in between"

all folders are always watched, anyway

* clippy, rm debug logs, comments

* Codestyle, comments

* fixing things again

* Fix another test: don't fetch from uid_next-1 but uid_next; make some {} to {:#} so that we can use `.context(...)`

* move self-sent, non-setupmessage chat messages to the Sent folder if `mvbox_move` is off

* comment

* Comments, make sure things work even if there is no uid_next

* Style

* Comments

* The rust test tested wrongly

* comments, small codestyle change

* Ignore emails that are probably only drafts

Most mailboxes have a "Drafts" folder where constantly new emails appear
but we don't actually want to show them.
So: If there is no Received header AND it's not in the ConfiguredSentbox,
then ignore the email.

Also: Add test.

* Fix occasional test failure, it was introduced as DC now moves messages from Inbox to Sent

* Add `Received` header to the rust tests

* After this PR we will always watch all folders and delete messages there if server_delete is enabled. So, for people who have server_delete on, disable it and add a hint to the devicechat

* comment, small fix

* link2xt's first review

* Use ON CONFLICT(FOLDER) DO to update and if it doesn't exist, then insert

Reason from link2xt: We had a problem with multiple peerstates inserted due to key fingerprint parsing error previously. With logic in Rust a similar problem can occur: an UPDATE can fail for reasons other than a conflict. PRIMARY KEY should ensure uniqueness in this case, but anyway.

* Remove two TODO statements, remove fetch_new_messages: ignoring uid {}, uid_next was {} log

* Next TODO: Make uidvalidity and uid_next DEFAULT 0

* rm two TODOs, Seems like we are not going to `exclude folders that are watched anyway` in this PR

* small tweak: Handle instants more carefully

* Add scan_all_folders_debounce_secs config for tests, set debounce to 60s (before it was just 2s during the first day)

* Don't use bold letters for the device message

* React to changes in the folders better

Before, if there was a configured Sent folder, but then it got
removed and replaced with another folder with a name meaning "Sent" but
without Sent flag, it would be ignored.

So, instead of checking against ConfiguredSentboxFolder,
create two Option variables at the beginning of the loop and replace
them with Some if it is None. At the end of the loop, store the new
values into ConfiguredSendboxFolder and ConfiguredSpamFolder, even if it
is None.

Also, derive some useful traits.

* move job: Return a meaningful error if server_folder is None instead of panicing

* small error-handling fix

* Fix test_fetch_existing() python test

Before, we sometimes got a race condition where scan_folders() sees that
there is a Sentbox and saves this info after we set the
ConfiguredSentbox to None and before the message is sent.

So, just expect that the message is moved to the sentbox.

* migration is 72 now

* rm 2 TODOs, Don't infinitely retry when dc_receive_imf() returns Err

* clippy: Remove glob imports

* Delete created folders at the beginning of tests

(some created folders made problems in the next tests because)

* Improve resetting accounts between tests
2021-01-13 14:09:51 +01:00
Alexander Krotov
5e8e77dfb6 clippy: forbid wildcard_imports 2021-01-12 12:06:13 +03:00
bjoern
e2688f6355 add option to access original message (#2125)
* draft API to deal with uncut message texts

* add column mime_modified

* add mime_modified flag to MimeParser and save it in the database

* save mime_headers also when mime_modified is set

* cargo fmt

* set mime_modified on parsed html-texts and when there are multiple alternative-parts; add test for that

* prototype functions, add to repl and ffi

* use correct mime_modified flag

* basically parse Mime-Structure to HTML

* add basic tests for HTML-parsing

* convert text/plain to html for getting original

* respect charset for plain texts

* make test more specific

* fix handling non-utf-8 charsets for plain messages

* add test for plain_to_html()

* add failing test for plaintext linkify

* linkify urls in plain text

* fix regex

* plain text linkify: add failing test for encapsulated links as <https://domain.com>

* plain text linkify: make encapsulated links as <https://domain.com> work

* plain text linkify: require word boundary at beginning of link, add tests for that

* plain text linkify: linkify emails

* plain text: support format=flowed

* plain text: support quotes

* make clippy happy

* set mime-modified also when simplify() cuts non-html messages, add tests for that

* streamline mime recursion

* repl tool: write original html to file for further processing

* convert cid:- to data:-protocol

* add a test for cid: to data: conversion

* make clippy happy

* fix html-tests to work with windows-lineends

* clarify what the returned html-code may contain

* add some more detailed doc comments

* add mime_modified column only if not exist

this additional check is needed
as the column may added with another dbversion in
some shipped beta-versions.

* incorporate documentation suggestions from review

* rename get_original_mime_html() to more simple get_html()

* rename api is_mime_modified() to more simple has_html(); internally, mime_modified-flag stays as-is, however

* rename MimeS to MimeMultipartType

* do not set mime-modified flag for encrypted messages that need extra-handling for saved mime-structure

* fix typo

* move get_msg_html() to MsgId.get_html()

* incorporate more documentation suggestions from review

* remove unused return value from collect_texts_recursive()

* avoid mime_modified being mutable in write-parts-loop

* move 'use futures::future::FutureExt' atop of html.rs

* move attributes defining plain-text to a dedicated structure

* more PlainText to separate file

* escape cid when building regex

* let dc_get_msg_html() return NULL when calling with bad param
2021-01-11 17:40:35 +01:00
Hocuri
d3aba4e817 Simplify if condition 2020-12-20 20:04:19 +01:00
Hocuri
53fed91a17 Fix marking read receipts as seen
If mvbox_move was on and an mdn was received, it was not marked as read.

Also remove a confusing log that said that we are adding a markseen job, even if we weren't. As job::save() logs itself, there is no need to log this again.
2020-12-20 20:04:19 +01:00
Hocuri
2b207e1375 rustfmt 2020-12-18 18:35:54 +01:00
Hocuri
4d2c2130e8 Replace all t.ctx with t
Not sure if that's the way to go because, you know, merge conflicts, but
we could do this now.
2020-12-18 18:35:54 +01:00
Hocuri
af8a6d7722 Create and use some test helper functions 2020-12-18 18:35:54 +01:00
Alexander Krotov
93e038e056 Ignore ephemeral timer changes if replying to old message
This should prevent timer changes back when someone is replying before
receiving timer change.
2020-12-06 21:09:13 +03:00
Alexander Krotov
30e7f84770 Add get_parent_message() 2020-12-06 21:09:13 +03:00
B. Petersen
07109e9b17 add passing test for simple-filename and failing test for continued-filename 2020-11-24 14:40:27 +01:00
B. Petersen
889f4673ad make loading eml reusable 2020-11-23 23:08:21 +01:00
B. Petersen
46833ca4f2 do not unarchive one-to-one on receiving read-receipts 2020-10-30 19:03:02 +01:00
B. Petersen
dbdea787a7 fix typo that results in a not-working test 2020-10-30 19:02:10 +01:00
Hocuri
31bf34890a Always show the cause for which a msg landed in trash 2020-10-25 17:42:26 +01:00
Hocuri
e6b7a7e292 saved-messages do not pop up in original chat in multi-device anymore
fix #2020

When forwarding a message, the original `in_reply_to` stays in place.
I did not find any recent commit that changed anything about this,
but IIRC there was a bug that prevented setting the `in_reply_to` at
all.

So, for chat messages, do not look at the InReplyTo header (and also not
at the References header)
2020-10-23 12:33:25 +03:00
B. Petersen
9bf8799484 fix processing of protection-changed messages
by #2001, processing of protection-enabled and protection-disabled
messages is only done if verification-checks pass.

unfortunately, these verification checks
were only applied on already protected chats,
so that enabling via a protection-enabled message was not possible.

this is fixed by this pr.
moreover, when inner_set_protection() fails,
the error is shown in the chat.
2020-10-19 13:03:56 +02:00
B. Petersen
e15372531e skip protection enabled/disabled messages where they did not appear in the past with verified-groups
this avoids confusion - as long the current core
does not communicate with a UI that enables/disables protection,
everything looks just the same as in the past :)
2020-10-19 13:02:24 +02:00
B. Petersen
78b44cb4d0 do not say a concrete user has enabled protection if we do not really know 2020-10-17 11:46:46 +02:00
B. Petersen
6ec743f8b1 make clippy happy 2020-10-15 16:29:21 +02:00
B. Petersen
010be693e1 check protected properties for all chats
before, checks were done for groups only.
moreover, apply protection-changes only when the check passes.
2020-10-15 16:04:43 +02:00
B. Petersen
d8a7a178c2 skip check for Chat-Verified on normal messages
this would exclude non-deltas from protected-chats
(where they could participate in verified-groups in the past)
and makes migration a bit harder when using a fuzzy multi-device-setup.

however, the test still takes place
when a group is created or protection is enabled/disabled.
2020-10-15 15:19:25 +02:00
B. Petersen
7f882a6406 less duplicate code on calling inner_set_protection() 2020-10-13 14:59:29 +02:00
B. Petersen
8425e23d82 move get_protection_msg() to stock.rs as stock_protection_msg() 2020-10-13 14:59:28 +02:00
B. Petersen
45dae1ff0c protect against attackers dropping the protect-this-chat message by not showing unprotected messages directly; this is done by checking the Chat-Verified flag on each incoming message. moreover, make sure, the flag is signed+encrypted (it must be read from the protected headers). 2020-10-13 14:59:27 +02:00
B. Petersen
e447bdc0c3 simplify code-path 2020-10-13 14:59:27 +02:00
B. Petersen
47f4f2bd08 use language of receiver for protection-messages, show correct sender 2020-10-13 14:59:26 +02:00
B. Petersen
12cf89735c handling incoming protection-changes messages, always add info-msg 2020-10-13 14:59:26 +02:00
B. Petersen
b8a55f3aa4 replace chat.is_verified() by chat.is_protected() 2020-10-13 14:59:25 +02:00
B. Petersen
ab8bf3c2f3 use ProtectionStatus to create chats 2020-10-13 14:59:25 +02:00
bjoern
d9a45eb931 Merge pull request #1981 from deltachat/notice-on-answer
basic DC_EVENT_MSGS_NOTICED multi-device-support
2020-10-12 17:58:32 +02:00
Hocuri
be88b946b6 Peek reipients, fetch existing messages
Read all of an e-mail accounts messages and extract all To/CC addresses
if the From was from our own account.
Then, fetch existing messages from the server and show them.

Also, I fixed two other things:
- just by chance my test failed because of an completely unrelated bug.
The bug: bcc_self messages were not marked as read if mvbox_move was set
to true.
- add some color to the test output (minor change)
2020-10-10 15:56:30 +03:00
B. Petersen
c2b222e6a5 emit DC_EVENT_MSGS_NOTICED when a chat was answered on another device 2020-10-10 12:50:23 +02:00
René Rössler
9739c0305b Accessible msg error and type changes 2020-10-08 11:51:04 +02:00
Alexander Krotov
332a387c98 Fix nightly clippy warnings 2020-09-19 17:49:32 +03:00
Floris Bruynooghe
2a254c51fa Remove the Bob::status field and BobStatus enum
This field is entirely unused.
2020-09-11 18:40:36 +02:00
Floris Bruynooghe
ee27c7d9d4 Run clippy on tests and examples 2020-09-05 18:13:16 +02:00
Alexander Krotov
8f290530fd Use enum type for Bob status 2020-08-30 15:03:43 +03:00