Merge 340b30e923 into e9f0f31d27
commit
d34c0060e4
@ -0,0 +1,147 @@
|
||||
# MSC4337: Appservice API to supplement user profiles
|
||||
|
||||
User profiles in Matrix are currently largely stored on the homeserver statically. Clients can
|
||||
update the static information as often as they like, but it's expected that the homeserver
|
||||
maintains a copy in it's datastore. This means that having dynamic profile values that may change
|
||||
depending on a user's status (e.g. "In a meeting") or profiles that may change depending on the
|
||||
requester are hard to achieve.
|
||||
|
||||
This proposal extends the appservice API to offer a new route to supplement a user's profile with
|
||||
additional fields, or to replace existing ones.
|
||||
|
||||
## Proposal
|
||||
|
||||
A new route is introduced on the Application Service API:
|
||||
|
||||
`GET /_matrix/app/v1/profile/{userId}/{key}`
|
||||
|
||||
This API is authenticated as with the rest of the application service APIs, and takes two additional
|
||||
*optional* query parameters:
|
||||
|
||||
- `origin_server` The server name of the server requesting the profile, *if* the profile is requested
|
||||
over federation. Otherwise, omit.
|
||||
- `from_user_id` The user MxID of the user requesting the profile, *if* the requesting user is known.
|
||||
Otherwise, omit.
|
||||
|
||||
The path parameters match the C-S API `/profile` GET parameters, where `userId` is the user profile to be
|
||||
fetched and `key` is an optional field on the profile. If the `key` is omitted, the full profile should be returned.
|
||||
|
||||
The response to the API should be an object representing the profile. Homeservers should call this API
|
||||
whenever a user's profile is requested by a client or a federated service, and the appservice should return
|
||||
a profile object. If a `key` is specified then an object should be returned only containing the value for `key`.
|
||||
|
||||
### Examples
|
||||
|
||||
`GET /_matrix/app/v1/profile/@alice:example.org` would return
|
||||
|
||||
```json
|
||||
{
|
||||
"displayName": "Alice S.",
|
||||
"org.example.holiday": true
|
||||
}
|
||||
```
|
||||
|
||||
and
|
||||
|
||||
`GET /_matrix/app/v1/profile/@alice:example.org/org.example.holiday` would return
|
||||
|
||||
```json
|
||||
{
|
||||
"org.example.holiday": true
|
||||
}
|
||||
```
|
||||
|
||||
### Merging behaviour
|
||||
|
||||
The homeserver should *always* request the profile from the application service even if the `key` is already
|
||||
present in the user's stored profile. For instance, given a profile of:
|
||||
|
||||
```json
|
||||
{
|
||||
"displayName": "Bob",
|
||||
"avatar_url": "mxc://foo/bar"
|
||||
}
|
||||
```
|
||||
|
||||
and an appservice response of:
|
||||
|
||||
```json
|
||||
{
|
||||
"displayName": "Alice S.",
|
||||
"org.example.holiday": true
|
||||
}
|
||||
```
|
||||
|
||||
then the resulting profile for the user will be:
|
||||
|
||||
```json
|
||||
{
|
||||
"avatar_url": "mxc://foo/bar",
|
||||
"displayName": "Alice S.",
|
||||
"org.example.holiday": true
|
||||
}
|
||||
```
|
||||
|
||||
### Error codes
|
||||
|
||||
Application services may respond with a `404` `M_NOT_FOUND` if they do not provide any information
|
||||
for the given `userId`. They may also choose to do this if they do not want to divulge information
|
||||
about a given user to another user or service.
|
||||
|
||||
|
||||
### Caching
|
||||
|
||||
Homeservers should not cache responses to this endpoint as the values may change dynamically.
|
||||
|
||||
TODO: Should we introduce a ETag-like system here so homeservers can cache?
|
||||
|
||||
### Application service selection
|
||||
|
||||
Any homeserver with a matching `namespaces.users` field for the requested `userId` should be used
|
||||
when querying the profile. The resulting profile should be merged together. The order of application services
|
||||
here is **NOT** stable, and so if multiple application services set the same field on the same user
|
||||
then there is potential for instability. Server admins should take care not to register multiple application
|
||||
services with overlapping namespaces, if they may both alter the profile.
|
||||
|
||||
Implementations MAY choose to specify a guaranteed ordering for application service queries but this is out
|
||||
of scope for the spec.
|
||||
|
||||
The registration file **MUST** contain `supports_profile_lookup: true` to be considered for profile queries
|
||||
to reduce the number of requests made to appservices not supporting this feature.
|
||||
|
||||
## Potential issues
|
||||
|
||||
### Performance
|
||||
|
||||
This can place additional delay on the profile endpoint, as now an additional HTTP hit will need to be made. A sensible
|
||||
maximum response time should probably be specified to reduce the risk of a profile endpoint timing out. Additionally,
|
||||
the timeout should not prevent a client from reading the resulting profile, without the missing application service response.
|
||||
|
||||
### Instability
|
||||
|
||||
As per the previous section, application service querying is not inheriently stable across homeserver implementations
|
||||
so overlaps in profiles may lead to unpredictable results.
|
||||
|
||||
## Alternatives
|
||||
|
||||
Application services already can modify profiles, albeit with no controls over who can view them and with the added
|
||||
cost of these profiles being stored in the homeserver. There is also no way to update on-demand to reduce the amount
|
||||
of changes needed to be made to the homeservers stores.
|
||||
|
||||
## Security considerations
|
||||
|
||||
The most obvious security risk is that this MSC opens up the ability to do authed profile requests and alter the response
|
||||
depending on the requester. The application service and the homeserver must ensure not to cache these responses globally,
|
||||
and be careful when validating the requester.
|
||||
|
||||
TODO: There must be more things that can go wrong here.
|
||||
|
||||
## Unstable prefix
|
||||
|
||||
While this MSC is not considered stable:
|
||||
- the endpoint will be `/_matrix/app/uk.half-shot.msc4337/profile/@alice:example.org`
|
||||
- the registration file flag will be `msc4337_supports_profile_lookup`
|
||||
|
||||
## Dependencies
|
||||
|
||||
None.
|
||||
Loading…
Reference in New Issue