diff --git a/synapse/handlers/search.py b/synapse/handlers/search.py
index 9dc474aa56..71182a8fe0 100644
--- a/synapse/handlers/search.py
+++ b/synapse/handlers/search.py
@@ -17,7 +17,9 @@ from twisted.internet import defer
from ._base import BaseHandler
-from synapse.api.constants import KnownRoomEventKeys, SearchConstraintTypes
+from synapse.api.constants import (
+ EventTypes, KnownRoomEventKeys, Membership, SearchConstraintTypes
+)
from synapse.api.errors import SynapseError
from synapse.events.utils import serialize_event
@@ -72,6 +74,52 @@ class SearchHandler(BaseHandler):
super(SearchHandler, self).__init__(hs)
@defer.inlineCallbacks
+ def _filter_events_for_client(self, user_id, room_id, events):
+ event_id_to_state = yield self.store.get_state_for_events(
+ frozenset(e.event_id for e in events),
+ types=(
+ (EventTypes.RoomHistoryVisibility, ""),
+ (EventTypes.Member, user_id),
+ )
+ )
+
+ def allowed(event, state):
+ if event.type == EventTypes.RoomHistoryVisibility:
+ return True
+
+ membership_ev = state.get((EventTypes.Member, user_id), None)
+ if membership_ev:
+ membership = membership_ev.membership
+ else:
+ membership = Membership.LEAVE
+
+ if membership == Membership.JOIN:
+ return True
+
+ history = state.get((EventTypes.RoomHistoryVisibility, ''), None)
+ if history:
+ visibility = history.content.get("history_visibility", "shared")
+ else:
+ visibility = "shared"
+
+ if visibility == "public":
+ return True
+ elif visibility == "shared":
+ return True
+ elif visibility == "joined":
+ return membership == Membership.JOIN
+ elif visibility == "invited":
+ return membership == Membership.INVITE
+
+ return True
+
+ defer.returnValue([
+ event
+ for event in events
+ if allowed(event, event_id_to_state[event.event_id])
+ ])
+
+ @defer.inlineCallbacks
def search(self, user, content):
constraint_dicts = content["search_categories"]["room_events"]["constraints"]
constraints = [RoomConstraint.from_dict(c)for c in constraint_dicts]
|