Skip to content

Commit a038414

Browse files
Merge pull request #215 from supertokens/feat/ev-claim
feat: Add and use email verification claim
2 parents e58cb87 + 6fc90c6 commit a038414

File tree

72 files changed

+1163
-2378
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+1163
-2378
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from typing import Callable, List
2+
3+
4+
class PostSTInitCallbacks:
5+
"""Callbacks that are called after the SuperTokens instance is initialized."""
6+
7+
callbacks: List[Callable[[], None]] = []
8+
9+
@staticmethod
10+
def add_post_init_callback(cb: Callable[[], None]) -> None:
11+
PostSTInitCallbacks.callbacks.append(cb)
12+
13+
@staticmethod
14+
def run_post_init_callbacks() -> None:
15+
for cb in PostSTInitCallbacks.callbacks:
16+
cb()
17+
18+
PostSTInitCallbacks.callbacks = []

supertokens_python/recipe/emailpassword/__init__.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
exceptions = ex
2727
InputOverrideConfig = utils.InputOverrideConfig
2828
InputResetPasswordUsingTokenFeature = utils.InputResetPasswordUsingTokenFeature
29-
InputEmailVerificationConfig = utils.InputEmailVerificationConfig
3029
InputSignUpFeature = utils.InputSignUpFeature
3130
InputFormField = utils.InputFormField
3231
SMTPService = emaildelivery_services.SMTPService
@@ -42,14 +41,12 @@ def init(
4241
reset_password_using_token_feature: Union[
4342
utils.InputResetPasswordUsingTokenFeature, None
4443
] = None,
45-
email_verification_feature: Union[utils.InputEmailVerificationConfig, None] = None,
4644
override: Union[utils.InputOverrideConfig, None] = None,
4745
email_delivery: Union[EmailDeliveryConfig[EmailTemplateVars], None] = None,
4846
) -> Callable[[AppInfo], RecipeModule]:
4947
return EmailPasswordRecipe.init(
5048
sign_up_feature,
5149
reset_password_using_token_feature,
52-
email_verification_feature,
5350
override,
5451
email_delivery,
5552
)

