summary refs log tree commit diff
path: root/synapse/event_auth.py
diff options
context:
space:
mode:
authorSorunome <mail@sorunome.de>2020-01-18 21:53:35 +0100
committerSorunome <mail@sorunome.de>2020-01-18 21:53:35 +0100
commit16801e2b5ce7d99c2fd157c1228fbbfbad55b668 (patch)
tree8973ffe2fab82b9e2f7a98e8d2020d6d6420d8b2 /synapse/event_auth.py
parentAdd more logging around message retention policies support (#6717) (diff)
downloadsynapse-16801e2b5ce7d99c2fd157c1228fbbfbad55b668.tar.xz
implement knock via non-federation
Diffstat (limited to 'synapse/event_auth.py')
-rw-r--r--synapse/event_auth.py19
1 files changed, 17 insertions, 2 deletions
diff --git a/synapse/event_auth.py b/synapse/event_auth.py
index 1033e5e121..577f8f166b 100644
--- a/synapse/event_auth.py
+++ b/synapse/event_auth.py
@@ -225,9 +225,12 @@ def _is_membership_change_allowed(event, auth_events):
 
     key = (EventTypes.JoinRules, "")
     join_rule_event = auth_events.get(key)
+    print(auth_events)
+    print(join_rule_event)
     if join_rule_event:
         join_rule = join_rule_event.content.get("join_rule", JoinRules.INVITE)
     else:
+        print("No such event")
         join_rule = JoinRules.INVITE
 
     user_level = get_user_power_level(event.user_id, auth_events)
@@ -235,6 +238,7 @@ def _is_membership_change_allowed(event, auth_events):
 
     # FIXME (erikj): What should we do here as the default?
     ban_level = _get_named_level(auth_events, "ban", 50)
+    knock_level = _get_named_level(auth_events, "knock", 0)
 
     logger.debug(
         "_is_membership_change_allowed: %s",
@@ -257,7 +261,7 @@ def _is_membership_change_allowed(event, auth_events):
             raise AuthError(403, "%s is banned from the room" % (target_user_id,))
         return
 
-    if Membership.JOIN != membership:
+    if Membership.JOIN != membership and Membership.KNOCK != membership:
         if (
             caller_invited
             and Membership.LEAVE == membership
@@ -311,6 +315,17 @@ def _is_membership_change_allowed(event, auth_events):
     elif Membership.BAN == membership:
         if user_level < ban_level or user_level <= target_level:
             raise AuthError(403, "You don't have permission to ban")
+    elif Membership.KNOCK == membership:
+        # check that we have the leave event
+        print("====================")
+        print(join_rule)
+        print(user_level, knock_level)
+        if target and target.membership != Membership.LEAVE:
+            raise AuthError(403, "You don't have permission to knock")
+        elif join_rule != JoinRules.INVITE:
+            raise AuthError(403, "You don't have permission to knock")
+        elif user_level < knock_level:
+            raise AuthError(403, "You don't have permission to knock")
     else:
         raise AuthError(500, "Unknown membership %s" % membership)
 
@@ -653,7 +668,7 @@ def auth_types_for_event(event) -> Set[Tuple[str]]:
 
     if event.type == EventTypes.Member:
         membership = event.content["membership"]
-        if membership in [Membership.JOIN, Membership.INVITE]:
+        if membership in [Membership.JOIN, Membership.INVITE, Membership.KNOCK]:
             auth_types.add((EventTypes.JoinRules, ""))
 
         auth_types.add((EventTypes.Member, event.state_key))