summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--synapse/events/utils.py2
-rw-r--r--synapse/handlers/federation.py34
-rw-r--r--synapse/handlers/message.py24
-rw-r--r--synapse/handlers/sync.py25
4 files changed, 61 insertions, 24 deletions
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