aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pydis_site/apps/home/apps.py24
-rw-r--r--pydis_site/apps/home/urls.py2
-rw-r--r--pydis_site/apps/home/views/login.py31
-rw-r--r--pydis_site/templates/base/navbar.html13
-rw-r--r--pydis_site/templates/home/login.html50
5 files changed, 34 insertions, 86 deletions
diff --git a/pydis_site/apps/home/apps.py b/pydis_site/apps/home/apps.py
index 055d721b..a7c47dc5 100644
--- a/pydis_site/apps/home/apps.py
+++ b/pydis_site/apps/home/apps.py
@@ -1,3 +1,5 @@
+from typing import Any, Dict
+
from django.apps import AppConfig
@@ -12,3 +14,25 @@ class HomeConfig(AppConfig):
from pydis_site.apps.home.signals import SignalListener
self.signal_listener = SignalListener()
+ 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
diff --git a/pydis_site/apps/home/urls.py b/pydis_site/apps/home/urls.py
index 150b5b12..dbb53cb6 100644
--- a/pydis_site/apps/home/urls.py
+++ b/pydis_site/apps/home/urls.py
@@ -6,7 +6,6 @@ from django.contrib import admin
from django.contrib.messages import ERROR
from django.urls import include, path
-from pydis_site.apps.home.views.login import LoginView
from pydis_site.utils.views import MessageRedirectView
from .views import HomeView
@@ -31,7 +30,6 @@ urlpatterns = [
),
path('connections', ConnectionsView.as_view()),
- path('login', LoginView.as_view(), name="login"),
path('logout', LogoutView.as_view(), name="logout"),
path('admin/', admin.site.urls),
diff --git a/pydis_site/apps/home/views/login.py b/pydis_site/apps/home/views/login.py
deleted file mode 100644
index d74403a8..00000000
--- a/pydis_site/apps/home/views/login.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from allauth.socialaccount.providers import registry
-from allauth.socialaccount.providers.discord.provider import DiscordProvider
-from django.contrib import messages
-from django.http import HttpRequest, HttpResponse
-from django.shortcuts import redirect
-from django.views.generic import View
-from django.views.generic.base import TemplateResponseMixin
-
-
-class LoginView(View, TemplateResponseMixin):
- """Login view for collecting email collection consent from users."""
-
- template_name = "home/login.html"
-
- def get(self, request: HttpRequest) -> HttpResponse:
- """Render the login page view."""
- return self.render_to_response({})
-
- def post(self, request: HttpRequest) -> HttpResponse:
- """Check whether the user provided consent, and action appropriately."""
- if request.POST.get("consent", None) != "on": # I bet IE breaks this standard...
- messages.add_message(
- request,
- messages.ERROR,
- "Consent is required to login with Discord.",
- )
-
- return self.render_to_response({})
-
- provider: DiscordProvider = registry.by_id("discord")
- return redirect(provider.get_login_url(request))
diff --git a/pydis_site/templates/base/navbar.html b/pydis_site/templates/base/navbar.html
index f51f7c53..1d30b8f0 100644
--- a/pydis_site/templates/base/navbar.html
+++ b/pydis_site/templates/base/navbar.html
@@ -1,3 +1,4 @@
+{% load socialaccount %}
{% load static %}
<nav class="navbar is-primary" role="navigation" aria-label="main navigation">
@@ -86,9 +87,15 @@
<hr class="navbar-divider">
{% if not user.is_authenticated %}
- <a class="navbar-item" href="{% url 'login' %}">
- Login
- </a>
+ {% get_providers as socialaccount_providers %}
+
+ {% for provider in socialaccount_providers %}
+ {% if provider.id == "discord" %}
+ <a class="navbar-item"
+ href="{% provider_login_url provider.id process="login" scope=scope auth_params=auth_params %}"
+ >Login with {{ provider.name }}</a>
+ {% endif %}
+ {% endfor %}
{% else %}
<form method="post" action="{% url 'logout' %}">
{% csrf_token %}
diff --git a/pydis_site/templates/home/login.html b/pydis_site/templates/home/login.html
deleted file mode 100644
index 2206e95c..00000000
--- a/pydis_site/templates/home/login.html
+++ /dev/null
@@ -1,50 +0,0 @@
-{% extends 'base/base.html' %}
-
-{% load account %}
-{% load socialaccount %}
-{% load static %}
-
-{% block title %}Login{% endblock %}
-{% block head %}
- <link rel="stylesheet" href="{% static "css/home/index.css" %}">
-{% endblock %}
-
-{% block content %}
- {% include "base/navbar.html" %}
-
- {# Sponsors #}
- <section class="section">
- <div class="container">
- <div class="columns is-mobile is-centered">
- <div class="column is-full-mobile is-full-tablet is-half-desktop">
- {% get_providers as socialaccount_providers %}
-
- <h1 class="title has-text-centered">Login with Discord</h1>
-
- <form method="post">
- {% csrf_token %}
-
- <div class="field notification is-horizontal">
- <input class="is-checkradio is-circle is-dark" type="checkbox" id="consent" name="consent" />
- <label for="consent">
- I consent to Python Discord using my Discord email address to identify my account
- </label>
- </div>
-
- <div class="field is-grouped-centered has-text-centered">
- <button class="button is-large is-primary" type="submit">
- <span class="icon">
- <i class="fab fa-discord"></i>
- </span>
- <span>
- Login
- </span>
- </button>
- </div>
- </form>
- </div>
- </div>
- </div>
- </section>
-
-{% endblock %}