Coverage for authentication\validators\emailValidator.py: 82%

17 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-10-13 15:18 +0200

1""" 

2Validateur personnalisé pour les adresses email. 

3 

4Ce module fournit un validateur qui vérifie le format de l'email, 

5rejette les emails jetables et s'assure que l'adresse n'est pas déjà utilisée 

6dans le système. 

7 

8:module: users.validators.email 

9""" 

10 

11import re 

12from django.core.exceptions import ValidationError 

13from django.utils.translation import gettext_lazy as _ 

14from users.models.base_user import User # adapte ce chemin selon ton projet 

15 

16class EmailValidator: 

17 """ 

18 Validateur personnalisé pour les adresses email. 

19 

20 Vérifie : 

21 - le format de l'email, 

22 - l'absence de domaines d'emails jetables, 

23 - l'unicité de l'email dans la base de données. 

24 

25 :ivar forbidden_domains: Liste des domaines d'emails jetables interdits 

26 :type forbidden_domains: list 

27 """ 

28 

29 def __init__(self, forbidden_domains=None): 

30 """ 

31 Initialise le validateur avec une liste de domaines interdits. 

32 

33 :param forbidden_domains: Domaines d'emails jetables à interdire 

34 :type forbidden_domains: list, optional 

35 """ 

36 self.forbidden_domains = forbidden_domains or [ 

37 'tempmail.com', 

38 'mailinator.com', 

39 'yopmail.com', 

40 '10minutemail.com', 

41 ] 

42 

43 def __call__(self, value): 

44 """ 

45 Valide l'adresse email selon plusieurs critères. 

46 

47 :param value: L'adresse email à valider 

48 :type value: str 

49 :raises ValidationError: Si l'email est invalide, jetable ou déjà utilisé 

50 """ 

51 # Vérification du format 

52 if not re.match(r'^[\w\.-]+@[\w\.-]+\.\w+$', value): 

53 raise ValidationError(_("Adresse e-mail invalide.")) 

54 

55 # Vérification des domaines interdits 

56 domain = value.split('@')[-1].lower() 

57 if domain in self.forbidden_domains: 

58 raise ValidationError(_("Les adresses e-mail jetables ne sont pas autorisées.")) 

59 

60 # Vérification de l'unicité 

61 if User.objects.filter(email__iexact=value).exists(): 

62 raise ValidationError(_("Un utilisateur avec cet e-mail existe déjà.")) 

63 

64 def get_help_text(self): 

65 """ 

66 Retourne le texte d'aide pour ce validateur. 

67 

68 :return: Message d'aide expliquant les règles de validation 

69 :rtype: str 

70 """ 

71 return _( 

72 "Utilisez une adresse e-mail valide, non temporaire, et qui n'est pas déjà enregistrée." 

73 )