security: H-1 settings-Whitelist + H-5 UUID-Guard + H-6 DNS-Pinning + H-7 Heartbeat-Timing
H-1: company.settings als typisiertes Sub-Schema - schemas/company.py: CompanySettingsUpdate mit extra=forbid - Nur bekannte Keys (carryover_expires_month/day) erlaubt - Unbekannte Keys → HTTP 422 H-5: SQL-Injection defensiv absichern - dependencies.py: UUID-Round-Trip str(_uuid.UUID(...)) + Sicherheitskommentar H-6: CalDAV DNS-Rebinding-Schutz - caldav_service.py: PinnedIPTransport — IP einmal auflösen, beim Request fixieren - _validate_caldav_url gibt aufgelöste IP zurück - Alle HTTP-Methoden nutzen PinnedIPTransport H-7: Heartbeat-Timestamp nach Route-Logik - kiosk_security.py: last_heartbeat_at-Update aus Dependency entfernt - kiosk_service.py: Update erst in process_heartbeat() nach erfolgreicher Auth Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -119,9 +119,13 @@ class KioskService:
|
||||
) -> None:
|
||||
"""
|
||||
Heartbeat-Daten vom Kiosk-Gerät verarbeiten.
|
||||
last_heartbeat_at wird bereits in verify_kiosk_request gesetzt –
|
||||
hier werden nur die zusätzlichen Felder aktualisiert.
|
||||
|
||||
last_heartbeat_at wird hier gesetzt (H-7 Fix: nicht in verify_kiosk_request,
|
||||
da der Timestamp erst nach erfolgreicher Route-Logik committed werden soll).
|
||||
"""
|
||||
# Heartbeat-Timestamp erst jetzt setzen – nach erfolgreicher Auth + Route-Logik
|
||||
device.last_heartbeat_at = datetime.now(timezone.utc)
|
||||
|
||||
if data.client_version is not None:
|
||||
device.client_version = data.client_version
|
||||
|
||||
|
||||
Reference in New Issue
Block a user