Commit Graph

13461 Commits

Author SHA1 Message Date
Benjamin Bouvier e158e8abc0 refactor(timeline): in thread permalinks, avoid back-paginating if the root event is part of the /context response
For thread permalinks, we start with a /context query that will load the
focused event, and maybe a few other in-thread events. In fact, it can
also include the thread root event, which was excluded before. Instead,
we would get a previous-token for back-paginations, which would be used
in /relations. When the request to /relations returns an empty previous
token, that means we've reached the start of the thread, and in this
case we would manually load the root with /event.

We can do better, if the root event is part of the initial /context
response: skip the back-paginations altogether, and make sure to include
the root event in `init_focus()`.
2025-09-25 10:21:19 +02:00
Damir Jelić e2ec8bcbd6 ci: Install clippy for the test-crypto CI run 2025-09-25 10:14:21 +02:00
Benjamin Bouvier 36e0d4bfb8 ci: don't compile the benchmarks in a separate CI step
They're built as part of the codspeed run these days, so this is
duplicated wasteful work.
2025-09-25 10:05:27 +02:00
Benjamin Bouvier 05362be89a ci: use the latest bnjbvr/cargo-machete action
It's much faster now as it downloads the latest version of the
precompiled binary from Github, and it will use the latest tagged
version of cargo-machete by default.
2025-09-25 10:05:27 +02:00
Ivan Enderlin 03fc5dacbe feat(ui): The recency sorter handles recency stamp _and_ latest event's timestamp.
This patch revisits a feature we have disabled a couple of days ago:
the `recency` sorter was initially only supporting the recency stamp,
then later the recency stamp _and_ the latest event's timestamp. It was
however buggy and we had to revert it. Now it's time to re-introduce it
but with a different approach.

The previous rules were:

1. if two rooms have a latest event, use their latest event's timestamps
   as their _scores,
2. if one of room has a latest event, use the recency stamp as their
   _scores_ for both rooms.

Rule 2 was buggy because one room was sometimes using its latest
event's timestamp, and sometimes its recency stamp, based on what it was
compared to. It was an error!

The new rules are the following:

1. unchanged
2. if one room has a latest event, use its latest event's timestamp as
   its _score_, and use no _score_ for the other room,
3. if two rooms have NO latest event, use the recency stamp as their
   _scores_.

It means that a room with no latest event will always be sorted _after_
a room with a latest event. It can feel cruel, but it should be an edge
case. When a room is synchronised, it should receive events, which
should trigger the computation of a latest event.

Note that this patch also renames _rank_ to _score_, as I consider it's
a better vocabulary. It could be confusing to use _rank_ as one can
expect all rooms to be indexed and get a rank, but it's not the case.
_Score_ sounds better.
2025-09-24 17:51:38 +02:00
Alexis Loiseau 0a0e31af83 feat(ui): add custom events to timeline when explicitly filtered
This allows custom message-like events (created by the `EventContent` macro from ruma) to be added to the timeline if they are explicitly allowed when building the timeline with a custom `event_filter`.

The custom event content is not available directly to the consumer, but it can still fetch it from the matrix-sdk client with its `event_id`, or display a "this type of event is not supported". 

Signed-off-by: Itess <me@aloiseau.com>

Fixes #5598.
2025-09-24 15:50:50 +00:00
Ivan Enderlin 290f27a343 doc(base): Update CHANGELOG.md. 2025-09-24 16:12:09 +02:00
Ivan Enderlin 0033de1f49 refactor(base): Rename sync_lock to state_store_lock.
This patch renames the `sync_lock` to `state_store_lock` because it is
what it is. It's not about the sync, it's about the state store.
2025-09-24 16:12:09 +02:00
Ivan Enderlin 688eb6880d refactor(sdk): Move the RoomLatestEvents* types in their own module.
This patch moves the `RoomLatestEvents*` types in their own new
`room_latest_events` module.
2025-09-24 14:26:14 +02:00
Ivan Enderlin 07704c7835 feat(sdk): Put locks around RoomLatestEvents.
This patch tries to solve a problem raised by Complement Crypto. In
`compute_latest_events`, in two places, `RegisteredRooms::rooms` was
locked with an exclusive write access. Then, during the updates of
the latest events (via `RoomLatestEvents::update_with_event_cache` and
`RoomLatestEvents::update_with_send_queue`), the state store lock is
acquired to update the state store. At the same time, in the sync, the
state store lock can **already** be taken to store the new updates, and
the function `subscribe_to_room_latest_events` is called, which waits
on the lock around `RegisteredRooms::rooms` to be available. We have a
dead lock:

