aboutsummaryrefslogtreecommitdiffstats
path: root/pydis_site/apps/home/apps.py
blob: 55a393a9c6db65ac0904e12ec59fe9ce3d25db84 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from typing import Any, Dict

from django.apps import AppConfig


class HomeConfig(AppConfig):
    """Django AppConfig for the home app."""

    name = 'pydis_site.apps.home'
    signal_listener = None

    def ready(self) -> None:
        """Run when the app has been loaded and is ready to serve requests."""
        from pydis_site.apps.home.signals import AllauthSignalListener

        self.signal_listener = AllauthSignalListener()
        self.patch_allauth()

    def patch_allauth(self) -> None:
        """Monkey-patches Allauth classes so we never collect email addresses."""
        # Imported here because we can't import it before our apps are loaded up
        from allauth.socialaccount.providers.base import Provider

        def extract_extra_data(_: Provider, data: Dict[str, Any]) -> Dict[str, Any]:
            """
            Extracts extra data for a SocialAccount provided by Allauth.

            This is our version of this function that strips the email address from incoming extra
            data. We do this so that we never have to store it.

            This is monkey-patched because most OAuth providers - or at least the ones we care
            about - all use the function from the base Provider class. This means we don't have
            to make a new Django app for each one we want to work with.
            """
            data["email"] = ""
            return data

        Provider.extract_extra_data = extract_extra_data