Fixed an issue that prevented the password reset tokens from working. Added email templates for password reset success and new account creation. Added more dynamic email template support.
107 lines
3.1 KiB
Python
107 lines
3.1 KiB
Python
import typing as _t
|
|
from datetime import datetime
|
|
|
|
_t_opt_any = _t.Optional[_t.Any]
|
|
_t_opt_exc = _t.Optional[Exception]
|
|
|
|
|
|
class BadData(Exception):
|
|
"""Raised if bad data of any sort was encountered. This is the base
|
|
for all exceptions that ItsDangerous defines.
|
|
|
|
.. versionadded:: 0.15
|
|
"""
|
|
|
|
def __init__(self, message: str):
|
|
super().__init__(message)
|
|
self.message = message
|
|
|
|
def __str__(self) -> str:
|
|
return self.message
|
|
|
|
|
|
class BadSignature(BadData):
|
|
"""Raised if a signature does not match."""
|
|
|
|
def __init__(self, message: str, payload: _t_opt_any = None):
|
|
super().__init__(message)
|
|
|
|
#: The payload that failed the signature test. In some
|
|
#: situations you might still want to inspect this, even if
|
|
#: you know it was tampered with.
|
|
#:
|
|
#: .. versionadded:: 0.14
|
|
self.payload: _t_opt_any = payload
|
|
|
|
|
|
class BadTimeSignature(BadSignature):
|
|
"""Raised if a time-based signature is invalid. This is a subclass
|
|
of :class:`BadSignature`.
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
message: str,
|
|
payload: _t_opt_any = None,
|
|
date_signed: _t.Optional[datetime] = None,
|
|
):
|
|
super().__init__(message, payload)
|
|
|
|
#: If the signature expired this exposes the date of when the
|
|
#: signature was created. This can be helpful in order to
|
|
#: tell the user how long a link has been gone stale.
|
|
#:
|
|
#: .. versionchanged:: 2.0
|
|
#: The datetime value is timezone-aware rather than naive.
|
|
#:
|
|
#: .. versionadded:: 0.14
|
|
self.date_signed = date_signed
|
|
|
|
|
|
class SignatureExpired(BadTimeSignature):
|
|
"""Raised if a signature timestamp is older than ``max_age``. This
|
|
is a subclass of :exc:`BadTimeSignature`.
|
|
"""
|
|
|
|
|
|
class BadHeader(BadSignature):
|
|
"""Raised if a signed header is invalid in some form. This only
|
|
happens for serializers that have a header that goes with the
|
|
signature.
|
|
|
|
.. versionadded:: 0.24
|
|
"""
|
|
|
|
def __init__(
|
|
self,
|
|
message: str,
|
|
payload: _t_opt_any = None,
|
|
header: _t_opt_any = None,
|
|
original_error: _t_opt_exc = None,
|
|
):
|
|
super().__init__(message, payload)
|
|
|
|
#: If the header is actually available but just malformed it
|
|
#: might be stored here.
|
|
self.header: _t_opt_any = header
|
|
|
|
#: If available, the error that indicates why the payload was
|
|
#: not valid. This might be ``None``.
|
|
self.original_error: _t_opt_exc = original_error
|
|
|
|
|
|
class BadPayload(BadData):
|
|
"""Raised if a payload is invalid. This could happen if the payload
|
|
is loaded despite an invalid signature, or if there is a mismatch
|
|
between the serializer and deserializer. The original exception
|
|
that occurred during loading is stored on as :attr:`original_error`.
|
|
|
|
.. versionadded:: 0.15
|
|
"""
|
|
|
|
def __init__(self, message: str, original_error: _t_opt_exc = None):
|
|
super().__init__(message)
|
|
|
|
#: If available, the error that indicates why the payload was
|
|
#: not valid. This might be ``None``.
|
|
self.original_error: _t_opt_exc = original_error
|