fix(scan): correggi 4 bug nella pipeline di scansione clamscan/clamd - #8
Merged
Conversation
La scansione (Quick/Custom/System Scan) riportava sempre "1 files, 0 threats" indipendentemente dal contenuto reale della cartella scansionata. L'indagine ha rivelato 4 bug distinti e sovrapposti: 1. _scan_clamscan scartava tutti i risultati reali parsati da clamscan e li rimpiazzava con un unico ScanResult fittizio per cartella, perche' il codice cercava un match esatto tra il path della cartella di input e i path (di file) nei risultati -- match che non poteva mai avvenire. Eventuali minacce trovate in profondita' venivano perse silenziosamente. 2. Il flag --infected nascondeva dal conteggio tutti i file puliti (clamscan stampa una riga solo per file infetti/in errore con quel flag attivo). 3. clamscan non scende di default nelle sottocartelle: mancava --recursive, quindi veniva scansionato solo il livello superiore della cartella scelta. 4. Il piu' impattante: --database passato su una cartella esistente ma vuota (lo stato di QUALSIASI installazione pulita, prima di scaricare firme di terze parti) fa fallire l'intero comando clamscan con "ERROR: Can't open file or directory" -- nessun file scansionato, per nessuno dei path richiesti. _scan_clamd() aveva un bug della stessa famiglia (ogni comando SCAN su una directory puo' produrre piu' righe di risposta, ma veniva letta una sola riga per comando) con un rischio aggiuntivo di disallineamento del protocollo tra scansioni di cartelle diverse. E' stato riscritto per espandere ogni path nell'elenco reale dei file (os.walk) ed inviare un comando SCAN per singolo file. Validato con: confronto diretto find|wc-l vs risultati scanner reali (64/64 file), rilevamento di una firma ClamAV di test creata ad-hoc, suite pytest completa (33/33, 8 nuovi test di regressione). Dettagli completi in docs/scan_audit_20260811.md.
D3M-Sudo
added a commit
that referenced
this pull request
Aug 11, 2026
* fix(ui): correggi NaN error e statistiche dashboard mai aggiornate
Due bug distinti nello stato mostrato in dashboard:
1. "Status update error: cannot convert float NaN to integer" in log
ad ogni avvio e ogni 30s. Quando nessun database ClamAV e'
installato, get_database_age() ritorna float("inf"). In Python
float('inf') // 86400 produce nan (non inf), e int(nan) solleva
ValueError -- l'eccezione veniva intercettata e solo loggata,
lasciando l'etichetta "Updated: ..." bloccata sul testo hardcoded
iniziale. Fix: gestito esplicitamente il caso db_age == inf,
mostrando "Updated: Never".
2. Le tre righe statistiche della dashboard (Threats blocked / Files
scanned / Last scan) venivano impostate una sola volta alla
creazione della UI e mai piu' aggiornate: nessun codice le
rileggeva dopo una scansione completata. Fix: nuovo metodo
HistoryManager.get_summary_stats() (totali aggregati dalla
cronologia) + _refresh_dashboard_stats() in window.py, richiamato
all'avvio e dopo ogni scansione.
Validato con l'app reale (build meson, non mock): log di avvio pulito,
badge "Updated: Never" corretto senza database, dashboard che si
aggiorna e accumula correttamente su scansioni successive (screenshot
in docs/dashboard_stats_audit_20260811.md). Suite pytest: 28/28 (3
nuovi test di regressione in TestSummaryStats), ruff pulito.
Sviluppato indipendentemente da fix/scan-result-mapping (priorita' 1,
PR #8): una volta mergiate entrambe, "Files scanned" in dashboard
riflettera' anche i conteggi corretti della pipeline di scan.
* style: applica black a window.py (fix CI lint)
---------
Co-authored-by: Claude (audit assistito) <claude@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cosa risolve
La scansione (Quick/Custom/System Scan) riportava sempre "1 files, 0 threats" indipendentemente dal contenuto reale della cartella scansionata. L'indagine ha rivelato 4 bug distinti e sovrapposti in
_scan_clamscan, correggerne solo alcuni avrebbe lasciato la scansione ancora rotta:ScanResultfittizio per cartella.--infectednascondeva i file puliti dal conteggio (clamscan stampa una riga solo per file infetti/in errore con quel flag).--recursive— clamscan di default non scende nelle sottocartelle: veniva scansionato solo il livello superiore della cartella scelta.--databasesu una cartella esistente ma vuota (lo stato di qualsiasi installazione pulita, prima di scaricare firme di terze parti) fa fallire l'intero comando clamscan — nessun file scansionato, per nessuno dei path richiesti._scan_clamd()aveva un bug della stessa famiglia (un comandoSCANsu una directory può produrre più righe di risposta, ma ne veniva letta una sola per comando), con un rischio aggiuntivo di disallineamento del protocollo tra scansioni di cartelle diverse. Riscritto per espandere ogni path nell'elenco reale dei file (os.walk) e inviare un comandoSCANper singolo file.Dettagli completi, con log di riproduzione ed evidenze empiriche, in
docs/scan_audit_20260811.md.Come è stato validato
find src/ tests/ -type f | wc -l→ 64,scanner.scan_paths(...)→ 64 risultati.hdblocale) per verificare che un file infetto venga davvero rilevatoruff checkpulitoNon incluso in questa PR (fuori scope, priorità successive)
Status update error: cannot convert float NaN to integer+ statistiche dashboard mai aggiornate🤖 Audit e fix assistiti da Claude, su richiesta del maintainer.