xmpp: Allow <confirm/> in message with empty body

Adrien Destugues created

skip-changelog: bugfix for previous not yet released change

Change summary

xmpp/src/message/receive/chat.rs | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)

Detailed changes

xmpp/src/message/receive/chat.rs 🔗

@@ -20,14 +20,26 @@ pub async fn handle_message_chat(
 ) {
     let langs: Vec<&str> = agent.lang.iter().map(String::as_str).collect();
 
+    let confirm = message.extract_valid_payload::<Confirm>();
+    let is_muc_pm = message.extract_valid_payload::<MucUser>().is_some();
+
+    // First process events that do not require the message body
+    if !is_muc_pm && confirm.is_some() {
+        events.push(Event::AuthConfirm(
+            from.to_bare(),
+            confirm.unwrap(),
+            time_info,
+        ));
+        return;
+    }
+
+    // For other events, a message body is required, so stop here if there isn't one
     let Some((_lang, body)) = message.get_best_body_cloned(langs) else {
         debug!("Received normal/chat message without body:\n{:#?}", message);
         return;
     };
 
-    let is_muc_pm = message.extract_valid_payload::<MucUser>().is_some();
     let correction = message.extract_valid_payload::<Replace>();
-    let confirm = message.extract_valid_payload::<Confirm>();
 
     if is_muc_pm {
         if from.resource().is_none() {
@@ -58,8 +70,6 @@ pub async fn handle_message_chat(
         let event = if let Some(correction) = correction {
             // TODO: Check that correction is valid (only for last N minutes or last N messages)
             Event::ChatMessageCorrection(correction.id, from.to_bare(), body.clone(), time_info)
-        } else if let Some(confirm) = confirm {
-            Event::AuthConfirm(from.to_bare(), confirm, time_info)
         } else {
             Event::ChatMessage(message.id.clone(), from.to_bare(), body, time_info)
         };