Source code for social_core.pipeline.mail
from __future__ import annotations
from typing import TYPE_CHECKING, cast
from social_core.exceptions import InvalidEmail
from .partial import partial_step
if TYPE_CHECKING:
from social_core.backends.base import BaseAuth
[docs]
@partial_step(save_to_session=True, allow_external_resume=True)
def mail_validation(backend: BaseAuth, details, is_new=False, *args, **kwargs):
requires_validation = backend.REQUIRES_EMAIL_VALIDATION or backend.setting(
"FORCE_EMAIL_VALIDATION", False
)
send_validation = details.get("email") and (
is_new or backend.setting("PASSWORDLESS", False)
)
if requires_validation and send_validation:
# External partial resumes may replay the original validation-link data
# after a local confirmation request.
data = kwargs.get("request") or backend.strategy.request_data()
if "verification_code" in data:
backend.strategy.session_pop("email_validation_address")
if not backend.strategy.validate_email(
details["email"], data["verification_code"]
):
raise InvalidEmail(backend)
return None
current_partial = kwargs["current_partial"]
backend.strategy.send_email_validation(
backend, details["email"], current_partial.token
)
backend.strategy.session_set("email_validation_address", details["email"])
return backend.strategy.redirect(
cast("str", backend.strategy.setting("EMAIL_VALIDATION_URL"))
)
return None