Skip to content

Commit f35003c

Browse files
committed
feat: last changes
1 parent 58255c1 commit f35003c

File tree

7 files changed

+125
-101
lines changed

7 files changed

+125
-101
lines changed

supertokens_python/recipe/session/with_jwt/session_class.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from __future__ import annotations
1616

1717
from math import ceil
18-
from typing import TYPE_CHECKING, Any, Dict, Union
18+
from typing import TYPE_CHECKING, Any, Dict, Union, Optional
1919

2020
from jwt import decode
2121
from supertokens_python.recipe.session.with_jwt.constants import (
@@ -40,11 +40,14 @@ def get_session_with_jwt(
4040
original_update_access_token_payload = original_session.update_access_token_payload
4141

4242
async def update_access_token_payload(
43-
new_access_token_payload: Dict[str, Any],
43+
new_access_token_payload: Optional[Dict[str, Any]],
4444
user_context: Union[None, Dict[str, Any]] = None,
4545
) -> None:
4646
if user_context is None:
4747
user_context = {}
48+
if new_access_token_payload is None:
49+
new_access_token_payload = {}
50+
4851
access_token_payload = original_session.get_access_token_payload()
4952

5053
if ACCESS_TOKEN_PAYLOAD_JWT_PROPERTY_NAME_KEY not in access_token_payload:

supertokens_python/recipe/thirdparty/recipe.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ async def handle_api_request(
138138
if request_id == APPLE_REDIRECT_HANDLER:
139139
return await handle_apple_redirect_api(self.api_implementation, api_options)
140140

141-
return None # TODO: Node PR returns False, but here signature is different. Verify if this is correct.
141+
return None
142142

143143
async def handle_error(
144144
self, request: BaseRequest, err: SuperTokensError, response: BaseResponse

supertokens_python/recipe/userroles/__init__.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,14 @@
1313
# under the License.
1414
from __future__ import annotations
1515

16-
from typing import TYPE_CHECKING, Callable, Union
16+
from typing import TYPE_CHECKING, Callable, Union, Optional
1717

1818
from . import utils
1919
from .recipe import UserRolesRecipe
20+
from . import recipe
21+
22+
PermissionClaim = recipe.PermissionClaim
23+
UserRoleClaim = recipe.UserRoleClaim
2024

2125
if TYPE_CHECKING:
2226
from supertokens_python.supertokens import AppInfo
@@ -25,6 +29,12 @@
2529

2630

2731
def init(
28-
override: Union[utils.InputOverrideConfig, None] = None
32+
skip_adding_roles_to_access_token: Optional[bool] = None,
33+
skip_adding_permissions_to_access_token: Optional[bool] = None,
34+
override: Union[utils.InputOverrideConfig, None] = None,
2935
) -> Callable[[AppInfo], RecipeModule]:
30-
return UserRolesRecipe.init(override)
36+
return UserRolesRecipe.init(
37+
skip_adding_roles_to_access_token,
38+
skip_adding_permissions_to_access_token,
39+
override,
40+
)

supertokens_python/recipe/userroles/permission_claim.py

Lines changed: 0 additions & 52 deletions
This file was deleted.

supertokens_python/recipe/userroles/recipe.py

Lines changed: 83 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from __future__ import annotations
1616

1717
from os import environ
18-
from typing import List, Union
18+
from typing import List, Union, Optional, Dict, Any, Set
1919

2020
from supertokens_python.exceptions import SuperTokensError, raise_general_exception
2121
from supertokens_python.framework import BaseRequest, BaseResponse
@@ -29,7 +29,11 @@
2929
from supertokens_python.supertokens import AppInfo
3030

3131
from .exceptions import SuperTokensUserRolesError
32+
from .interfaces import GetPermissionsForRoleOkResult
3233
from .utils import InputOverrideConfig
34+
from ..session import SessionRecipe
35+
from ..session.claim_base_classes.primitive_array_claim import PrimitiveArrayClaim
36+
from ...post_init_callbacks import PostSTInitCallbacks
3337

3438

3539
class UserRolesRecipe(RecipeModule):
@@ -40,17 +44,35 @@ def __init__(
4044
self,
4145
recipe_id: str,
4246
app_info: AppInfo,
47+
skip_adding_roles_to_access_token: Optional[bool] = None,
48+
skip_adding_permissions_to_access_token: Optional[bool] = None,
4349
override: Union[InputOverrideConfig, None] = None,
4450
):
4551
super().__init__(recipe_id, app_info)
46-
self.config = validate_and_normalise_user_input(self, app_info, override)
52+
self.config = validate_and_normalise_user_input(
53+
self,
54+
app_info,
55+
skip_adding_roles_to_access_token,
56+
skip_adding_permissions_to_access_token,
57+
override,
58+
)
4759
recipe_implementation = RecipeImplementation(Querier.get_instance(recipe_id))
4860
self.recipe_implementation = (
4961
recipe_implementation
5062
if self.config.override.functions is None
5163
else self.config.override.functions(recipe_implementation)
5264
)
5365

66+
def callback():
67+
if self.config.skip_adding_roles_to_access_token is False:
68+
SessionRecipe.get_instance().add_claim_from_other_recipe(UserRoleClaim)
69+
if self.config.skip_adding_permissions_to_access_token is False:
70+
SessionRecipe.get_instance().add_claim_from_other_recipe(
71+
PermissionClaim
72+
)
73+
74+
PostSTInitCallbacks.add_post_init_callback(callback)
75+
5476
def is_error_from_this_recipe_based_on_instance(self, err: Exception) -> bool:
5577
return isinstance(err, SuperTokensError) and (
5678
isinstance(err, SuperTokensUserRolesError)
@@ -78,11 +100,19 @@ def get_all_cors_headers(self) -> List[str]:
78100
return []
79101

80102
@staticmethod
81-
def init(override: Union[InputOverrideConfig, None] = None):
103+
def init(
104+
skip_adding_roles_to_access_token: Optional[bool] = None,
105+
skip_adding_permissions_to_access_token: Optional[bool] = None,
106+
override: Union[InputOverrideConfig, None] = None,
107+
):
82108
def func(app_info: AppInfo):
83109
if UserRolesRecipe.__instance is None:
84110
UserRolesRecipe.__instance = UserRolesRecipe(
85-
UserRolesRecipe.recipe_id, app_info, override
111+
UserRolesRecipe.recipe_id,
112+
app_info,
113+
skip_adding_roles_to_access_token,
114+
skip_adding_permissions_to_access_token,
115+
override,
86116
)
87117
return UserRolesRecipe.__instance
88118
raise Exception(
@@ -107,3 +137,52 @@ def get_instance() -> UserRolesRecipe:
107137
raise_general_exception(
108138
"Initialisation not done. Did you forget to call the SuperTokens.init or UserRoles.init function?"
109139
)
140+
141+
142+
class PermissionClaimClass(PrimitiveArrayClaim[List[str]]):
143+
def __init__(self) -> None:
144+
key = "st-perm"
145+
146+
async def fetch_value(user_id: str, user_context: Dict[str, Any]) -> List[str]:
147+
recipe = UserRolesRecipe.get_instance()
148+
149+
user_roles = await recipe.recipe_implementation.get_roles_for_user(
150+
user_id, user_context
151+
)
152+
153+
user_permissions: Set[str] = set()
154+
155+
for role in user_roles.roles:
156+
role_permissions = (
157+
await recipe.recipe_implementation.get_permissions_for_role(
158+
role, user_context
159+
)
160+
)
161+
162+
if isinstance(role_permissions, GetPermissionsForRoleOkResult):
163+
for permission in role_permissions.permissions:
164+
user_permissions.add(permission)
165+
166+
return list(user_permissions)
167+
168+
super().__init__(key, fetch_value)
169+
170+
171+
PermissionClaim = PermissionClaimClass()
172+
173+
174+
class UserRoleClaimClass(PrimitiveArrayClaim[List[str]]):
175+
def __init__(self) -> None:
176+
key = "st-role"
177+
178+
async def fetch_value(user_id: str, user_context: Dict[str, Any]) -> List[str]:
179+
recipe = UserRolesRecipe.get_instance()
180+
res = await recipe.recipe_implementation.get_roles_for_user(
181+
user_id, user_context
182+
)
183+
return res.roles
184+
185+
super().__init__(key, fetch_value)
186+
187+
188+
UserRoleClaim = UserRoleClaimClass()

supertokens_python/recipe/userroles/user_role_claim.py

Lines changed: 0 additions & 36 deletions
This file was deleted.

supertokens_python/recipe/userroles/utils.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from __future__ import annotations
1616

17-
from typing import TYPE_CHECKING, Callable, Union
17+
from typing import TYPE_CHECKING, Callable, Union, Optional
1818

1919
from supertokens_python.recipe.userroles.interfaces import APIInterface, RecipeInterface
2020
from supertokens_python.supertokens import AppInfo
@@ -34,13 +34,24 @@ def __init__(
3434

3535

3636
class UserRolesConfig:
37-
def __init__(self, override: InputOverrideConfig) -> None:
37+
def __init__(
38+
self,
39+
skip_adding_roles_to_access_token: bool,
40+
skip_adding_permissions_to_access_token: bool,
41+
override: InputOverrideConfig,
42+
) -> None:
43+
self.skip_adding_roles_to_access_token = skip_adding_roles_to_access_token
44+
self.skip_adding_permissions_to_access_token = (
45+
skip_adding_permissions_to_access_token
46+
)
3847
self.override = override
3948

4049

4150
def validate_and_normalise_user_input(
4251
_recipe: UserRolesRecipe,
4352
_app_info: AppInfo,
53+
skip_adding_roles_to_access_token: Optional[bool] = None,
54+
skip_adding_permissions_to_access_token: Optional[bool] = None,
4455
override: Union[InputOverrideConfig, None] = None,
4556
) -> UserRolesConfig:
4657
if override is not None and not isinstance(override, InputOverrideConfig): # type: ignore
@@ -49,4 +60,13 @@ def validate_and_normalise_user_input(
4960
if override is None:
5061
override = InputOverrideConfig()
5162

52-
return UserRolesConfig(override=override)
63+
if skip_adding_roles_to_access_token is None:
64+
skip_adding_roles_to_access_token = False
65+
if skip_adding_permissions_to_access_token is None:
66+
skip_adding_permissions_to_access_token = False
67+
68+
return UserRolesConfig(
69+
skip_adding_roles_to_access_token=skip_adding_roles_to_access_token,
70+
skip_adding_permissions_to_access_token=skip_adding_permissions_to_access_token,
71+
override=override,
72+
)

0 commit comments

Comments
 (0)