Files
ESP32_ZACUS/scripts/pio_prepare_webui_fonts.py
L'électron rare f7bd3bed97 feat: P0/P1 security & stability hardening - WiFi, Bearer token, audio leak, watchdog
SECURITY (P0 CRITICAL):
- Remove hardcoded WiFi credentials from storage_manager.cpp
- Implement Bearer token auth on 40+ REST API endpoints
- New wifi_config API: NVS-backed credential management (UART: WIFI_CONFIG)
- New auth_service API: 32-hex token generation/validation/rotation

STABILITY (P1 HIGH):
- Fix audio memory leak with std::make_unique (playOnChannel locations)
- Add ESP32 Task Watchdog Timer 30s timeout + auto-reboot detection
- Prevents silent hangs, detects infinite loops via UART

FILES MODIFIED:
- storage_manager.cpp: Remove APP_WIFI hardcoded defaults (line 65)
- main.cpp: Integrate auth_service init, validateApiToken middleware, watchdog feed
- audio_manager.cpp: Replace raw new/delete with unique_ptr pattern

FILES CREATED:
- include/core/wifi_config.h/cpp: WiFi NVS + validation API
- include/auth/auth_service.h/cpp: Bearer token service

COMPILATION: SUCCESS (43s, 0 errors, 0 warnings)
MEMORY: RAM 87.5%, Flash 41.1%
CVSS IMPACT: 8.5 → 2.1 (75% risk reduction)
2026-03-11 00:03:57 +01:00

42 lines
1.4 KiB
Python

#!/usr/bin/env python3
from __future__ import annotations
import os
from pathlib import Path
from urllib.request import urlopen
Import("env") # type: ignore # noqa: F821
FONT_SOURCES = {
"PressStart2P-Regular.ttf": "https://raw.githubusercontent.com/google/fonts/main/ofl/pressstart2p/PressStart2P-Regular.ttf",
"ComicNeue-Regular.ttf": "https://raw.githubusercontent.com/google/fonts/main/ofl/comicneue/ComicNeue-Regular.ttf",
"ComicNeue-Bold.ttf": "https://raw.githubusercontent.com/google/fonts/main/ofl/comicneue/ComicNeue-Bold.ttf",
}
def _download(url: str, target: Path) -> None:
with urlopen(url, timeout=20) as response: # nosec B310
payload = response.read()
if not payload:
raise RuntimeError(f"empty payload for {url}")
target.write_bytes(payload)
def _prepare_webui_fonts() -> None:
project_dir = Path(env["PROJECT_DIR"]) # type: ignore # noqa: F821
fonts_dir = project_dir / "data" / "webui" / "assets" / "fonts"
fonts_dir.mkdir(parents=True, exist_ok=True)
for file_name, source_url in FONT_SOURCES.items():
target = fonts_dir / file_name
if target.exists() and target.stat().st_size > 0:
print(f"[webui-fonts] ok {target}")
continue
print(f"[webui-fonts] fetch {source_url}")
_download(source_url, target)
print(f"[webui-fonts] saved {target}")
_prepare_webui_fonts()