summary refs log tree commit diff
path: root/synapse/handlers
diff options
context:
space:
mode:
authorDaniel Wagner-Hall <daniel@matrix.org>2016-02-12 15:11:49 +0000
committerreview.rocks <nobody@review.rocks>2016-02-12 15:11:49 +0000
commitcf81375b94c4763766440471e632fc4b103450ab (patch)
tree00826864651550411f164dcb510cd1f7d6e5b6de /synapse/handlers
parentMerge pull request #574 from matrix-org/markjh/connection_closed (diff)
downloadsynapse-cf81375b94c4763766440471e632fc4b103450ab.tar.xz
Merge two of the room join codepaths
There's at least one more to merge in.

Side-effects:
 * Stop reporting None as displayname and avatar_url in some cases
 * Joining a room by alias populates guest-ness in join event
 * Remove unspec'd PUT version of /join/<room_id_or_alias> which has not
   been called on matrix.org according to logs
 * Stop recording access_token_id on /join/room_id - currently we don't
   record it on /join/room_alias; I can try to thread it through at some
   point.
Diffstat (limited to 'synapse/handlers')
-rw-r--r--synapse/handlers/profile.py11
-rw-r--r--synapse/handlers/room.py44
2 files changed, 44 insertions, 11 deletions
diff --git a/synapse/handlers/profile.py b/synapse/handlers/profile.py
index 629e6e3594..32af622733 100644
--- a/synapse/handlers/profile.py
+++ b/synapse/handlers/profile.py
@@ -169,8 +169,15 @@ class ProfileHandler(BaseHandler):
             consumeErrors=True
         ).addErrback(unwrapFirstError)
 
-        state["displayname"] = displayname
-        state["avatar_url"] = avatar_url
+        if displayname is None:
+            del state["displayname"]
+        else:
+            state["displayname"] = displayname
+
+        if avatar_url is None:
+            del state["avatar_url"]
+        else:
+            state["avatar_url"] = avatar_url
 
         defer.returnValue(None)
 
diff --git a/synapse/handlers/room.py b/synapse/handlers/room.py
index b2de2cd0c0..2950ed14e4 100644
--- a/synapse/handlers/room.py
+++ b/synapse/handlers/room.py
@@ -527,7 +527,17 @@ class RoomMemberHandler(BaseHandler):
         defer.returnValue({"room_id": room_id})
 
     @defer.inlineCallbacks
-    def join_room_alias(self, joinee, room_alias, content={}):
+    def lookup_room_alias(self, room_alias):
+        """
+        Gets the room ID for an alias.
+
+        Args:
+            room_alias (str): The room alias to look up.
+        Returns:
+            A tuple of the room ID (str) and the hosts hosting the room ([str])
+        Raises:
+            SynapseError if the room couldn't be looked up.
+        """
         directory_handler = self.hs.get_handlers().directory_handler
         mapping = yield directory_handler.get_association(room_alias)
 
@@ -539,24 +549,40 @@ class RoomMemberHandler(BaseHandler):
         if not hosts:
             raise SynapseError(404, "No known servers")
 
-        # If event doesn't include a display name, add one.
-        yield collect_presencelike_data(self.distributor, joinee, content)
+        defer.returnValue((room_id, hosts))
+
+    @defer.inlineCallbacks
+    def do_join(self, requester, room_id, hosts=None):
+        """
+        Joins requester to room_id.
+
+        Args:
+            requester (Requester): The user joining the room.
+            room_id (str): The room ID (not alias) being joined.
+            hosts ([str]): A list of hosts which are hopefully in the room.
+        Raises:
+            SynapseError if the room couldn't be joined.
+        """
+        hosts = hosts or []
+
+        content = {"membership": Membership.JOIN}
+        if requester.is_guest:
+            content["kind"] = "guest"
+
+        yield collect_presencelike_data(self.distributor, requester.user, content)
 
-        content.update({"membership": Membership.JOIN})
         builder = self.event_builder_factory.new({
             "type": EventTypes.Member,
-            "state_key": joinee.to_string(),
+            "state_key": requester.user.to_string(),
             "room_id": room_id,
-            "sender": joinee.to_string(),
-            "membership": Membership.JOIN,
+            "sender": requester.user.to_string(),
+            "membership": Membership.JOIN,  # For backwards compatibility
             "content": content,
         })
         event, context = yield self._create_new_client_event(builder)
 
         yield self._do_join(event, context, room_hosts=hosts)
 
-        defer.returnValue({"room_id": room_id})
-
     @defer.inlineCallbacks
     def _do_join(self, event, context, room_hosts=None):
         room_id = event.room_id