diff --git a/synapse/api/auth.py b/synapse/api/auth.py
index 4a13f7e2e1..adb7d64482 100644
--- a/synapse/api/auth.py
+++ b/synapse/api/auth.py
@@ -207,6 +207,13 @@ class Auth(object):
user_id, room_id
))
+ if membership == Membership.LEAVE:
+ forgot = yield self.store.did_forget(user_id, room_id)
+ if forgot:
+ raise AuthError(403, "User %s not in room %s" % (
+ user_id, room_id
+ ))
+
defer.returnValue(member)
@defer.inlineCallbacks
@@ -771,7 +778,7 @@ class Auth(object):
if "third_party_invite" in event.content:
key = (
EventTypes.ThirdPartyInvite,
- event.content["third_party_invite"]["token"]
+ event.content["third_party_invite"]["signed"]["token"]
)
third_party_invite = current_state.get(key)
if third_party_invite:
@@ -853,7 +860,7 @@ class Auth(object):
redact_level = self._get_named_level(auth_events, "redact", 50)
- if user_level > redact_level:
+ if user_level >= redact_level:
return False
redacter_domain = EventID.from_string(event.event_id).domain
diff --git a/synapse/api/errors.py b/synapse/api/errors.py
index d4037b3d55..8bc7b9e6db 100644
--- a/synapse/api/errors.py
+++ b/synapse/api/errors.py
@@ -120,6 +120,22 @@ class AuthError(SynapseError):
super(AuthError, self).__init__(*args, **kwargs)
+class GuestAccessError(AuthError):
+ """An error raised when a there is a problem with a guest user accessing
+ a room"""
+
+ def __init__(self, rooms, *args, **kwargs):
+ self.rooms = rooms
+ super(GuestAccessError, self).__init__(*args, **kwargs)
+
+ def error_dict(self):
+ return cs_error(
+ self.msg,
+ self.errcode,
+ rooms=self.rooms,
+ )
+
+
class EventSizeError(SynapseError):
"""An error raised when an event is too big."""
diff --git a/synapse/api/filtering.py b/synapse/api/filtering.py
index 18f2ec3ae8..5287aaa757 100644
--- a/synapse/api/filtering.py
+++ b/synapse/api/filtering.py
@@ -50,7 +50,7 @@ class Filtering(object):
# many definitions.
top_level_definitions = [
- "presence"
+ "presence", "account_data"
]
room_level_definitions = [
@@ -62,10 +62,29 @@ class Filtering(object):
self._check_definition(user_filter_json[key])
if "room" in user_filter_json:
+ self._check_definition_room_lists(user_filter_json["room"])
for key in room_level_definitions:
if key in user_filter_json["room"]:
self._check_definition(user_filter_json["room"][key])
+ def _check_definition_room_lists(self, definition):
+ """Check that "rooms" and "not_rooms" are lists of room ids if they
+ are present
+
+ Args:
+ definition(dict): The filter definition
+ Raises:
+ SynapseError: If there was a problem with this definition.
+ """
+ # check rooms are valid room IDs
+ room_id_keys = ["rooms", "not_rooms"]
+ for key in room_id_keys:
+ if key in definition:
+ if type(definition[key]) != list:
+ raise SynapseError(400, "Expected %s to be a list." % key)
+ for room_id in definition[key]:
+ RoomID.from_string(room_id)
+
def _check_definition(self, definition):
"""Check if the provided definition is valid.
@@ -85,14 +104,7 @@ class Filtering(object):
400, "Expected JSON object, not %s" % (definition,)
)
- # check rooms are valid room IDs
- room_id_keys = ["rooms", "not_rooms"]
- for key in room_id_keys:
- if key in definition:
- if type(definition[key]) != list:
- raise SynapseError(400, "Expected %s to be a list." % key)
- for room_id in definition[key]:
- RoomID.from_string(room_id)
+ self._check_definition_room_lists(definition)
# check senders are valid user IDs
user_id_keys = ["senders", "not_senders"]
@@ -119,25 +131,26 @@ class FilterCollection(object):
def __init__(self, filter_json):
self.filter_json = filter_json
- self.room_timeline_filter = Filter(
- self.filter_json.get("room", {}).get("timeline", {})
- )
+ room_filter_json = self.filter_json.get("room", {})
- self.room_state_filter = Filter(
- self.filter_json.get("room", {}).get("state", {})
- )
+ self.room_filter = Filter({
+ k: v for k, v in room_filter_json.items()
+ if k in ("rooms", "not_rooms")
+ })
- self.room_ephemeral_filter = Filter(
- self.filter_json.get("room", {}).get("ephemeral", {})
- )
+ self.room_timeline_filter = Filter(room_filter_json.get("timeline", {}))
+ self.room_state_filter = Filter(room_filter_json.get("state", {}))
+ self.room_ephemeral_filter = Filter(room_filter_json.get("ephemeral", {}))
+ self.room_account_data = Filter(room_filter_json.get("account_data", {}))
+ self.presence_filter = Filter(self.filter_json.get("presence", {}))
+ self.account_data = Filter(self.filter_json.get("account_data", {}))
- self.room_account_data = Filter(
- self.filter_json.get("room", {}).get("account_data", {})
+ self.include_leave = self.filter_json.get("room", {}).get(
+ "include_leave", False
)
- self.presence_filter = Filter(
- self.filter_json.get("presence", {})
- )
+ def list_rooms(self):
+ return self.room_filter.list_rooms()
def timeline_limit(self):
return self.room_timeline_filter.limit()
@@ -151,23 +164,35 @@ class FilterCollection(object):
def filter_presence(self, events):
return self.presence_filter.filter(events)
+ def filter_account_data(self, events):
+ return self.account_data.filter(events)
+
def filter_room_state(self, events):
- return self.room_state_filter.filter(events)
+ return self.room_state_filter.filter(self.room_filter.filter(events))
def filter_room_timeline(self, events):
- return self.room_timeline_filter.filter(events)
+ return self.room_timeline_filter.filter(self.room_filter.filter(events))
def filter_room_ephemeral(self, events):
- return self.room_ephemeral_filter.filter(events)
+ return self.room_ephemeral_filter.filter(self.room_filter.filter(events))
def filter_room_account_data(self, events):
- return self.room_account_data.filter(events)
+ return self.room_account_data.filter(self.room_filter.filter(events))
class Filter(object):
def __init__(self, filter_json):
self.filter_json = filter_json
+ def list_rooms(self):
+ """The list of room_id strings this filter restricts the output to
+ or None if the this filter doesn't list the room ids.
+ """
+ if "rooms" in self.filter_json:
+ return list(set(self.filter_json["rooms"]))
+ else:
+ return None
+
def check(self, event):
"""Checks whether the filter matches the given event.
|