- `compute_latest_events` waits on the state store lock while the lock
  on `RegisteredRooms::rooms` is taken with an exclusive access,
- the sync has acquired the state store lock while it waits on the lock
  on `RegisteredRooms::rooms`

This patch introduces a lock inside `RoomLatestEvents`. A new
`RoomLatestEventsState` type is introduced to be the lockable value. A
new `RoomLatestEvents::read()` and `RoomLatestEvents::write()` methods
are introduced to respectively return a `RoomLatestEventsReadGuard` and
a `RoomLatestEventsWriteGuard` type. The idea is to abstract a bit the
owned lock guard and to distribute the methods that were previously on
`RoomLatestEvents` in the new guard types, so that we keep the `&self`
and `&mut self` semantics, plus we take a lock for multiple operations.

The deadlock is fixed because of all the following reasons combined:

- only `RegisteredRooms::room_latest_event`,
  `RegisteredRooms::forget_room` and `RegisteredRooms::forget_thread`
  take a write lock over `RegisteredRooms::rooms`,
- `compute_latest_events` no longer takes a write lock over
  `RegisteredRoooms::rooms`, but it also has a short-lived lock:
  its read lock is dropped as soon as the **owned** write lock over
  `RoomLatestEvents` is taken.

Now, `subscribe_to_room_latest_events` can acquire a write lock over
`RegisteredRooms::rooms` while `compute_latest_events` is doing the
updates. If the state store lock is acquired here, it will just wait
its availability: the sync flow can finish and release the lock without
being blocked by `subscribe_to_room_latest_events`.
2025-09-24 14:26:14 +02:00
Ivan Enderlin 60c3b3dd43 chore(base): Scope the lock guard to a block.
This patch ensures that the state store lock guard (`_sync_lock`) is
scoped to a block so that it cannot live too long.
2025-09-24 14:26:14 +02:00
Ivan Enderlin d00cfb0ba8 fix(base): Take the state store lock before updating it.
This patch updates
`BaseClient::receive_sync_response_with_requested_required_states` to
take the state store lock before applying any change onto it.
2025-09-24 14:26:14 +02:00
Ivan Enderlin f7e1866bda feat(sdk,ui): Automatically subscribe to LatestEvents if EventCache has subscribed. 2025-09-24 14:26:14 +02:00
Ivan Enderlin b316c534ea feat(sdk): Call LatestEvents::listen_to_room for rooms in sync response.
This patch updates `SlidingSyncResponseProcessor::handle_room_response`
to automatically call `LatestEvents::listen_to_room` based on
`http::Response`'s `rooms`.

Why? Because when a sync is received, we want its `LatestEventValue`
to be computed, so that it can trigger a `RoomInfoNotableUpdate`,
which will update the `RoomList`, which will re-sort the
rooms. So far, `LatestEvents::listen_to_room` was called by
`RoomListService::subscribe_to_rooms`, but it's possible to receive a
room update via the sync for a room that is not subscribed, i.e. out
of the viewport of the room list in Matrix clients (it's recommended
to subscribe to rooms that “enter” the viewport). Without this
patch, rooms are receiving updates but the room list is not entirely
refreshed/recalculated.
2025-09-24 14:26:14 +02:00
multi prise fa7fd5df42 Remove unusual import 2025-09-24 12:35:17 +02:00
multi prise adc8276162 Add key opening logic to the media store 2025-09-24 12:35:17 +02:00
multi prise abecb33e34 Lint code 2025-09-24 12:35:17 +02:00
multi prise b26ce417f0 Add comments documenting the new structure 2025-09-24 12:35:17 +02:00
multi prise 5a1bd54bb1 Implement use of Zeroizing struct for string 2025-09-24 12:35:17 +02:00
multi prise 0d0e2aa472 Add ZeroiseOnDrop trait to secret and make the key a Box 2025-09-24 12:35:17 +02:00
multi prise 88ed0afcb3 Replace missing line 2025-09-24 12:35:17 +02:00
multi prise 9938ab8b1f Reimplement previous tests for the store and on top of the one testing the opening with a key 2025-09-24 12:35:17 +02:00
multi prise eed7384934 Remove some superfluous change 2025-09-24 12:35:17 +02:00
multi prise 32255cd178 Update changelog 2025-09-24 12:35:17 +02:00
multi prise c51536a054 reformat 2025-09-24 12:35:17 +02:00
multi prise 6099928b40 Remove conditional logic for running tests 2025-09-24 12:35:17 +02:00
multi prise fac1f295b2 Correct wrong borrow 2025-09-24 12:35:17 +02:00
multi prise 24d02a72e3 implement zeroizing of secrets after use 2025-09-24 12:35:17 +02:00
multi prise 2a073043fd Revert "Use of lifetime in order to not clone/copy the data"
This reverts commit 009ee3a0e5fdff1332aaf0b1e62ab2577d728b82.
2025-09-24 12:35:17 +02:00
multi prise c5b35209b3 Revert "Update matrix-sdk with new lifetimes"
This reverts commit 3a8f5f110cd755158e3a5605a282556da6060417.
2025-09-24 12:35:17 +02:00
multi prise 8e759befd3 Refactorize tests config to correspond with the new api 2025-09-24 12:35:17 +02:00
multi prise 9faffa5b10 Temporary comment insecure function 2025-09-24 12:35:17 +02:00
multi prise 31200357a0 Update matrix-sdk with new lifetimes 2025-09-24 12:35:17 +02:00
multi prise 75b8c9fe93 Use of lifetime in order to not clone/copy the data 2025-09-24 12:35:17 +02:00
multi prise 004d98230c Uncomment the config directives and allows test to run faster by usinf an insecure export function 2025-09-24 12:35:17 +02:00
multi prise eb37a0d2e1 Update some expect text to make sure they reflect the use of secret instead of a only a key to encrypt a store 2025-09-24 12:35:17 +02:00
multi prise 8a0e61e95b correct comment on the state store file 2025-09-24 12:35:17 +02:00
multi prise a2e2765298 correct comment on the crypto store file 2025-09-24 12:35:17 +02:00
multi prise 6e1e0981b1 remove typo 2025-09-24 12:35:17 +02:00
multi prise b2120a8f3d Update changelog to represent changes 2025-09-24 12:35:17 +02:00
multi prise 5d169ae765 Comment the use 2025-09-24 12:35:17 +02:00
multi prise 34dd7ea3cd Revert get_or_create_store_cypher to use 2025-09-24 12:35:17 +02:00
multi prise 4930c589a8 Refactorize SqliteStoreConfig::key and SqliteStoreConfig::passphrase method 2025-09-24 12:35:17 +02:00
multi prise f6d2e73cab More reformarting of files 2025-09-24 12:35:17 +02:00
multi prise 2bd5ec30d1 Correct some tests 2025-09-24 12:35:17 +02:00
multi prise 425b502977 Format files 2025-09-24 12:35:17 +02:00
multi prise 0dfecd78d6 Updated the store encryption to use a enum Secret instead of passphrase 2025-09-24 12:35:17 +02:00
multi prise 4754ac2cbf Updated changelog 2025-09-24 12:35:17 +02:00
multi prise 72bb452b5b Remove all passphrase mention 2025-09-24 12:35:17 +02:00
multi prise c17dbf9ebe Replace the passphrase logic with a key logic in the implementation of encrypted store 2025-09-24 12:35:17 +02:00