88 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
# 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.
 | 
						|
from typing import TYPE_CHECKING, Dict, Optional
 | 
						|
 | 
						|
from pydantic import Extra, StrictInt, StrictStr, constr, validator
 | 
						|
 | 
						|
from synapse.rest.models import RequestBodyModel
 | 
						|
from synapse.util.threepids import validate_email
 | 
						|
 | 
						|
 | 
						|
class AuthenticationData(RequestBodyModel):
 | 
						|
    """
 | 
						|
    Data used during user-interactive authentication.
 | 
						|
 | 
						|
    (The name "Authentication Data" is taken directly from the spec.)
 | 
						|
 | 
						|
    Additional keys will be present, depending on the `type` field. Use
 | 
						|
    `.dict(exclude_unset=True)` to access them.
 | 
						|
    """
 | 
						|
 | 
						|
    class Config:
 | 
						|
        extra = Extra.allow
 | 
						|
 | 
						|
    session: Optional[StrictStr] = None
 | 
						|
    type: Optional[StrictStr] = None
 | 
						|
 | 
						|
 | 
						|
if TYPE_CHECKING:
 | 
						|
    ClientSecretStr = StrictStr
 | 
						|
else:
 | 
						|
    # See also assert_valid_client_secret()
 | 
						|
    ClientSecretStr = constr(
 | 
						|
        regex="[0-9a-zA-Z.=_-]",  # noqa: F722
 | 
						|
        min_length=1,
 | 
						|
        max_length=255,
 | 
						|
        strict=True,
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class ThreepidRequestTokenBody(RequestBodyModel):
 | 
						|
    client_secret: ClientSecretStr
 | 
						|
    id_server: Optional[StrictStr]
 | 
						|
    id_access_token: Optional[StrictStr]
 | 
						|
    next_link: Optional[StrictStr]
 | 
						|
    send_attempt: StrictInt
 | 
						|
 | 
						|
    @validator("id_access_token", always=True)
 | 
						|
    def token_required_for_identity_server(
 | 
						|
        cls, token: Optional[str], values: Dict[str, object]
 | 
						|
    ) -> Optional[str]:
 | 
						|
        if values.get("id_server") is not None and token is None:
 | 
						|
            raise ValueError("id_access_token is required if an id_server is supplied.")
 | 
						|
        return token
 | 
						|
 | 
						|
 | 
						|
class EmailRequestTokenBody(ThreepidRequestTokenBody):
 | 
						|
    email: StrictStr
 | 
						|
 | 
						|
    # Canonicalise the email address. The addresses are all stored canonicalised
 | 
						|
    # in the database. This allows the user to reset his password without having to
 | 
						|
    # know the exact spelling (eg. upper and lower case) of address in the database.
 | 
						|
    # Without this, an email stored in the database as "foo@bar.com" would cause
 | 
						|
    # user requests for "FOO@bar.com" to raise a Not Found error.
 | 
						|
    _email_validator = validator("email", allow_reuse=True)(validate_email)
 | 
						|
 | 
						|
 | 
						|
if TYPE_CHECKING:
 | 
						|
    ISO3116_1_Alpha_2 = StrictStr
 | 
						|
else:
 | 
						|
    # Per spec: two-letter uppercase ISO-3166-1-alpha-2
 | 
						|
    ISO3116_1_Alpha_2 = constr(regex="[A-Z]{2}", strict=True)
 | 
						|
 | 
						|
 | 
						|
class MsisdnRequestTokenBody(ThreepidRequestTokenBody):
 | 
						|
    country: ISO3116_1_Alpha_2
 | 
						|
    phone_number: StrictStr
 |