Commit Graph

10604 Commits

Author SHA1 Message Date
holger krekel
ea3ca3a213 fix: reliably complete configuration with progress=1000 or progress=0
this is meant to help configuration event consumers (Python, UIs)
to not hang waiting for configuration outcomes.
One test case is added that fails on main.
2026-08-24 19:09:34 +02:00
link2xt
6c47e86380 refactor: turn DC_MSG_ID_* into MsgId::* associated constants 2026-08-22 20:21:20 +00:00
link2xt
fe25e93d6c refactor: turn DC_CHAT_ID_* into ChatId::* associated constants
We already have it done for ContactId.
2026-08-22 20:21:20 +00:00
link2xt
0b2ff5d0e2 fix: take timestamp_rcvd into account in estimate_deletion_cnt
This did not affect actual message deletion,
because select_expired_messages already takes timestamp_rcvd
into account and does not delete system messages
that say "Messages are end-to-end encrypted" too early.

So it is a minor bug as estimate_deletion_cnt
is meant to only roughly estimate the number of messages
to be deleted. Still, there were no tests before,
so now estimate_deletion_cnt is tested.
2026-08-22 20:21:20 +00:00
WofWca
48888898ee docs(json-rpc): clarify when reactions is None
Initially I thought that this is only `null`
when reactions are somehow not applicable to this message.
2026-08-22 20:58:09 +04:00
holger krekel
c9880d0ba6 chore: start checking column documentation in CI and add comment for "transports.add_timestamp" 2026-08-22 18:07:16 +02:00
link2xt
d2286254b3 ci: update Rust to 1.98.0 2026-08-22 12:52:12 +00:00
j-g00da
589a628cda refactor: Don't store email address in location KML. (#8615)
Address inside the KML is not used anywhere,
and we are moving away from "primary" relay notation (and thus also
identifying contacts by email address).

Part of: #8572

Signed-off-by: Jagoda Ślązak <jslazak@jslazak.com>
2026-08-21 13:46:29 +02:00
link2xt
3df1e3712a fix: send legacy securejoin key requests as multipart/mixed
chatmail relays (filtermail) expect {vc,vg}-request
messages to be multipart/mixed with a single part.
Messages had this structure
before commit e0494b0b37
so we need to keep it for compatibility.
2026-08-20 20:31:27 +00:00
link2xt
f09f8fd8a4 docs: always suggest using --locked with "cargo install"
Otherwise the lockfile is completely ignored
as <https://doc.rust-lang.org/cargo/commands/cargo-install.html#dealing-with-the-lockfile>
says "By default, the Cargo.lock file that is included with the package will be ignored."

Mostly a reaction to <https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/>
2026-08-20 16:00:15 +00:00
link2xt
357c6e74d5 build: use --locked in scripts/clippy.sh
This is mostly a reaction in response to
https://blog.rust-lang.org/2026/08/20/supply-chain-attack-on-arrayref/

I don't know when exactly
`cargo clippy` and similar commands (check, build, run etc.)
may update dependencies
and it does not look like they actively pull
the package index and update yanked crates.
We also keep the lockfile updated all the time
by checking in CI.

