FIX: 11 bugs bảo mật/ổn định (static mount chặn dotfile, delete traversal, cleanup giữ clips serverFileId, upload whitelist, password strength, auth audio endpoints, pedalboard==0.9.19, vendor CDN local) + FEATURE: Carla bridge preview/export MIDI notes âm VSTi (POST /midi-render, /carla-play-notes, nút Preview VSTi/Export MIDI->Audio; pedalboard 0.9.19 raw MIDI bytes; SONICFORGE_STORAGE_DIR cô lập test storage)
This commit is contained in:
@@ -1,8 +1,11 @@
|
||||
import os
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from pydantic import BaseModel
|
||||
from typing import List, Optional
|
||||
from app.config import settings
|
||||
from app.api.v1.auth import enforce_password_changed
|
||||
from app.api.v1.projects import get_optional_user
|
||||
from app.api.v1.audio import _safe_file_id
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@@ -33,13 +36,19 @@ class MultitrackSessionRequest(BaseModel):
|
||||
tracks: List[TrackConfig]
|
||||
|
||||
@router.post("/mix")
|
||||
async def mix_multitrack_session(req: MultitrackSessionRequest):
|
||||
async def mix_multitrack_session(req: MultitrackSessionRequest, current_user: Optional[dict] = Depends(get_optional_user)):
|
||||
"""
|
||||
API endpoint để xử lý hòa âm đa kênh (Multitrack Mixdown).
|
||||
Nhận cấu hình JSON từ Client và gửi task xuống Celery Worker.
|
||||
"""
|
||||
# Kiểm tra xem các file nguồn có tồn tại không
|
||||
if current_user:
|
||||
enforce_password_changed(current_user)
|
||||
# Bug #9: guard auth-optional + sanitize file_id (chống traversal vào worker)
|
||||
for track in req.tracks:
|
||||
track.file_id = _safe_file_id(track.file_id)
|
||||
if not track.file_id:
|
||||
raise HTTPException(status_code=400, detail=f"file_id không hợp lệ cho track {track.track_id}")
|
||||
# Kiểm tra xem các file nguồn có tồn tại không
|
||||
if track.muted:
|
||||
continue
|
||||
|
||||
@@ -63,11 +72,15 @@ async def mix_multitrack_session(req: MultitrackSessionRequest):
|
||||
}
|
||||
|
||||
@router.post("/process-session")
|
||||
async def process_session(req: MultitrackSessionRequest):
|
||||
async def process_session(req: MultitrackSessionRequest, current_user: Optional[dict] = Depends(get_optional_user)):
|
||||
"""
|
||||
API endpoint để xử lý toàn bộ session với nhiều tracks và clips.
|
||||
Xử lý từng clip, sau đó hòa âm tất cả tracks lại với nhau.
|
||||
"""
|
||||
if current_user:
|
||||
enforce_password_changed(current_user)
|
||||
for track in req.tracks:
|
||||
track.file_id = _safe_file_id(track.file_id)
|
||||
from app.tasks.worker import process_multitrack_session_task
|
||||
task = process_multitrack_session_task.delay(req.model_dump())
|
||||
|
||||
|
||||
Reference in New Issue
Block a user