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
« 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
4from django.conf import settings
5from ivatar.ivataraccount.models import ConfirmedEmail, Photo
7logger = logging.getLogger("ivatar")
8TRUST_EMAIL_FROM_SOCIAL_AUTH_BACKENDS = getattr(settings, "TRUST_EMAIL_FROM_SOCIAL_AUTH_BACKENDS", [])
11from social_django.utils import load_strategy
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"
21 def __init__(self, strategy=None, *args, **kwargs):
22 if strategy is None:
23 strategy = load_strategy()
24 super().__init__(strategy, *args, **kwargs)
27# Pipeline methods
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)
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}