diff --git a/backend/routers/auth_router.py b/backend/routers/auth_router.py index 4376f94..3f18f7e 100644 --- a/backend/routers/auth_router.py +++ b/backend/routers/auth_router.py @@ -4,6 +4,7 @@ import pyotp from fastapi import APIRouter, Depends, HTTPException, status from fastapi.security import OAuth2PasswordRequestForm from pydantic import BaseModel +from sqlalchemy import func from sqlalchemy.orm import Session import models @@ -39,7 +40,7 @@ def setup(req: SetupRequest, db: Session = Depends(get_db)): if db.query(models.User).count() > 0: raise HTTPException(400, "Setup already completed") user = models.User( - username=req.username, + username=req.username.lower(), email=req.email, password_hash=get_password_hash(req.password), is_admin=True, @@ -58,7 +59,7 @@ def login( form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db) ): user = ( - db.query(models.User).filter(models.User.username == form_data.username).first() + db.query(models.User).filter(func.lower(models.User.username) == form_data.username.lower()).first() ) if not user or not verify_password(form_data.password, user.password_hash): raise HTTPException( @@ -78,7 +79,7 @@ def login( @router.post("/login") def login_json(req: LoginRequest, db: Session = Depends(get_db)): user = ( - db.query(models.User).filter(models.User.username == req.username).first() + db.query(models.User).filter(func.lower(models.User.username) == req.username.lower()).first() ) if not user or not verify_password(req.password, user.password_hash): raise HTTPException( diff --git a/backend/routers/users_router.py b/backend/routers/users_router.py index b1a3551..7b50248 100644 --- a/backend/routers/users_router.py +++ b/backend/routers/users_router.py @@ -2,6 +2,7 @@ from typing import Optional from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel +from sqlalchemy import func from sqlalchemy.orm import Session import models @@ -40,10 +41,10 @@ def create_user( db: Session = Depends(get_db), _: models.User = Depends(get_current_admin), ): - if db.query(models.User).filter(models.User.username == req.username).first(): + if db.query(models.User).filter(func.lower(models.User.username) == req.username.lower()).first(): raise HTTPException(400, "Username already taken") user = models.User( - username=req.username, + username=req.username.lower(), email=req.email, password_hash=get_password_hash(req.password), is_admin=req.is_admin, diff --git a/frontend/css/app.css b/frontend/css/app.css index 7277927..5b6e898 100644 --- a/frontend/css/app.css +++ b/frontend/css/app.css @@ -355,6 +355,7 @@ a { color: var(--primary); text-decoration: none; } text-align: center; cursor: pointer; background: none; border: none; border-top: 1px solid var(--border); transition: color var(--transition); + white-space: nowrap; position: sticky; bottom: 0; background: var(--bg-sidebar); } diff --git a/frontend/index.html b/frontend/index.html index bf053c1..35625cd 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -70,7 +70,7 @@ - + @@ -83,7 +83,7 @@ @@ -170,7 +170,7 @@
- + @@ -390,17 +390,16 @@
- -
+ +
+

Farben

@@ -441,11 +440,8 @@
-
- -
-

Kalenderansicht

+

Kalenderansicht