diff --git a/synapse/events/utils.py b/synapse/events/utils.py
index 4c82780f46..7bd78343f0 100644
--- a/synapse/events/utils.py
+++ b/synapse/events/utils.py
@@ -75,7 +75,7 @@ def prune_event(event):
elif event_type == EventTypes.Aliases:
add_fields("aliases")
elif event_type == EventTypes.RoomHistoryVisibility:
- add_fields("visibility")
+ add_fields("history_visibility")
allowed_fields = {
k: v
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 663d05c633..cd3867ed9c 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -239,22 +239,28 @@ class FederationHandler(BaseHandler):
return event
history = state.get((EventTypes.RoomHistoryVisibility, ''), None)
- if history and history.content.get("visibility", None) == "after_join":
- for ev in state.values():
- if ev.type != EventTypes.Member:
- continue
- try:
- domain = UserID.from_string(ev.state_key).domain
- except:
- continue
+ if history:
+ visibility = history.content.get("history_visibility", "shared")
+ if visibility in ["invited", "joined"]:
+ for ev in state.values():
+ if ev.type != EventTypes.Member:
+ continue
+ try:
+ domain = UserID.from_string(ev.state_key).domain
+ except:
+ continue
- if domain != server_name:
- continue
+ if domain != server_name:
+ continue
- if ev.membership == Membership.JOIN:
- return event
- else:
- return prune_event(event)
+ memtype = ev.membership
+ if memtype == Membership.JOIN:
+ return event
+ elif memtype == Membership.INVITE:
+ if visibility == "invited":
+ return event
+ else:
+ return prune_event(event)
return event
diff --git a/synapse/handlers/message.py b/synapse/handlers/message.py
index 00c7dbec88..d8b117612d 100644
--- a/synapse/handlers/message.py
+++ b/synapse/handlers/message.py
@@ -149,13 +149,29 @@ class MessageHandler(BaseHandler):
if event.type == EventTypes.RoomHistoryVisibility:
return True
- membership = state.get((EventTypes.Member, user_id), None)
- if membership and membership.membership == Membership.JOIN:
+ 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 and history.content.get("visibility", None) == "after_join":
- return False
+ 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
diff --git a/synapse/handlers/sync.py b/synapse/handlers/sync.py
index 5078c4e45e..6cff6230c1 100644
--- a/synapse/handlers/sync.py
+++ b/synapse/handlers/sync.py
@@ -306,16 +306,31 @@ class SyncHandler(BaseHandler):
if event.type == EventTypes.RoomHistoryVisibility:
return True
- membership = state.get((EventTypes.Member, user_id), None)
- if membership and membership.membership == Membership.JOIN:
+ 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 and history.content.get("visibility", None) == "after_join":
- return False
+ if history:
+ visibility = history.content.get("history_visibility", "shared")
+ else:
+ visibility = "shared"
- return True
+ 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
events_and_states = filter(allowed, events_and_states)
defer.returnValue([
ev
|