mirror of
https://github.com/maziggy/bambuddy.git
synced 2026-10-21 10:15:04 +02:00
Add authentication to 200+ API endpoints (CVE-2026-25505)
Security fix for critical vulnerability (CVSS 9.8) where API endpoints were accessible without authentication when auth was enabled. Changes: - Add RequirePermissionIfAuthEnabled() to all unprotected route files: archives, projects, settings, api_keys, groups, cloud, github_backup, support, notifications, notification_templates, maintenance, filaments, external_links, smart_plugs, discovery, firmware, kprofiles, camera, ams_history, pending_uploads, updates, spoolman, system, print_queue, printers - Keep image-serving endpoints (thumbnails, timelapse, photos, camera streams, icons) unauthenticated since <img> tags cannot send headers - Add backend integration tests for endpoint auth enforcement - Add frontend tests for ownership-based permissions (canModify) Fixes: CVE-2026-25505
This commit is contained in:
@@ -4,9 +4,11 @@ from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from backend.app.core.auth import generate_api_key
|
||||
from backend.app.core.auth import RequirePermissionIfAuthEnabled, generate_api_key
|
||||
from backend.app.core.database import get_db
|
||||
from backend.app.core.permissions import Permission
|
||||
from backend.app.models.api_key import APIKey
|
||||
from backend.app.models.user import User
|
||||
from backend.app.schemas.api_key import (
|
||||
APIKeyCreate,
|
||||
APIKeyCreateResponse,
|
||||
@@ -20,7 +22,10 @@ router = APIRouter(prefix="/api-keys", tags=["api-keys"])
|
||||
|
||||
|
||||
@router.get("/", response_model=list[APIKeyResponse])
|
||||
async def list_api_keys(db: AsyncSession = Depends(get_db)):
|
||||
async def list_api_keys(
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_: User | None = RequirePermissionIfAuthEnabled(Permission.API_KEYS_READ),
|
||||
):
|
||||
"""List all API keys (without full key values)."""
|
||||
result = await db.execute(select(APIKey).order_by(APIKey.created_at.desc()))
|
||||
return list(result.scalars().all())
|
||||
@@ -30,6 +35,7 @@ async def list_api_keys(db: AsyncSession = Depends(get_db)):
|
||||
async def create_api_key(
|
||||
data: APIKeyCreate,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_: User | None = RequirePermissionIfAuthEnabled(Permission.API_KEYS_CREATE),
|
||||
):
|
||||
"""Create a new API key.
|
||||
|
||||
@@ -74,6 +80,7 @@ async def create_api_key(
|
||||
async def get_api_key(
|
||||
key_id: int,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_: User | None = RequirePermissionIfAuthEnabled(Permission.API_KEYS_READ),
|
||||
):
|
||||
"""Get an API key by ID."""
|
||||
result = await db.execute(select(APIKey).where(APIKey.id == key_id))
|
||||
@@ -90,6 +97,7 @@ async def update_api_key(
|
||||
key_id: int,
|
||||
data: APIKeyUpdate,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_: User | None = RequirePermissionIfAuthEnabled(Permission.API_KEYS_UPDATE),
|
||||
):
|
||||
"""Update an API key."""
|
||||
result = await db.execute(select(APIKey).where(APIKey.id == key_id))
|
||||
@@ -124,6 +132,7 @@ async def update_api_key(
|
||||
async def delete_api_key(
|
||||
key_id: int,
|
||||
db: AsyncSession = Depends(get_db),
|
||||
_: User | None = RequirePermissionIfAuthEnabled(Permission.API_KEYS_DELETE),
|
||||
):
|
||||
"""Delete (revoke) an API key."""
|
||||
result = await db.execute(select(APIKey).where(APIKey.id == key_id))
|
||||
|
||||
Reference in New Issue
Block a user