Still, all commands better use --locked as a precaution.
2026-08-20 14:52:32 +00:00
j-g00da
484d56f24d feat: Use display name for contacts in encryption info (#8609)
Email address is already present in the list of relays,
a display name is more useful.

Signed-off-by: Jagoda Ślązak <jslazak@jslazak.com>
2026-08-20 08:00:30 +02:00
holger krekel
8f3337d971 refactor: move pgp tests to submodule 2026-08-19 02:00:14 +02:00
j-g00da
1283b986df feat: carry all published relay addresses in securejoin links (#8591)
Carry all published "secondary" addresses in `r` param of the securejoin URL.

Closes: #8590
Signed-off-by: Jagoda Ślązak <jslazak@jslazak.com>
2026-08-18 19:19:54 +00:00
j-g00da
33b258302b fix: RUSTSEC-2026-0258 (#8603)
https://rustsec.org/advisories/RUSTSEC-2026-0258

Signed-off-by: Jagoda Ślązak <jslazak@jslazak.com>
2026-08-18 11:29:56 +00:00
holger krekel
307ff9def1 fix(rpc): avoid hang when requests race a dying rpc-server
Requests now register before testing for shutdown,
so either the reader loop or the caller answers them.
Also failed start() winds down its threads, ignoring a broken pipe on stdin.
2026-08-17 21:07:19 +02:00
holger krekel
0119db85ad test!: rename rpc fixtures to disambiguate from ffi fixtures
fixes https://github.com/chatmail/core/issues/8583
2026-08-14 16:44:50 +02:00
Hocuri
b1c3615431 chore: Add script to show the sizes of futures (async Rust) (#8536)
Add the script from
https://github.com/chatmail/core/pull/8345/changes#r3696015000 with a
few small tweaks

TODO: Add to readme
2026-08-14 14:09:10 +02:00
link2xt
aa95d87568 chore: bump version to 2.60.0-dev 2026-08-14 12:02:17 +00:00
biørn
07e18c64af sanitize version_string we got from the wire (#8582)
`version_string` is meant to be displayed by UI, and comes from the
wire.

therefore, as a general precaution, ensure a string that is
regarded as a typical version string. all versions in scope are
currently v123.456.789-shortsuffix, where suffix is a-z and mostly
unused in production. that is the base. we can adapt if there is really
a need, but not for theoretical version strings. as we do not stop
processing, things are not bad even if we missed a valid usecase herr.

moreover, if `version_string` is empty, we skip the candidate - as we
cannot display something useful to the user. that little bit of care is
expected from relays :)
2026-08-14 12:01:15 +00:00
link2xt
e322fdf157 chore(release): prepare for 2.59.0 v2.59.0 2026-08-14 11:59:48 +00:00
link2xt
3dce06b02b refactor(mimefactory): add Encryption enum
This replaces independent data structures
which allowed invalid state of having both the public keys
and the shared secret, or having a shared secret
but not encrypting the message because encryption_pubkeys
was None instead of Some(Vec::new()).
2026-08-14 11:32:33 +00:00
link2xt
40faf829d3 feat: stop creating info messages for old broadcast lists
Creating QR code or sending a message will still fail
with a shorter error, but no info message will be created anymore.
Most users should have migrated the channels by recreating them by now.

This change is needed for moving loading of the shared secret
to earlier stages of message preparation,
otherwise mimefactory will have to create these info messages
when loading the message into memory.
2026-08-14 11:32:33 +00:00
WofWca
fbbe56c8ff refactor: rename _ex() -> _ext()
"ex" means "used to be, but no longer is".
"ext" means "extended", which is the intended meaning.
"Ext" is more common not only in the Rust ecosystem but in general.
We already had several people (myself included) asking
what "ex" is supposed to mean.

To reproduce this commit, search and replace `_ex(?!\w)` -> `_ext`.
But don't change `list_transports_ex` because it's public API.
2026-08-14 14:40:43 +04:00
holger krekel
ce7c8dbca1 fix: send http requests in origin not absolute form
Absolute form is meant for proxies and for example
nginx rejects it with 400 if the host contains an underscore, breaking autoconfig discovery.
2026-08-14 12:09:24 +02:00
holger krekel
0f8c91570b feat: allow to run the test suite against underscore-domain relays
Such relays serve self-signed certificates, and are created e.g. by cmlxc deploys.
2026-08-14 12:09:24 +02:00
holger krekel
feb777f704 test: load test data through the data fixture
Relative paths only worked when running from `deltachat-rpc-client`.
2026-08-14 12:09:24 +02:00
holger krekel
28a1a1da96 chore: don't swallow but log errors in three places
helps with debugging failing (flaky) tests
2026-08-14 12:04:43 +02:00
holger krekel
7add59fa76 test: abort early if DNS to chatmail domain does not work and nicer pytest startup header 2026-08-14 11:19:12 +02:00
link2xt
e0494b0b37 feat: remove hidden headers
Unencrypted messages are no longer sent as multipart/mixed
with Message-ID header duplicated inside.
This was useful as non-standard protection
against servers that rewrite the Message-ID,
but now most messages are sent encrypted
and for them standard RFC 9788 header protection
works the same way.
2026-08-14 07:09:49 +00:00
biørn
412ed15b8b deprecate dc_chat_get_info_json() (#8580)
it is outdated and incomplete, and always was experimental.

it is not in use in any UI but to get the name of the chat in Ubuntu
Touch, i created an issue for that at
https://codeberg.org/lk108/deltatouch/issues/305

moreover it is used for python bindings as get_summary(), not sure how
much that is in use,
we can leave the API for that for now, but we should not encourage
further usage of the API

---------

Co-authored-by: adb <adb@merlinux.eu>
2026-08-13 16:56:32 +00:00
biørn
c1e961d37f feat: client version information (#8557)
> we aim to inform about updates for installations outside of any
appstore soon.
>
> there is already a PR on android at
https://github.com/deltachat/deltachat-android/pull/4582, however, the
information about "update available" is a mockup there.
>
> in general, there are 3 ideas around about how to gather the "update
available" infomation - (1) checking a central url, (2) let contacts
provide information, (3) let relay provide information. on various
one-to-one discussions, outcome is that (3) is the most reasonable way
to go.

this PR is about reading update information via IMAP metadata from the
relay.

it is up to the UI to call `get_app_version()` at a reasonable time and
frequency, see comment in the code. when called, `get_app_version()`
iterates over all known profiles and relays and checks for version
information, returning the newest for the given scope.

we do not use an event, as that is tricky wrt changes - we do not know
if other relays report later a newer version. we also do not cache
anything, to prevent bad relays avoiding us to update permanently. also
it is easier :)

<details>
<summary>outdated notes and questions</summary>

- ~~it is up to the clients to get the needed information, we could let
core filter, but it seems easy enough the other way round, and may have
debug advantages, one can iterate etc.~~ EDIT: we now filter in core,
this also makes the jsonrpc part easier, see review comments

- when is IMAP METADATA actually read? when are they ready? is that
really the correct place? i am up to change that, but beware, this is
not really my expertise, so someone else may need to take over :)
EDIT: see below, IMAP METADATA is read on connection, before fetching
starts, usually fast enough

- relay part is missing. once the format is settled and discussed
shortly here, that should be done soon as well. but this is definitely
not my expertise and needed to be done by someone else :)

- key for IMAP METADATA is `/shared/vendor/deltachat/appversions` -
shall we continue use `deltachat` for compatibility or so? `chatmail`
seems to be more correct
EDIT: we stay with the current
</details>

relay counterpart issue: https://github.com/chatmail/relay/issues/1037

cc @link2xt @Hocuri @hpk42

---------

Co-authored-by: holger krekel <holger@merlinux.eu>
2026-08-13 16:45:58 +02:00
Jagoda Estera Ślązak
1edbfa1024 refactor: Merge msg_group_left_local into msg_del_member_local (#8575)
Follow-up to #8562

Signed-off-by: Jagoda Ślązak <jslazak@jslazak.com>
2026-08-13 14:08:27 +02:00
holger krekel
56a99c227a test: add a CI-failing check that documented sql schema matches real one
finds things like "exists in the db, but is not documented" or "documented but not in the db".
2026-08-13 12:07:15 +00:00
link2xt
31c37848ec docs: add SQL schema documentation
There is currently no place to document up to date SQL schema.
New database is initialized with src/sql/tables.sql
and then updated by migrations,
So tracking down how some column is used requires grepping the code,
looking for a migration adding it and corresponding commits.

Co-Authored-By: biørn <r10s@b44t.com>
2026-08-13 12:07:15 +00:00
link2xt
ec4d195814 fix: send MDNs to self even if MDNs are disabled
MDNs to self are used for seen status synhronization between devices.
2026-08-13 11:36:50 +00:00
dependabot[bot]
1a959c392b chore(cargo): bump bytes from 1.12.0 to 1.12.1
Bumps [bytes](https://github.com/tokio-rs/bytes) from 1.12.0 to 1.12.1.
- [Release notes](https://github.com/tokio-rs/bytes/releases)
- [Changelog](https://github.com/tokio-rs/bytes/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tokio-rs/bytes/compare/v1.12.0...v1.12.1)

---
updated-dependencies:
- dependency-name: bytes
  dependency-version: 1.12.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-12 23:57:06 +00:00
dependabot[bot]
e94e33f59a chore(cargo): bump astral-tokio-tar from 0.6.3 to 0.6.4
Bumps [astral-tokio-tar](https://github.com/astral-sh/tokio-tar) from 0.6.3 to 0.6.4.
- [Release notes](https://github.com/astral-sh/tokio-tar/releases)
- [Changelog](https://github.com/astral-sh/tokio-tar/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/tokio-tar/compare/v0.6.3...v0.6.4)

---
updated-dependencies:
- dependency-name: astral-tokio-tar
  dependency-version: 0.6.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-08-12 23:17:43 +00:00
link2xt
e2b0eb1fb9 chore: fix nightly clippy warnings 2026-08-12 20:56:33 +00:00
holger krekel
3363f63316 test: remove all cache-related logic in the FFI pytest plugin 2026-08-12 22:04:15 +02:00
holger krekel
6beced4f51 test: avoid another source of random failures with direct_imap failing to connect on first try
also core src/imap.rs retries connecting (2s with backoff) but direct_imap is only used in (CI) tests
and we can just keep trying every second until pytest timeout hits.
2026-08-12 22:04:15 +02:00
holger krekel
cc229372e4 test: provide complete test isolation by not re-using account addresses
As we are using a dedicated CI relay instance, we don't need to be careful with creating test addresses.
But re-using test addresses in a test running in a single worker can leak events/messages which compromises test isolation.
Instead of encountering random flaky tests because let's just not cache addresses to maximize test isolation.
2026-08-12 22:04:15 +02:00
link2xt
292bd9f58d docs: do not talk about verified chats in securejoin QR-scanning functions
The chat is always going to be encrypted, this is enough.
We actually do mark the contact as verified,
but the meaning of this verification is unclear
and we don't even display it visibly in the chat anymore.
2026-08-12 19:28:32 +00:00
link2xt
998892395a docs: do not refer to is_chat_protected()
is_chat_protected() does not exist anymore.
2026-08-12 19:28:32 +00:00
link2xt
9f5fbcdcae api!: remove deprecated dc_chat_is_protected() 2026-08-12 19:28:32 +00:00
link2xt
d89a972a2c refactor: stop setting chats.protected column explicitly
It is not used anymore and has a default value of 0.
2026-08-12 19:28:32 +00:00
link2xt
ae5b27fb69 refactor: remove MessengerMessage
This value is not used for any logic
except the disappearing messages timer rollback prevention.
It is unlikely that non-chat clients
participate in chats with disappearing messages,
and the case was not tested anyway.
2026-08-12 07:44:38 +00:00
WofWca
1a41e42bda docs(json-rpc): improve reactions_by_contact doc
Sync `reactions_by_contact` with the "backend" struct docs.

Follow-up to bd846c6e43
(https://github.com/chatmail/core/pull/8450).
2026-08-12 01:03:38 +04:00
B. Petersen
c680432c23 fix: filtered reactions are info, not error in device chat
bail!() bubbles up the error until it lands in the device chat,
which is way over the top for a reaction that is filtered out by channel owner.

currently this happens, as arcance chat uses different default reactions.
in the future, this may happen even more often when we allow custom filters,
that may change over time.
2026-08-11 21:49:38 +02:00
Jagoda Estera Ślązak
4623d89528 feat: Add stock strings for being added/removed from group (#8562)
Adds following stock strings:
- You were removed by %1$s.
- You were added by %1$s.

and implicit equivalents:
- You were removed.
- You were added.

Closes: #8419

Signed-off-by: Jagoda Ślązak <jslazak@jslazak.com>
2026-08-11 18:47:30 +00:00