summary refs log tree commit diff
path: root/synapse/rest
diff options
context:
space:
mode:
authorSorunome <mail@sorunome.de>2020-01-19 12:35:59 +0100
committerSorunome <mail@sorunome.de>2020-01-19 12:35:59 +0100
commitddd3584bdc856992e6f3f3eaac699275c90677d3 (patch)
tree85d9531577241634a68a7dc1f0ad143ab538a62e /synapse/rest
parentremove unneeded print statements (diff)
downloadsynapse-ddd3584bdc856992e6f3f3eaac699275c90677d3.tar.xz
draft for federation of knock (untested)
Diffstat (limited to 'synapse/rest')
-rw-r--r--synapse/rest/client/v2_alpha/knock.py76
1 files changed, 75 insertions, 1 deletions
diff --git a/synapse/rest/client/v2_alpha/knock.py b/synapse/rest/client/v2_alpha/knock.py
index 946aa5a620..b4ffcfd808 100644
--- a/synapse/rest/client/v2_alpha/knock.py
+++ b/synapse/rest/client/v2_alpha/knock.py
@@ -17,13 +17,19 @@ import logging
 
 from synapse.api.errors import AuthError, SynapseError
 from synapse.http.servlet import RestServlet, parse_json_object_from_request
+from synapse.rest.client.transactions import HttpTransactionCache
+from synapse.types import RoomAlias, RoomID, StreamToken, ThirdPartyInstanceID, UserID
 
 from ._base import client_patterns
 
 logger = logging.getLogger(__name__)
 
+class TransactionRestServlet(RestServlet):
+    def __init__(self, hs):
+        super(TransactionRestServlet, self).__init__()
+        self.txns = HttpTransactionCache(hs)
 
-class KnockServlet(RestServlet):
+class KnockServlet(TransactionRestServlet):
     """
     POST /rooms/{roomId}/knock
     """
@@ -57,5 +63,73 @@ class KnockServlet(RestServlet):
 
         return 200, {}
 
+    def on_PUT(self, request, room_id, txn_id):
+        set_tag("txn_id", txn_id)
+
+        return self.txns.fetch_or_execute_request(
+            request, self.on_POST, request, room_id, txn_id
+        )
+
+class KnockRoomALiasServlet(TransactionRestServlet):
+    """
+    POST /knock/{roomIdOrAlias}
+    """
+
+    PATTERNS = client_patterns(
+        "/knock/(?P<room_identifier>[^/]*)"
+    )
+
+    def __init__(self, hs):
+        super(KnockRoomALiasServlet, self).__init__()
+        self.room_member_handler = hs.get_room_member_handler()
+        self.auth = hs.get_auth()
+
+    async def on_POST(self, request, room_identifier, txn_id=None):
+        requester = await self.auth.get_user_by_req(request)
+
+        content = parse_json_object_from_request(request)
+        event_content = None
+        if "reason" in content:
+            event_content = {"reason": content["reason"]}
+
+        if RoomID.is_valid(room_identifier):
+            room_id = room_identifier
+            try:
+                remote_room_hosts = [
+                    x.decode("ascii") for x in request.args[b"server_name"]
+                ]
+            except Exception:
+                remote_room_hosts = None
+        elif RoomAlias.is_valid(room_identifier):
+            handler = self.room_member_handler
+            room_alias = RoomAlias.from_string(room_identifier)
+            room_id, remote_room_hosts = await handler.lookup_room_alias(room_alias)
+            room_id = room_id.to_string()
+        else:
+            raise SynapseError(
+                400, "%s was not legal room ID or room alias" % (room_identifier,)
+            )
+
+        await self.room_member_handler.update_membership(
+            requester=requester,
+            target=requester.user,
+            room_id=room_id,
+            action="knock",
+            txn_id=txn_id,
+            third_party_signed=None,
+            remote_room_hosts=remote_room_hosts,
+            content=event_content,
+        )
+
+        return 200, {}
+
+    def on_PUT(self, request, room_identifier, txn_id):
+        set_tag("txn_id", txn_id)
+
+        return self.txns.fetch_or_execute_request(
+            request, self.on_POST, request, room_identifier, txn_id
+        )
+
 def register_servlets(hs, http_server):
     KnockServlet(hs).register(http_server)
+    KnockServlet(hs).register(http_server)