Coverage for ivatar/ivataraccount/auth.py: 93%

44 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-21 11:51 +0000

1import logging 

2from social_core.backends.open_id_connect import OpenIdConnectAuth 

3 

4from django.conf import settings 

5from ivatar.ivataraccount.models import ConfirmedEmail, Photo 

6 

7logger = logging.getLogger("ivatar") 

8TRUST_EMAIL_FROM_SOCIAL_AUTH_BACKENDS = getattr(settings, "TRUST_EMAIL_FROM_SOCIAL_AUTH_BACKENDS", []) 

9 

10 

11from social_django.utils import load_strategy 

12 

13 

14class FedoraOpenIdConnect(OpenIdConnectAuth): 

15 name = "fedora" 

16 USERNAME_KEY = "nickname" 

17 OIDC_ENDPOINT = "https://id.fedoraproject.org" 

18 DEFAULT_SCOPE = ["openid", "profile", "email"] 

19 TOKEN_ENDPOINT_AUTH_METHOD = "client_secret_post" 

20 

21 def __init__(self, strategy=None, *args, **kwargs): 

22 if strategy is None: 

23 strategy = load_strategy() 

24 super().__init__(strategy, *args, **kwargs) 

25 

26 

27# Pipeline methods 

28 

29 

30def add_confirmed_email(backend, user, response, *args, **kwargs): 

31 """Add a ConfirmedEmail if we trust the auth backend to validate email.""" 

32 if not kwargs.get("is_new", False): 

33 return None # Only act on account creation 

34 if backend.name not in TRUST_EMAIL_FROM_SOCIAL_AUTH_BACKENDS: 

35 return None 

36 if ConfirmedEmail.objects.filter(email=user.email).count() > 0: 

37 # email already exists 

38 return None 

39 (confirmed_id, external_photos) = ConfirmedEmail.objects.create_confirmed_email( 

40 user, user.email, True 

41 ) 

42 confirmed_email = ConfirmedEmail.objects.get(id=confirmed_id) 

43 logger.debug( 

44 "Email %s added upon creation of user %s", confirmed_email.email, user.pk 

45 ) 

46 photo = Photo.objects.create(user=user, ip_address=confirmed_email.ip_address) 

47 import_result = photo.import_image("Gravatar", confirmed_email.email) 

48 if import_result: 

49 logger.debug("Gravatar image imported for %s", confirmed_email.email) 

50 

51 

52def associate_by_confirmed_email(backend, details, user=None, *args, **kwargs): 

53 """ 

54 Associate current auth with a user that has their email address as ConfirmedEmail in the DB. 

55 """ 

56 if user: 

57 return None 

58 email = details.get("email") 

59 if not email: 

60 return None 

61 try: 

62 confirmed_email = ConfirmedEmail.objects.get(email=email) 

63 except ConfirmedEmail.DoesNotExist: 

64 return None 

65 user = confirmed_email.user 

66 logger.debug("Found a matching ConfirmedEmail for %s upon login", user.username) 

67 return {"user": user, "is_new": False}