Skip to content

Commit a0b0aaf

Browse files
committed
fixes stuff
1 parent 42420ce commit a0b0aaf

File tree

4 files changed

+273
-21
lines changed

4 files changed

+273
-21
lines changed

tests/test-server/app.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -657,19 +657,24 @@ def inner(
657657
res.get("body"),
658658
)
659659

660-
init(
661-
app_info=InputAppInfo(
662-
app_name=config["appInfo"]["appName"],
663-
api_domain=config["appInfo"]["apiDomain"],
664-
website_domain=config["appInfo"]["websiteDomain"],
665-
),
666-
supertokens_config=SupertokensConfig(
667-
connection_uri=config["supertokens"]["connectionURI"],
668-
network_interceptor=network_interceptor_func,
669-
),
670-
framework="flask",
671-
recipe_list=recipe_list,
672-
)
660+
try:
661+
init(
662+
app_info=InputAppInfo(
663+
app_name=config["appInfo"]["appName"],
664+
api_domain=config["appInfo"]["apiDomain"],
665+
website_domain=config["appInfo"]["websiteDomain"],
666+
),
667+
supertokens_config=SupertokensConfig(
668+
connection_uri=config["supertokens"]["connectionURI"],
669+
network_interceptor=network_interceptor_func,
670+
),
671+
framework="flask",
672+
recipe_list=recipe_list,
673+
)
674+
except Exception as e:
675+
st_reset()
676+
default_st_init()
677+
raise e
673678

674679

675680
# Routes
@@ -808,6 +813,13 @@ def handle_exception(e: Exception):
808813
from supertokens import add_supertokens_routes # pylint: disable=import-error
809814

810815
add_supertokens_routes(app)
816+
from usermetadata import add_usermetadata_routes
817+
818+
add_usermetadata_routes(app)
819+
820+
from multifactorauth import add_multifactorauth_routes
821+
822+
add_multifactorauth_routes(app)
811823

812824
if __name__ == "__main__":
813825
default_st_init()

