fix: Set Param::GuaranteeE2ee before preparing message blob (#8090)

Otherwise `Param::GuaranteeE2ee` is set only after rendering the message and some UIs, e.g. DC
Android, display the message as unencrypted while preparing the blob and rendering and encrypting
the message. NB: DC Desktop doesn't display the message until `send_msg()` returns.
This commit is contained in:
iequidoo
2026-04-13 09:00:00 -03:00
parent ad7f873c68
commit 159f2e41ab
2 changed files with 16 additions and 2 deletions

View File

@@ -2628,7 +2628,7 @@ pub async fn send_msg(context: &Context, chat_id: ChatId, msg: &mut Message) ->
if msg.state != MessageState::Undefined && msg.state != MessageState::OutPreparing {
msg.param.remove(Param::GuaranteeE2ee);
msg.param.remove(Param::ForcePlaintext);
msg.update_param(context).await?;
// create_send_msg_jobs() will update `param` in the db.
}
// protect all system messages against RTLO attacks
@@ -2733,7 +2733,19 @@ async fn prepare_send_msg(
None
};
// ... then change the MessageState in the message object
if matches!(
msg.state,
MessageState::Undefined | MessageState::OutPreparing
)
// v2 SecureJoin "v*-request" messages are unencrypted.
&& msg.param.get_cmd() != SystemMessage::SecurejoinMessage
&& chat.is_encrypted(context).await?
{
msg.param.set_int(Param::GuaranteeE2ee, 1);
if !msg.id.is_unset() {
msg.update_param(context).await?;
}
}
msg.state = MessageState::OutPending;
msg.timestamp_sort = create_smeared_timestamp(context);

View File

@@ -1393,6 +1393,8 @@ pub enum MessageState {
/// For files which need time to be prepared before they can be
/// sent, the message enters this state before
/// OutPending.
///
/// Deprecated 2024-12-07.
OutPreparing = 18,
/// Message saved as draft.