Skip to content

Commit bfb18b2

Browse files
committed
split confirmation schemas
1 parent 8ee786b commit bfb18b2

File tree

2 files changed

+56
-42
lines changed

2 files changed

+56
-42
lines changed

services/web/server/src/simcore_service_webserver/login/_controller/rest/confirmation.py

Lines changed: 9 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
import logging
2-
from contextlib import suppress
3-
from json import JSONDecodeError
42

53
from aiohttp import web
64
from aiohttp.web import RouteTableDef
75
from common_library.error_codes import create_error_code
86
from models_library.emails import LowerCaseEmailStr
97
from models_library.products import ProductName
108
from pydantic import (
11-
BaseModel,
12-
Field,
13-
PositiveInt,
14-
SecretStr,
159
TypeAdapter,
16-
ValidationError,
17-
field_validator,
1810
)
1911
from servicelib.aiohttp import status
2012
from servicelib.aiohttp.requests_validation import (
@@ -35,7 +27,6 @@
3527
from ....utils_rate_limiting import global_rate_limit_route
3628
from ....web_utils import flash_response
3729
from ... import _confirmation_service, _security_service, _twofa_service
38-
from ..._invitations_service import ConfirmedInvitationData
3930
from ..._login_repository_legacy import (
4031
AsyncpgStorage,
4132
ConfirmationTokenDict,
@@ -48,7 +39,6 @@
4839
RESET_PASSWORD,
4940
notify_user_confirmation,
5041
)
51-
from ..._models import InputSchema, check_confirm_password_match
5242
from ...constants import (
5343
MSG_PASSWORD_CHANGE_NOT_ALLOWED,
5444
MSG_PASSWORD_CHANGED,
@@ -60,27 +50,19 @@
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

6763
routes = 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-
8466
async 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)
281248
async 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(
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from contextlib import suppress
2+
from json import JSONDecodeError
3+
4+
from models_library.emails import LowerCaseEmailStr
5+
from pydantic import (
6+
BaseModel,
7+
Field,
8+
PositiveInt,
9+
SecretStr,
10+
ValidationError,
11+
field_validator,
12+
)
13+
14+
from ..._invitations_service import ConfirmedInvitationData
15+
from ..._login_repository_legacy import (
16+
ConfirmationTokenDict,
17+
)
18+
from ..._models import InputSchema, check_confirm_password_match
19+
20+
21+
class CodePathParam(BaseModel):
22+
code: SecretStr
23+
24+
25+
def parse_extra_credits_in_usd_or_none(
26+
confirmation: ConfirmationTokenDict,
27+
) -> PositiveInt | None:
28+
with suppress(ValidationError, JSONDecodeError):
29+
confirmation_data = confirmation.get("data", "EMPTY") or "EMPTY"
30+
invitation = ConfirmedInvitationData.model_validate_json(confirmation_data)
31+
return invitation.extra_credits_in_usd
32+
return None
33+
34+
35+
class PhoneConfirmationBody(InputSchema):
36+
email: LowerCaseEmailStr
37+
phone: str = Field(
38+
..., description="Phone number E.164, needed on the deployments with 2FA"
39+
)
40+
code: SecretStr
41+
42+
43+
class ResetPasswordConfirmation(InputSchema):
44+
password: SecretStr
45+
confirm: SecretStr
46+
47+
_password_confirm_match = field_validator("confirm")(check_confirm_password_match)

0 commit comments

Comments
 (0)