summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/appservice/__init__.py2
-rw-r--r--synapse/config/appservice.py2
-rw-r--r--synapse/handlers/appservice.py23
-rw-r--r--synapse/rest/client/v2_alpha/report_event.py13
4 files changed, 38 insertions, 2 deletions
diff --git a/synapse/appservice/__init__.py b/synapse/appservice/__init__.py
index d4a2f02fc2..6b5b66029f 100644
--- a/synapse/appservice/__init__.py
+++ b/synapse/appservice/__init__.py
@@ -61,6 +61,7 @@ class ApplicationService:
         rate_limited=True,
         ip_range_whitelist=None,
         supports_ephemeral=False,
+        push_reports=False,
     ):
         self.token = token
         self.url = (
@@ -73,6 +74,7 @@ class ApplicationService:
         self.id = id
         self.ip_range_whitelist = ip_range_whitelist
         self.supports_ephemeral = supports_ephemeral
+        self.push_reports = push_reports
 
         if "|" in self.id:
             raise Exception("application service ID cannot contain '|' character")
diff --git a/synapse/config/appservice.py b/synapse/config/appservice.py
index 746fc3cc02..b6a605a4fb 100644
--- a/synapse/config/appservice.py
+++ b/synapse/config/appservice.py
@@ -161,6 +161,7 @@ def _load_appservice(hostname, as_info, config_filename):
         ip_range_whitelist = IPSet(as_info.get("ip_range_whitelist"))
 
     supports_ephemeral = as_info.get("de.sorunome.msc2409.push_ephemeral", False)
+    send_reports = as_info.get("uk.half-shot.msc???.push_reports", False)
 
     return ApplicationService(
         token=as_info["as_token"],
@@ -171,6 +172,7 @@ def _load_appservice(hostname, as_info, config_filename):
         sender=user_id,
         id=as_info["id"],
         supports_ephemeral=supports_ephemeral,
+        push_reports=send_reports,
         protocols=protocols,
         rate_limited=rate_limited,
         ip_range_whitelist=ip_range_whitelist,
diff --git a/synapse/handlers/appservice.py b/synapse/handlers/appservice.py
index fd1e7e7ea8..c17e74bb1f 100644
--- a/synapse/handlers/appservice.py
+++ b/synapse/handlers/appservice.py
@@ -30,7 +30,7 @@ from synapse.metrics import (
     event_processing_loop_room_count,
 )
 from synapse.metrics.background_process_metrics import run_as_background_process
-from synapse.types import Collection, RoomStreamToken, UserID
+from synapse.types import Collection, RoomStreamToken, UserID, JsonDict
 from synapse.util.metrics import Measure
 
 logger = logging.getLogger(__name__)
@@ -261,6 +261,27 @@ class ApplicationServicesHandler:
             ]
             events = events + presence_events
 
+    def on_event_report(self, room_id: str, event_id: str, user_id: str, body: JsonDict, recieved_ts: int):
+        services = [
+            service
+            for service in self.store.get_app_services()
+            if service.supports_ephemeral and service.push_reports
+        ]
+
+        if not services or not self.notify_appservices:
+            return
+
+        for service in services:
+            event = {
+                "room_id": room_id,
+                "event_id": event_id,
+                "sender": user_id,
+                "content": body,
+                "ts": recieved_ts,
+            }
+            self.scheduler.submit_ephemeral_events_for_as(service, [event])
+
+
     async def query_user_exists(self, user_id):
         """Check if any application service knows this user_id exists.
 
diff --git a/synapse/rest/client/v2_alpha/report_event.py b/synapse/rest/client/v2_alpha/report_event.py
index 215d619ca1..aee49ac554 100644
--- a/synapse/rest/client/v2_alpha/report_event.py
+++ b/synapse/rest/client/v2_alpha/report_event.py
@@ -37,8 +37,11 @@ class ReportEventRestServlet(RestServlet):
         self.auth = hs.get_auth()
         self.clock = hs.get_clock()
         self.store = hs.get_datastore()
+        self.appservice_handler = hs.get_application_service_handler()
+
 
     async def on_POST(self, request, room_id, event_id):
+        received_ts = self.clock.time_msec()
         requester = await self.auth.get_user_by_req(request)
         user_id = requester.user.to_string()
 
@@ -64,7 +67,15 @@ class ReportEventRestServlet(RestServlet):
             user_id=user_id,
             reason=body["reason"],
             content=body,
-            received_ts=self.clock.time_msec(),
+            received_ts=received_ts,
+        )
+
+        self.appservice_handler.on_event_report(
+            room_id=room_id,
+            event_id=event_id,
+            user_id=user_id,
+            body=body,
+            received_ts=received_ts,
         )
 
         return 200, {}