Compare commits

..

5 commits

Author SHA1 Message Date
codedust 056b61ab84
Merge f42ce28bfe into 7bc016bda6 2025-09-16 10:21:35 +02:00
Travis Ralston 7bc016bda6
Specification for MSC4311: Create event availability in stripped state (#2207)
Some checks failed
Spec / 🔎 Validate OpenAPI specifications (push) Has been cancelled
Spec / 🔎 Check Event schema examples (push) Has been cancelled
Spec / 🔎 Check OpenAPI definitions examples (push) Has been cancelled
Spec / 🔎 Check JSON Schemas inline examples (push) Has been cancelled
Spec / ⚙️ Calculate baseURL for later jobs (push) Has been cancelled
Spec / 📢 Run towncrier for changelog (push) Has been cancelled
Spell Check / Spell Check with Typos (push) Has been cancelled
Spec / 🐍 Build OpenAPI definitions (push) Has been cancelled
Spec / 📖 Build the spec (push) Has been cancelled
Spec / 🔎 Validate generated HTML (push) Has been cancelled
Spec / 📖 Build the historical backup spec (push) Has been cancelled
* Part 1: Invites

* Part 2: Knocks

* Use correct schema and examples; Remind readers often about formats

* changelogs

* Add schema warning

* Name the objects

* Move changed-in and expand upon it

* Rename the example

* address review feedback
2025-09-12 13:47:13 -06:00
Patrick Cloke fea0b925a0
Add time zone profile field from MSC4175 (#2206)
Some checks failed
Spec / 🔎 Validate OpenAPI specifications (push) Has been cancelled
Spec / 🔎 Check Event schema examples (push) Has been cancelled
Spec / 🔎 Check OpenAPI definitions examples (push) Has been cancelled
Spec / 🔎 Check JSON Schemas inline examples (push) Has been cancelled
Spec / ⚙️ Calculate baseURL for later jobs (push) Has been cancelled
Spec / 📢 Run towncrier for changelog (push) Has been cancelled
Spell Check / Spell Check with Typos (push) Has been cancelled
Spec / 🐍 Build OpenAPI definitions (push) Has been cancelled
Spec / 📖 Build the spec (push) Has been cancelled
Spec / 🔎 Validate generated HTML (push) Has been cancelled
Spec / 📖 Build the historical backup spec (push) Has been cancelled
2025-09-09 12:02:39 -04:00
Kim Brose bfbeb5e257
clarify world_readable history visibility (#2204)
Signed-off-by: HarHarLinks <2803622+HarHarLinks@users.noreply.github.com>
2025-09-09 16:02:51 +01:00
Kim Brose d1a51f7b8c
fix typo in MSC process (#2205)
Co-authored-by: Andrew Morgan <andrew@amorgan.xyz>
2025-09-09 09:02:32 +00:00
18 changed files with 196 additions and 66 deletions

View file

@ -1 +1 @@
Update user profile endpoints to handle custom fields, and add a new `m.profile_fields` capability,as per [MSC4133](https://github.com/matrix-org/matrix-spec-proposals/pull/4133). Update user profile endpoints to handle custom fields, and add a new `m.profile_fields` capability, as per [MSC4133](https://github.com/matrix-org/matrix-spec-proposals/pull/4133).

View file

@ -0,0 +1 @@
Clarify wording around the `world_readable` history visibility setting. Contributed by @HarHarLinks.

View file

@ -0,0 +1 @@
Add a profile field for a user's time zone, per [MSC4175](https://github.com/matrix-org/matrix-spec-proposals/pull/4175).

View file

@ -0,0 +1 @@
Invites and knocks are now expected to contain the `m.room.create` event in their stripped state entries, as per [MSC4311](https://github.com/matrix-org/matrix-spec-proposals/pull/4311).

View file

@ -0,0 +1 @@
Fix a grammatical typo on the Matrix Spec Process documentation page.

View file

@ -0,0 +1 @@
`invite_room_state` and `knock_room_state` now have additional requirements and validation depending on the room version, as per [MSC4311](https://github.com/matrix-org/matrix-spec-proposals/pull/4311).

View file

@ -2818,6 +2818,14 @@ should be represented as stripped state events when possible:
* [`m.room.canonical_alias`](#mroomcanonical_alias) * [`m.room.canonical_alias`](#mroomcanonical_alias)
* [`m.room.encryption`](#mroomencryption) * [`m.room.encryption`](#mroomencryption)
{{% changed-in v="1.16" %}} The `m.room.create` event is now **required** in
the following places:
* [`invite_state`](#get_matrixclientv3sync_response-200_invited-room) and
[`knock_state`](#get_matrixclientv3sync_response-200_knocked-room) on
[`/sync`](#get_matrixclientv3sync) responses.
* On [`m.room.member`](#mroommember) events, the `invite_room_state`
and `knock_room_state` under `unsigned` on the event.
{{% boxes/note %}} {{% boxes/note %}}
Clients should inspect the list of stripped state events and not assume any Clients should inspect the list of stripped state events and not assume any
particular event is present. The server might include events not described particular event is present. The server might include events not described
@ -2848,6 +2856,12 @@ events are not signed and could theoretically be modified, or outdated due to
updates not being sent. updates not being sent.
{{% /boxes/warning %}} {{% /boxes/warning %}}
{{% boxes/warning %}}
{{% added-in v="1.16" %}} Servers cannot pass through what they receive over
federation to clients as stripped state. Servers are expected to prune the events
into the stripped state schema below before passing the details onto clients.
{{% /boxes/warning %}}
{{% event-fields event_type="stripped_state" %}} {{% event-fields event_type="stripped_state" %}}
### Size limits ### Size limits

View file

@ -16,8 +16,8 @@ The four options for the `m.room.history_visibility` event are:
- `world_readable` - All events while this is the - `world_readable` - All events while this is the
`m.room.history_visibility` value may be shared by any participating `m.room.history_visibility` value may be shared by any participating
homeserver with anyone, regardless of whether they have ever joined homeserver with any authenticated user, regardless of whether they have
the room. ever joined the room. This includes [guest users](#guest-access).
- `shared` - Previous events are always accessible to newly joined - `shared` - Previous events are always accessible to newly joined
members. All events in the room are accessible, even those sent when members. All events in the room are accessible, even those sent when
the member was not a part of the room. the member was not a part of the room.
@ -44,7 +44,7 @@ setting at that time was more restrictive.
#### Client behaviour #### Client behaviour
Clients may want to display a notice that events may be read by Clients may want to display a notice that events may be read by
non-joined people if the history visibility is set to `world_readable`. non-joined users if the history visibility is set to `world_readable`.
#### Server behaviour #### Server behaviour

View file

@ -6,7 +6,7 @@ It is sometimes desirable to offer a preview of a room, where a user can
This can be particularly effective when combined with [Guest Access](#guest-access). This can be particularly effective when combined with [Guest Access](#guest-access).
Previews are implemented via the `world_readable` [Room History Previews are implemented via the `world_readable` [Room History
Visibility](#room-history-visibility). setting, along with a special version of the [GET Visibility](#room-history-visibility) setting, along with a special version of the [GET
/events](#get_matrixclientv3events) endpoint. /events](#get_matrixclientv3events) endpoint.
#### Client behaviour #### Client behaviour

View file

@ -555,7 +555,7 @@ resolve to the desired MSC, whether it started as an issue or a PR.
Other metadata: Other metadata:
- The MSC number is taken from the GitHub Pull Request ID. This is - The MSC number is taken from the GitHub Pull Request ID. This is
carried for the lifetime of the proposal. These IDs do not necessary carried for the lifetime of the proposal. These IDs do not necessarily
represent a chronological order. represent a chronological order.
- The GitHub PR title will act as the MSC's title. - The GitHub PR title will act as the MSC's title.
- Please link to the spec PR (if any) by adding a "PRs: \#1234" line - Please link to the spec PR (if any) by adding a "PRs: \#1234" line

View file

@ -945,6 +945,18 @@ Note that invites are used to indicate that knocks were accepted. As such,
receiving servers should be prepared to manually link up a previous knock receiving servers should be prepared to manually link up a previous knock
to an invite if the invite event does not directly reference the knock. to an invite if the invite event does not directly reference the knock.
{{% boxes/note %}}
{{% added-in v="1.16" %}} `invite_room_state` MUST now have its entries formatted
according to the room's version (see [room version specification](/rooms)). However,
servers SHOULD consider their local ecosystems before returning the described
`400 M_MISSING_PARAM` error code. While migrating, servers SHOULD warn about
invites which fail the validation rather than error in room versions 1 through 11.
All invites to other room versions which fail validation SHOULD result in an error.
The specification suggests that servers finish their migration no later than
January 2026, though servers may extend this as required to support their users.
{{% /boxes/note %}}
{{% http-api spec="server-server" api="invites-v1" %}} {{% http-api spec="server-server" api="invites-v1" %}}
{{% http-api spec="server-server" api="invites-v2" %}} {{% http-api spec="server-server" api="invites-v2" %}}

View file

@ -43,7 +43,7 @@ properties:
example: "All things general" example: "All things general"
world_readable: world_readable:
type: boolean type: boolean
description: Whether the room may be viewed by guest users without joining. description: Whether the room may be viewed by users without joining.
example: false example: false
guest_can_join: guest_can_join:
type: boolean type: boolean

View file

@ -19,7 +19,7 @@ paths:
"/profile/{userId}/{keyName}": "/profile/{userId}/{keyName}":
put: put:
x-changedInMatrixVersion: x-changedInMatrixVersion:
"1.16": This endpoint now accepts a variable `keyName` parameter. Previously only `displayname` and `avatar_url` were accepted. "1.16": This endpoint now accepts a variable `keyName` parameter and `m.tz` was added as a defined key. Previously only `displayname` and `avatar_url` were accepted.
summary: Set a profile field for a user. summary: Set a profile field for a user.
description: |- description: |-
Set or update a profile field for a user. Must be authenticated with an Set or update a profile field for a user. Must be authenticated with an
@ -44,13 +44,13 @@ paths:
- in: path - in: path
name: keyName name: keyName
description: The name of the profile field to set. This MUST be either description: The name of the profile field to set. This MUST be either
`avatar_url`, `displayname`, or a custom field following the `avatar_url`, `displayname`, `m.tz`, or a custom field following the
[Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar). [Common Namespaced Identifier Grammar](/appendices/#common-namespaced-identifier-grammar).
required: true required: true
example: "displayname" example: "displayname"
schema: schema:
type: string type: string
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$' pattern: '^(avatar_url|displayname|m\.tz|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
requestBody: requestBody:
description: A JSON object containing the property whose name matches description: A JSON object containing the property whose name matches
the `keyName` specified in the URL. See `additionalProperties` for the `keyName` specified in the URL. See `additionalProperties` for
@ -69,6 +69,10 @@ paths:
For `displayname`, the value MUST be a string. For `displayname`, the value MUST be a string.
For `m.tz`, the value MUST be a valid identifier from the [IANA Time Zone Database](https://www.iana.org/time-zones).
Servers MAY choose to validate the value. Clients MUST expect unknown or invalid
values.
For custom keys, any JSON type is allowed. Servers MAY not validate For custom keys, any JSON type is allowed. Servers MAY not validate
these values, but clients SHOULD follow the format defined for that key. these values, but clients SHOULD follow the format defined for that key.
additionalProperties: true additionalProperties: true
@ -137,7 +141,7 @@ paths:
- User data - User data
get: get:
x-changedInMatrixVersion: x-changedInMatrixVersion:
"1.16": This endpoint now accepts a variable `keyName` parameter. Previously only `displayname` and `avatar_url` were accepted. "1.16": This endpoint now accepts a variable `keyName` parameter and `m.tz` was added as a defined key. Previously only `displayname` and `avatar_url` were accepted.
summary: Get a profile field for a user. summary: Get a profile field for a user.
description: Get the value of a profile field for a user. description: Get the value of a profile field for a user.
operationId: getProfileField operationId: getProfileField
@ -156,7 +160,7 @@ paths:
example: "displayname" example: "displayname"
schema: schema:
type: string type: string
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$' pattern: '^(avatar_url|displayname|m\.tz|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
responses: responses:
"200": "200":
description: The profile field value was retrieved. description: The profile field value was retrieved.
@ -214,7 +218,7 @@ paths:
example: "displayname" example: "displayname"
schema: schema:
type: string type: string
pattern: '^(avatar_url|displayname|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$' pattern: '^(avatar_url|displayname|m\.tz|[a-z][a-z0-9_]*(\.[a-z][a-z0-9_]*)+)$'
responses: responses:
"200": "200":
description: The profile field was deleted or it doesn't exist. description: The profile field was deleted or it doesn't exist.
@ -293,6 +297,10 @@ paths:
type: string type: string
description: The user's display name if they have set one, otherwise not description: The user's display name if they have set one, otherwise not
present. present.
m.tz:
x-addedInMatrixVersion: "1.16"
type: string
description: The user's time zone.
additionalProperties: additionalProperties:
x-addedInMatrixVersion: "1.16" x-addedInMatrixVersion: "1.16"
description: Additional profile fields. description: Additional profile fields.
@ -302,6 +310,7 @@ paths:
{ {
"avatar_url": "mxc://matrix.org/SDGdghriugerRg", "avatar_url": "mxc://matrix.org/SDGdghriugerRg",
"displayname": "Alice Margatroid", "displayname": "Alice Margatroid",
"m.tz": "Europe/London",
"m.example_field": "custom_value", "m.example_field": "custom_value",
} }
"403": "403":

View file

@ -0,0 +1,9 @@
[
{"$ref": "./minimal_pdu.json"},
{
"type": "m.room.create",
"content": {
"see_room_version_spec": "The event format changes depending on the room version."
}
}
]

View file

@ -71,13 +71,32 @@ paths:
properties: properties:
invite_room_state: invite_room_state:
type: array type: array
x-changedInMatrixVersion:
"1.16": |
`m.room.create` and format requirements were added.
description: |- description: |-
An optional list of [stripped state events](/client-server-api/#stripped-state) A list of state events to help the receiver of the invite identify the room.
to help the receiver of the invite identify the room. Translated as [stripped state events](/client-server-api/#stripped-state)
over the Client-Server API.
MUST contain the `m.room.create` event for the room. All events listed
MUST additionally be formatted according to the room version specification.
Servers might need to apply validation to the `invite_room_state` depending
on room version. See the `400 M_MISSING_PARAM` error definition for more
information.
Note that events have a different format depending on the room
version - check the [room version specification](/rooms) for
precise event formats.
items: items:
$ref: ../../event-schemas/schema/core-event-schema/stripped_state.yaml type: object
example: title: PDU
$ref: ../../event-schemas/examples/invite_room_state.json properties: {}
description: |-
Note that events have a different format depending on the room
version - check the [room version specification](/rooms) for
precise event formats.
type: object type: object
required: true required: true
responses: responses:
@ -118,24 +137,7 @@ paths:
"origin_server_ts": 1549041175876, "origin_server_ts": 1549041175876,
"sender": "@someone:example.org", "sender": "@someone:example.org",
"unsigned": { "unsigned": {
"invite_room_state": [ "invite_room_state": {"$ref": "./examples/invite_or_knock_state.json"}
{
"type": "m.room.name",
"sender": "@bob:example.org",
"state_key": "",
"content": {
"name": "Example Room"
}
},
{
"type": "m.room.join_rules",
"sender": "@bob:example.org",
"state_key": "",
"content": {
"join_rule": "invite"
}
}
]
}, },
"content": { "content": {
"membership": "invite" "membership": "invite"
@ -168,6 +170,35 @@ paths:
"errcode": "M_FORBIDDEN", "errcode": "M_FORBIDDEN",
"error": "User cannot invite the target user." "error": "User cannot invite the target user."
} }
"400":
description: |-
The `M_MISSING_PARAM` error code is used to indicate one or more of
the following:
* The `m.room.create` event is missing from `invite_room_state`.
* One or more entries in `invite_room_state` are not formatted according
to the room's version.
* One or more events fails a [signature check](/server-server-api/#validating-hashes-and-signatures-on-received-events).
* One or more events does not reside in the same room as the invite.
Note: Some room versions may require calculating the room ID for an
event rather than relying on the presence of `room_id`.
Servers MAY apply the validation above to room versions 1 through 11,
and SHOULD apply the validation above to all other room versions.
If `M_MISSING_PARAM` is returned and the request is associated with a
Client-Server API request, the Client-Server API request SHOULD fail
with a 5xx error rather than being passed through.
content:
application/json:
schema:
$ref: ../client-server/definitions/errors/error.yaml
examples:
response:
value: {
"errcode": "M_MISSING_PARAM",
"error": "Create event not among invite state entries."
}
servers: servers:
- url: "{protocol}://{hostname}{basePath}" - url: "{protocol}://{hostname}{basePath}"
variables: variables:

View file

@ -72,13 +72,32 @@ paths:
$ref: definitions/invite_event.yaml $ref: definitions/invite_event.yaml
invite_room_state: invite_room_state:
type: array type: array
x-changedInMatrixVersion:
"1.16": |
`m.room.create` and format requirements were added.
description: |- description: |-
An optional list of [stripped state events](/client-server-api/#stripped-state) A list of state events to help the receiver of the invite identify the room.
to help the receiver of the invite identify the room. Translated as [stripped state events](/client-server-api/#stripped-state)
over the Client-Server API.
MUST contain the `m.room.create` event for the room. All events listed
MUST additionally be formatted according to the room version specification.
Servers might need to apply validation to the `invite_room_state` depending
on room version. See the `400 M_MISSING_PARAM` error definition for more
information.
Note that events have a different format depending on the room
version - check the [room version specification](/rooms) for
precise event formats.
items: items:
$ref: ../../event-schemas/schema/core-event-schema/stripped_state.yaml type: object
example: title: PDU
$ref: ../../event-schemas/examples/invite_room_state.json properties: {}
description: |-
Note that events have a different format depending on the room
version - check the [room version specification](/rooms) for
precise event formats.
required: required:
- room_version - room_version
- event - event
@ -111,24 +130,7 @@ paths:
"origin_server_ts": 1549041175876, "origin_server_ts": 1549041175876,
"sender": "@someone:example.org", "sender": "@someone:example.org",
"unsigned": { "unsigned": {
"invite_room_state": [ "invite_room_state": {"$ref": "./examples/invite_or_knock_state.json"}
{
"type": "m.room.name",
"sender": "@bob:example.org",
"state_key": "",
"content": {
"name": "Example Room"
}
},
{
"type": "m.room.join_rules",
"sender": "@bob:example.org",
"state_key": "",
"content": {
"join_rule": "invite"
}
}
]
}, },
"content": { "content": {
"membership": "invite" "membership": "invite"
@ -151,6 +153,24 @@ paths:
The error should be passed through to clients so that they The error should be passed through to clients so that they
may give better feedback to users. may give better feedback to users.
The `M_MISSING_PARAM` error code is used to indicate one or more of
the following:
* The `m.room.create` event is missing from `invite_room_state`.
* One or more entries in `invite_room_state` are not formatted according
to the room's version.
* One or more events fails a [signature check](/server-server-api/#validating-hashes-and-signatures-on-received-events).
* One or more events does not reside in the same room as the invite.
Note: Some room versions may require calculating the room ID for an
event rather than relying on the presence of `room_id`.
Servers MAY apply the validation above to room versions 1 through 11,
and SHOULD apply the validation above to all other room versions.
If `M_MISSING_PARAM` is returned and the request is associated with a
Client-Server API request, the Client-Server API request SHOULD fail
with a 5xx error rather than being passed through.
content: content:
application/json: application/json:
schema: schema:

View file

@ -293,19 +293,41 @@ paths:
knock_room_state: knock_room_state:
type: array type: array
items: items:
$ref: ../../event-schemas/schema/core-event-schema/stripped_state.yaml type: object
title: PDU
properties: {}
description: |-
Note that events have a different format depending on the room
version - check the [room version specification](/rooms) for
precise event formats.
x-changedInMatrixVersion:
"1.16": |
`m.room.create` and format requirements were added.
description: |- description: |-
A list of [stripped state events](/client-server-api/#stripped-state) A list of state events to help the initiator of the knock identify
to help the initiator of the knock identify the room. the room. Translated as [stripped state events](/client-server-api/#stripped-state)
over the Client-Server API.
MUST contain the `m.room.create` event for the room. All events
listed MUST additionally be formatted according to the room
version specification.
Entries which are [improperly signed](/server-server-api/#validating-hashes-and-signatures-on-received-events)
or formatted SHOULD be removed by the server prior to supplying
them over the Client-Server API.
Note that events have a different format depending on the room
version - check the [room version specification](/rooms) for
precise event formats.
example: example:
$ref: ../../event-schemas/examples/knock_room_state.json "$ref": "./examples/invite_or_knock_state.json"
required: required:
- knock_room_state - knock_room_state
examples: examples:
response: response:
value: { value: {
"knock_room_state": { "knock_room_state": {
"$ref": "../../event-schemas/examples/knock_room_state.json" "$ref": "./examples/invite_or_knock_state.json"
} }
} }
"403": "403":

View file

@ -137,6 +137,9 @@ properties:
- type: object - type: object
properties: properties:
invite_room_state: invite_room_state:
x-changedInMatrixVersion:
"1.16": |
`m.room.create` was made a required event type for stripped state.
description: |- description: |-
A subset of the state of the room at the time of the invite, if `membership` is `invite`. A subset of the state of the room at the time of the invite, if `membership` is `invite`.
Note that this state is informational, and SHOULD NOT be trusted; once the client has Note that this state is informational, and SHOULD NOT be trusted; once the client has
@ -145,16 +148,21 @@ properties:
they SHOULD behave properly (with possibly a degraded but not a broken experience) in they SHOULD behave properly (with possibly a degraded but not a broken experience) in
the absence of any particular events here. If they are set on the room, at least the the absence of any particular events here. If they are set on the room, at least the
state for `m.room.avatar`, `m.room.canonical_alias`, `m.room.join_rules`, and `m.room.name` state for `m.room.avatar`, `m.room.canonical_alias`, `m.room.join_rules`, and `m.room.name`
SHOULD be included. SHOULD be included. The `m.room.create` event MUST be included, though MAY be missing if
the server hasn't updated to support the Matrix 1.16 specification.
items: items:
$ref: "core-event-schema/stripped_state.yaml" $ref: "core-event-schema/stripped_state.yaml"
type: array type: array
knock_room_state: knock_room_state:
x-changedInMatrixVersion:
"1.16": |
`m.room.create` was made a required event type for stripped state.
description: |- description: |-
A subset of the state of the room at the time of the knock, if `membership` is `knock`. A subset of the state of the room at the time of the knock, if `membership` is `knock`.
This has the same restrictions as `invite_room_state`. If they are set on the room, at least This has the same restrictions as `invite_room_state`. If they are set on the room, at least
the state for `m.room.avatar`, `m.room.canonical_alias`, `m.room.join_rules`, `m.room.name`, the state for `m.room.avatar`, `m.room.canonical_alias`, `m.room.join_rules`, `m.room.name`,
and `m.room.encryption` SHOULD be included. and `m.room.encryption` SHOULD be included. The `m.room.create` event MUST be included,
though MAY be missing if the server hasn't updated to support the Matrix 1.16 specification.
items: items:
$ref: "core-event-schema/stripped_state.yaml" $ref: "core-event-schema/stripped_state.yaml"
type: array type: array