Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarifications to AS spec, including MSC3905 #1305

Merged
merged 6 commits into from
Nov 8, 2022
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Clarify that application services can only register an interest in local users, as per [MSC3905](https://github.com/matrix-org/matrix-spec-proposals/issues/3905).
88 changes: 31 additions & 57 deletions content/application-service-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,8 @@ registration for suspicious regex strings.
{{% /boxes/note %}}

Application services register "namespaces" of user IDs, room aliases and
room IDs. These namespaces are represented as regular expressions. An
application service is said to be "interested" in a given event if one
of the IDs in the event match the regular expression provided by the
application service, such as the room having an alias or ID in the
relevant namespaces. Similarly, the application service is said to be
interested in a given event if one of the application service's
namespaced users is the target of the event, or is a joined member of
the room where the event occurred.
room IDs. An application service is said to be "interested" in a given event
if it matches any of the namespaces.
Comment on lines +40 to +41
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
room IDs. An application service is said to be "interested" in a given event
if it matches any of the namespaces.
room IDs. An application service is said to be "interested" in a given event
if it matches any of the namespace regex patterns.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not entirely convinced this is an improvement in clarity, personally. The fact that namespaces are defined via regular expressions is a detail which I think is better left for the formal definition below rather in this overview.

(In any case, we'd want to say "namespace regular expressions" rather than "namespace regex patterns").

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"namespace regular expressions" sounds good to me 👍

I think it makes sense to mention when we're talking about matching. It's immediately apparent and understandable for anyone slightly familiar with regex how it matches then.


An application service can also state whether they should be the only
ones who can manage a specified namespace. This is referred to as an
Expand All @@ -53,28 +47,12 @@ application services from creating/deleting entities in that namespace.
Typically, exclusive namespaces are used when the rooms represent real
rooms on another service (e.g. IRC). Non-exclusive namespaces are used
when the application service is merely augmenting the room itself (e.g.
providing logging or searching facilities). Namespaces are represented
by POSIX extended regular expressions and look like:
richvdh marked this conversation as resolved.
Show resolved Hide resolved
providing logging or searching facilities).

users:
- exclusive: true
regex: "@_irc_bridge_.*"

Application services may define the following namespaces (with none
being explicitly required):

| Name | Description |
|----------|------------------------------------------------------------|
| users | Events which are sent from certain users. |
| aliases | Events which are sent in rooms with certain room aliases. |
| rooms | Events which are sent in rooms with certain room IDs. |

Each individual namespace MUST declare the following fields:
The registration is represented by a series of key-value pairs, which
is normally encoded as an object in a YAML file. It has the following structure:

| Name | Description |
|------------|------------------------------------------------------------------------------------------------------------------------------------|
| exclusive | **Required** A true or false value stating whether this application service has exclusive access to events within this namespace. |
| regex | **Required** A regular expression defining which values this namespace includes. |
{{% definition path="api/application-service/definitions/registration" %}}

Exclusive user and alias namespaces should begin with an underscore
after the sigil to avoid collisions with other users on the homeserver.
Expand All @@ -83,38 +61,34 @@ they represent in the reserved namespace. For example, `@_irc_.*` would
be a good namespace to register for an application service which deals
with IRC.

The registration is represented by a series of key-value pairs, which
this specification will present as YAML. See below for the possible
options along with their explanation:


| Name | Description |
|-------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|
| id | **Required** A unique, user-defined ID of the application service which will never change. |
| url | **Required** The URL for the application service. May include a path after the domain name. Optionally set to null if no traffic is required. |
| as_token | **Required** A unique token for application services to use to authenticate requests to Homeservers. |
| hs_token | **Required** A unique token for Homeservers to use to authenticate requests to application services. |
| sender_localpart | **Required** The localpart of the user associated with the application service. |
| namespaces | **Required** A list of `users`, `aliases` and `rooms` namespaces that the application service controls. |
| rate_limited | Whether requests from masqueraded users are rate-limited. The sender is excluded. |
| protocols | The external protocols which the application service provides (e.g. IRC). |

An example registration file for an IRC-bridging application service is
below:

id: "IRC Bridge"
url: "http://127.0.0.1:1234"
as_token: "30c05ae90a248a4188e620216fa72e349803310ec83e2a77b34fe90be6081f46"
hs_token: "312df522183efd404ec1cd22d2ffa4bbc76a8c1ccf541dd692eef281356bb74e"
sender_localpart: "_irc_bot" # Will result in @_irc_bot:example.org
namespaces:
users:
- exclusive: true
regex: "@_irc_bridge_.*"
aliases:
- exclusive: false
regex: "#_irc_bridge_.*"
rooms: []
```yaml
id: "IRC Bridge"
url: "http://127.0.0.1:1234"
as_token: "30c05ae90a248a4188e620216fa72e349803310ec83e2a77b34fe90be6081f46"
hs_token: "312df522183efd404ec1cd22d2ffa4bbc76a8c1ccf541dd692eef281356bb74e"
sender_localpart: "_irc_bot" # Will result in @_irc_bot:example.org
namespaces:
users:
- exclusive: true
regex: "@_irc_bridge_.*"
aliases:
- exclusive: false
regex: "#_irc_bridge_.*"
rooms: []
```

{{% boxes/note %}}
Application services can only register interest in *local* users (i.e., users
whose IDs end with the `server_name` of the local homeserver). Events affecting
users on other homeservers are not sent to an application service, even if the
user happens to match the one of the `users` namespaces (unless, of course, the
event affects a room that the application service is interested in for another
room - for example, because there is another user in the room that the
application service is interested in).
richvdh marked this conversation as resolved.
Show resolved Hide resolved
{{% /boxes/note %}}

{{% boxes/warning %}}
If the homeserver in question has multiple application services, each
Expand Down
28 changes: 28 additions & 0 deletions data/api/application-service/definitions/namespace_list.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright 2022 The Matrix.org Foundation C.I.C
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

type: array
items:
type: object
title: Namespace
properties:
regex:
type: string
description: A POSIX regular expression defining which values this namespace includes.
exclusive:
type: boolean
description: A true or false value stating whether this application service has exclusive access to events within this namespace.
required:
- regex
- exclusive
74 changes: 74 additions & 0 deletions data/api/application-service/definitions/registration.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Copyright 2022 The Matrix.org Foundation C.I.C
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

type: object
title: Registration
properties:
id:
type: string
description: A unique, user-defined ID of the application service which will never change.
url:
type: string
description: The URL for the application service. May include a path after the domain name. Optionally set to null if no traffic is required.
as_token:
type: string
description: A secret token that the application service will use to authenticate requests to the homeserver.
hs_token:
type: string
description: A secret token that the homeserver will use authenticate requests to the application service.
sender_localpart:
type: string
description: The localpart of the user associated with the application service.
namespaces:
type: object
title: Namespaces
description: The namespaces that the application service is interested in.
properties:
users:
allOf:
- $ref: namespace_list.yaml
- description: |-
A list of namespaces defining the user IDs that the application
service is interested in. Events will be sent to the AS if a
local user matching one of the namespaces is the target of the event,
or is a joined member of the room where the event occurred.
rooms:
allOf:
- $ref: namespace_list.yaml
- description: |-
A list of namespaces defining the room IDs that the application
service is interested in. Events will be sent to the AS if they
take place in a room with an ID matching one of the namespaces.
richvdh marked this conversation as resolved.
Show resolved Hide resolved
aliases:
allOf:
- $ref: namespace_list.yaml
- description: |-
A list of namespaces defining the room aliases that the application
service is interested in. Events will be sent to the AS if they
take place in a room with an alias matching one of the namespaces.
richvdh marked this conversation as resolved.
Show resolved Hide resolved
rate_limited:
type: boolean
description: Whether requests from masqueraded users are rate-limited. The sender is excluded.
protocols:
type: array
description: The external protocols which the application service provides (e.g. IRC).
items:
type: string
required:
- id
- url
- as_token
- hs_token
- sender_localpart
- namespaces