Integrate knock rooms with the public rooms directory (#9359)

This PR implements the ["Changes regarding the Public Rooms Directory"](https://github.com/Sorunome/matrix-doc/blob/soru/knock/proposals/2403-knock.md#changes-regarding-the-public-rooms-directory) section of knocking MSC2403.

Specifically, it:

* Allows rooms with `join_rule` "knock" to be returned by the query behind the public rooms directory
* Adds the field `join_rule` to each room entry returned by a public rooms directory query, so clients can know whether to attempt a join or knock on a room

Based on https://github.com/matrix-org/synapse/issues/6739. Complement tests for this change: https://github.com/matrix-org/complement/pull/72
This commit is contained in:
Andrew Morgan 2021-06-09 20:31:31 +01:00 committed by GitHub
parent d936371b69
commit a7a37437bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 11 additions and 5 deletions

1
changelog.d/9359.feature Normal file
View File

@ -0,0 +1 @@
Implement "room knocking" as per [MSC2403](https://github.com/matrix-org/matrix-doc/pull/2403). Contributed by Sorunome and anoa.

View File

@ -169,6 +169,7 @@ class RoomListHandler(BaseHandler):
"world_readable": room["history_visibility"] "world_readable": room["history_visibility"]
== HistoryVisibility.WORLD_READABLE, == HistoryVisibility.WORLD_READABLE,
"guest_can_join": room["guest_access"] == "can_join", "guest_can_join": room["guest_access"] == "can_join",
"join_rule": room["join_rules"],
} }
# Filter out Nones rather omit the field altogether # Filter out Nones rather omit the field altogether

View File

@ -19,7 +19,7 @@ from abc import abstractmethod
from enum import Enum from enum import Enum
from typing import Any, Dict, List, Optional, Tuple from typing import Any, Dict, List, Optional, Tuple
from synapse.api.constants import EventTypes from synapse.api.constants import EventTypes, JoinRules
from synapse.api.errors import StoreError from synapse.api.errors import StoreError
from synapse.api.room_versions import RoomVersion, RoomVersions from synapse.api.room_versions import RoomVersion, RoomVersions
from synapse.storage._base import SQLBaseStore, db_to_json from synapse.storage._base import SQLBaseStore, db_to_json
@ -177,11 +177,13 @@ class RoomWorkerStore(SQLBaseStore):
INNER JOIN room_stats_current USING (room_id) INNER JOIN room_stats_current USING (room_id)
WHERE WHERE
( (
join_rules = 'public' OR history_visibility = 'world_readable' join_rules = 'public' OR join_rules = '%(knock_join_rule)s'
OR history_visibility = 'world_readable'
) )
AND joined_members > 0 AND joined_members > 0
""" % { """ % {
"published_sql": published_sql "published_sql": published_sql,
"knock_join_rule": JoinRules.KNOCK,
} }
txn.execute(sql, query_args) txn.execute(sql, query_args)
@ -303,7 +305,7 @@ class RoomWorkerStore(SQLBaseStore):
sql = """ sql = """
SELECT SELECT
room_id, name, topic, canonical_alias, joined_members, room_id, name, topic, canonical_alias, joined_members,
avatar, history_visibility, joined_members, guest_access avatar, history_visibility, guest_access, join_rules
FROM ( FROM (
%(published_sql)s %(published_sql)s
) published ) published
@ -311,7 +313,8 @@ class RoomWorkerStore(SQLBaseStore):
INNER JOIN room_stats_current USING (room_id) INNER JOIN room_stats_current USING (room_id)
WHERE WHERE
( (
join_rules = 'public' OR history_visibility = 'world_readable' join_rules = 'public' OR join_rules = '%(knock_join_rule)s'
OR history_visibility = 'world_readable'
) )
AND joined_members > 0 AND joined_members > 0
%(where_clause)s %(where_clause)s
@ -320,6 +323,7 @@ class RoomWorkerStore(SQLBaseStore):
"published_sql": published_sql, "published_sql": published_sql,
"where_clause": where_clause, "where_clause": where_clause,
"dir": "DESC" if forwards else "ASC", "dir": "DESC" if forwards else "ASC",
"knock_join_rule": JoinRules.KNOCK,
} }
if limit is not None: if limit is not None: