11import logging
2- from contextlib import suppress
3- from json import JSONDecodeError
42
53from aiohttp import web
64from aiohttp .web import RouteTableDef
75from common_library .error_codes import create_error_code
86from models_library .emails import LowerCaseEmailStr
97from models_library .products import ProductName
108from pydantic import (
11- BaseModel ,
12- Field ,
13- PositiveInt ,
14- SecretStr ,
159 TypeAdapter ,
16- ValidationError ,
17- field_validator ,
1810)
1911from servicelib .aiohttp import status
2012from servicelib .aiohttp .requests_validation import (
3527from ....utils_rate_limiting import global_rate_limit_route
3628from ....web_utils import flash_response
3729from ... import _confirmation_service , _security_service , _twofa_service
38- from ..._invitations_service import ConfirmedInvitationData
3930from ..._login_repository_legacy import (
4031 AsyncpgStorage ,
4132 ConfirmationTokenDict ,
4839 RESET_PASSWORD ,
4940 notify_user_confirmation ,
5041)
51- from ..._models import InputSchema , check_confirm_password_match
5242from ...constants import (
5343 MSG_PASSWORD_CHANGE_NOT_ALLOWED ,
5444 MSG_PASSWORD_CHANGED ,
6050 get_plugin_options ,
6151 get_plugin_settings ,
6252)
53+ from .confirmation_schemas import (
54+ CodePathParam ,
55+ PhoneConfirmationBody ,
56+ ResetPasswordConfirmation ,
57+ parse_extra_credits_in_usd_or_none ,
58+ )
6359
6460_logger = logging .getLogger (__name__ )
6561
6662
6763routes = RouteTableDef ()
6864
6965
70- class _PathParam (BaseModel ):
71- code : SecretStr
72-
73-
74- def _parse_extra_credits_in_usd_or_none (
75- confirmation : ConfirmationTokenDict ,
76- ) -> PositiveInt | None :
77- with suppress (ValidationError , JSONDecodeError ):
78- confirmation_data = confirmation .get ("data" , "EMPTY" ) or "EMPTY"
79- invitation = ConfirmedInvitationData .model_validate_json (confirmation_data )
80- return invitation .extra_credits_in_usd
81- return None
82-
83-
8466async def _handle_confirm_registration (
8567 app : web .Application ,
8668 product_name : ProductName ,
@@ -100,7 +82,7 @@ async def _handle_confirm_registration(
10082 app ,
10183 user_id = user_id ,
10284 product_name = product_name ,
103- extra_credits_in_usd = _parse_extra_credits_in_usd_or_none (confirmation ),
85+ extra_credits_in_usd = parse_extra_credits_in_usd_or_none (confirmation ),
10486 )
10587
10688
@@ -143,7 +125,7 @@ async def validate_confirmation_and_redirect(request: web.Request):
143125 cfg : LoginOptions = get_plugin_options (request .app )
144126 product : Product = products_web .get_current_product (request )
145127
146- path_params = parse_request_path_parameters_as (_PathParam , request )
128+ path_params = parse_request_path_parameters_as (CodePathParam , request )
147129
148130 confirmation : ConfirmationTokenDict | None = (
149131 await _confirmation_service .validate_confirmation_code (
@@ -213,14 +195,6 @@ async def validate_confirmation_and_redirect(request: web.Request):
213195 raise web .HTTPFound (location = redirect_to_login_url )
214196
215197
216- class PhoneConfirmationBody (InputSchema ):
217- email : LowerCaseEmailStr
218- phone : str = Field (
219- ..., description = "Phone number E.164, needed on the deployments with 2FA"
220- )
221- code : SecretStr
222-
223-
224198@routes .post ("/v0/auth/validate-code-register" , name = "auth_phone_confirmation" )
225199@global_rate_limit_route (number_of_requests = 5 , interval_seconds = MINUTE )
226200@session_access_required (
@@ -269,13 +243,6 @@ async def phone_confirmation(request: web.Request):
269243 )
270244
271245
272- class ResetPasswordConfirmation (InputSchema ):
273- password : SecretStr
274- confirm : SecretStr
275-
276- _password_confirm_match = field_validator ("confirm" )(check_confirm_password_match )
277-
278-
279246@routes .post ("/v0/auth/reset-password/{code}" , name = "complete_reset_password" )
280247@global_rate_limit_route (number_of_requests = 10 , interval_seconds = HOUR )
281248async def complete_reset_password (request : web .Request ):
@@ -288,7 +255,7 @@ async def complete_reset_password(request: web.Request):
288255 cfg : LoginOptions = get_plugin_options (request .app )
289256 product : Product = products_web .get_current_product (request )
290257
291- path_params = parse_request_path_parameters_as (_PathParam , request )
258+ path_params = parse_request_path_parameters_as (CodePathParam , request )
292259 request_body = await parse_request_body_as (ResetPasswordConfirmation , request )
293260
294261 confirmation = await _confirmation_service .validate_confirmation_code (
0 commit comments