This commit is contained in:
trinkey 2024-12-23 13:22:07 -05:00
parent b1ab59cfdd
commit 6f6ff87a85
9 changed files with 78 additions and 22 deletions

View file

@ -1,4 +1,2 @@
ALLOW_NEW_USERS = True
tCOMMON_URL_INTERNAL = "http://localhost:8888"
tCOMMON_TOKEN = "Secret tCommon-specific token"

View file

@ -15,7 +15,7 @@ class Migration(migrations.Migration):
operations = [
migrations.CreateModel(
name='TUser',
name='tUser',
fields=[
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
],

View file

@ -2,5 +2,5 @@ from django.contrib.auth.models import User
from django.db import models
class TUser(models.Model):
class tUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)

View file

@ -1,10 +1,12 @@
{% extends "base.html" %}
{% block body %}
<h1>Welcome back, {{ username }}!</h1>
<h1>Hey there, {{ username }}!</h1>
<hr>
<p>Available services:</p>
<ul class="left inline-block no-margin">
{% if config.services.message %}<li><a href="{{ config.services.message.url.pub }}{{ login_token }}">tMessage</a></li>{% endif %}
</ul>
<hr class="sub">
<small><a href="/logout/">Log out</a></small>
{% endblock %}

View file

@ -2,10 +2,10 @@
{% block body %}
<h1>Sign Up</h1>
{{ error }}
<div id="error">{{ error }}</div>
<hr>
<p>
<form method="POST">
<form method="POST" onsubmit="if (document.getElementById('password').value !== document.getElementById('confirm').value) {event.preventDefault(); document.getElementById('error').innerText = 'Passwords don\'t match!';}">
{% csrf_token %}
<p>
<div><input name="username" id="username" required type="text" pattern="[a-z0-9A-Z_][a-z0-9A-Z_\-]{0,28}[a-z0-9A-Z_]" maxlength="30" placeholder="Username"></div>
@ -28,6 +28,7 @@
</ul>
</small></label>
</p>
<p><div><input id="confirm" required type="password" placeholder="Confirm password" maxlength="100"></div></p>
<p><input type="submit" value="Sign Up"></p>
<p><a href="/login/{{ login_extra }}">Already have an account?</a></p>
</form>

View file

@ -1,13 +1,17 @@
from django.contrib import admin
from django.urls import path
from .views import index, is_logged_in, login, redirect, signup
from .views import (auth, get_username, index, login, logout, redirect, signup,
username_exists)
urlpatterns = [
path("", index),
path("login/", login),
path("signup/", signup),
path("logout/", logout),
path("auth/", auth),
path("redirect/", redirect),
path("api/authenticated/", is_logged_in),
path("api/authenticated/", get_username),
path("api/username/", username_exists),
path("django-admin/", admin.site.urls)
]

View file

@ -1,2 +1,3 @@
from .api import is_logged_in # noqa: F401
from .templates import index, login, redirect, signup # noqa: F401
from .api import get_username, username_exists # noqa: F401
from .templates import (auth, index, login, logout, redirect, # noqa: F401
signup)

View file

@ -1,18 +1,21 @@
import json
from django.contrib.auth.models import User
from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponse
from tauth.settings import config
def is_logged_in(request: WSGIRequest) -> HttpResponse:
def get_username(request: WSGIRequest) -> HttpResponse:
try:
if request.GET.get("token") == config["services"][request.GET.get("service")]["token"]:
authenticated = request.user.is_authenticated
return HttpResponse(
json.dumps({
"success": True,
"auth": request.user.is_authenticated
"authenticated": authenticated,
"username": request.user.get_username() if authenticated else None
}),
content_type="application/json"
)
@ -26,3 +29,31 @@ def is_logged_in(request: WSGIRequest) -> HttpResponse:
content_type="application/json",
status=401
)
def username_exists(request: WSGIRequest) -> HttpResponse:
try:
if request.GET.get("token") == config["services"][request.GET.get("service")]["token"]:
exists = True
try:
User.objects.get(username=request.GET.get("username"))
except User.DoesNotExist:
exists = False
return HttpResponse(
json.dumps({
"success": True,
"exists": exists
}),
content_type="application/json"
)
except KeyError:
...
return HttpResponse(
json.dumps({
"success": False
}),
content_type="application/json",
status=401
)

View file

@ -1,4 +1,5 @@
import re
from datetime import datetime
from django.contrib.auth import authenticate
from django.contrib.auth import login as set_auth
@ -7,13 +8,21 @@ from django.contrib.auth.models import User
from django.core.handlers.wsgi import WSGIRequest
from django.http import HttpResponse, HttpResponseRedirect
from config import ALLOW_NEW_USERS
from tauth.models import TUser
from tauth.models import tUser
from tauth.settings import config
from .helper import render_template
def auth(request: WSGIRequest) -> HttpResponseRedirect:
resp = HttpResponseRedirect("/")
if "remove" in request.GET:
resp.set_cookie("sessionid", "", max_age=0, expires=datetime(0, 0, 0))
else:
resp.set_cookie("sessionid", request.GET.get("sessionid") or "")
return resp
def index(request: WSGIRequest) -> HttpResponse:
if request.user.is_authenticated:
return render_template(
@ -23,14 +32,14 @@ def index(request: WSGIRequest) -> HttpResponse:
return render_template(
request, "noauth/index.html",
new_users=ALLOW_NEW_USERS
new_users=config["new_users"]
)
def signup(request: WSGIRequest) -> HttpResponse:
if request.user.is_authenticated:
return HttpResponseRedirect("/")
if ALLOW_NEW_USERS:
if config["new_users"]:
if request.method == "POST":
username = (request.POST.get("username") or "").lower().strip()
password = (request.POST.get("password") or "")
@ -42,6 +51,9 @@ def signup(request: WSGIRequest) -> HttpResponse:
elif len(password) < 6 or len(password) > 100 or not (any([i.isalpha() for i in password]) and any([i.isnumeric() for i in password]) and any([not i.isalnum() for i in password])):
error = "Invalid password"
elif username.lower() in password.lower():
error = "Password can't contain username"
else:
try:
u = User.objects.create_user(
@ -51,7 +63,7 @@ def signup(request: WSGIRequest) -> HttpResponse:
except User.DoesNotExist:
error = "Username already in use"
else:
TUser.objects.create(user=u)
tUser.objects.create(user=u)
set_auth(request, u)
to = request.GET.get("to")
@ -103,7 +115,7 @@ def login(request: WSGIRequest) -> HttpResponse:
return render_template(
request, "noauth/login.html",
title="Log In",
new_users=ALLOW_NEW_USERS,
new_users=config["new_users"],
error="Username or password is incorrect",
login_extra=f"?to={request.GET.get('to')}" if "to" in request.GET else "",
repopulate={
@ -123,16 +135,23 @@ def login(request: WSGIRequest) -> HttpResponse:
return render_template(
request, "noauth/login.html",
title="Log In",
new_users=ALLOW_NEW_USERS,
new_users=config["new_users"],
login_extra=f"?to={request.GET.get('to')}" if "to" in request.GET else ""
)
def redirect(request: WSGIRequest) -> HttpResponseRedirect:
to = request.GET.get("to")
print(request.COOKIES)
if to and to in config["services"] and config["services"][to]:
return HttpResponseRedirect(config["services"][to]["url"]["pub"] + (f"/auth/?sessionid={request.COOKIES.get('sessionid')}" if "reauth" in request.GET else ""))
return HttpResponseRedirect("/")
def logout(request: WSGIRequest) -> HttpResponseRedirect:
remove_auth(request)
to = request.GET.get("to")
if to and to in config["services"] and config["services"][to]:
return HttpResponseRedirect(config["services"][to]["url"]["pub"] + "/auth/?remove")
return HttpResponseRedirect("/")