fix: Always pass the correct sort timestamp to ChatId::set_protection() (#5088)

Before in some places it was correctly calculated by passing the "sent" timestamp to
`calc_sort_timestamp()`, but in other places just the system time was used. In some complex
scenarios like #5088 (restoration of a backup made before a contact verification) it led to wrong
sort timestamps of protection messages and also messages following by them.

But to reduce number of args passed to functions needing to calculate the sort timestamp, add
message timestamps to `struct MimeMessage` which is anyway passed everywhere.
This commit is contained in:
iequidoo
2023-12-07 21:32:30 -03:00
committed by iequidoo
parent 2a0a51bea0
commit fce3f80654
5 changed files with 128 additions and 73 deletions

View File

@@ -130,7 +130,9 @@ pub(super) async fn handle_contact_confirm(
// Note this goes to the 1:1 chat, as when joining a group we implicitly also
// verify both contacts (this could be a bug/security issue, see
// e.g. https://github.com/deltachat/deltachat-core-rust/issues/1177).
bobstate.notify_peer_verified(context).await?;
bobstate
.notify_peer_verified(context, message.timestamp_sent)
.await?;
bobstate.emit_progress(context, JoinerProgress::Succeeded);
Ok(retval)
}
@@ -220,7 +222,7 @@ impl BobState {
/// Notifies the user that the SecureJoin peer is verified.
///
/// This creates an info message in the chat being joined.
async fn notify_peer_verified(&self, context: &Context) -> Result<()> {
async fn notify_peer_verified(&self, context: &Context, timestamp: i64) -> Result<()> {
let contact = Contact::get_by_id(context, self.invite().contact_id()).await?;
let chat_id = self.joining_chat_id(context).await?;
@@ -232,7 +234,7 @@ impl BobState {
.set_protection(
context,
ProtectionStatus::Protected,
time(),
timestamp,
Some(contact.id),
)
.await?;