Skip to content

Commit

Permalink
Remove Discord Integration
Browse files Browse the repository at this point in the history
We can build this in a separate service, let's keep the scope small
  • Loading branch information
trickeydan committed Feb 10, 2024
1 parent 2d2eedb commit 8eef749
Show file tree
Hide file tree
Showing 15 changed files with 46 additions and 269 deletions.
26 changes: 26 additions & 0 deletions kmicms/accounts/migrations/0003_remove_discord_integration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Generated by Django 4.2.10 on 2024-02-10 14:15

from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
("accounts", "0002_discord_accounts"),
]

operations = [
migrations.RemoveField(
model_name="discordconnection",
name="discord_account",
),
migrations.RemoveField(
model_name="discordconnection",
name="user",
),
migrations.DeleteModel(
name="DiscordAccount",
),
migrations.DeleteModel(
name="DiscordConnection",
),
]
32 changes: 0 additions & 32 deletions kmicms/accounts/models.py
Original file line number Diff line number Diff line change
@@ -1,39 +1,7 @@
from __future__ import annotations

from django.contrib.auth.models import AbstractUser
from django.db import models


class User(AbstractUser):
pass


class DiscordAccount(models.Model):
discord_id = models.PositiveBigIntegerField(unique=True)
username = models.CharField(max_length=255, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def __str__(self) -> str:
return f"@{self.username}"


class DiscordConnection(models.Model):
user = models.OneToOneField(
User, on_delete=models.CASCADE, related_name="discord_connection", related_query_name="discord_connection"
)
discord_account = models.OneToOneField(
DiscordAccount,
on_delete=models.CASCADE,
related_name="discord_connection",
related_query_name="discord_connection",
)
access_token = models.CharField(max_length=30)
refresh_token = models.CharField(max_length=30)
access_token_expires_at = models.DateTimeField()

created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

def __str__(self) -> str:
return f"Discord Connection for {self.user} to {self.discord_account}"
12 changes: 0 additions & 12 deletions kmicms/accounts/oauth.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,6 @@

oauth_config = OAuth()

# Discord Integration
oauth_config.register(
"discord",
client_id=settings.DISCORD_APP_CLIENT_ID,
client_secret=settings.DISCORD_APP_CLIENT_SECRET,
access_token_url=settings.DISCORD_ACCESS_TOKEN_URL,
authorize_url=settings.DISCORD_AUTHORIZE_URL,
revocation_url=settings.DISCORD_REVOCATION_URL,
userinfo_endpoint=settings.DISCORD_USERINFO_ENDPOINT,
client_kwargs=settings.DISCORD_CLIENT_KWARGS,
)

# SOWN SSO
oauth_config.register(
"sown",
Expand Down
14 changes: 0 additions & 14 deletions kmicms/accounts/templates/accounts/discord_account_disconnect.html

This file was deleted.

50 changes: 0 additions & 50 deletions kmicms/accounts/templates/accounts/user_profile.html

This file was deleted.

20 changes: 2 additions & 18 deletions kmicms/accounts/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,27 +6,11 @@
app_name = "accounts"

urlpatterns = [
path("login/", views.auth.LoginView.as_view(), name="login"),
path("login/", views.LoginView.as_view(), name="login"),
path("logout/", LogoutView.as_view(), name="logout"),
path("profile/", views.profile.UserProfileView.as_view(), name="profile"),
path(
"integrations/discord/setup/",
views.discord.DiscordOAuthProfileAuthorizeView.as_view(),
name="discord_oauth_setup",
),
path(
"integrations/discord/redirect/",
views.discord.DiscordOAuthProfileRedirectView.as_view(),
name="discord_oauth_redirect",
),
path(
"integrations/discord/disconnect/",
views.discord.DiscordAccountProfileDisconnectView.as_view(),
name="discord_oauth_disconnect",
),
path(
"oidc/redirect/",
views.auth.SSOOIDCRedirectView.as_view(),
views.SSOOIDCRedirectView.as_view(),
name="sso_oidc_redirect",
),
]
20 changes: 17 additions & 3 deletions kmicms/accounts/views/auth.py → kmicms/accounts/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@
from django.shortcuts import redirect
from django.urls import reverse
from django.views import View
from wagtail.models import Site

from accounts.models import User
from accounts.oauth import oauth_config
from .models import User
from .oauth import oauth_config


class LoginView(auth_views.LoginView):
Expand All @@ -31,11 +32,17 @@ def dispatch(self, request: http.HttpRequest, *args: Any, **kwargs: Any) -> http

# If SSO is enabled, redirect immediately.
if not settings.USE_CONVENTIONAL_AUTH:
request.session["sso_next"] = self.get_redirect_url()

redirect_uri = request.build_absolute_uri(reverse("accounts:sso_oidc_redirect"))
return oauth_config.sown.authorize_redirect(request, redirect_uri)

return super().dispatch(request, *args, **kwargs)

def get_default_redirect_url(self) -> str:
site = Site.find_for_request(self.request)
return site.root_page.get_url()


class SSOOIDCRedirectView(View):
def get(self, request: http.HttpRequest) -> http.HttpResponseRedirect:
Expand All @@ -54,8 +61,15 @@ def get(self, request: http.HttpRequest) -> http.HttpResponseRedirect:

login(request, user)

from_session = request.session.pop("sso_next", None)

redirect_to = from_session or self.get_default_redirect_url()
messages.info(request, f"Signed in via SOWN SSO. Welcome {user.get_short_name()}")
return redirect("accounts:profile")
return redirect(redirect_to)

def get_default_redirect_url(self) -> str:
site = Site.find_for_request(self.request)
return site.root_page.get_url()

def update_user(self, user: User, claims: dict[str, bool | str | list[str]]) -> User:
full_name = claims.get("given_name", "")
Expand Down
3 changes: 0 additions & 3 deletions kmicms/accounts/views/__init__.py

This file was deleted.

94 changes: 0 additions & 94 deletions kmicms/accounts/views/discord.py

This file was deleted.

17 changes: 0 additions & 17 deletions kmicms/accounts/views/profile.py

This file was deleted.

8 changes: 0 additions & 8 deletions kmicms/accounts/wagtail_hooks.py

This file was deleted.

3 changes: 0 additions & 3 deletions kmicms/kmicms/configuration.prod.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,6 @@
SSO_STAFF_GROUP_NAME = os.environ.get("SSO_STAFF_GROUP_NAME")
SSO_SUPERUSER_GROUP_NAME = os.environ.get("SSO_SUPERUSER_GROUP_NAME")

DISCORD_APP_CLIENT_ID = os.environ.get("DISCORD_APP_CLIENT_ID")
DISCORD_APP_CLIENT_SECRET = os.environ.get("DISCORD_APP_CLIENT_SECRET")

RECAPTCHA_PUBLIC_KEY = os.environ.get("RECAPTCHA_PUBLIC_KEY")
RECAPTCHA_PRIVATE_KEY = os.environ.get("RECAPTCHA_PRIVATE_KEY")

Expand Down
12 changes: 0 additions & 12 deletions kmicms/kmicms/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,18 +207,6 @@
USE_X_FORWARDED_HOST = True
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")

# Discord Integration
DISCORD_APP_CLIENT_ID = getattr(configuration, "DISCORD_APP_CLIENT_ID")
DISCORD_APP_CLIENT_SECRET = getattr(configuration, "DISCORD_APP_CLIENT_SECRET")
DISCORD_ACCESS_TOKEN_URL = "https://discordapp.com/api/oauth2/token" # noqa: S105
DISCORD_AUTHORIZE_URL = "https://discordapp.com/api/oauth2/authorize"
DISCORD_REVOCATION_URL = "https://discord.com/api/oauth2/token/revoke"
DISCORD_USERINFO_ENDPOINT = "https://discordapp.com/api/users/@me"
DISCORD_CLIENT_KWARGS = {
"token_endpoint_auth_method": "client_secret_post",
"scope": "identify",
}


# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/
Expand Down
Loading

0 comments on commit 8eef749

Please sign in to comment.