Skip to content

fix(scan): correggi 4 bug nella pipeline di scansione clamscan/clamd - #8

Merged
D3M-Sudo merged 3 commits into
testingfrom
fix/scan-result-mapping
Aug 11, 2026
Merged

fix(scan): correggi 4 bug nella pipeline di scansione clamscan/clamd#8
D3M-Sudo merged 3 commits into
testingfrom
fix/scan-result-mapping

Conversation

@D3M-Sudo

Copy link
Copy Markdown
Owner

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:

  1. Risultati reali scartati — il codice cercava un match esatto tra il path della cartella di input e i path (di file) nei risultati parsati da clamscan, match che non poteva mai avvenire. Risultati veri (comprese eventuali minacce) venivano rimpiazzati con un unico ScanResult fittizio per cartella.
  2. --infected nascondeva i file puliti dal conteggio (clamscan stampa una riga solo per file infetti/in errore con quel flag).
  3. Mancava --recursive — clamscan di default non scende nelle sottocartelle: veniva scansionato solo il livello superiore della cartella scelta.
  4. Il più impattante: --database 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 — nessun file scansionato, per nessuno dei path richiesti.

_scan_clamd() aveva un bug della stessa famiglia (un comando SCAN su 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 comando SCAN per singolo file.

Dettagli completi, con log di riproduzione ed evidenze empiriche, in docs/scan_audit_20260811.md.

Come è stato validato

  • App compilata e installata realmente (build meson), eseguita sotto Xvfb con clamscan reale
  • Confronto diretto file reali vs risultati scanner: find src/ tests/ -type f | wc -l → 64, scanner.scan_paths(...) → 64 risultati
  • Firma ClamAV di test creata ad-hoc (database .hdb locale) per verificare che un file infetto venga davvero rilevato
  • Suite pytest completa: 33/33 passati (25 preesistenti + 8 nuovi test di regressione, uno per bug)
  • ruff check pulito

Non incluso in questa PR (fuori scope, priorità successive)

  • Status update error: cannot convert float NaN to integer + statistiche dashboard mai aggiornate
  • Icone non esistenti nel tema Adwaita moderno
  • Viste stub "View implementation pending" per VirusTotal e Settings
  • Un crash ripetuto del subprocesso tray osservato durante i test ma non ancora indagato

🤖 Audit e fix assistiti da Claude, su richiesta del maintainer.

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
D3M-Sudo merged commit 7e6c134 into testing Aug 11, 2026
6 checks passed
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>
@D3M-Sudo
D3M-Sudo deleted the fix/scan-result-mapping branch August 11, 2026 20:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants