Compare commits

..
2 Commits
Author SHA1 Message Date
ciomek a603566235 Username show
Build and Push Docker Image / build-and-push (push) Successful in 29s
2026-08-17 21:35:40 +02:00
ciomek 42e2fbcdb5 Password hashing 2026-08-17 20:59:58 +02:00
5 changed files with 63 additions and 25 deletions

No files matched your search

+13 -7
View File
@@ -5,14 +5,20 @@ from sqlmodel import Session, select
from loon.web.db import engine from loon.web.db import engine
from loon.web.users.models import User from loon.web.users.models import User
from loon.web.utils.password import hash_password
async def change_password_handler(client, userdata, msg, data): async def change_password_handler(client, userdata, msg, data):
if msg.topic != "loon/register/change_password": prefix = "loon/auth/register/"
if not msg.topic.startswith(prefix):
return
rest = msg.topic[len(prefix):]
uuid, _, subtopic = rest.partition("/")
if not uuid or subtopic != "change_password":
return return
uuid = data["uuid"]
password = data["password"] password = data["password"]
with Session(engine) as session: with Session(engine) as session:
@@ -20,22 +26,22 @@ async def change_password_handler(client, userdata, msg, data):
user = session.exec(statement).first() user = session.exec(statement).first()
if user is None: if user is None:
client.publish(f"loon/register/{uuid}/response", client.publish(f"loon/auth/register/{uuid}/response",
json.dumps({"success": False, "error": "The user is not registered!"})) json.dumps({"success": False, "error": "The user is not registered!"}))
return return
user = session.exec( user = session.exec(
select(User).where(User.uuid == uuid) select(User).where(User.uuid == uuid)
).first() ).first()
user.password = hash_password(password) user.password = password
try: try:
session.commit() session.commit()
except IntegrityError: except IntegrityError:
session.rollback() session.rollback()
client.publish(f"loon/register/{uuid}/response", client.publish(f"loon/auth/register/{uuid}/response",
json.dumps({"success": False, "error": "The user is not registered!"})) json.dumps({"success": False, "error": "The user is not registered!"}))
return return
client.publish(f"loon/register/{uuid}/response", json.dumps({"success": True, "error": None})) client.publish(f"loon/auth/register/{uuid}/response", json.dumps({"success": True, "error": None}))
+14 -8
View File
@@ -5,14 +5,20 @@ from sqlmodel import Session, select
from loon.web.db import engine from loon.web.db import engine
from loon.web.users.models import User from loon.web.users.models import User
from loon.web.utils.password import hash_password
async def register_request_handler(client, userdata, msg, data): async def register_request_handler(client, userdata, msg, data):
if msg.topic != "loon/register/request": prefix = "loon/auth/register/"
if not msg.topic.startswith(prefix):
return
rest = msg.topic[len(prefix):]
uuid, _, subtopic = rest.partition("/")
if not uuid or subtopic != "request":
return return
uuid = data["uuid"]
password = data["password"] password = data["password"]
internal_username = data["internalUsername"] internal_username = data["internalUsername"]
@@ -21,7 +27,7 @@ async def register_request_handler(client, userdata, msg, data):
user = session.exec(statement).first() user = session.exec(statement).first()
if user is not None: if user is not None:
client.publish(f"loon/register/{uuid}/response", client.publish(f"loon/auth/register/{uuid}/response",
json.dumps({"success": False, "error": "The user is already registered!"})) json.dumps({"success": False, "error": "The user is already registered!"}))
return return
@@ -29,19 +35,19 @@ async def register_request_handler(client, userdata, msg, data):
user = session.exec(statement).first() user = session.exec(statement).first()
if user is not None: if user is not None:
client.publish(f"loon/register/{uuid}/response", client.publish(f"loon/auth/register/{uuid}/response",
json.dumps({"success": False, "error": f"The {internal_username} is taken!"})) json.dumps({"success": False, "error": f"The {internal_username} is taken!"}))
return return
user = User(uuid=uuid, password=hash_password(password), internal_username=internal_username, admin=False) user = User(uuid=uuid, password=password, internal_username=internal_username, admin=False)
session.add(user) session.add(user)
try: try:
session.commit() session.commit()
except IntegrityError: except IntegrityError:
session.rollback() session.rollback()
client.publish(f"loon/register/{uuid}/response", client.publish(f"loon/auth/register/{uuid}/response",
json.dumps({"success": False, "error": "The user is already registered!"})) json.dumps({"success": False, "error": "The user is already registered!"}))
return return
client.publish(f"loon/register/{uuid}/response", json.dumps({"success": True, "error": None})) client.publish(f"loon/auth/register/{uuid}/response", json.dumps({"success": True, "error": None}))
@@ -0,0 +1,32 @@
import json
from sqlmodel import Session, select
from loon.web.db import engine
from loon.web.users.models import User
async def show_username_handler(client, userdata, msg, data):
prefix = "loon/auth/show_username/"
if not msg.topic.startswith(prefix):
return
rest = msg.topic[len(prefix):]
uuid, _, subtopic = rest.partition("/")
if not uuid or subtopic:
return
with Session(engine) as session:
user = session.exec(select(User).where(User.uuid == uuid)).first()
if user is None:
client.publish(f"loon/auth/show_username/{uuid}/response",
json.dumps({"success": False, "error": "The user is not registered!"}))
return
internal_username = user.internal_username
client.publish(f"loon/auth/show_username/{uuid}/response",
json.dumps({"success": True, "error": None, "internalUsername": internal_username}))
+4 -2
View File
@@ -11,11 +11,12 @@ from loon.mqtt.handlers.marquee import marquee_handler
from loon.mqtt.handlers.player import player_handler from loon.mqtt.handlers.player import player_handler
from loon.mqtt.handlers.register_request import register_request_handler from loon.mqtt.handlers.register_request import register_request_handler
from loon.mqtt.handlers.server import server_handler from loon.mqtt.handlers.server import server_handler
from loon.mqtt.handlers.show_username_request import show_username_handler
from loon.mqtt.handlers.world import world_handler from loon.mqtt.handlers.world import world_handler
class MQTTManager: class MQTTManager:
BASE_HANDLERS = [player_handler, register_request_handler, world_handler, server_handler, marquee_handler, change_password_handler] BASE_HANDLERS = [player_handler, register_request_handler, world_handler, server_handler, marquee_handler, change_password_handler, show_username_handler]
def __init__(self, inject_handlers = None): def __init__(self, inject_handlers = None):
if inject_handlers is None: if inject_handlers is None:
@@ -59,7 +60,8 @@ class MQTTManager:
def on_topic(self, client, userdata, msg): def on_topic(self, client, userdata, msg):
async def handle_message(): async def handle_message():
try: try:
data = json.loads(msg.payload.decode()) raw = msg.payload.decode()
data = json.loads(raw) if raw.strip() else {}
except json.decoder.JSONDecodeError: except json.decoder.JSONDecodeError:
return return
-8
View File
@@ -2,14 +2,6 @@ from argon2 import PasswordHasher
from argon2.exceptions import InvalidHashError, VerifyMismatchError from argon2.exceptions import InvalidHashError, VerifyMismatchError
def hash_password(password: str) -> str:
ph = PasswordHasher()
hashed = ph.hash(password)
return str(hashed)
def verify_password(password: str, hashed_password: str) -> bool: def verify_password(password: str, hashed_password: str) -> bool:
ph = PasswordHasher() ph = PasswordHasher()