-
Notifications
You must be signed in to change notification settings - Fork 404
Support stable endpoint and scopes from the MSC3861 family #18549
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
Changes from all commits
f41e21d
9abd404
cb9fe38
ea84db8
0e50341
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
Support for the stable endpoint and scopes of [MSC3861](https://github.com/matrix-org/matrix-spec-proposals/pull/3861) & co. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -20,7 +20,7 @@ | |
# | ||
import logging | ||
from dataclasses import dataclass | ||
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional | ||
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Set | ||
from urllib.parse import urlencode | ||
|
||
from authlib.oauth2 import ClientAuth | ||
|
@@ -34,7 +34,6 @@ | |
AuthError, | ||
HttpResponseException, | ||
InvalidClientTokenError, | ||
OAuthInsufficientScopeError, | ||
SynapseError, | ||
UnrecognizedRequestError, | ||
) | ||
|
@@ -63,9 +62,10 @@ | |
|
||
# Scope as defined by MSC2967 | ||
# https://github.com/matrix-org/matrix-spec-proposals/pull/2967 | ||
SCOPE_MATRIX_API = "urn:matrix:org.matrix.msc2967.client:api:*" | ||
SCOPE_MATRIX_GUEST = "urn:matrix:org.matrix.msc2967.client:api:guest" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For reference, this guest scope was removed from MSC2967 in the rework commit |
||
SCOPE_MATRIX_DEVICE_PREFIX = "urn:matrix:org.matrix.msc2967.client:device:" | ||
UNSTABLE_SCOPE_MATRIX_API = "urn:matrix:org.matrix.msc2967.client:api:*" | ||
UNSTABLE_SCOPE_MATRIX_DEVICE_PREFIX = "urn:matrix:org.matrix.msc2967.client:device:" | ||
STABLE_SCOPE_MATRIX_API = "urn:matrix:client:api:*" | ||
STABLE_SCOPE_MATRIX_DEVICE_PREFIX = "urn:matrix:client:device:" | ||
|
||
# Scope which allows access to the Synapse admin API | ||
SCOPE_SYNAPSE_ADMIN = "urn:synapse:admin:*" | ||
|
@@ -444,9 +444,6 @@ async def _wrapped_get_user_by_req( | |
if not self._is_access_token_the_admin_token(access_token): | ||
await self._record_request(request, requester) | ||
|
||
if not allow_guest and requester.is_guest: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we get rid of all of the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Meh, it's still in the base 'auth' API, and this code is soon to go away anyway. The new stable integration doesn't have that anymore: https://github.com/element-hq/synapse/blob/develop/synapse/api/auth/mas.py |
||
raise OAuthInsufficientScopeError([SCOPE_MATRIX_API]) | ||
|
||
request.requester = requester | ||
|
||
return requester | ||
|
@@ -528,10 +525,11 @@ async def get_user_by_access_token( | |
scope: List[str] = introspection_result.get_scope_list() | ||
|
||
# Determine type of user based on presence of particular scopes | ||
has_user_scope = SCOPE_MATRIX_API in scope | ||
has_guest_scope = SCOPE_MATRIX_GUEST in scope | ||
has_user_scope = ( | ||
UNSTABLE_SCOPE_MATRIX_API in scope or STABLE_SCOPE_MATRIX_API in scope | ||
) | ||
|
||
if not has_user_scope and not has_guest_scope: | ||
if not has_user_scope: | ||
raise InvalidClientTokenError("No scope in token granting user rights") | ||
|
||
# Match via the sub claim | ||
|
@@ -579,19 +577,20 @@ async def get_user_by_access_token( | |
# We only allow a single device_id in the scope, so we find them all in the | ||
# scope list, and raise if there are more than one. The OIDC server should be | ||
# the one enforcing valid scopes, so we raise a 500 if we find an invalid scope. | ||
device_ids = [ | ||
tok[len(SCOPE_MATRIX_DEVICE_PREFIX) :] | ||
for tok in scope | ||
if tok.startswith(SCOPE_MATRIX_DEVICE_PREFIX) | ||
] | ||
device_ids: Set[str] = set() | ||
for tok in scope: | ||
if tok.startswith(UNSTABLE_SCOPE_MATRIX_DEVICE_PREFIX): | ||
device_ids.add(tok[len(UNSTABLE_SCOPE_MATRIX_DEVICE_PREFIX) :]) | ||
elif tok.startswith(STABLE_SCOPE_MATRIX_DEVICE_PREFIX): | ||
device_ids.add(tok[len(STABLE_SCOPE_MATRIX_DEVICE_PREFIX) :]) | ||
|
||
if len(device_ids) > 1: | ||
raise AuthError( | ||
500, | ||
"Multiple device IDs in scope", | ||
) | ||
|
||
device_id = device_ids[0] if device_ids else None | ||
device_id = next(iter(device_ids), None) | ||
|
||
if device_id is not None: | ||
# Sanity check the device_id | ||
|
@@ -617,5 +616,4 @@ async def get_user_by_access_token( | |
user_id=user_id, | ||
device_id=device_id, | ||
scope=scope, | ||
is_guest=(has_guest_scope and not has_user_scope), | ||
) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These are the same as the ones below
synapse/api/auth/msc3861_delegated.py
. We should have these shared from a single source of truth.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
synapse/api/auth/msc3861_delegated.py
should be removed sooner than later, so I don't really mind if they are shared for now