FEAT: Détection automatique des caméras — pool de credentials par site + scan agent #48
Labels
No labels
bug
chore
design
dx:ci
dx:database
dx:dotnet
dx:infra
dx:security
dx:tests
dx:ui
etape-1
etape-2
etape-3
etape-4
etape-5
etape-6
etape-7
feature
priority-high
priority-low
priority-medium
security
spec
tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
nonobis/Heimdall#48
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Feature — à remplir avant de commencer
🎯 Contexte
Un agent est installé sur un réseau local avec des caméras IP. La détection automatique des caméras ne fonctionne pas : l'utilisateur doit ajouter chaque caméra manuellement (nom, RTSP, credentials), ce qui est inacceptable pour un déploiement multi-caméras. Le besoin : déclarer N couples login/mdp possibles par site (pool de credentials), et les agents détectent automatiquement toutes les caméras compatibles sur leur réseau.
📚 Référence spec
Étape 2 — Phase 13 « API Caméras + ONVIF », section ONVIF Device Discovery (lignes ~1390-1395, 1425-1431, 1459) :
POST /api/sites/{siteId}/onvif/discover→ scan WS-Discovery sur le sous-réseau du site ;POST /api/cameras/onvif/probe {ip, port, username, password}→ interroge avec credentials ; « Découverte ONVIF réseau : scan automatique des caméras ».✅ Comportement attendu
🔍 État actuel
DiscoveryController(/api/discovery/*) existe : probe IP, scan subnet (CIDR fourni par le client), search DB, build-urls, test-streams, confirm, check. Aucune UI ne l'expose → la création de caméra reste 100 % manuelle.CameraDiscoveryService: scan complet côté central (Heimdall.Web) — si le central n'est pas sur le réseau caméras, le scan ne voit rien.OnvifProbeService: WS-Discovery unicast +GetDeviceInformationsans aucune authentification → la plupart des caméras protégées ne répondent pas / renvoient une erreur SOAP → non classées comme caméras.CameraCredentials: 1:1 avec une Camera (pas de pool par site). EntitéSitesans credentials.Heimdall.Agent) : aucune logique de découverte.DiscoveryControllerTests.🧩 Découpage proposé
SiteCredential(SiteId, Label, Username, Password chiffrée viaICredentialProtector) + migration EF + config./api/sites/{id}/credentials) ; endpoints discovery conformes spec (/api/sites/{siteId}/onvif/discover,/api/cameras/onvif/probeavec username/password).OnvifProbeService+GetDeviceInformationavec WS-UsernameToken (ONVIF) en utilisant chaque couple du pool.CameraDiscoveryResult+ POST depuis l'agent).🧪 Critères d'acceptation
make testvert📁 Fichiers concernés (estimés)
src/Heimdall.Domain/Entities/SiteCredential.cs(nouveau),Site.cssrc/Heimdall.Infrastructure/Services/Discovery/*(OnvifProbeService, CameraDiscoveryService)src/Heimdall.Agent/Services/*(nouveau service discovery)src/Heimdall.Web/Controllers/DiscoveryController.cs, pages Blazor (SitesPage, nouvelles pages)tests/*Clôturé par
9c7295d(branchefeat/camera-discovery-agent).Ce qui a été fait :
GET /api/settings/agent/{id}dans une enveloppe AES-256-GCM (clé dérivée du hash SHA-256 de l'API key de l'agent) — déchiffrable uniquement côté agent.NetworkCameraScannertenteGetDeviceInformationavec chaque couple du pool (PasswordDigest puis PasswordText) et remonte des devices déjà identifiés (fabricant/modèle ONVIF + label du credential utilisé).LastUsedAt).SettingsController.GetEffectiveConfigaccepte désormais l'API key agent (vérification par site) — auparavant l'agent recevait 403 sur cet endpoint.SitesControllerbroadcastConfigReloadaprès add/delete credential pour que les agents re-fetch leur pool.