- Logo oficial (sabia.png) e conjunto de ícones do app desktop. - Interface em português e inglês: tradutor por observação do DOM, seletor de idioma e checagem de cobertura de tradução no CI. - CI/CD com caches (rust-cache, .deb do Tauri em cache) e pipeline de release multiplataforma (CLI em 5 alvos + app desktop via tauri-action), templates de issue/PR. - Suíte de testes de integração do sabia-core (scan e2e, handshake/crack 4-way e PMKID, pcap, trilha de auditoria) — 46 testes verdes. - Documentação completa pt/en: README, ROADMAP, SECURITY, CONTRIBUTING, CHANGELOG e docs/ (cli, interface, arquitetura), com enquadramento de uso autorizado. - Correções de clippy (-D warnings) e formatação em toda a árvore. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
84 lines
2.6 KiB
Rust
84 lines
2.6 KiB
Rust
//! Integração: grava quadros com `PcapWriter`, lê de volta com
|
|
//! `PcapReader` e confere que batem byte a byte; depois confirma que
|
|
//! `Engine::analyze_pcap` encontra redes e handshakes no arquivo recém-escrito.
|
|
|
|
mod common;
|
|
|
|
use sabia_core::engine::Engine;
|
|
use sabia_core::pcapreader::PcapReader;
|
|
use sabia_core::pcapwriter::PcapWriter;
|
|
|
|
#[test]
|
|
fn writes_and_reads_back_identical_frames() {
|
|
let dir = tempfile::tempdir().expect("tempdir");
|
|
let path = dir.path().join("captura.pcap");
|
|
|
|
let beacon = common::radiotap_wrap(
|
|
&common::beacon_frame(common::ap(), "PcapRede", 1, &[2]),
|
|
2412,
|
|
-30,
|
|
);
|
|
let probe = common::radiotap_wrap(&common::probe_request(common::sta(), "PcapRede"), 2412, -45);
|
|
|
|
{
|
|
let mut writer = PcapWriter::create(&path).expect("create");
|
|
writer.write_frame(&beacon).expect("write beacon");
|
|
writer.write_frame(&probe).expect("write probe");
|
|
writer.flush().expect("flush");
|
|
}
|
|
|
|
let mut reader = PcapReader::open(&path).expect("open");
|
|
assert!(reader.supports_80211());
|
|
|
|
let f1 = reader
|
|
.next_frame()
|
|
.expect("read 1")
|
|
.expect("frame 1 presente");
|
|
assert_eq!(f1.data, beacon);
|
|
|
|
let f2 = reader
|
|
.next_frame()
|
|
.expect("read 2")
|
|
.expect("frame 2 presente");
|
|
assert_eq!(f2.data, probe);
|
|
|
|
assert!(reader.next_frame().expect("read 3").is_none());
|
|
}
|
|
|
|
#[test]
|
|
fn analyze_pcap_finds_networks_and_handshake() {
|
|
let dir = tempfile::tempdir().expect("tempdir");
|
|
let pcap_path = dir.path().join("sessao.pcap");
|
|
let audit_path = dir.path().join("audit.log");
|
|
|
|
let beacon = common::radiotap_wrap(
|
|
&common::beacon_frame(common::ap(), "PcapHandshake", 3, &[2]),
|
|
2422,
|
|
-38,
|
|
);
|
|
let (f1, f2) = common::handshake_radiotap_frames("PcapHandshake", "senha-pcap", 2, false);
|
|
|
|
{
|
|
let mut writer = PcapWriter::create(&pcap_path).expect("create");
|
|
writer.write_frame(&beacon).expect("write beacon");
|
|
writer.write_frame(&f1).expect("write msg1");
|
|
writer.write_frame(&f2).expect("write msg2");
|
|
writer.flush().expect("flush");
|
|
}
|
|
|
|
let engine = Engine::with_audit_path(&audit_path);
|
|
let snapshot = engine.analyze_pcap(&pcap_path).expect("analyze_pcap");
|
|
|
|
assert_eq!(snapshot.access_points.len(), 1);
|
|
assert_eq!(
|
|
snapshot.access_points[0].ssid.as_deref(),
|
|
Some("PcapHandshake")
|
|
);
|
|
|
|
assert_eq!(snapshot.handshakes.len(), 1);
|
|
let hs = &snapshot.handshakes[0];
|
|
assert_eq!(hs.ssid.as_deref(), Some("PcapHandshake"));
|
|
assert!(hs.complete);
|
|
assert!(hs.crackable);
|
|
}
|