mirror of
https://github.com/element-hq/synapse.git
synced 2026-10-23 17:23:55 +00:00
Merge branch 'release-v1.116' into matrix-org-hotfixes
This commit is contained in:
7 files changed
+431
-27
No files matched your search
+26
-20
@@ -1,3 +1,12 @@
|
||||
# Synapse 1.116.0rc2 (2024-09-26)
|
||||
|
||||
### Features
|
||||
|
||||
- Add implementation of restricting who can overwrite a state event as proposed by [MSC3757](https://github.com/matrix-org/matrix-spec-proposals/pull/3757). ([\#17513](https://github.com/element-hq/synapse/issues/17513))
|
||||
|
||||
|
||||
|
||||
|
||||
# Synapse 1.116.0rc1 (2024-09-25)
|
||||
|
||||
### Features
|
||||
@@ -5,45 +14,43 @@
|
||||
- Add initial implementation of delayed events as proposed by [MSC4140](https://github.com/matrix-org/matrix-spec-proposals/pull/4140). ([\#17326](https://github.com/element-hq/synapse/issues/17326))
|
||||
- Add an asynchronous Admin API endpoint [to redact all a user's events](https://element-hq.github.io/synapse/v1.116/admin_api/user_admin_api.html#redact-all-the-events-of-a-user),
|
||||
and [an endpoint to check on the status of that redaction task](https://element-hq.github.io/synapse/v1.116/admin_api/user_admin_api.html#check-the-status-of-a-redaction-process). ([\#17506](https://github.com/element-hq/synapse/issues/17506))
|
||||
- Add support for the `tags` and `not_tags` filters for simplified sliding sync. ([\#17662](https://github.com/element-hq/synapse/issues/17662))
|
||||
- Add support for the `tags` and `not_tags` filters for [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync. ([\#17662](https://github.com/element-hq/synapse/issues/17662))
|
||||
- Guests can use the new media endpoints to download media, as described by [MSC4189](https://github.com/matrix-org/matrix-spec-proposals/pull/4189). ([\#17675](https://github.com/element-hq/synapse/issues/17675))
|
||||
- Add config option `turn_shared_secret_path`. ([\#17690](https://github.com/element-hq/synapse/issues/17690))
|
||||
- Return room tags in Sliding Sync account data extension. ([\#17707](https://github.com/element-hq/synapse/issues/17707))
|
||||
- Return room tags in [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync account data extension. ([\#17707](https://github.com/element-hq/synapse/issues/17707))
|
||||
|
||||
### Bugfixes
|
||||
|
||||
- Make sure we get up-to-date state information when using the new Sliding Sync tables to derive room membership. ([\#17692](https://github.com/element-hq/synapse/issues/17692))
|
||||
- Fix bug where room account data would not correctly be sent down sliding sync for old rooms. ([\#17695](https://github.com/element-hq/synapse/issues/17695))
|
||||
- Fix a bug in SSS which could prevent /sync from working for certain user accounts. ([\#17727](https://github.com/element-hq/synapse/issues/17727), [\#17733](https://github.com/element-hq/synapse/issues/17733))
|
||||
- Make sure we get up-to-date state information when using the new [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync tables to derive room membership. ([\#17692](https://github.com/element-hq/synapse/issues/17692))
|
||||
- Fix bug where room account data would not correctly be sent down [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync for old rooms. ([\#17695](https://github.com/element-hq/synapse/issues/17695))
|
||||
- Fix a bug in [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync which could prevent /sync from working for certain user accounts. ([\#17727](https://github.com/element-hq/synapse/issues/17727), [\#17733](https://github.com/element-hq/synapse/issues/17733))
|
||||
- Ignore invites from ignored users in Sliding Sync. ([\#17729](https://github.com/element-hq/synapse/issues/17729))
|
||||
- Fix bug in sliding sync where the server would incorrectly return a negative bump stamp, which caused Element X apps to stop syncing. ([\#17748](https://github.com/element-hq/synapse/issues/17748))
|
||||
- Fix bug in [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync where the server would incorrectly return a negative bump stamp, which caused Element X apps to stop syncing. ([\#17748](https://github.com/element-hq/synapse/issues/17748))
|
||||
|
||||
### Internal Changes
|
||||
|
||||
- Import pydantic objects from the `_pydantic_compat` module.
|
||||
|
||||
This allows `check_pydantic_models.py` to mock those pydantic objects
|
||||
only in the synapse module, and not interfere with pydantic objects in
|
||||
external dependencies. ([\#17667](https://github.com/element-hq/synapse/issues/17667))
|
||||
- Use Sliding Sync tables as a bulk shortcut for getting the max `event_stream_ordering` of rooms. ([\#17693](https://github.com/element-hq/synapse/issues/17693))
|
||||
- Speed up sliding sync requests a bit where there are many room changes. ([\#17696](https://github.com/element-hq/synapse/issues/17696))
|
||||
- Refactor sliding sync filter unit tests so the sliding sync API has better test coverage. ([\#17703](https://github.com/element-hq/synapse/issues/17703))
|
||||
- Fetch `bump_stamp`'s more efficiently in Sliding Sync. ([\#17723](https://github.com/element-hq/synapse/issues/17723))
|
||||
- Shortcut for checking if certain background updates have completed (utilized in Sliding Sync). ([\#17724](https://github.com/element-hq/synapse/issues/17724))
|
||||
- More efficiently fetch rooms for Sliding Sync. ([\#17725](https://github.com/element-hq/synapse/issues/17725))
|
||||
- Use [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync tables as a bulk shortcut for getting the max `event_stream_ordering` of rooms. ([\#17693](https://github.com/element-hq/synapse/issues/17693))
|
||||
- Speed up [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) sliding sync requests a bit where there are many room changes. ([\#17696](https://github.com/element-hq/synapse/issues/17696))
|
||||
- Refactor [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) sliding sync filter unit tests so the sliding sync API has better test coverage. ([\#17703](https://github.com/element-hq/synapse/issues/17703))
|
||||
- Fetch `bump_stamp`s more efficiently in [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync. ([\#17723](https://github.com/element-hq/synapse/issues/17723))
|
||||
- Shortcut for checking if certain background updates have completed (utilized in [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync). ([\#17724](https://github.com/element-hq/synapse/issues/17724))
|
||||
- More efficiently fetch rooms for [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync. ([\#17725](https://github.com/element-hq/synapse/issues/17725))
|
||||
- Fix `_bulk_get_max_event_pos` being inefficient. ([\#17728](https://github.com/element-hq/synapse/issues/17728))
|
||||
- Add cache to `get_tags_for_room(...)`. ([\#17730](https://github.com/element-hq/synapse/issues/17730))
|
||||
- Small performance improvement in speeding up Sliding Sync. ([\#17731](https://github.com/element-hq/synapse/issues/17731))
|
||||
- Minor speed up of initial sliding sync requests. ([\#17734](https://github.com/element-hq/synapse/issues/17734))
|
||||
- Remove usage of the deprecated cgi module. ([\#17741](https://github.com/element-hq/synapse/issues/17741))
|
||||
- Small performance improvement in speeding up [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) Sliding Sync. ([\#17731](https://github.com/element-hq/synapse/issues/17731))
|
||||
- Minor speed up of initial [MSC4186](https://github.com/matrix-org/matrix-spec-proposals/pull/4186) sliding sync requests. ([\#17734](https://github.com/element-hq/synapse/issues/17734))
|
||||
- Remove usage of the deprecated `cgi` module, deprecated in Python 3.11 and removed in Python 3.13. ([\#17741](https://github.com/element-hq/synapse/issues/17741))
|
||||
- Fix typing of a variable that is not `Unknown` anymore after updating `treq`. ([\#17744](https://github.com/element-hq/synapse/issues/17744))
|
||||
|
||||
|
||||
|
||||
### Updates to locked dependencies
|
||||
|
||||
* Bump anyhow from 1.0.86 to 1.0.87. ([\#17685](https://github.com/element-hq/synapse/issues/17685))
|
||||
* Bump anyhow from 1.0.87 to 1.0.89. ([\#17716](https://github.com/element-hq/synapse/issues/17716))
|
||||
* Bump anyhow from 1.0.86 to 1.0.89. ([\#17685](https://github.com/element-hq/synapse/issues/17685), [\#17716](https://github.com/element-hq/synapse/issues/17716))
|
||||
* Bump bytes from 1.7.1 to 1.7.2. ([\#17743](https://github.com/element-hq/synapse/issues/17743))
|
||||
* Bump cryptography from 43.0.0 to 43.0.1. ([\#17689](https://github.com/element-hq/synapse/issues/17689))
|
||||
* Bump idna from 3.8 to 3.10. ([\#17758](https://github.com/element-hq/synapse/issues/17758))
|
||||
@@ -54,8 +61,7 @@
|
||||
* Bump pyasn1-modules from 0.4.0 to 0.4.1. ([\#17747](https://github.com/element-hq/synapse/issues/17747))
|
||||
* Bump pydantic from 2.8.2 to 2.9.2. ([\#17756](https://github.com/element-hq/synapse/issues/17756))
|
||||
* Bump python-multipart from 0.0.9 to 0.0.10. ([\#17745](https://github.com/element-hq/synapse/issues/17745))
|
||||
* Bump ruff from 0.6.4 to 0.6.5. ([\#17715](https://github.com/element-hq/synapse/issues/17715))
|
||||
* Bump ruff from 0.6.5 to 0.6.7. ([\#17760](https://github.com/element-hq/synapse/issues/17760))
|
||||
* Bump ruff from 0.6.4 to 0.6.7. ([\#17715](https://github.com/element-hq/synapse/issues/17715), [\#17760](https://github.com/element-hq/synapse/issues/17760))
|
||||
* Bump sentry-sdk from 2.13.0 to 2.14.0. ([\#17712](https://github.com/element-hq/synapse/issues/17712))
|
||||
* Bump serde from 1.0.209 to 1.0.210. ([\#17686](https://github.com/element-hq/synapse/issues/17686))
|
||||
* Bump serde_json from 1.0.127 to 1.0.128. ([\#17687](https://github.com/element-hq/synapse/issues/17687))
|
||||
|
||||
Vendored
+6
@@ -1,3 +1,9 @@
|
||||
matrix-synapse-py3 (1.116.0~rc2) stable; urgency=medium
|
||||
|
||||
* New synapse release 1.116.0rc2.
|
||||
|
||||
-- Synapse Packaging team <packages@matrix.org> Thu, 26 Sep 2024 13:28:43 +0000
|
||||
|
||||
matrix-synapse-py3 (1.116.0~rc1) stable; urgency=medium
|
||||
|
||||
* New synapse release 1.116.0rc1.
|
||||
|
||||
+1
-1
@@ -97,7 +97,7 @@ module-name = "synapse.synapse_rust"
|
||||
|
||||
[tool.poetry]
|
||||
name = "matrix-synapse"
|
||||
version = "1.116.0rc1"
|
||||
version = "1.116.0rc2"
|
||||
description = "Homeserver for the Matrix decentralised comms protocol"
|
||||
authors = ["Matrix.org Team and Contributors <packages@matrix.org>"]
|
||||
license = "AGPL-3.0-or-later"
|
||||
|
||||
@@ -220,6 +220,7 @@ test_packages=(
|
||||
./tests/msc3874
|
||||
./tests/msc3890
|
||||
./tests/msc3391
|
||||
./tests/msc3757
|
||||
./tests/msc3930
|
||||
./tests/msc3902
|
||||
./tests/msc3967
|
||||
|
||||
@@ -107,6 +107,8 @@ class RoomVersion:
|
||||
# support the flag. Unknown flags are ignored by the evaluator, making conditions
|
||||
# fail if used.
|
||||
msc3931_push_features: Tuple[str, ...] # values from PushRuleRoomFlag
|
||||
# MSC3757: Restricting who can overwrite a state event
|
||||
msc3757_enabled: bool
|
||||
|
||||
|
||||
class RoomVersions:
|
||||
@@ -128,6 +130,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V2 = RoomVersion(
|
||||
"2",
|
||||
@@ -147,6 +150,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V3 = RoomVersion(
|
||||
"3",
|
||||
@@ -166,6 +170,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V4 = RoomVersion(
|
||||
"4",
|
||||
@@ -185,6 +190,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V5 = RoomVersion(
|
||||
"5",
|
||||
@@ -204,6 +210,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V6 = RoomVersion(
|
||||
"6",
|
||||
@@ -223,6 +230,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V7 = RoomVersion(
|
||||
"7",
|
||||
@@ -242,6 +250,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V8 = RoomVersion(
|
||||
"8",
|
||||
@@ -261,6 +270,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V9 = RoomVersion(
|
||||
"9",
|
||||
@@ -280,6 +290,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=False,
|
||||
enforce_int_power_levels=False,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
V10 = RoomVersion(
|
||||
"10",
|
||||
@@ -299,6 +310,7 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=True,
|
||||
enforce_int_power_levels=True,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
MSC1767v10 = RoomVersion(
|
||||
# MSC1767 (Extensible Events) based on room version "10"
|
||||
@@ -319,6 +331,28 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=True,
|
||||
enforce_int_power_levels=True,
|
||||
msc3931_push_features=(PushRuleRoomFlag.EXTENSIBLE_EVENTS,),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
MSC3757v10 = RoomVersion(
|
||||
# MSC3757 (Restricting who can overwrite a state event) based on room version "10"
|
||||
"org.matrix.msc3757.10",
|
||||
RoomDisposition.UNSTABLE,
|
||||
EventFormatVersions.ROOM_V4_PLUS,
|
||||
StateResolutionVersions.V2,
|
||||
enforce_key_validity=True,
|
||||
special_case_aliases_auth=False,
|
||||
strict_canonicaljson=True,
|
||||
limit_notifications_power_levels=True,
|
||||
implicit_room_creator=False,
|
||||
updated_redaction_rules=False,
|
||||
restricted_join_rule=True,
|
||||
restricted_join_rule_fix=True,
|
||||
knock_join_rule=True,
|
||||
msc3389_relation_redactions=False,
|
||||
knock_restricted_join_rule=True,
|
||||
enforce_int_power_levels=True,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=True,
|
||||
)
|
||||
V11 = RoomVersion(
|
||||
"11",
|
||||
@@ -338,6 +372,28 @@ class RoomVersions:
|
||||
knock_restricted_join_rule=True,
|
||||
enforce_int_power_levels=True,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=False,
|
||||
)
|
||||
MSC3757v11 = RoomVersion(
|
||||
# MSC3757 (Restricting who can overwrite a state event) based on room version "11"
|
||||
"org.matrix.msc3757.11",
|
||||
RoomDisposition.UNSTABLE,
|
||||
EventFormatVersions.ROOM_V4_PLUS,
|
||||
StateResolutionVersions.V2,
|
||||
enforce_key_validity=True,
|
||||
special_case_aliases_auth=False,
|
||||
strict_canonicaljson=True,
|
||||
limit_notifications_power_levels=True,
|
||||
implicit_room_creator=True, # Used by MSC3820
|
||||
updated_redaction_rules=True, # Used by MSC3820
|
||||
restricted_join_rule=True,
|
||||
restricted_join_rule_fix=True,
|
||||
knock_join_rule=True,
|
||||
msc3389_relation_redactions=False,
|
||||
knock_restricted_join_rule=True,
|
||||
enforce_int_power_levels=True,
|
||||
msc3931_push_features=(),
|
||||
msc3757_enabled=True,
|
||||
)
|
||||
|
||||
|
||||
@@ -355,6 +411,8 @@ KNOWN_ROOM_VERSIONS: Dict[str, RoomVersion] = {
|
||||
RoomVersions.V9,
|
||||
RoomVersions.V10,
|
||||
RoomVersions.V11,
|
||||
RoomVersions.MSC3757v10,
|
||||
RoomVersions.MSC3757v11,
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+31
-6
@@ -388,6 +388,7 @@ LENIENT_EVENT_BYTE_LIMITS_ROOM_VERSIONS = {
|
||||
RoomVersions.V9,
|
||||
RoomVersions.V10,
|
||||
RoomVersions.MSC1767v10,
|
||||
RoomVersions.MSC3757v10,
|
||||
}
|
||||
|
||||
|
||||
@@ -790,9 +791,10 @@ def get_send_level(
|
||||
|
||||
|
||||
def _can_send_event(event: "EventBase", auth_events: StateMap["EventBase"]) -> bool:
|
||||
state_key = event.get_state_key()
|
||||
power_levels_event = get_power_level_event(auth_events)
|
||||
|
||||
send_level = get_send_level(event.type, event.get("state_key"), power_levels_event)
|
||||
send_level = get_send_level(event.type, state_key, power_levels_event)
|
||||
user_level = get_user_power_level(event.user_id, auth_events)
|
||||
|
||||
if user_level < send_level:
|
||||
@@ -803,11 +805,34 @@ def _can_send_event(event: "EventBase", auth_events: StateMap["EventBase"]) -> b
|
||||
errcode=Codes.INSUFFICIENT_POWER,
|
||||
)
|
||||
|
||||
# Check state_key
|
||||
if hasattr(event, "state_key"):
|
||||
if event.state_key.startswith("@"):
|
||||
if event.state_key != event.user_id:
|
||||
raise AuthError(403, "You are not allowed to set others state")
|
||||
if (
|
||||
state_key is not None
|
||||
and state_key.startswith("@")
|
||||
and state_key != event.user_id
|
||||
):
|
||||
if event.room_version.msc3757_enabled:
|
||||
try:
|
||||
colon_idx = state_key.index(":", 1)
|
||||
suffix_idx = state_key.find("_", colon_idx + 1)
|
||||
state_key_user_id = (
|
||||
state_key[:suffix_idx] if suffix_idx != -1 else state_key
|
||||
)
|
||||
if not UserID.is_valid(state_key_user_id):
|
||||
raise ValueError
|
||||
except ValueError:
|
||||
raise SynapseError(
|
||||
400,
|
||||
"State key neither equals a valid user ID, nor starts with one plus an underscore",
|
||||
errcode=Codes.BAD_JSON,
|
||||
)
|
||||
if (
|
||||
# sender is owner of the state key
|
||||
state_key_user_id == event.user_id
|
||||
# sender has higher PL than the owner of the state key
|
||||
or user_level > get_user_power_level(state_key_user_id, auth_events)
|
||||
):
|
||||
return True
|
||||
raise AuthError(403, "You are not allowed to set others state")
|
||||
|
||||
return True
|
||||
|
||||
|
||||
@@ -0,0 +1,308 @@
|
||||
from http import HTTPStatus
|
||||
|
||||
from parameterized import parameterized_class
|
||||
|
||||
from twisted.test.proto_helpers import MemoryReactor
|
||||
|
||||
from synapse.api.errors import Codes
|
||||
from synapse.api.room_versions import KNOWN_ROOM_VERSIONS, RoomVersions
|
||||
from synapse.rest import admin
|
||||
from synapse.rest.client import login, room
|
||||
from synapse.server import HomeServer
|
||||
from synapse.types import JsonDict
|
||||
from synapse.util import Clock
|
||||
|
||||
from tests.unittest import HomeserverTestCase
|
||||
|
||||
_STATE_EVENT_TEST_TYPE = "com.example.test"
|
||||
|
||||
# To stress-test parsing, include separator & sigil characters
|
||||
_STATE_KEY_SUFFIX = "_state_key_suffix:!@#$123"
|
||||
|
||||
|
||||
class OwnedStateBase(HomeserverTestCase):
|
||||
servlets = [
|
||||
admin.register_servlets,
|
||||
room.register_servlets,
|
||||
login.register_servlets,
|
||||
]
|
||||
|
||||
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
||||
self.creator_user_id = self.register_user("creator", "pass")
|
||||
self.creator_access_token = self.login("creator", "pass")
|
||||
self.user1_user_id = self.register_user("user1", "pass")
|
||||
self.user1_access_token = self.login("user1", "pass")
|
||||
|
||||
self.room_id = self.helper.create_room_as(
|
||||
self.creator_user_id,
|
||||
tok=self.creator_access_token,
|
||||
is_public=True,
|
||||
extra_content={
|
||||
"power_level_content_override": {
|
||||
"events": {
|
||||
_STATE_EVENT_TEST_TYPE: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
)
|
||||
|
||||
self.helper.join(
|
||||
room=self.room_id, user=self.user1_user_id, tok=self.user1_access_token
|
||||
)
|
||||
|
||||
|
||||
class WithoutOwnedStateTestCase(OwnedStateBase):
|
||||
def default_config(self) -> JsonDict:
|
||||
config = super().default_config()
|
||||
config["default_room_version"] = RoomVersions.V10.identifier
|
||||
return config
|
||||
|
||||
def test_user_can_set_state_with_own_userid_key(self) -> None:
|
||||
self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user1_user_id}",
|
||||
tok=self.user1_access_token,
|
||||
expect_code=HTTPStatus.OK,
|
||||
)
|
||||
|
||||
def test_room_creator_cannot_set_state_with_own_suffixed_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.creator_user_id}{_STATE_KEY_SUFFIX}",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_room_creator_cannot_set_state_with_other_userid_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user1_user_id}",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_room_creator_cannot_set_state_with_other_suffixed_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user1_user_id}{_STATE_KEY_SUFFIX}",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_room_creator_cannot_set_state_with_nonmember_userid_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key="@notinroom:hs2",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_room_creator_cannot_set_state_with_malformed_userid_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key="@oops",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
|
||||
@parameterized_class(
|
||||
("room_version",),
|
||||
[(i,) for i, v in KNOWN_ROOM_VERSIONS.items() if v.msc3757_enabled],
|
||||
)
|
||||
class MSC3757OwnedStateTestCase(OwnedStateBase):
|
||||
room_version: str
|
||||
|
||||
def default_config(self) -> JsonDict:
|
||||
config = super().default_config()
|
||||
config["default_room_version"] = self.room_version
|
||||
return config
|
||||
|
||||
def prepare(self, reactor: MemoryReactor, clock: Clock, hs: HomeServer) -> None:
|
||||
super().prepare(reactor, clock, hs)
|
||||
|
||||
self.user2_user_id = self.register_user("user2", "pass")
|
||||
self.user2_access_token = self.login("user2", "pass")
|
||||
|
||||
self.helper.join(
|
||||
room=self.room_id, user=self.user2_user_id, tok=self.user2_access_token
|
||||
)
|
||||
|
||||
def test_user_can_set_state_with_own_suffixed_key(self) -> None:
|
||||
self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user1_user_id}{_STATE_KEY_SUFFIX}",
|
||||
tok=self.user1_access_token,
|
||||
expect_code=HTTPStatus.OK,
|
||||
)
|
||||
|
||||
def test_room_creator_can_set_state_with_other_userid_key(self) -> None:
|
||||
self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user1_user_id}",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.OK,
|
||||
)
|
||||
|
||||
def test_room_creator_can_set_state_with_other_suffixed_key(self) -> None:
|
||||
self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user1_user_id}{_STATE_KEY_SUFFIX}",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.OK,
|
||||
)
|
||||
|
||||
def test_user_cannot_set_state_with_other_userid_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user2_user_id}",
|
||||
tok=self.user1_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_user_cannot_set_state_with_other_suffixed_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user2_user_id}{_STATE_KEY_SUFFIX}",
|
||||
tok=self.user1_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_user_cannot_set_state_with_unseparated_suffixed_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.user1_user_id}{_STATE_KEY_SUFFIX[1:]}",
|
||||
tok=self.user1_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_user_cannot_set_state_with_misplaced_userid_in_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
# Still put @ at start of state key, because without it, there is no write protection at all
|
||||
state_key=f"@prefix_{self.user1_user_id}{_STATE_KEY_SUFFIX}",
|
||||
tok=self.user1_access_token,
|
||||
expect_code=HTTPStatus.FORBIDDEN,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.FORBIDDEN,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_room_creator_can_set_state_with_nonmember_userid_key(self) -> None:
|
||||
self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key="@notinroom:hs2",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.OK,
|
||||
)
|
||||
|
||||
def test_room_creator_cannot_set_state_with_malformed_userid_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key="@oops",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.BAD_REQUEST,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.BAD_JSON,
|
||||
body,
|
||||
)
|
||||
|
||||
def test_room_creator_cannot_set_state_with_improperly_suffixed_key(self) -> None:
|
||||
body = self.helper.send_state(
|
||||
self.room_id,
|
||||
_STATE_EVENT_TEST_TYPE,
|
||||
{},
|
||||
state_key=f"{self.creator_user_id}@{_STATE_KEY_SUFFIX[1:]}",
|
||||
tok=self.creator_access_token,
|
||||
expect_code=HTTPStatus.BAD_REQUEST,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
body["errcode"],
|
||||
Codes.BAD_JSON,
|
||||
body,
|
||||
)
|
||||
Reference in new issue
Block a user