supertokens_python/recipe/emailpassword/api/implementation.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,9 @@ async def generate_password_reset_token_post(
9292

9393
token = token_result.token
9494
password_reset_link = (
95-
await api_options.config.reset_password_using_token_feature.get_reset_password_url(
96-
user, user_context
97-
)
98-
+ "?token="
95+
api_options.app_info.website_domain.get_as_string_dangerous()
96+
+ api_options.app_info.website_base_path.get_as_string_dangerous()
97+
+ "/reset-password?token="
9998
+ token
10099
+ "&rid="
101100
+ api_options.recipe_id

supertokens_python/recipe/emailpassword/asyncio/__init__.py

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -18,55 +18,6 @@
1818
from ..types import EmailTemplateVars, User
1919

2020

21-
async def create_email_verification_token(
22-
user_id: str, user_context: Union[None, Dict[str, Any]] = None
23-
):
24-
if user_context is None:
25-
user_context = {}
26-
email = await EmailPasswordRecipe.get_instance().get_email_for_user_id(
27-
user_id, user_context
28-
)
29-
return await EmailPasswordRecipe.get_instance().email_verification_recipe.recipe_implementation.create_email_verification_token(
30-
user_id, email, user_context
31-
)
32-
33-
34-
async def verify_email_using_token(
35-
token: str, user_context: Union[None, Dict[str, Any]] = None
36-
):
37-
if user_context is None:
38-
user_context = {}
39-
return await EmailPasswordRecipe.get_instance().email_verification_recipe.recipe_implementation.verify_email_using_token(
40-
token, user_context
41-
)
42-
43-
44-
async def unverify_email(
45-
user_id: str, user_context: Union[None, Dict[str, Any]] = None
46-
):
47-
if user_context is None:
48-
user_context = {}
49-
email = await EmailPasswordRecipe.get_instance().get_email_for_user_id(
50-
user_id, user_context
51-
)
52-
return await EmailPasswordRecipe.get_instance().email_verification_recipe.recipe_implementation.unverify_email(
53-
user_id, email, user_context
54-
)
55-
56-
57-
async def is_email_verified(
58-
user_id: str, user_context: Union[None, Dict[str, Any]] = None
59-
):
60-
if user_context is None:
61-
user_context = {}
62-
email = await EmailPasswordRecipe.get_instance().get_email_for_user_id(
63-
user_id, user_context
64-
)
65-
return await EmailPasswordRecipe.get_instance().email_verification_recipe.recipe_implementation.is_email_verified(
66-
user_id, email, user_context
67-
)
68-
69-
7021
async def update_email_or_password(
7122
user_id: str,
7223
email: Union[str, None] = None,
@@ -142,19 +93,6 @@ async def sign_up(
14293
)
14394

14495

145-
async def revoke_email_verification_token(
146-
user_id: str, user_context: Union[None, Dict[str, Any]] = None
147-
):
148-
if user_context is None:
149-
user_context = {}
150-
email = await EmailPasswordRecipe.get_instance().get_email_for_user_id(
151-
user_id, user_context
152-
)
153-
return await EmailPasswordRecipe.get_instance().email_verification_recipe.recipe_implementation.revoke_email_verification_tokens(
154-
user_id, email, user_context
155-
)
156-
157-
15896
async def send_email(
15997
input_: EmailTemplateVars, user_context: Union[None, Dict[str, Any]] = None
16098
):

supertokens_python/recipe/emailpassword/emaildelivery/services/backward_compatibility/__init__.py

Lines changed: 11 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,12 @@
2525
)
2626
from supertokens_python.recipe.emailpassword.types import (
2727
User,
28-
VerificationEmailTemplateVars,
29-
)
30-
from supertokens_python.recipe.emailverification.emaildelivery.services.backward_compatibility import (
31-
BackwardCompatibilityService as EmailVerificationBackwardCompatibilityService,
32-
)
33-
from supertokens_python.recipe.emailverification.types import (
34-
User as EmailVerificationUser,
3528
)
3629
from supertokens_python.supertokens import AppInfo
3730
from supertokens_python.utils import handle_httpx_client_exceptions
3831

3932
if TYPE_CHECKING:
4033
from supertokens_python.recipe.emailpassword.utils import (
41-
InputEmailVerificationConfig,
4234
InputResetPasswordUsingTokenFeature,
4335
)
4436

@@ -68,7 +60,6 @@ async def func(user: User, password_reset_url_with_token: str, _: Dict[str, Any]
6860

6961
class BackwardCompatibilityService(EmailDeliveryInterface[EmailTemplateVars]):
7062
app_info: AppInfo
71-
ev_backward_compatibility_service: EmailVerificationBackwardCompatibilityService
7263

7364
def __init__(
7465
self,
@@ -77,7 +68,6 @@ def __init__(
7768
reset_password_using_token_feature: Union[
7869
InputResetPasswordUsingTokenFeature, None
7970
] = None,
80-
email_verification_feature: Union[InputEmailVerificationConfig, None] = None,
8171
) -> None:
8272
self.recipe_interface_impl = recipe_interface_impl
8373

@@ -97,55 +87,18 @@ def __init__(
9787
reset_password_feature_send_email_func
9888
)
9989

100-
create_and_send_custom_email: Union[
101-
Callable[[EmailVerificationUser, str, Dict[str, Any]], Awaitable[None]],
102-
None,
103-
] = None
104-
if email_verification_feature:
105-
if email_verification_feature.create_and_send_custom_email is not None:
106-
ev_create_and_send_custom_email = (
107-
email_verification_feature.create_and_send_custom_email
108-
)
109-
110-
async def create_and_send_custom_email_wrapper(
111-
user: EmailVerificationUser, link: str, user_context: Dict[str, Any]
112-
):
113-
user_info = await recipe_interface_impl.get_user_by_id(
114-
user.user_id, user_context
115-
)
116-
if user_info is None:
117-
raise Exception("Unknown User ID provided")
118-
119-
return await ev_create_and_send_custom_email(
120-
user_info, link, user_context
121-
)
122-
123-
create_and_send_custom_email = create_and_send_custom_email_wrapper
124-
125-
self.ev_backward_compatibility_service = (
126-
EmailVerificationBackwardCompatibilityService(
127-
app_info, create_and_send_custom_email=create_and_send_custom_email
128-
)
129-
)
130-
13190
async def send_email(
13291
self, template_vars: EmailTemplateVars, user_context: Dict[str, Any]
13392
) -> None:
134-
if isinstance(template_vars, VerificationEmailTemplateVars):
135-
await self.ev_backward_compatibility_service.send_email(
136-
template_vars, user_context
137-
)
138-
else:
139-
user = await self.recipe_interface_impl.get_user_by_id(
140-
user_id=template_vars.user.id, user_context=user_context
141-
)
142-
143-
if user is None:
144-
raise Exception("Should never come here")
93+
user = await self.recipe_interface_impl.get_user_by_id(
94+
user_id=template_vars.user.id, user_context=user_context
95+
)
96+
if user is None:
97+
raise Exception("Should never come here")
14598

146-
try:
147-
await self.reset_password_feature_send_email_func(
148-
user, template_vars.password_reset_link, user_context
149-
)
150-
except Exception:
151-
pass
99+
try:
100+
await self.reset_password_feature_send_email_func(
101+
user, template_vars.password_reset_link, user_context
102+
)
103+
except Exception:
104+
pass

supertokens_python/recipe/emailpassword/emaildelivery/services/smtp/__init__.py

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,8 @@
2424
EmailTemplateVars,
2525
SMTPOverrideInput,
2626
)
27-
from supertokens_python.recipe.emailverification.emaildelivery.services.smtp import (
28-
SMTPService as EmailVerificationSMTPService,
29-
)
30-
from supertokens_python.recipe.emailverification.types import (
31-
VerificationEmailTemplateVars,
32-
)
3327

3428
from .service_implementation import ServiceImplementation
35-
from .service_implementation.email_verification_implementation import (
36-
ServiceImplementation as EmailVerificationServiceImpl,
37-
)
3829

3930

4031
class SMTPService(EmailDeliveryInterface[EmailTemplateVars]):
@@ -50,21 +41,9 @@ def __init__(
5041
oi = ServiceImplementation(transporter)
5142
self.service_implementation = oi if override is None else override(oi)
5243

53-
self.email_verification_smtp_service = EmailVerificationSMTPService(
54-
smtp_settings=smtp_settings,
55-
override=lambda _: EmailVerificationServiceImpl(
56-
self.service_implementation
57-
),
58-
)
59-
6044
async def send_email(
6145
self, template_vars: EmailTemplateVars, user_context: Dict[str, Any]
6246
) -> None:
63-
if isinstance(template_vars, VerificationEmailTemplateVars):
64-
return await self.email_verification_smtp_service.send_email(
65-
template_vars, user_context
66-
)
67-
6847
content = await self.service_implementation.get_content(
6948
template_vars, user_context
7049
)

supertokens_python/recipe/emailpassword/emaildelivery/services/smtp/service_implementation/__init__.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,6 @@
2626
from supertokens_python.recipe.emailverification.emaildelivery.services.smtp.service_implementation import (
2727
ServiceImplementation as EVServiceImplementation,
2828
)
29-
from supertokens_python.recipe.emailverification.types import (
30-
VerificationEmailTemplateVars,
31-
)
32-
33-
from .email_verification_implementation import (
34-
ServiceImplementation as DerivedEVServiceImplementation,
35-
)
3629

3730

3831
class ServiceImplementation(SMTPServiceInterface[EmailTemplateVars]):
@@ -45,14 +38,6 @@ def __init__(self, transporter: Transporter) -> None:
4538
)
4639
self.ev_get_content = email_verification_service_implementation.get_content
4740

48-
derived_ev_service_implementation = DerivedEVServiceImplementation(self)
49-
email_verification_service_implementation.send_raw_email = (
50-
derived_ev_service_implementation.send_raw_email
51-
)
52-
email_verification_service_implementation.get_content = (
53-
derived_ev_service_implementation.get_content
54-
)
55-
5641
async def send_raw_email(
5742
self, content: EmailContent, user_context: Dict[str, Any]
5843
) -> None:
@@ -61,6 +46,4 @@ async def send_raw_email(
6146
async def get_content(
6247
self, template_vars: EmailTemplateVars, user_context: Dict[str, Any]
6348
) -> EmailContent:
64-
if isinstance(template_vars, VerificationEmailTemplateVars):
65-
return await self.ev_get_content(template_vars, user_context)
6649
return get_password_reset_email_content(template_vars)

supertokens_python/recipe/emailpassword/emaildelivery/services/smtp/service_implementation/email_verification_implementation.py

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

0 commit comments

Comments
 (0)