Skip to content

Commit 0c48c1b

Browse files
Merge pull request #529 from supertokens/auto-transpiling-cyclic-import
auto transpile: pr2
2 parents e0995f0 + 0cfec6f commit 0c48c1b

23 files changed

+206
-103
lines changed

supertokens_python/auth_utils.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -912,19 +912,26 @@ async def filter_out_invalid_second_factors_or_throw_if_all_are_invalid(
912912
factors_set_up_for_user_prom: Optional[List[str]] = None
913913
mfa_info_prom = None
914914

915-
async def get_factors_set_up_for_user():
915+
async def get_factors_set_up_for_user() -> List[str]:
916916
nonlocal factors_set_up_for_user_prom
917917
if factors_set_up_for_user_prom is None:
918918
factors_set_up_for_user_prom = await mfa_instance.recipe_implementation.get_factors_setup_for_user(
919919
user=session_user, user_context=user_context
920920
)
921+
assert factors_set_up_for_user_prom is not None
921922
return factors_set_up_for_user_prom
922923

923924
async def get_mfa_requirements_for_auth():
924925
nonlocal mfa_info_prom
925926
if mfa_info_prom is None:
927+
from .recipe.multifactorauth.multi_factor_auth_claim import (
928+
MultiFactorAuthClaim,
929+
)
930+
926931
mfa_info_prom = await update_and_get_mfa_related_info_in_session(
927-
input_session=session, user_context=user_context
932+
MultiFactorAuthClaim,
933+
input_session=session,
934+
user_context=user_context,
928935
)
929936
return mfa_info_prom.mfa_requirements_for_auth
930937

supertokens_python/recipe/multifactorauth/api/implementation.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,28 +12,19 @@
1212
# License for the specific language governing permissions and limitations
1313
# under the License.
1414
from __future__ import annotations
15+
import importlib
1516

16-
from typing import TYPE_CHECKING, Any, Dict, List, Union
17+
from typing import Any, Dict, List, Union, TYPE_CHECKING
1718

1819
from supertokens_python.recipe.session import SessionContainer
19-
from supertokens_python.recipe.multifactorauth.utils import (
20-
update_and_get_mfa_related_info_in_session,
21-
)
2220
from supertokens_python.recipe.multitenancy.asyncio import get_tenant
23-
from ..multi_factor_auth_claim import MultiFactorAuthClaim
2421
from supertokens_python.asyncio import get_user
2522
from supertokens_python.recipe.session.exceptions import (
2623
InvalidClaimsError,
2724
SuperTokensSessionError,
2825
UnauthorisedError,
2926
)
3027

31-
if TYPE_CHECKING:
32-
from supertokens_python.recipe.multifactorauth.interfaces import (
33-
APIInterface,
34-
APIOptions,
35-
)
36-
3728
from supertokens_python.types import GeneralErrorResponse
3829
from ..interfaces import (
3930
APIInterface,
@@ -42,6 +33,11 @@
4233
ResyncSessionAndFetchMFAInfoPUTOkResult,
4334
)
4435

36+
if TYPE_CHECKING:
37+
from ..multi_factor_auth_claim import (
38+
MultiFactorAuthClaimClass as MultiFactorAuthClaimType,
39+
)
40+
4541

4642
class APIImplementation(APIInterface):
4743
async def resync_session_and_fetch_mfa_info_put(
@@ -50,14 +46,24 @@ async def resync_session_and_fetch_mfa_info_put(
5046
session: SessionContainer,
5147
user_context: Dict[str, Any],
5248
) -> Union[ResyncSessionAndFetchMFAInfoPUTOkResult, GeneralErrorResponse]:
49+
50+
mfa = importlib.import_module("supertokens_python.recipe.multifactorauth")
51+
52+
MultiFactorAuthClaim: MultiFactorAuthClaimType = mfa.MultiFactorAuthClaim
53+
54+
module = importlib.import_module(
55+
"supertokens_python.recipe.multifactorauth.utils"
56+
)
57+
5358
session_user = await get_user(session.get_user_id(), user_context)
5459

5560
if session_user is None:
5661
raise UnauthorisedError(
5762
"Session user not found",
5863
)
5964

60-
mfa_info = await update_and_get_mfa_related_info_in_session(
65+
mfa_info = await module.update_and_get_mfa_related_info_in_session(
66+
MultiFactorAuthClaim,
6167
input_session=session,
6268
user_context=user_context,
6369
)
@@ -144,7 +150,7 @@ async def get_mfa_requirements_for_auth():
144150
)
145151
return ResyncSessionAndFetchMFAInfoPUTOkResult(
146152
factors=NextFactors(
147-
next=next_factors,
153+
next_=next_factors,
148154
already_setup=factors_setup_for_user,
149155
allowed_to_setup=factors_allowed_to_setup,
150156
),

supertokens_python/recipe/multifactorauth/api/resync_session_and_fetch_mfa_info.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828

2929
async def handle_resync_session_and_fetch_mfa_info_api(
30-
tenant_id: str,
30+
_tenant_id: str,
3131
api_implementation: APIInterface,
3232
api_options: APIOptions,
3333
user_context: Dict[str, Any],

supertokens_python/recipe/multifactorauth/asyncio/__init__.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from ..types import (
2222
MFARequirementList,
2323
)
24-
from ..recipe import MultiFactorAuthRecipe
2524
from ..utils import update_and_get_mfa_related_info_in_session
2625
from supertokens_python.recipe.accountlinking.asyncio import get_user
2726

@@ -34,13 +33,17 @@ async def assert_allowed_to_setup_factor_else_throw_invalid_claim_error(
3433
if user_context is None:
3534
user_context = {}
3635

36+
from ..multi_factor_auth_claim import MultiFactorAuthClaim
37+
3738
mfa_info = await update_and_get_mfa_related_info_in_session(
39+
MultiFactorAuthClaim,
3840
input_session=session,
3941
user_context=user_context,
4042
)
4143
factors_set_up_for_user = await get_factors_setup_for_user(
4244
session.get_user_id(), user_context
4345
)
46+
from ..recipe import MultiFactorAuthRecipe
4447

4548
recipe = MultiFactorAuthRecipe.get_instance_or_throw_error()
4649

@@ -66,7 +69,10 @@ async def get_mfa_requirements_for_auth(
6669
if user_context is None:
6770
user_context = {}
6871

72+
from ..multi_factor_auth_claim import MultiFactorAuthClaim
73+
6974
mfa_info = await update_and_get_mfa_related_info_in_session(
75+
MultiFactorAuthClaim,
7076
input_session=session,
7177
user_context=user_context,
7278
)
@@ -81,6 +87,7 @@ async def mark_factor_as_complete_in_session(
8187
) -> None:
8288
if user_context is None:
8389
user_context = {}
90+
from ..recipe import MultiFactorAuthRecipe
8491

8592
recipe = MultiFactorAuthRecipe.get_instance_or_throw_error()
8693
await recipe.recipe_implementation.mark_factor_as_complete_in_session(
@@ -100,6 +107,7 @@ async def get_factors_setup_for_user(
100107
user = await get_user(user_id, user_context)
101108
if user is None:
102109
raise Exception("Unknown user id")
110+
from ..recipe import MultiFactorAuthRecipe
103111

104112
recipe = MultiFactorAuthRecipe.get_instance_or_throw_error()
105113
return await recipe.recipe_implementation.get_factors_setup_for_user(
@@ -114,6 +122,7 @@ async def get_required_secondary_factors_for_user(
114122
) -> List[str]:
115123
if user_context is None:
116124
user_context = {}
125+
from ..recipe import MultiFactorAuthRecipe
117126

118127
recipe = MultiFactorAuthRecipe.get_instance_or_throw_error()
119128
return await recipe.recipe_implementation.get_required_secondary_factors_for_user(
@@ -129,6 +138,7 @@ async def add_to_required_secondary_factors_for_user(
129138
) -> None:
130139
if user_context is None:
131140
user_context = {}
141+
from ..recipe import MultiFactorAuthRecipe
132142

133143
recipe = MultiFactorAuthRecipe.get_instance_or_throw_error()
134144
await recipe.recipe_implementation.add_to_required_secondary_factors_for_user(
@@ -145,13 +155,11 @@ async def remove_from_required_secondary_factors_for_user(
145155
) -> None:
146156
if user_context is None:
147157
user_context = {}
158+
from ..recipe import MultiFactorAuthRecipe
148159

149160
recipe = MultiFactorAuthRecipe.get_instance_or_throw_error()
150161
await recipe.recipe_implementation.remove_from_required_secondary_factors_for_user(
151162
user_id=user_id,
152163
factor_id=factor_id,
153164
user_context=user_context,
154165
)
155-
156-
157-
init = MultiFactorAuthRecipe.init

supertokens_python/recipe/multifactorauth/interfaces.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,15 @@ async def resync_session_and_fetch_mfa_info_put(
123123

124124
class NextFactors:
125125
def __init__(
126-
self, next: List[str], already_setup: List[str], allowed_to_setup: List[str]
126+
self, next_: List[str], already_setup: List[str], allowed_to_setup: List[str]
127127
):
128-
self.next = next
128+
self.next_ = next_
129129
self.already_setup = already_setup
130130
self.allowed_to_setup = allowed_to_setup
131131

132132
def to_json(self) -> Dict[str, Any]:
133133
return {
134-
"next": self.next,
134+
"next": self.next_,
135135
"alreadySetup": self.already_setup,
136136
"allowedToSetup": self.allowed_to_setup,
137137
}

supertokens_python/recipe/multifactorauth/multi_factor_auth_claim.py

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
1+
# Copyright (c) 2023, VRAI Labs and/or its affiliates. All rights reserved.
2+
#
3+
# This software is licensed under the Apache License, Version 2.0 (the
4+
# "License") as published by the Apache Software Foundation.
5+
#
6+
# You may not use this file except in compliance with the License. You may
7+
# obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12+
# License for the specific language governing permissions and limitations
13+
# under the License.
14+
115
from __future__ import annotations
16+
import importlib
217

318
from typing import Any, Dict, Optional, Set
419

@@ -15,7 +30,6 @@
1530
MFAClaimValue,
1631
MFARequirementList,
1732
)
18-
from .utils import update_and_get_mfa_related_info_in_session
1933

2034

2135
class HasCompletedRequirementListSCV(SessionClaimValidator):
@@ -29,14 +43,10 @@ def __init__(
2943
self.claim: MultiFactorAuthClaimClass = claim
3044
self.requirement_list = requirement_list
3145

32-
async def should_refetch(
46+
def should_refetch(
3347
self, payload: Dict[str, Any], user_context: Dict[str, Any]
3448
) -> bool:
35-
return (
36-
True
37-
if self.claim.key not in payload or not payload[self.claim.key]
38-
else False
39-
)
49+
return bool(self.claim.key not in payload or not payload[self.claim.key])
4050

4151
async def validate(
4252
self, payload: JSONObject, user_context: Dict[str, Any]
@@ -65,7 +75,7 @@ async def validate(
6575

6676
factor_ids = next_set_of_unsatisfied_factors.factor_ids
6777

68-
if next_set_of_unsatisfied_factors.type == "string":
78+
if next_set_of_unsatisfied_factors.type_ == "string":
6979
return ClaimValidationResult(
7080
is_valid=False,
7181
reason={
@@ -74,7 +84,7 @@ async def validate(
7484
},
7585
)
7686

77-
elif next_set_of_unsatisfied_factors.type == "oneOf":
87+
elif next_set_of_unsatisfied_factors.type_ == "oneOf":
7888
return ClaimValidationResult(
7989
is_valid=False,
8090
reason={
@@ -101,15 +111,11 @@ def __init__(
101111
super().__init__(id_)
102112
self.claim = claim
103113

104-
async def should_refetch(
114+
def should_refetch(
105115
self, payload: Dict[str, Any], user_context: Dict[str, Any]
106116
) -> bool:
107117
assert self.claim is not None
108-
return (
109-
True
110-
if self.claim.key not in payload or not payload[self.claim.key]
111-
else False
112-
)
118+
return bool(self.claim.key not in payload or not payload[self.claim.key])
113119

114120
async def validate(
115121
self, payload: JSONObject, user_context: Dict[str, Any]
@@ -161,13 +167,18 @@ def __init__(self, key: Optional[str] = None):
161167
key = key or "st-mfa"
162168

163169
async def fetch_value(
164-
user_id: str,
170+
_user_id: str,
165171
recipe_user_id: RecipeUserId,
166172
tenant_id: str,
167173
current_payload: Dict[str, Any],
168174
user_context: Dict[str, Any],
169175
) -> MFAClaimValue:
170-
mfa_info = await update_and_get_mfa_related_info_in_session(
176+
module = importlib.import_module(
177+
"supertokens_python.recipe.multifactorauth.utils"
178+
)
179+
180+
mfa_info = await module.update_and_get_mfa_related_info_in_session(
181+
self,
171182
input_session_recipe_user_id=recipe_user_id,
172183
input_tenant_id=tenant_id,
173184
input_access_token_payload=current_payload,
@@ -209,9 +220,11 @@ def get_next_set_of_unsatisfied_factors(
209220
)
210221

211222
if len(next_factors) > 0:
212-
return FactorIdsAndType(factor_ids=list(next_factors), type=factor_type)
223+
return FactorIdsAndType(
224+
factor_ids=list(next_factors), type_=factor_type
225+
)
213226

214-
return FactorIdsAndType(factor_ids=[], type="string")
227+
return FactorIdsAndType(factor_ids=[], type_="string")
215228

216229
def add_to_payload_(
217230
self,

supertokens_python/recipe/multifactorauth/recipe.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
# License for the specific language governing permissions and limitations
1313
# under the License.
1414
from __future__ import annotations
15+
import importlib
1516

1617
from os import environ
1718
from typing import Any, Dict, Optional, List, Union
@@ -31,7 +32,6 @@
3132
MultiFactorAuthClaim,
3233
)
3334
from supertokens_python.recipe.multitenancy.interfaces import TenantConfig
34-
from supertokens_python.recipe.multitenancy.recipe import MultitenancyRecipe
3535
from supertokens_python.recipe.session.recipe import SessionRecipe
3636
from supertokens_python.recipe_module import APIHandled, RecipeModule
3737
from supertokens_python.supertokens import AppInfo
@@ -47,9 +47,6 @@
4747
GetEmailsForFactorOkResult,
4848
GetPhoneNumbersForFactorsOkResult,
4949
)
50-
from .utils import validate_and_normalise_user_input
51-
from .recipe_implementation import RecipeImplementation
52-
from .api.implementation import APIImplementation
5350
from .interfaces import APIOptions
5451

5552

@@ -79,10 +76,15 @@ def __init__(
7976
] = []
8077
self.is_get_mfa_requirements_for_auth_overridden: bool = False
8178

82-
self.config = validate_and_normalise_user_input(
79+
module = importlib.import_module(
80+
"supertokens_python.recipe.multifactorauth.utils"
81+
)
82+
83+
self.config = module.validate_and_normalise_user_input(
8384
first_factors,
8485
override,
8586
)
87+
from .recipe_implementation import RecipeImplementation
8688

8789
recipe_implementation = RecipeImplementation(
8890
Querier.get_instance(recipe_id), self
@@ -92,6 +94,7 @@ def __init__(
9294
if self.config.override.functions is None
9395
else self.config.override.functions(recipe_implementation)
9496
)
97+
from .api.implementation import APIImplementation
9598

9699
api_implementation = APIImplementation()
97100
self.api_implementation = (
@@ -101,6 +104,8 @@ def __init__(
101104
)
102105

103106
def callback():
107+
from supertokens_python.recipe.multitenancy.recipe import MultitenancyRecipe
108+
104109
mt_recipe = MultitenancyRecipe.get_instance()
105110
mt_recipe.static_first_factors = self.config.first_factors
106111

0 commit comments

Comments
 (0)