93 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.0 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 synapse._pydantic_compat import HAS_PYDANTIC_V2
 | |
| 
 | |
| if TYPE_CHECKING or HAS_PYDANTIC_V2:
 | |
|     from pydantic.v1 import Extra, StrictInt, StrictStr, constr, validator
 | |
| else:
 | |
|     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
 |