Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 15 additions & 12 deletions src/securejoin/bob.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,20 +123,23 @@ pub(super) async fn start_protocol(context: &Context, invite: QrInvite) -> Resul
}
}

let timestamp = smeared_time(context);
match invite {
QrInvite::Group { .. } => {
let joining_chat_id = joining_chat_id(context, &invite, private_chat_id).await?;
let joining_chat_id =
joining_chat_id(context, &invite, private_chat_id, timestamp).await?;
let msg = stock_str::secure_join_started(context, invite.contact_id()).await;
chat::add_info_msg(context, joining_chat_id, &msg, time()).await?;
chat::add_info_msg(context, joining_chat_id, &msg, timestamp).await?;
Ok(joining_chat_id)
}
QrInvite::Broadcast { .. } => {
let joining_chat_id = joining_chat_id(context, &invite, private_chat_id).await?;
let joining_chat_id =
joining_chat_id(context, &invite, private_chat_id, timestamp).await?;
// We created the broadcast channel already, now we need to add Alice to it.
if !is_contact_in_chat(context, joining_chat_id, invite.contact_id()).await? {
chat::add_to_chat_contacts_table(
context,
time(),
timestamp,
joining_chat_id,
&[invite.contact_id()],
)
Expand All @@ -148,28 +151,26 @@ pub(super) async fn start_protocol(context: &Context, invite: QrInvite) -> Resul
// use the generic `Establishing guaranteed end-to-end encryption, please wait…`
if !is_contact_in_chat(context, joining_chat_id, ContactId::SELF).await? {
let msg = stock_str::securejoin_wait(context).await;
chat::add_info_msg(context, joining_chat_id, &msg, time()).await?;
chat::add_info_msg(context, joining_chat_id, &msg, timestamp).await?;
}
Ok(joining_chat_id)
}
QrInvite::Contact { .. } => {
// For setup-contact the BobState already ensured the 1:1 chat exists because it
// uses it to send the handshake messages.
// Calculate the sort timestamp before checking the chat protection status so that if we
// race with its change, we don't add our message below the protection message.
// Use calc_sort_timestamp() to make sure that the new message is the last message in the chat.
let sort_to_bottom = true;
let (received, incoming) = (false, false);
let ts_sort = private_chat_id
.calc_sort_timestamp(context, 0, sort_to_bottom, received, incoming)
.await?;
let ts_start = time();
chat::add_info_msg_with_cmd(
context,
private_chat_id,
&stock_str::securejoin_wait(context).await,
SystemMessage::SecurejoinWait,
ts_sort,
Some(ts_start),
Some(timestamp),
None,
None,
None,
Expand Down Expand Up @@ -242,8 +243,9 @@ pub(super) async fn handle_auth_required(
// so only show it when joining a group and not for a 1:1 chat or broadcast channel.
let contact_id = invite.contact_id();
let msg = stock_str::secure_join_replies(context, contact_id).await;
let chat_id = joining_chat_id(context, &invite, chat_id).await?;
chat::add_info_msg(context, chat_id, &msg, time()).await?;
let timestamp = smeared_time(context);
let chat_id = joining_chat_id(context, &invite, chat_id, timestamp).await?;
chat::add_info_msg(context, chat_id, &msg, timestamp).await?;
}
}

Expand Down Expand Up @@ -368,6 +370,7 @@ async fn joining_chat_id(
context: &Context,
invite: &QrInvite,
alice_chat_id: ChatId,
timestamp: i64,
) -> Result<ChatId> {
match invite {
QrInvite::Contact { .. } => Ok(alice_chat_id),
Expand All @@ -391,7 +394,7 @@ async fn joining_chat_id(
name,
Blocked::Not,
None,
smeared_time(context),
timestamp,
)
.await?
}
Expand Down
2 changes: 1 addition & 1 deletion test-data/golden/test_broadcast_joining_golden_bob
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
InBroadcast#Chat#2002: My Channel [2 member(s)] Icon: e9b6c7a78aa2e4f415644f55a553e73.png
--------------------------------------------------------------------------------
Msg#2004: info (Contact#Contact#Info): Establishing guaranteed end-to-end encryption, please wait… [NOTICED][INFO]
Msg#2003: info (Contact#Contact#Info): Messages are end-to-end encrypted. [NOTICED][INFO]
Msg#2004: info (Contact#Contact#Info): Establishing guaranteed end-to-end encryption, please wait… [NOTICED][INFO]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this may regarded as weird.

first saying "Messages are e2ee" and then "establishing e2ee".

maybe the second one should read smth as "Establishing connection, please wait…" this also shorter

Copy link
Collaborator Author

@Hocuri Hocuri Nov 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree - and also, we don't really talk about "guaranteed end-to-end encryption" anymore, because all end-to-end encryption is guaranteed to last forever now

Edit: Actually, the wording in the UI previously was "Establishing end-to-end encryption, please wait...". Still, I think that "Establishing connection, please wait…" is better; one message talking about e2ee is enough

Msg#2007🔒: (Contact#Contact#2001): You joined the channel. [FRESH][INFO]
--------------------------------------------------------------------------------
2 changes: 1 addition & 1 deletion test-data/golden/test_sync_broadcast_bob
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
InBroadcast#Chat#2002: Channel [1 member(s)]
--------------------------------------------------------------------------------
Msg#2004: info (Contact#Contact#Info): Establishing guaranteed end-to-end encryption, please wait… [NOTICED][INFO]
Msg#2003: info (Contact#Contact#Info): Messages are end-to-end encrypted. [NOTICED][INFO]
Msg#2004: info (Contact#Contact#Info): Establishing guaranteed end-to-end encryption, please wait… [NOTICED][INFO]
Msg#2008🔒: (Contact#Contact#2001): You joined the channel. [FRESH][INFO]
Msg#2010🔒: (Contact#Contact#2001): hi [FRESH]
Msg#2011🔒: (Contact#Contact#2001): Member Me removed by alice@example.org. [FRESH][INFO]
Expand Down
2 changes: 1 addition & 1 deletion test-data/golden/two_group_securejoins
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Group#Chat#6002: Group [3 member(s)]
--------------------------------------------------------------------------------
Msg#6003: info (Contact#Contact#Info): Messages are end-to-end encrypted. [NOTICED][INFO]
Msg#6004: info (Contact#Contact#Info): alice@example.org invited you to join this group.

Waiting for the device of alice@example.org to reply… [NOTICED][INFO]
Msg#6006: info (Contact#Contact#Info): alice@example.org replied, waiting for being added to the group… [NOTICED][INFO]
Msg#6003: info (Contact#Contact#Info): Messages are end-to-end encrypted. [NOTICED][INFO]
Msg#6008🔒: (Contact#Contact#6001): Member Me added by alice@example.org. [FRESH][INFO]
--------------------------------------------------------------------------------
2 changes: 1 addition & 1 deletion test-data/golden/verified_chats_editor_reordering
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
Group#Chat#3002: Group [3 member(s)]
--------------------------------------------------------------------------------
Msg#3003: info (Contact#Contact#Info): Messages are end-to-end encrypted. [NOTICED][INFO]
Msg#3004: info (Contact#Contact#Info): alice@example.org invited you to join this group.

Waiting for the device of alice@example.org to reply… [NOTICED][INFO]
Msg#3006: info (Contact#Contact#Info): alice@example.org replied, waiting for being added to the group… [NOTICED][INFO]
Msg#3003: info (Contact#Contact#Info): Messages are end-to-end encrypted. [NOTICED][INFO]
Msg#3008🔒: (Contact#Contact#3002): [FRESH]
Msg#3009: info (Contact#Contact#Info): Member bob@example.net added. [NOTICED][INFO]
Msg#3010🔒: (Contact#Contact#3001): Member Me added by alice@example.org. [FRESH][INFO]
Expand Down
Loading