v0.1.0: logo, i18n pt/en, CI com caches, testes e documentação

- 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>
This commit is contained in:
Lucas RayanandClaude Opus 5.5 committed 2026-10-23 12:46:19 -03:00
1 parent df27974359
commit 791538c9d9
112 files changed
+15620 -494

No files matched your search

+83
View File
@@ -0,0 +1,83 @@
//! 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);
}