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

1"""Lifecycle hooks for auth/mfa — intercepted when MFA operations occur.""" 

2 

3from __future__ import annotations 

4 

5from dataclasses import dataclass 

6 

7__all__ = ["MFAChallengeIssuedHook", "MFAFailedHook", "MFAVerifiedHook"] 

8 

9 

10@dataclass(frozen=True, kw_only=True) 

11class MFAChallengeIssuedHook: 

12 """Payload fired when an MFA challenge is issued to a user. 

13 

14 Attributes: 

15 user_id: Identifier of the user receiving the MFA challenge. 

16 method: MFA method used (e.g. ``"totp"``, ``"backup_code"``). 

17 """ 

18 

19 user_id: str 

20 method: str 

21 

22 

23@dataclass(frozen=True, kw_only=True) 

24class MFAVerifiedHook: 

25 """Payload fired when MFA verification succeeds. 

26 

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 """ 

31 

32 user_id: str 

33 method: str 

34 

35 

36@dataclass(frozen=True, kw_only=True) 

37class MFAFailedHook: 

38 """Payload fired when MFA verification fails. 

39 

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 """ 

45 

46 user_id: str 

47 method: str 

48 reason: str