mirror of
https://github.com/matrix-org/matrix-spec
synced 2026-05-02 15:14:09 +02:00
Compare commits
1 commit
3b9253da9a
...
ba162dfcfd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ba162dfcfd |
|
|
@ -1 +0,0 @@
|
|||
Clarify formats of string types.
|
||||
|
|
@ -1 +0,0 @@
|
|||
Clarify how multiple signatures should be handled during signature verification. Contributed by @nexy7574.
|
||||
|
|
@ -3348,8 +3348,8 @@ room at the start of the returned timeline. The response also includes a
|
|||
`next_batch` field, which should be used as the value of the `since`
|
||||
parameter in the next call to `/sync`. Finally, the response includes,
|
||||
for each room, a `prev_batch` field, which can be passed as a `from`/`to`
|
||||
parameter to the [`/rooms/{roomId}/messages`](#get_matrixclientv3roomsroomidmessages)
|
||||
API to retrieve earlier messages.
|
||||
parameter to the [`/rooms/<room_id>/messages`](/client-server-api/#get_matrixclientv3roomsroomidmessages) API to retrieve earlier
|
||||
messages.
|
||||
|
||||
For example, a `/sync` request might return a range of four events
|
||||
`E2`, `E3`, `E4` and `E5` within a given room, omitting two prior events
|
||||
|
|
@ -3368,8 +3368,7 @@ response to the previous call as the `since` parameter. The client
|
|||
should also pass a `timeout` parameter. The server will then hold open
|
||||
the HTTP connection for a short period of time waiting for new events,
|
||||
returning early if an event occurs. Only the `/sync` API (and the
|
||||
deprecated [`/events`](#get_matrixclientv3events) API) support
|
||||
long-polling in this way.
|
||||
deprecated `/events` API) support long-polling in this way.
|
||||
|
||||
Continuing the example above, an incremental sync might report
|
||||
a single new event `E6`. The response can be visualised as:
|
||||
|
|
@ -3389,7 +3388,7 @@ containing only the most recent message events. A state "delta" is also
|
|||
returned, summarising any state changes in the omitted part of the
|
||||
timeline. The client may therefore end up with "gaps" in its knowledge
|
||||
of the message timeline. The client can fill these gaps using the
|
||||
[`/rooms/{roomId}/messages`](#get_matrixclientv3roomsroomidmessages) API.
|
||||
[`/rooms/<room_id>/messages`](/client-server-api/#get_matrixclientv3roomsroomidmessages) API.
|
||||
|
||||
Continuing our example, suppose we make a third `/sync` request asking for
|
||||
events since the last sync, by passing the `next_batch` token `x-y-z` as
|
||||
|
|
@ -3412,7 +3411,7 @@ The limited response includes a state delta which describes how the state
|
|||
of the room changes over the gap. This delta explains how to build the state
|
||||
prior to returned timeline (i.e. at `E7`) from the state the client knows
|
||||
(i.e. at `E6`). To close the gap, the client should make a request to
|
||||
[`/rooms/{roomId}/messages`](#get_matrixclientv3roomsroomidmessages)
|
||||
[`/rooms/<room_id>/messages`](/client-server-api/#get_matrixclientv3roomsroomidmessages)
|
||||
with the query parameters `from=x-y-z` and `to=d-e-f`.
|
||||
|
||||
{{% boxes/warning %}}
|
||||
|
|
|
|||
|
|
@ -1484,30 +1484,34 @@ the Policy Server for a signature too.
|
|||
When a server receives an event over federation from another server, the
|
||||
receiving server should check the hashes and signatures on that event.
|
||||
|
||||
First the signatures are checked. The event is redacted following the
|
||||
[redaction algorithm](/client-server-api#redactions), and
|
||||
the resultant object is checked for signatures from the originating
|
||||
First the signature is checked. The event is redacted following the
|
||||
[redaction
|
||||
algorithm](/client-server-api#redactions), and
|
||||
the resultant object is checked for a signature from the originating
|
||||
server, following the algorithm described in [Checking for a
|
||||
signature](/appendices#checking-for-a-signature). Note that this
|
||||
step should succeed whether we have been sent the full event or a
|
||||
redacted copy.
|
||||
|
||||
For room versions 3 and later, unless the event is a 3rd party invite, only the
|
||||
signature(s) from the originating server (the server the `sender` belongs to)
|
||||
are required for verification. Room versions 1 and 2 also require that a
|
||||
signature is present from the domain in the `event_id`, if it differs from the
|
||||
originating server. If a signature is from an unknown or expired key, it is
|
||||
skipped.
|
||||
The signatures expected on an event are:
|
||||
|
||||
If the event is a 3rd party invite, the sender must already match the 3rd party
|
||||
invite, and the server which actually sends the event may be a different
|
||||
server.
|
||||
- The `sender`'s server, unless the invite was created as a result of
|
||||
3rd party invite. The sender must already match the 3rd party
|
||||
invite, and the server which actually sends the event may be a
|
||||
different server.
|
||||
- For room versions 1 and 2, the server which created the `event_id`.
|
||||
Other room versions do not track the `event_id` over federation and
|
||||
therefore do not need a signature from those servers.
|
||||
|
||||
Only signatures from known server keys are validated here. Any unknown keys are ignored.
|
||||
In particular, the [policy server key](#validating-policy-server-signatures) is not
|
||||
expected to be published and therefore should be skipped at this stage.
|
||||
Additionally, any keys that are known to have expired prior to the event's
|
||||
`origin_server_ts` are ignored.
|
||||
If the signature is found to be valid, the expected content hash is
|
||||
calculated as described below. The content hash in the `hashes` property
|
||||
of the received event is base64-decoded, and the two are compared for
|
||||
equality.
|
||||
|
||||
If the hash check fails, then it is assumed that this is because we have
|
||||
only been given a redacted version of the event. To enforce this, the
|
||||
receiving server should use the redacted copy it calculated rather than
|
||||
the full copy it received.
|
||||
|
||||
{{% boxes/note %}}
|
||||
{{% added-in v="1.18" %}}
|
||||
|
|
@ -1515,16 +1519,6 @@ Events sent in rooms with [Policy Servers](#policy-servers) have [additional](#v
|
|||
signature validation requirements.
|
||||
{{% /boxes/note %}}
|
||||
|
||||
If all signatures from known unexpired keys from the originating server(s) are
|
||||
found to be valid, the expected content hash is calculated as described below.
|
||||
The content hash in the `hashes` property of the received event is base64-decoded,
|
||||
and the two are compared for equality.
|
||||
|
||||
If the hash check fails, then it is assumed that this is because we have
|
||||
only been given a redacted version of the event. To enforce this, the
|
||||
receiving server should use the redacted copy it calculated rather than
|
||||
the full copy it received.
|
||||
|
||||
### Calculating the reference hash for an event
|
||||
|
||||
The *reference hash* of an event covers the essential fields of an
|
||||
|
|
|
|||
|
|
@ -24,9 +24,8 @@ allOf:
|
|||
room_id:
|
||||
description: The ID of the room associated with this event.
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
example: '!jEsUZKDJdhlrceRyVU:example.org'
|
||||
|
||||
unsigned:
|
||||
properties:
|
||||
redacted_because:
|
||||
|
|
@ -44,6 +43,6 @@ allOf:
|
|||
"unsigned": {
|
||||
"age": 1257,
|
||||
}
|
||||
}
|
||||
}
|
||||
required:
|
||||
- room_id
|
||||
|
|
|
|||
|
|
@ -28,8 +28,6 @@ properties:
|
|||
event_id:
|
||||
description: The globally unique identifier for this event.
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
example: '$26RqwJMLw-yds1GAH_QxjHRC1Da9oasK0e5VLnck_45'
|
||||
type:
|
||||
description: The type of the event.
|
||||
|
|
@ -49,8 +47,6 @@ properties:
|
|||
sender:
|
||||
description: Contains the fully-qualified ID of the user who sent this event.
|
||||
type: string
|
||||
format: mx-user-id
|
||||
pattern: "^@"
|
||||
example: "@example:example.org"
|
||||
origin_server_ts:
|
||||
description: |-
|
||||
|
|
|
|||
|
|
@ -39,7 +39,5 @@ properties:
|
|||
such.
|
||||
event_id:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
description: The event ID of the event that this event relates to.
|
||||
required: ['rel_type', 'event_id']
|
||||
|
|
|
|||
|
|
@ -37,8 +37,6 @@ paths:
|
|||
example: "!636q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
- in: query
|
||||
name: from
|
||||
x-changedInMatrixVersion:
|
||||
|
|
|
|||
|
|
@ -148,8 +148,6 @@ paths:
|
|||
properties:
|
||||
room_id:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
description: The ID of this room.
|
||||
membership:
|
||||
type: string
|
||||
|
|
@ -339,8 +337,6 @@ paths:
|
|||
example: $asfDuShaf7Gafaw:matrix.org
|
||||
schema:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
responses:
|
||||
"200":
|
||||
description: The full event.
|
||||
|
|
|
|||
|
|
@ -43,17 +43,13 @@ paths:
|
|||
example: "!637q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
- in: path
|
||||
name: eventId
|
||||
description: The ID of the event to redact.
|
||||
description: The ID of the event to redact
|
||||
required: true
|
||||
example: $bai2b1i9:matrix.org
|
||||
example: bai2b1i9:matrix.org
|
||||
schema:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
- in: path
|
||||
name: txnId
|
||||
description: |-
|
||||
|
|
@ -86,8 +82,6 @@ paths:
|
|||
properties:
|
||||
event_id:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
description: A unique identifier for the event.
|
||||
examples:
|
||||
response:
|
||||
|
|
|
|||
|
|
@ -233,8 +233,6 @@ components:
|
|||
example: "!636q39766251:matrix.org"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
eventId:
|
||||
in: path
|
||||
name: eventId
|
||||
|
|
@ -243,8 +241,6 @@ components:
|
|||
example: $asfDuShaf7Gafaw
|
||||
schema:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
from:
|
||||
in: query
|
||||
name: from
|
||||
|
|
|
|||
|
|
@ -56,8 +56,6 @@ paths:
|
|||
example: "!636q39766251:matrix.org"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
- in: query
|
||||
name: ts
|
||||
description: |-
|
||||
|
|
@ -88,8 +86,6 @@ paths:
|
|||
properties:
|
||||
event_id:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
description: The ID of the event found
|
||||
origin_server_ts:
|
||||
type: integer
|
||||
|
|
|
|||
|
|
@ -27,8 +27,6 @@ paths:
|
|||
example: "!636q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
responses:
|
||||
"200":
|
||||
description: The current state of the room
|
||||
|
|
@ -40,8 +38,6 @@ paths:
|
|||
properties:
|
||||
room_id:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
description: The ID of this room.
|
||||
membership:
|
||||
type: string
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@ paths:
|
|||
example: "!636q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
- in: path
|
||||
name: eventType
|
||||
description: The type of event to send.
|
||||
|
|
@ -88,8 +86,6 @@ paths:
|
|||
properties:
|
||||
event_id:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
description: A unique identifier for the event.
|
||||
required:
|
||||
- event_id
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@ paths:
|
|||
example: "!636q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
- in: path
|
||||
name: eventType
|
||||
description: The type of event to send.
|
||||
|
|
@ -88,8 +86,6 @@ paths:
|
|||
properties:
|
||||
event_id:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
description: A unique identifier for the event.
|
||||
required:
|
||||
- event_id
|
||||
|
|
|
|||
|
|
@ -34,8 +34,6 @@ paths:
|
|||
example: "!636q39766251:matrix.org"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
- in: path
|
||||
name: eventId
|
||||
description: The event ID to get.
|
||||
|
|
@ -43,8 +41,6 @@ paths:
|
|||
example: $asfDuShaf7Gafaw:matrix.org
|
||||
schema:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
responses:
|
||||
"200":
|
||||
description: The full event.
|
||||
|
|
@ -93,8 +89,6 @@ paths:
|
|||
example: "!636q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
- in: path
|
||||
name: eventType
|
||||
description: The type of state to look up.
|
||||
|
|
@ -164,8 +158,6 @@ paths:
|
|||
example: "!636q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
responses:
|
||||
"200":
|
||||
description: The current state of the room
|
||||
|
|
@ -219,8 +211,6 @@ paths:
|
|||
example: "!636q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
- in: query
|
||||
name: at
|
||||
description: |-
|
||||
|
|
@ -315,8 +305,6 @@ paths:
|
|||
example: "!636q39766251:example.com"
|
||||
schema:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
security:
|
||||
- accessTokenQuery: []
|
||||
- accessTokenBearer: []
|
||||
|
|
|
|||
|
|
@ -209,8 +209,6 @@ paths:
|
|||
field may be omitted.
|
||||
items:
|
||||
type: string
|
||||
format: mx-user-id
|
||||
pattern: "^@"
|
||||
m.joined_member_count:
|
||||
type: integer
|
||||
description: |-
|
||||
|
|
|
|||
|
|
@ -20,13 +20,10 @@ properties:
|
|||
The signatures are calculated using the process described at
|
||||
[Signing JSON](/appendices/#signing-json).
|
||||
type: object
|
||||
patternProperties:
|
||||
"":
|
||||
x-pattern-format: mx-server-name
|
||||
type: object
|
||||
additionalProperties:
|
||||
type: string
|
||||
format: mx-unpadded-base64
|
||||
additionalProperties:
|
||||
type: object
|
||||
additionalProperties:
|
||||
type: string
|
||||
example: {
|
||||
"magic.forest": {
|
||||
"ed25519:3": "fQpGIW1Snz+pwLZu6sTy2aHy/DYWWTspTJRPyNp0PKkymfIsNffysMl6ObMMFdIJhk6g6pwlIqZ54rxo8SLmAg"
|
||||
|
|
|
|||
|
|
@ -11,7 +11,5 @@ allOf:
|
|||
The ID of the room associated with this event. Will not be present on events
|
||||
that arrive through `/sync`, despite being required everywhere else.
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
required:
|
||||
- room_id
|
||||
|
|
|
|||
|
|
@ -39,8 +39,6 @@ properties:
|
|||
sender:
|
||||
description: The `sender` for the event.
|
||||
type: string
|
||||
format: mx-user-id
|
||||
pattern: "^@"
|
||||
required:
|
||||
- type
|
||||
- state_key
|
||||
|
|
|
|||
|
|
@ -29,13 +29,9 @@ allOf:
|
|||
event_id:
|
||||
description: The globally unique event identifier.
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
sender:
|
||||
description: Contains the fully-qualified ID of the user who sent this event.
|
||||
type: string
|
||||
format: mx-user-id
|
||||
pattern: "^@"
|
||||
origin_server_ts:
|
||||
description: Timestamp in milliseconds on originating homeserver
|
||||
when this event was sent.
|
||||
|
|
|
|||
|
|
@ -16,8 +16,6 @@ properties:
|
|||
The canonical alias for the room. If not present, null, or empty the
|
||||
room should be considered to have no canonical alias.
|
||||
type: string
|
||||
format: mx-room-alias
|
||||
pattern: "^#"
|
||||
alt_aliases:
|
||||
description: |
|
||||
Alternative aliases the room advertises. This list can have aliases
|
||||
|
|
@ -25,8 +23,6 @@ properties:
|
|||
type: array
|
||||
items:
|
||||
type: string
|
||||
format: mx-room-alias
|
||||
pattern: "^#"
|
||||
type: object
|
||||
state_key:
|
||||
description: A zero-length string.
|
||||
|
|
|
|||
|
|
@ -12,8 +12,6 @@ properties:
|
|||
The `user_id` of the room creator. **Required** for, and only present in, room versions 1 - 10. Starting with
|
||||
room version 11 the event `sender` should be used instead.
|
||||
type: string
|
||||
format: mx-user-id
|
||||
pattern: "^@"
|
||||
m.federate:
|
||||
description: Whether users on other servers can join this room. Defaults to `true` if key does not exist.
|
||||
type: boolean
|
||||
|
|
@ -34,13 +32,9 @@ properties:
|
|||
properties:
|
||||
room_id:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
description: The ID of the old room.
|
||||
event_id:
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
deprecated: true
|
||||
x-changedInMatrixVersion:
|
||||
"1.16": |-
|
||||
|
|
@ -57,8 +51,6 @@ properties:
|
|||
type: array
|
||||
items:
|
||||
type: string
|
||||
format: mx-user-id
|
||||
pattern: "^@"
|
||||
description: Additional user ID to consider a creator of the room, if supported by the room version.
|
||||
x-addedInMatrixVersion: "1.16"
|
||||
description: |-
|
||||
|
|
|
|||
|
|
@ -55,8 +55,6 @@ properties:
|
|||
enum: ['m.room_membership']
|
||||
room_id:
|
||||
type: string
|
||||
format: mx-room-id
|
||||
pattern: "^!"
|
||||
description: |-
|
||||
Required if `type` is `m.room_membership`. The room ID to check the
|
||||
user's membership against. If the user is joined to this room, they
|
||||
|
|
|
|||
|
|
@ -76,8 +76,6 @@ properties:
|
|||
join_authorised_via_users_server:
|
||||
x-addedInMatrixVersion: "1.2"
|
||||
type: string
|
||||
format: mx-user-id
|
||||
pattern: "^@"
|
||||
description: |-
|
||||
Usually found on `join` events, this field is used to denote which homeserver (through
|
||||
representation of a user with sufficient power level) authorised the user's join. More
|
||||
|
|
@ -129,8 +127,6 @@ properties:
|
|||
`join`, the user ID sending the event does not need to match the user ID in the `state_key`,
|
||||
unlike other events. Regular authorisation rules still apply.
|
||||
type: string
|
||||
format: mx-user-id
|
||||
pattern: "^@"
|
||||
type:
|
||||
enum:
|
||||
- m.room.member
|
||||
|
|
|
|||
|
|
@ -10,8 +10,6 @@ properties:
|
|||
redacts:
|
||||
description: The event ID that was redacted. Required for, and present starting in, room version 11.
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
reason:
|
||||
description: 'The reason for the redaction, if any.'
|
||||
type: string
|
||||
|
|
@ -19,8 +17,6 @@ properties:
|
|||
redacts:
|
||||
description: Required for, and only present in, room versions 1 - 10. The event ID that was redacted.
|
||||
type: string
|
||||
format: mx-event-id
|
||||
pattern: "^\\$"
|
||||
type:
|
||||
enum:
|
||||
- m.room.redaction
|
||||
|
|
|
|||
|
|
@ -66,11 +66,6 @@ mx-mxc-uri:
|
|||
url: client-server-api#matrix-content-mxc-uris
|
||||
# regex: "^mxc:\\/\\/"
|
||||
|
||||
mx-unpadded-base64:
|
||||
title: Unpadded Base64
|
||||
url: appendices#unpadded-base64
|
||||
# no regex
|
||||
|
||||
uri:
|
||||
title: URI
|
||||
url: https://datatracker.ietf.org/doc/html/rfc3986
|
||||
|
|
|
|||
Loading…
Reference in a new issue