mirror of
https://github.com/suitenumerique/meet.git
synced 2026-10-20 11:41:35 +00:00
dce67e37f8
Menshen is La Suite's OAuth 2.0 token exchange server (RFC 8693): another service exchanges its user's access token for a token targeting Meet, then calls the external API on behalf of that user. Tokens are validated by introspection (RFC 7662). Menshen only reports a token as active when Meet is among its audiences. Add Menshen auth to the external API. Only activate it for room creation scope (other scopes may be added later). If a user doesn't exist for the provided sub, create it, unless the provided email is already associated to a an existing account. This PR does not implement fallback to email to automatically create user when no sub or an invalid sub is passed and email is provided, when OIDC_FALLBACK_TO_EMAIL_FOR_IDENTIFICATION=True.
33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
"""Custom validators for the core app."""
|
|
|
|
from django.core.exceptions import ValidationError
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
|
|
def sub_validator(value):
|
|
"""Validate that the sub is printable ASCII only.
|
|
|
|
OpenID Connect Core 1.0 (section 2) allows any ASCII (RFC 20) string of
|
|
at most 255 characters, so no character whitelist is applied: providers
|
|
legitimately emit "|" (Auth0), ":" (Keycloak), "=", "/", etc. As a
|
|
deliberate hardening beyond the spec, ASCII control characters
|
|
(U+0000-U+001F and U+007F) are rejected: no known provider emits them,
|
|
NUL cannot be stored in PostgreSQL text fields, and the others invite
|
|
log-injection and interoperability issues. For str values,
|
|
``isprintable()`` is false exactly for those control characters, while
|
|
space (U+0020) remains allowed.
|
|
"""
|
|
msg = (
|
|
"Enter a valid sub. This value should be printable ASCII only, "
|
|
"with 255 characters or less."
|
|
)
|
|
|
|
if value is None:
|
|
raise ValidationError(_(msg))
|
|
|
|
if len(value) > 255:
|
|
raise ValidationError(_(msg))
|
|
|
|
if not value.isascii() or not value.isprintable():
|
|
raise ValidationError(_(msg))
|