canaille-globuzma/website/routes.py

112 lines
2.9 KiB
Python
Raw Normal View History

2020-08-14 11:18:08 +00:00
import datetime
2020-08-14 13:26:14 +00:00
from flask import Blueprint, request, session
2020-08-14 11:18:08 +00:00
from flask import render_template, redirect, jsonify
from werkzeug.security import gen_salt
from authlib.oauth2 import OAuth2Error
from .models import User, Client
from .oauth2 import authorization, require_oauth
2020-08-16 17:39:14 +00:00
bp = Blueprint(__name__, "home")
2020-08-14 11:18:08 +00:00
def current_user():
2020-08-16 17:39:14 +00:00
if "user_dn" in session:
2020-08-14 13:26:14 +00:00
return User.get(session["user_dn"])
2020-08-14 11:18:08 +00:00
return None
2020-08-16 17:39:14 +00:00
@bp.route("/", methods=("GET", "POST"))
2020-08-14 11:18:08 +00:00
def home():
2020-08-16 17:39:14 +00:00
if request.method == "POST":
username = request.form.get("username")
2020-08-14 13:26:14 +00:00
user = User.get(username)
2020-08-14 11:18:08 +00:00
if not user:
user = User(cn=username, sn=username)
user.save()
2020-08-17 07:45:35 +00:00
2020-08-14 11:18:08 +00:00
session["user_dn"] = user.dn
2020-08-16 17:39:14 +00:00
return redirect("/")
2020-08-17 07:45:35 +00:00
2020-08-14 11:18:08 +00:00
user = current_user()
2020-08-14 13:26:14 +00:00
if user:
clients = Client.filter()
else:
clients = []
2020-08-17 07:45:35 +00:00
2020-08-16 17:39:14 +00:00
return render_template("home.html", user=user, clients=clients)
2020-08-14 11:18:08 +00:00
2020-08-14 13:26:14 +00:00
def split_by_crlf(s):
return [v for v in s.splitlines() if v]
2020-08-14 11:18:08 +00:00
2020-08-16 17:39:14 +00:00
@bp.route("/create_client", methods=("GET", "POST"))
2020-08-14 11:18:08 +00:00
def create_client():
user = current_user()
if not user:
2020-08-16 17:39:14 +00:00
return redirect("/")
2020-08-17 07:45:35 +00:00
2020-08-16 17:39:14 +00:00
if request.method == "GET":
return render_template("create_client.html")
2020-08-17 07:45:35 +00:00
2020-08-14 11:18:08 +00:00
form = request.form
client_id = gen_salt(24)
client_id_issued_at = datetime.datetime.now().strftime("%Y%m%d%H%M%SZ")
client = Client(
oauthClientID=client_id,
2020-08-14 13:26:14 +00:00
oauthIssueDate=client_id_issued_at,
2020-08-14 11:18:08 +00:00
oauthClientName=form["client_name"],
oauthClientURI=form["client_uri"],
oauthGrantType=split_by_crlf(form["grant_type"]),
oauthRedirectURI=split_by_crlf(form["redirect_uri"]),
oauthResponseType=split_by_crlf(form["response_type"]),
2020-08-14 13:26:14 +00:00
oauthScope=form["scope"],
oauthTokenEndpointAuthMethod=form["token_endpoint_auth_method"],
2020-08-16 17:39:14 +00:00
oauthClientSecret=""
if form["token_endpoint_auth_method"] == "none"
else gen_salt(48),
2020-08-14 11:18:08 +00:00
)
client.save()
2020-08-16 17:39:14 +00:00
return redirect("/")
2020-08-14 11:18:08 +00:00
2020-08-16 17:39:14 +00:00
@bp.route("/oauth/authorize", methods=["GET", "POST"])
2020-08-14 11:18:08 +00:00
def authorize():
user = current_user()
2020-08-16 17:39:14 +00:00
if request.method == "GET":
2020-08-14 11:18:08 +00:00
try:
grant = authorization.validate_consent_request(end_user=user)
except OAuth2Error as error:
2020-08-14 13:26:14 +00:00
return jsonify(dict(error.get_body()))
2020-08-16 17:39:14 +00:00
return render_template("authorize.html", user=user, grant=grant)
2020-08-17 07:45:35 +00:00
2020-08-16 17:39:14 +00:00
if not user and "username" in request.form:
username = request.form.get("username")
2020-08-14 13:26:14 +00:00
user = User.get(username)
2020-08-17 07:45:35 +00:00
2020-08-16 17:39:14 +00:00
if request.form["confirm"]:
2020-08-14 11:18:08 +00:00
grant_user = user
else:
grant_user = None
2020-08-17 07:45:35 +00:00
2020-08-14 11:18:08 +00:00
return authorization.create_authorization_response(grant_user=grant_user)
2020-08-16 17:39:14 +00:00
@bp.route("/logout")
2020-08-14 13:26:14 +00:00
def logout():
2020-08-16 17:39:14 +00:00
del session["user_dn"]
return redirect("/")
2020-08-14 11:18:08 +00:00
2020-08-16 17:39:14 +00:00
@bp.route("/oauth/token", methods=["POST"])
2020-08-14 11:18:08 +00:00
def issue_token():
return authorization.create_token_response()
2020-08-16 17:39:14 +00:00
@bp.route("/api/me")
@require_oauth("profile")
2020-08-14 11:18:08 +00:00
def api_me():
2020-08-14 13:26:14 +00:00
return jsonify(foo="bar")