diff sat/plugins/plugin_xep_0277.py @ 3949:f7ff893b536e

plugin XEP-0277: add `encryption` flag to MB data: MB data are individually flagged with the new `encryption` key if they were e2ee, the key contain encryption metadata (for now, just the algorithm used). rel 380
author Goffi <goffi@goffi.org>
date Sat, 15 Oct 2022 20:38:33 +0200
parents e345d93fb6e5
children b8ab6da58ac8
line wrap: on
line diff
--- a/sat/plugins/plugin_xep_0277.py	Sat Oct 15 20:38:33 2022 +0200
+++ b/sat/plugins/plugin_xep_0277.py	Sat Oct 15 20:38:33 2022 +0200
@@ -20,7 +20,7 @@
 import dateutil
 import calendar
 from secrets import token_urlsafe
-from typing import Optional, Dict, Union, Any
+from typing import List, Optional, Dict, Tuple, Union, Any, Dict
 from functools import partial
 
 import shortuuid
@@ -33,7 +33,7 @@
 
 # XXX: sat_tmp.wokkel.pubsub is actually used instead of wokkel version
 from wokkel import pubsub
-from wokkel import disco, iwokkel
+from wokkel import disco, iwokkel, rsm
 from zope.interface import implementer
 
 from sat.core.i18n import _
@@ -1142,8 +1142,16 @@
         d.addCallback(self._mbGetSerialise)
         return d
 
-    async def mbGet(self, client, service=None, node=None, max_items=10, item_ids=None,
-              rsm_request=None, extra=None):
+    async def mbGet(
+        self,
+        client: SatXMPPEntity,
+        service: Optional[jid.JID] = None,
+        node: Optional[str] = None,
+        max_items: Optional[int] = 10,
+        item_ids: Optional[List[str]] = None,
+        rsm_request: Optional[rsm.RSMRequest] = None,
+        extra: Optional[Dict[str, Any]] = None
+    ) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]:
         """Get some microblogs
 
         @param service(jid.JID, None): jid of the publisher
@@ -1170,9 +1178,16 @@
             rsm_request=rsm_request,
             extra=extra,
         )
-        mb_data = await self._p.transItemsDataD(
+        mb_data_list, metadata = await self._p.transItemsDataD(
             items_data, partial(self.item2mbdata, client, service=service, node=node))
-        return mb_data
+        encrypted = metadata.pop("encrypted", None)
+        if encrypted is not None:
+            for mb_data in mb_data_list:
+                try:
+                    mb_data["encrypted"] = encrypted[mb_data["id"]]
+                except KeyError:
+                    pass
+        return (mb_data_list, metadata)
 
     def _mbRename(self, service, node, item_id, new_id, profile_key):
         return defer.ensureDeferred(self.mbRename(