Compare commits
No commits in common. 'refactor' and 'master' have entirely different histories.
@ -1,3 +1,5 @@
|
|||||||
peewee
|
peewee
|
||||||
quart
|
quart
|
||||||
quart_session_openid
|
Quart-Keycloak
|
||||||
|
uvicorn
|
||||||
|
redis
|
@ -1,28 +1,34 @@
|
|||||||
import peewee
|
import re
|
||||||
from quart import session, redirect, url_for
|
|
||||||
|
|
||||||
from yellow.factory import openid
|
import peewee
|
||||||
|
from quart import session, redirect, url_for, current_app
|
||||||
|
from quart_keycloak import Keycloak, KeycloakAuthToken, KeycloakLogoutRequest
|
||||||
|
from yellow.factory import keycloak
|
||||||
from yellow.models import User
|
from yellow.models import User
|
||||||
|
|
||||||
|
|
||||||
@openid.after_token()
|
@keycloak.after_login()
|
||||||
async def handle_user_login(resp: dict):
|
async def handle_user_login(auth_token: KeycloakAuthToken):
|
||||||
access_token = resp["access_token"]
|
username = auth_token.username
|
||||||
openid.verify_token(access_token)
|
uid = auth_token.sub
|
||||||
|
|
||||||
user = await openid.user_info(access_token)
|
if not re.match(r"^[a-zA-Z0-9_\.-]+$", username):
|
||||||
username = user['preferred_username']
|
raise Exception("bad username")
|
||||||
uid = user['sub']
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
user = User.select().where(User.id == uid).get()
|
user = User.select().where(User.username == username).get()
|
||||||
except peewee.DoesNotExist:
|
except Exception as ex:
|
||||||
user = None
|
user = None
|
||||||
|
|
||||||
if not user:
|
if not user:
|
||||||
# create new user if it does not exist yet
|
# create new user if it does not exist yet
|
||||||
|
current_app.logger.info(f'User {username} not found, creating')
|
||||||
|
try:
|
||||||
user = User.create(id=uid, username=username)
|
user = User.create(id=uid, username=username)
|
||||||
|
except Exception as ex:
|
||||||
|
current_app.logger.debug(f'User {username}, creation error')
|
||||||
|
raise
|
||||||
|
|
||||||
# user is now logged in
|
# user is now logged in
|
||||||
session['user'] = user.to_json()
|
session['user'] = user.to_json()
|
||||||
return redirect(url_for('bp_routes.root'))
|
return redirect(url_for('bp_routes.dashboard'))
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 2.1 KiB |
@ -0,0 +1,3 @@
|
|||||||
|
<form action="{{ url_for('bp_routes.search') }}" method="GET">
|
||||||
|
<input type="text" name="username" placeholder="Search for an username...">
|
||||||
|
</form>
|
@ -0,0 +1,11 @@
|
|||||||
|
<div id="addresses">
|
||||||
|
{% for user in users %}
|
||||||
|
<article>
|
||||||
|
<header>
|
||||||
|
<em><a href="{{ url_for('bp_routes.user_page', name=user.username) }}">{{user.username}}</a></em>
|
||||||
|
<small style="float: right">Added: {{ user.created_dt }}</small>
|
||||||
|
</header>
|
||||||
|
<kbd>{{user.address}}</kbd>
|
||||||
|
</article>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
@ -0,0 +1,42 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
<div style="display:none">
|
||||||
|
{% block title %}YellWOWPages - User{% endblock %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="main">
|
||||||
|
{% include 'includes/search.html' %}
|
||||||
|
|
||||||
|
{% if not users %}
|
||||||
|
<br>Nothing found...
|
||||||
|
{% else %}
|
||||||
|
{% include 'includes/user_results.html' %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#main{
|
||||||
|
width: 100%;
|
||||||
|
height: 80vh;
|
||||||
|
display: grid;
|
||||||
|
place-content: center;
|
||||||
|
}
|
||||||
|
form{
|
||||||
|
height: 80px;
|
||||||
|
}
|
||||||
|
#addresses{
|
||||||
|
width: 100%;
|
||||||
|
height: 50vh;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
#addresses::-webkit-scrollbar{
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
@media (max-width: 800px) {
|
||||||
|
kbd{
|
||||||
|
width: 100vw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
{% endblock %}
|
Loading…
Reference in new issue