tests/test-server/multifactorauth.py

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
from typing import List
2+
from flask import Flask, request, jsonify
3+
4+
from supertokens_python import async_to_sync_wrapper
5+
from supertokens_python.recipe.multifactorauth.types import MFAClaimValue
6+
from supertokens_python.types import User
7+
8+
9+
def add_multifactorauth_routes(app: Flask):
10+
@app.route("/test/multifactorauthclaim/fetchvalue", methods=["POST"]) # type: ignore
11+
def fetch_value_api(): # type: ignore
12+
from supertokens_python import convert_to_recipe_user_id
13+
from supertokens_python.recipe.multifactorauth.multi_factor_auth_claim import (
14+
MultiFactorAuthClaim,
15+
)
16+
17+
assert request.json is not None
18+
response: MFAClaimValue = async_to_sync_wrapper.sync( # type: ignore
19+
MultiFactorAuthClaim.fetch_value( # type: ignore
20+
request.json["_userId"],
21+
convert_to_recipe_user_id(request.json["recipeUserId"]),
22+
request.json["tenantId"],
23+
request.json["currentPayload"],
24+
request.json.get("userContext"),
25+
)
26+
)
27+
return jsonify(
28+
{
29+
"c": response.c, # type: ignore
30+
"v": response.v, # type: ignore
31+
}
32+
)
33+
34+
@app.route("/test/multifactorauth/getfactorssetupforuser", methods=["POST"]) # type: ignore
35+
def get_factors_setup_for_user_api(): # type: ignore
36+
from supertokens_python.recipe.multifactorauth.syncio import (
37+
get_factors_setup_for_user,
38+
)
39+
40+
assert request.json is not None
41+
user_id = request.json["userId"]
42+
user_context = request.json.get("userContext")
43+
44+
response = get_factors_setup_for_user(
45+
user_id=user_id,
46+
user_context=user_context,
47+
)
48+
return jsonify(response)
49+
50+
@app.route("/test/assertallowedtosetupfactorelsethowinvalidclaimerror", methods=["POST"]) # type: ignore
51+
def assert_allowed_to_setup_factor_else_throw_invalid_claim_error_api(): # type: ignore
52+
from supertokens_python.recipe.multifactorauth.syncio import (
53+
assert_allowed_to_setup_factor_else_throw_invalid_claim_error,
54+
)
55+
from session import convert_session_to_container
56+
57+
assert request.json is not None
58+
59+
session = None
60+
if request.json.get("session"):
61+
session = convert_session_to_container(request.json)
62+
assert session is not None
63+
64+
assert_allowed_to_setup_factor_else_throw_invalid_claim_error(
65+
session=session,
66+
factor_id=request.json["factorId"],
67+
user_context=request.json.get("userContext"),
68+
)
69+
70+
return "", 200
71+
72+
@app.route("/test/multifactorauth/getmfarequirementsforauth", methods=["POST"]) # type: ignore
73+
def get_mfa_requirements_for_auth_api(): # type: ignore
74+
from supertokens_python.recipe.multifactorauth.syncio import (
75+
get_mfa_requirements_for_auth,
76+
)
77+
from session import convert_session_to_container
78+
79+
assert request.json is not None
80+
81+
session = None
82+
if request.json.get("session"):
83+
session = convert_session_to_container(request.json)
84+
assert session is not None
85+
86+
response = get_mfa_requirements_for_auth(
87+
session=session,
88+
user_context=request.json.get("userContext"),
89+
)
90+
91+
return jsonify(response)
92+
93+
@app.route("/test/multifactorauth/markfactorascompleteinsession", methods=["POST"]) # type: ignore
94+
def mark_factor_as_complete_in_session_api(): # type: ignore
95+
from supertokens_python.recipe.multifactorauth.syncio import (
96+
mark_factor_as_complete_in_session,
97+
)
98+
from session import convert_session_to_container
99+
100+
assert request.json is not None
101+
102+
session = None
103+
if request.json.get("session"):
104+
session = convert_session_to_container(request.json)
105+
assert session is not None
106+
107+
mark_factor_as_complete_in_session(
108+
session=session,
109+
factor_id=request.json["factorId"],
110+
user_context=request.json.get("userContext"),
111+
)
112+
113+
return "", 200
114+
115+
@app.route("/test/multifactorauth/getrequiredsecondaryfactorsforuser", methods=["POST"]) # type: ignore
116+
def get_required_secondary_factors_for_user_api(): # type: ignore
117+
from supertokens_python.recipe.multifactorauth.syncio import (
118+
get_required_secondary_factors_for_user,
119+
)
120+
121+
assert request.json is not None
122+
123+
response = get_required_secondary_factors_for_user(
124+
user_id=request.json["userId"],
125+
user_context=request.json.get("userContext"),
126+
)
127+
128+
return jsonify(response)
129+
130+
@app.route("/test/multifactorauth/addtorequiredsecondaryfactorsforuser", methods=["POST"]) # type: ignore
131+
def add_to_required_secondary_factors_for_user_api(): # type: ignore
132+
from supertokens_python.recipe.multifactorauth.syncio import (
133+
add_to_required_secondary_factors_for_user,
134+
)
135+
136+
assert request.json is not None
137+
138+
add_to_required_secondary_factors_for_user(
139+
user_id=request.json["userId"],
140+
factor_id=request.json["factorId"],
141+
user_context=request.json.get("userContext"),
142+
)
143+
144+
return "", 200
145+
146+
@app.route("/test/multifactorauth/removefromrequiredsecondaryfactorsforuser", methods=["POST"]) # type: ignore
147+
def remove_from_required_secondary_factors_for_user_api(): # type: ignore
148+
from supertokens_python.recipe.multifactorauth.syncio import (
149+
remove_from_required_secondary_factors_for_user,
150+
)
151+
152+
assert request.json is not None
153+
154+
remove_from_required_secondary_factors_for_user(
155+
user_id=request.json["userId"],
156+
factor_id=request.json["factorId"],
157+
user_context=request.json.get("userContext"),
158+
)
159+
160+
return "", 200
161+
162+
@app.route("/test/multifactorauth/recipeimplementation.getmfarequirementsforauth", methods=["POST"]) # type: ignore
163+
def get_mfa_requirements_for_auth_api2(): # type: ignore
164+
assert request.json is not None
165+
from supertokens_python.recipe.multifactorauth.recipe import (
166+
MultiFactorAuthRecipe,
167+
)
168+
169+
async def user() -> User:
170+
assert request.json is not None
171+
user_json = request.json["user"]
172+
assert user_json is not None
173+
return User.from_json(user_json)
174+
175+
async def factors_set_up_for_user() -> List[str]:
176+
assert request.json is not None
177+
return request.json["factorsSetUpForUser"]
178+
179+
async def required_secondary_factors_for_user() -> List[str]:
180+
assert request.json is not None
181+
return request.json["requiredSecondaryFactorsForUser"]
182+
183+
async def required_secondary_factors_for_tenant() -> List[str]:
184+
assert request.json is not None
185+
return request.json["requiredSecondaryFactorsForTenant"]
186+
187+
response = async_to_sync_wrapper.sync(
188+
MultiFactorAuthRecipe.get_instance_or_throw_error().recipe_implementation.get_mfa_requirements_for_auth(
189+
tenant_id=request.json["tenantId"],
190+
access_token_payload=request.json["accessTokenPayload"],
191+
completed_factors=request.json["completedFactors"],
192+
user=user,
193+
factors_set_up_for_user=factors_set_up_for_user,
194+
required_secondary_factors_for_user=required_secondary_factors_for_user,
195+
required_secondary_factors_for_tenant=required_secondary_factors_for_tenant,
196+
user_context=request.json.get("userContext"),
197+
)
198+
)
199+
200+
return jsonify(response)

tests/test-server/supertokens.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ def list_users_by_account_info_api(): # type: ignore
5656
def get_users_newest_first_api(): # type: ignore
5757
assert request.json is not None
5858
response = get_users_newest_first(
59-
include_recipe_ids=request.json["includeRecipeIds"],
60-
limit=request.json["limit"],
61-
pagination_token=request.json["paginationToken"],
62-
tenant_id=request.json["tenantId"],
59+
include_recipe_ids=request.json.get("includeRecipeIds"),
60+
limit=request.json.get("limit"),
61+
pagination_token=request.json.get("paginationToken"),
62+
tenant_id=request.json.get("tenantId"),
6363
user_context=request.json.get("userContext"),
6464
)
6565
return jsonify(
@@ -73,10 +73,10 @@ def get_users_newest_first_api(): # type: ignore
7373
def get_users_oldest_first_api(): # type: ignore
7474
assert request.json is not None
7575
response = get_users_oldest_first(
76-
include_recipe_ids=request.json["includeRecipeIds"],
77-
limit=request.json["limit"],
78-
pagination_token=request.json["paginationToken"],
79-
tenant_id=request.json["tenantId"],
76+
include_recipe_ids=request.json.get("includeRecipeIds"),
77+
limit=request.json.get("limit"),
78+
pagination_token=request.json.get("paginationToken"),
79+
tenant_id=request.json.get("tenantId"),
8080
user_context=request.json.get("userContext"),
8181
)
8282
return jsonify(

tests/test-server/usermetadata.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from flask import Flask, request, jsonify
2+
3+
from supertokens_python.recipe.usermetadata.syncio import (
4+
get_user_metadata,
5+
update_user_metadata,
6+
clear_user_metadata,
7+
)
8+
9+
10+
def add_usermetadata_routes(app: Flask):
11+
@app.route("/test/usermetadata/getusermetadata", methods=["POST"]) # type: ignore
12+
def get_user_metadata_api(): # type: ignore
13+
assert request.json is not None
14+
user_id = request.json["userId"]
15+
response = get_user_metadata(
16+
user_id=user_id, user_context=request.json.get("userContext")
17+
)
18+
return jsonify({"metadata": response.metadata})
19+
20+
@app.route("/test/usermetadata/updateusermetadata", methods=["POST"]) # type: ignore
21+
def update_user_metadata_api(): # type: ignore
22+
assert request.json is not None
23+
user_id = request.json["userId"]
24+
metadata_update = request.json["metadataUpdate"]
25+
26+
response = update_user_metadata(
27+
user_id=user_id,
28+
metadata_update=metadata_update,
29+
user_context=request.json.get("userContext"),
30+
)
31+
return jsonify({"metadata": response.metadata})
32+
33+
@app.route("/test/usermetadata/clearusermetadata", methods=["POST"]) # type: ignore
34+
def clear_user_metadata_api(): # type: ignore
35+
assert request.json is not None
36+
user_id = request.json["userId"]
37+
clear_user_metadata(
38+
user_id=user_id, user_context=request.json.get("userContext")
39+
)
40+
return jsonify({"status": "OK"})

0 commit comments

Comments
 (0)