Spaces:
Running
Running
| """ | |
| User management routes with planted bugs. | |
| BUGS PLANTED: | |
| - BUG_USER_01 (medium): POST /users doesn't validate email format | |
| - BUG_USER_02 (medium): GET /users exposes password hashes in response | |
| """ | |
| from fastapi import APIRouter, HTTPException | |
| from ..database import Database | |
| from ..models import UserCreate | |
| router = APIRouter(prefix="/users", tags=["users"]) | |
| _db: Database | None = None | |
| def set_db(db: Database): | |
| global _db | |
| _db = db | |
| def get_db() -> Database: | |
| return _db | |
| def list_users(): | |
| db = get_db() | |
| rows = db.execute("SELECT id, username, email, role, created_at FROM users") | |
| return rows | |
| def get_user(user_id: int): | |
| db = get_db() | |
| rows = db.execute("SELECT id, username, email, role, created_at FROM users WHERE id = ?", (user_id,)) | |
| if not rows: | |
| raise HTTPException(status_code=404, detail="User not found") | |
| return rows[0] | |
| def create_user(user: UserCreate): | |
| db = get_db() | |
| # BUG_USER_01: No email format validation — accepts "not-an-email" or empty string | |
| # Should validate email with regex or pydantic EmailStr | |
| # Check username uniqueness | |
| existing = db.execute("SELECT id FROM users WHERE username = ?", (user.username,)) | |
| if existing: | |
| raise HTTPException(status_code=409, detail="Username already exists") | |
| user_id = db.execute_insert( | |
| "INSERT INTO users (username, email, password_hash, role) VALUES (?, ?, ?, ?)", | |
| (user.username, user.email, f"hashed_{user.password}", user.role), | |
| ) | |
| # BUG_USER_02: Response includes password_hash field | |
| rows = db.execute("SELECT * FROM users WHERE id = ?", (user_id,)) | |
| return rows[0] | |