157 lines
5.3 KiB
Python
157 lines
5.3 KiB
Python
import re
|
|
from datetime import datetime
|
|
|
|
from django.contrib.auth import authenticate
|
|
from django.contrib.auth import login as set_auth
|
|
from django.contrib.auth import logout as remove_auth
|
|
from django.contrib.auth.models import User
|
|
from django.core.handlers.wsgi import WSGIRequest
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
|
|
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(
|
|
request, "index.html",
|
|
username=request.user.get_username()
|
|
)
|
|
|
|
return render_template(
|
|
request, "noauth/index.html",
|
|
new_users=config["new_users"]
|
|
)
|
|
|
|
def signup(request: WSGIRequest) -> HttpResponse:
|
|
if request.user.is_authenticated:
|
|
return HttpResponseRedirect("/")
|
|
|
|
if config["new_users"]:
|
|
if request.method == "POST":
|
|
username = (request.POST.get("username") or "").lower().strip()
|
|
password = (request.POST.get("password") or "")
|
|
error = None
|
|
|
|
if len(username) < 2 or len(username) > 30 or not re.match("^[a-z0-9_][a-z0-9_\\-]{0,28}[a-z0-9_]$", username):
|
|
error = "Invalid username"
|
|
|
|
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(
|
|
username=username,
|
|
password=password
|
|
)
|
|
except User.DoesNotExist:
|
|
error = "Username already in use"
|
|
else:
|
|
tUser.objects.create(user=u)
|
|
set_auth(request, u)
|
|
to = request.GET.get("to")
|
|
|
|
if to and to in config["services"] and config["services"][to]:
|
|
return HttpResponseRedirect(f"/redirect/?to={to}&reauth")
|
|
|
|
return HttpResponseRedirect("/")
|
|
|
|
return render_template(
|
|
request, "noauth/signup.html",
|
|
title="Sign Up",
|
|
error=error,
|
|
login_extra=f"?to={request.GET.get('to')}" if "to" in request.GET else "",
|
|
repopulate={
|
|
"username": username
|
|
}
|
|
)
|
|
|
|
return render_template(
|
|
request, "noauth/signup.html",
|
|
title="Sign Up",
|
|
login_extra=f"?to={request.GET.get('to')}" if "to" in request.GET else ""
|
|
)
|
|
|
|
return render_template(
|
|
request, "404.html"
|
|
)
|
|
|
|
def login(request: WSGIRequest) -> HttpResponse:
|
|
if request.user.is_authenticated:
|
|
to = request.GET.get("to")
|
|
|
|
if to and to in config["services"] and config["services"]["to"]:
|
|
return HttpResponseRedirect(f"/redirect/?to={to}&reauth")
|
|
|
|
return HttpResponseRedirect("/")
|
|
|
|
if request.method == "POST":
|
|
username = (request.POST.get("username") or "").lower().strip()
|
|
password = (request.POST.get("password") or "")
|
|
|
|
user = authenticate(
|
|
request,
|
|
username=username,
|
|
password=password
|
|
)
|
|
|
|
if user is None:
|
|
return render_template(
|
|
request, "noauth/login.html",
|
|
title="Log In",
|
|
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={
|
|
"username": username
|
|
}
|
|
)
|
|
|
|
set_auth(request, user)
|
|
to = request.GET.get("to")
|
|
|
|
if to and to in config["services"] and config["services"][to]:
|
|
return HttpResponseRedirect(f"/redirect/?to={to}&reauth")
|
|
|
|
return HttpResponseRedirect("/")
|
|
|
|
|
|
return render_template(
|
|
request, "noauth/login.html",
|
|
title="Log In",
|
|
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")
|
|
|
|
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("/")
|