Coverage for src/lexigram/auth/mfa/hooks.py: 100%
16 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 12:26 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 12:26 +0800
1"""Lifecycle hooks for auth/mfa — intercepted when MFA operations occur."""
3from __future__ import annotations
5from dataclasses import dataclass
7__all__ = ["MFAChallengeIssuedHook", "MFAFailedHook", "MFAVerifiedHook"]
10@dataclass(frozen=True, kw_only=True)
11class MFAChallengeIssuedHook:
12 """Payload fired when an MFA challenge is issued to a user.
14 Attributes:
15 user_id: Identifier of the user receiving the MFA challenge.
16 method: MFA method used (e.g. ``"totp"``, ``"backup_code"``).
17 """
19 user_id: str
20 method: str
23@dataclass(frozen=True, kw_only=True)
24class MFAVerifiedHook:
25 """Payload fired when MFA verification succeeds.
27 Attributes:
28 user_id: Identifier of the user whose MFA was verified.
29 method: MFA method that was verified (e.g. ``"totp"``, ``"backup_code"``).
30 """
32 user_id: str
33 method: str
36@dataclass(frozen=True, kw_only=True)
37class MFAFailedHook:
38 """Payload fired when MFA verification fails.
40 Attributes:
41 user_id: Identifier of the user whose MFA failed.
42 method: MFA method that failed (e.g. ``"totp"``, ``"backup_code"``).
43 reason: Short description of why verification failed.
44 """
46 user_id: str
47 method: str
48 reason: str