diff libervia/backend/core/xmpp.py @ 4375:42becd4b819f

core (xmpp): add `origin` and `origin_label` to message data: If a message comes from a gateway, its type is used as `origin` in `extra`, and it has a name, it's used as `origin_label`. `is-bot` is also set when the sending entity is advertised as a bot. rel 459
author Goffi <goffi@goffi.org>
date Sun, 08 Jun 2025 17:16:56 +0200
parents 90d476a80ce9
children
line wrap: on
line diff
--- a/libervia/backend/core/xmpp.py	Fri Jun 06 10:45:54 2025 +0200
+++ b/libervia/backend/core/xmpp.py	Sun Jun 08 17:16:56 2025 +0200
@@ -24,7 +24,7 @@
 from pathlib import Path
 import sys
 import time
-from typing import Callable, Dict, Tuple, Optional
+from typing import Callable, Dict, Tuple, Optional, cast
 from urllib.parse import unquote, urlparse
 import uuid
 
@@ -1316,7 +1316,7 @@
         for child in elt.elements():
             self.normalize_ns(child, namespace)
 
-    def parse_message(self, message_elt: domish.Element) -> MessageData:
+    async def parse_message(self, message_elt: domish.Element) -> MessageData:
         """Parse a message XML and return message_data
 
         @param message_elt(domish.Element): raw <message> xml
@@ -1346,16 +1346,19 @@
                 )
             )
 
-        client = self.parent
+        client = cast(SatXMPPEntity, self.parent)
+        assert client is not None
 
         if not message_elt.hasAttribute("to"):
             message_elt["to"] = client.jid.full()
 
+        from_jid = jid.JID(message_elt["from"])
+        from_jid_bare = from_jid.userhostJID()
         message = {}
         subject = {}
         extra = {}
         data = MessageData({
-            "from": jid.JID(message_elt["from"]),
+            "from": from_jid,
             "to": jid.JID(message_elt["to"]),
             "uid": message_elt.getAttribute(
                 "uid", str(uuid.uuid4())
@@ -1373,6 +1376,23 @@
         else:
             client.mess_id2uid[(data["from"], message_id)] = data["uid"]
 
+        # origin
+        if not from_jid_bare in (client.jid.userhostJID(), client.server_jid):
+            disco_infos = await self.host.memory.disco.get_infos(client, from_jid_bare)
+            if from_jid_bare.user:
+                domain_disco_infos = await self.host.memory.disco.get_infos(
+                    client, jid.JID(from_jid_bare.host)
+                )
+            else:
+                domain_disco_infos = disco_infos
+            if ("client", "bot") in disco_infos.identities:
+                extra["is-bot"] = True
+            for (category, type_), label in domain_disco_infos.identities.items():
+                if category == "gateway":
+                    extra["origin"] = type_
+                if label:
+                    extra["origin_name"] = label
+
         # message
         for e in message_elt.elements(C.NS_CLIENT, "body"):
             message[e.getAttribute((C.NS_XML, "lang"), "")] = str(e)
@@ -1480,7 +1500,7 @@
             return
 
         try:
-            data = self.parse_message(message_elt)
+            data = await self.parse_message(message_elt)
             # we now do all post treatments added by plugins
             post_treat.callback(data)
             await post_treat