diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 6ebe9d2..6ea5e5b 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,14 +1,21 @@ name: Release -# Cria a entrada em "Releases" quando uma tag v* é enviada, com as notas da -# seção correspondente do CHANGELOG.md (scripts/release-notes.sh). +# Quando uma tag v* é enviada: cria a entrada em "Releases" com as notas do +# CHANGELOG.md e anexa o CLI compilado (scripts/package-cli.sh), com um .sha256 ao +# lado de cada pacote. É o que o atualizador (`sabia update`) baixa. # -# Só as notas: os binários para macOS e Windows exigiam runners que o Gitea daqui -# não tem (o único runner é Linux arm64), então não são gerados neste fluxo. +# O CLI é só para Linux (x86_64 e aarch64), compilado no runner Linux; o x86_64 +# por compilação cruzada. Windows e macOS têm só o app desktop. on: push: tags: ['v*'] +env: + CARGO_TERM_COLOR: always + # Toolchain e registry do cargo ficam no volume que sobrevive entre jobs. + CARGO_HOME: /opt/hostedtoolcache/cargo + RUSTUP_HOME: /opt/hostedtoolcache/rustup + jobs: release: name: Cria a release @@ -23,9 +30,43 @@ jobs: TOKEN: ${{ gitea.token }} API: ${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }} run: | + # Uma execução repetida não recria a release. + if curl -fsS -H "Authorization: token $TOKEN" "$API/releases/tags/$TAG" >/dev/null 2>&1; then + echo "a release $TAG já existe"; exit 0 + fi scripts/release-notes.sh "$TAG" > notes.md pre=false; case "$TAG" in *-*) pre=true ;; esac jq -n --arg tag "$TAG" --arg name "Sabiá ${TAG#v}" --rawfile body notes.md --argjson pre "$pre" \ '{tag_name:$tag, name:$name, body:$body, prerelease:$pre}' > release.json curl -fsS -X POST "$API/releases" -H "Authorization: token $TOKEN" \ - -H 'Content-Type: application/json' -d @release.json + -H 'Content-Type: application/json' -d @release.json >/dev/null + + cli: + name: CLI (${{ matrix.platform }}) + needs: release + runs-on: ubuntu-latest + env: + CARGO_TARGET_DIR: /opt/hostedtoolcache/cargo-target/sabia-release + strategy: + fail-fast: false + matrix: + include: + - { platform: linux-aarch64, target: aarch64-unknown-linux-gnu, apt: "" } + - { platform: linux-x86_64, target: x86_64-unknown-linux-gnu, apt: "gcc-x86-64-linux-gnu" } + steps: + - uses: actions/checkout@v7 + - uses: dtolnay/rust-toolchain@stable + with: + targets: ${{ matrix.target }} + - name: Linker e ferramentas desta plataforma + if: ${{ matrix.apt != '' }} + run: | + apt-get update -qq + apt-get install -y -qq ${{ matrix.apt }} + - name: Compila e empacota + run: scripts/package-cli.sh "${{ gitea.ref_name }}" "${{ matrix.platform }}" "${{ matrix.target }}" | tee packages.txt + - name: Anexa à release + env: + TOKEN: ${{ gitea.token }} + API: ${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }} + run: scripts/release-upload.sh "${{ gitea.ref_name }}" $(cat packages.txt) diff --git a/.gitignore b/.gitignore index cc81e5a..5eb1be2 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,7 @@ apps/gui/src-tauri/target CLAUDE.md AGENTS.md GEMINI.md + +# Pacotes gerados por scripts/package-cli.sh +/sabia-v* +/dist-gui diff --git a/CHANGELOG.md b/CHANGELOG.md index f1b0abe..1bda8e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow SemVer. +## [1.0.1] - 2026-10-30 + +The project moved from GitHub to Gitea, and the update check followed it. + +### Changed +- **Updates now come from Gitea.** `sabia update` and the desktop app's "Update now" + read the latest release from `git.lucasrguerra.dev.br` instead of the GitHub API. + Versions up to 1.0.0 still look at GitHub, which is no longer reachable, so they + cannot find this release: download 1.0.1 once, and later updates are automatic. +- Release packages: the CLI for Linux x86_64 and aarch64 (built by the Gitea CI when + a `v*` tag is pushed, with a `.sha256` next to each package), and the desktop app + for Linux (`.AppImage`, `.deb`) and Windows (NSIS `.exe` installer, cross-compiled + from Linux by `scripts/build-gui.sh`). **There is no Windows CLI and no macOS build + any more**: the CLI is Linux-only, and macOS needs Apple's SDK and code signing, + which this project's CI cannot provide. + +### Fixed +- `sabia update` refuses to run from the desktop app's executable (`sabia-gui`). + The release package contains the CLI, and replacing the app with it would have + broken the app; the app now points to the downloads page instead. + ## [1.0.0] - 2026-10-24 First stable release: real-hardware validation across the whole attack surface, a much more complete cracking pipeline, two new attacks (WPS, Evil Twin), a redesigned report, and several reliability fixes found only by testing against live Wi-Fi networks. diff --git a/CHANGELOG.pt-BR.md b/CHANGELOG.pt-BR.md index a973710..9c7c8a2 100644 --- a/CHANGELOG.pt-BR.md +++ b/CHANGELOG.pt-BR.md @@ -4,6 +4,27 @@ Formato baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/); versões seguem SemVer. +## [1.0.1] - 2026-10-30 + +O projeto saiu do GitHub para o Gitea, e a verificação de atualização foi junto. + +### Alterado +- **As atualizações agora vêm do Gitea.** O `sabia update` e o "Atualizar agora" do app + desktop leem a última release em `git.lucasrguerra.dev.br`, e não mais a API do + GitHub. As versões até a 1.0.0 ainda olham o GitHub, que não responde mais, e por isso + não enxergam esta release: baixe a 1.0.1 uma vez, e as próximas atualizações são automáticas. +- Pacotes da release: o CLI para Linux x86_64 e aarch64 (compilado pelo CI do Gitea + quando uma tag `v*` é enviada, com um `.sha256` ao lado de cada pacote) e o app desktop + para Linux (`.AppImage`, `.deb`) e Windows (instalador NSIS `.exe`, compilado a partir + do Linux pelo `scripts/build-gui.sh`). **Não há mais CLI para Windows nem build para + macOS**: o CLI é só para Linux, e o macOS exige o SDK e a assinatura da Apple, que o CI + deste projeto não tem. + +### Corrigido +- O `sabia update` se recusa a rodar a partir do executável do app desktop (`sabia-gui`). + O pacote da release contém o CLI, e trocar o app por ele o quebraria; o app passa a + apontar para a página de downloads. + ## [1.0.0] - 2026-10-24 Primeira versão estável: validação em hardware real por toda a superfície de ataque, um pipeline de quebra bem mais completo, dois ataques novos (WPS, Evil Twin), relatório redesenhado e várias correções de confiabilidade que só apareceram testando contra redes Wi-Fi de verdade. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d3d40ef..34fa390 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,9 +17,9 @@ cargo test --workspace node scripts/check-ui-i18n.mjs # UI translation coverage ``` -CI runs on Linux, Windows and macOS; run these before pushing — almost everything that fails CI shows up here in seconds. Documentation-only changes (`*.md`, `docs/`) are light on CI. +CI runs on Linux only (Gitea has one runner); run these before pushing — almost everything that fails CI shows up here in seconds. Documentation-only changes (`*.md`, `docs/`) are light on CI. -Live capture exists only on Linux (`AF_PACKET` + netlink); on Windows and macOS those paths compile but aren't exercised. Parsing and cracking tests run on all three, because they're offline. +Live capture exists only on Linux (`AF_PACKET` + netlink); the code behind Windows and macOS paths still compiles and is covered by `cargo check`, but neither runs in CI nor is built for release. ## Where to work diff --git a/CONTRIBUTING.pt-BR.md b/CONTRIBUTING.pt-BR.md index 87c6243..b042ea2 100644 --- a/CONTRIBUTING.pt-BR.md +++ b/CONTRIBUTING.pt-BR.md @@ -17,9 +17,9 @@ cargo test --workspace node scripts/check-ui-i18n.mjs # cobertura da tradução da interface ``` -O CI roda em Linux, Windows e macOS; rode esses comandos antes do push — quase tudo que faz o CI falhar aparece aqui em segundos. Mudanças só de documentação (`*.md`, `docs/`) são leves no CI. +O CI roda só em Linux (o Gitea tem um único runner); rode esses comandos antes do push — quase tudo que faz o CI falhar aparece aqui em segundos. Mudanças só de documentação (`*.md`, `docs/`) são leves no CI. -A captura ao vivo só existe no Linux (`AF_PACKET` + netlink); em Windows e macOS esses caminhos são compilados mas não exercitados. Testes de parsing e de quebra rodam nas três plataformas, porque são offline. +A captura ao vivo só existe no Linux (`AF_PACKET` + netlink); o código dos caminhos de Windows e macOS continua compilando e é coberto pelo `cargo check`, mas não roda no CI nem é compilado para release. são offline. ## Onde mexer diff --git a/Cargo.lock b/Cargo.lock index be79345..e24fb7e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -440,7 +440,7 @@ dependencies = [ [[package]] name = "sabia-cli" -version = "1.0.0" +version = "1.0.1" dependencies = [ "clap", "ctrlc", @@ -451,7 +451,7 @@ dependencies = [ [[package]] name = "sabia-core" -version = "1.0.0" +version = "1.0.1" dependencies = [ "aes", "flate2", diff --git a/Cargo.toml b/Cargo.toml index 26bf21d..15a557d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,10 +3,10 @@ resolver = "2" members = ["crates/sabia-core", "crates/sabia-cli"] [workspace.package] -version = "1.0.0" +version = "1.0.1" edition = "2021" license = "MIT OR Apache-2.0" -repository = "https://github.com/lucasrguerra/sabia" +repository = "https://git.lucasrguerra.dev.br/lucasrguerra/sabia" authors = ["Sabiá contributors"] rust-version = "1.80" diff --git a/README.md b/README.md index f01bfd8..67e5c91 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

Free and open Wi-Fi auditing.
Terminal and desktop app · live capture on Linux, offline analysis on Windows, Linux and macOS · authorized use.
Free and open Wi-Fi auditing.
Terminal and desktop app · live capture on Linux, offline analysis on Windows too · authorized use.
Terminal · Interface · Architecture · Roadmap · Changelog
@@ -37,17 +37,18 @@ Download the package for your system from **[Releases](../../releases)**: | | CLI | Desktop app | |---|---|---| -| Windows | `sabia-*-windows-x86_64.zip` | `.msi` / `.exe` installer | -| macOS | `sabia-*-macos-{aarch64,x86_64}.tar.gz` | `.dmg` | +| Windows | — | `.exe` installer | | Linux | `sabia-*-linux-{x86_64,aarch64}.tar.gz` | `.AppImage` / `.deb` | -Each file has a `.sha256` next to it. Build from source: `cargo build --release -p sabia-cli` (Rust 1.80+). +The CLI is Linux-only; the desktop app ships for Linux and Windows. Each CLI +package has a `.sha256` next to it. Build from source: `cargo build --release +-p sabia-cli` (Rust 1.80+, Linux). -**Updates:** the desktop app checks GitHub on startup; when a new version exists, a button offers **Update now**: it downloads the right binary for your platform, verifies the **SHA-256** and swaps the running executable — no manual download. The check is a single request to the releases API and sends nothing of yours. +**Updates:** the desktop app checks Gitea on startup; when a new version exists, a button offers **Update now**. The CLI updates the same way (`sabia update`); it downloads the right binary for your platform, verifies the **SHA-256** and swaps the running executable — no manual download. The check is a single request to the releases API and sends nothing of yours. -> The binaries are **not signed yet**: Windows SmartScreen and macOS Gatekeeper will warn. Check the SHA-256. +> The binaries are **not signed yet**: Windows SmartScreen will warn. Check the SHA-256. -**Capture and monitor mode require Linux and root** (`CAP_NET_ADMIN`/`CAP_NET_RAW`): raw capture uses `AF_PACKET` and interface control uses netlink. **Offline `.pcap` analysis and cracking** also run on Windows and macOS. The desktop app elevates to administrator on its own at startup. +**Capture and monitor mode require Linux and root** — the only platform the CLI ships for (`CAP_NET_ADMIN`/`CAP_NET_RAW`): raw capture uses `AF_PACKET` and interface control uses netlink. **Offline `.pcap` analysis and cracking** also run on Windows and macOS. The desktop app elevates to administrator on its own at startup. ## Getting started @@ -74,11 +75,11 @@ Desktop app (Tauri) with an interface sidebar, a capture panel with an animated ## Known limits -- **Capture is Linux-only**, with a card that supports **monitor mode** (and injection, for `deauth`). On Windows and macOS Sabiá only does `.pcap` analysis and offline cracking. +- **Capture is Linux-only**, with a card that supports **monitor mode** (and injection, for `deauth`); the CLI is not built for other platforms. On Windows Sabiá's desktop app only does `.pcap` analysis and offline cracking. - **WPA3/SAE** does not fall to handshake dictionaries — cracking covers **WPA/WPA2-PSK** (4-way and PMKID). - **5 and 6 GHz** depend on the card and the regulatory domain; some channels stay passive (no probing). - **Evil Twin's self-signed certificate:** the Enterprise variant's TLS certificate isn't trusted by clients that validate the chain (common on updated corporate/MDM devices) — that's the correct defense working, not a bug. -- **Windows and macOS:** the code compiles and is tested in CI, but live capture does not run on those platforms. +- **Windows:** the code compiles and is tested in CI, but live capture does not run there; the desktop app does offline analysis only. There is no macOS build: Tauri needs the macOS SDK and code signing, both tied to Apple hardware and an Apple Developer account, which this project's CI (a single Linux runner) does not have. ## Where it's going @@ -88,6 +89,7 @@ Summary of the [ROADMAP](ROADMAP.md): |---|---| | **Done** | Monitor mode via netlink (with NetworkManager recovery), 2.4/5/6 GHz scanning, 4-way and PMKID capture, CCMP decryption, dictionary/rules/mask cracking (WPA/WPA2-PSK), `.hc22000` export, `.pcap` read/write, authorized `deauth`/PMF/PMKID, WPS attack, Evil Twin (PSK + Enterprise), channel scoring and findings, paginated audit report, hash-chained audit trail, `doctor`, CLI + desktop app, one-click update | | **Next** | GPU acceleration for cracking, capture on Windows (Npcap) | +| **Not planned** | A macOS build — see [Known limits](#known-limits) | | **Later** | WPA3/SAE downgrade, validation on varied hardware, signed release binaries | ## Development diff --git a/README.pt-BR.md b/README.pt-BR.md index 86722f9..c450b25 100644 --- a/README.pt-BR.md +++ b/README.pt-BR.md @@ -1,6 +1,6 @@
Auditoria de Wi-Fi livre e gratuita.
Terminal e interface gráfica · captura no Linux, análise offline em Windows, Linux e macOS · uso autorizado.
Auditoria de Wi-Fi livre e gratuita.
Terminal e interface gráfica · captura no Linux, análise offline também em Windows · uso autorizado.
Terminal · Interface · Arquitetura · Roadmap · Changelog
@@ -37,17 +37,18 @@ Baixe o pacote do seu sistema em **[Releases](../../releases)**: | | CLI | App gráfico | |---|---|---| -| Windows | `sabia-*-windows-x86_64.zip` | instalador `.msi` / `.exe` | -| macOS | `sabia-*-macos-{aarch64,x86_64}.tar.gz` | `.dmg` | +| Windows | — | instalador `.exe` | | Linux | `sabia-*-linux-{x86_64,aarch64}.tar.gz` | `.AppImage` / `.deb` | -Cada arquivo tem um `.sha256` ao lado. Compilar do código: `cargo build --release -p sabia-cli` (Rust 1.80+). +O CLI é só para Linux; o app desktop sai para Linux e Windows. Cada pacote do +CLI tem um `.sha256` ao lado. Compilar do código: `cargo build --release -p +sabia-cli` (Rust 1.80+, Linux). -**Atualizações:** o app desktop consulta o GitHub ao abrir; havendo versão nova, um botão oferece **Atualizar agora**: ele baixa o binário certo para a plataforma, confere o **SHA-256** e troca o executável em uso — você não precisa baixar nada na mão. A consulta é uma única requisição à API de releases e nada seu é enviado. +**Atualizações:** o app desktop consulta o Gitea ao abrir; havendo versão nova, um botão oferece **Atualizar agora**. O CLI atualiza do mesmo jeito (`sabia update`); ele baixa o binário certo para a plataforma, confere o **SHA-256** e troca o executável em uso — você não precisa baixar nada na mão. A consulta é uma única requisição à API de releases e nada seu é enviado. -> Os binários ainda **não são assinados**: o SmartScreen (Windows) e o Gatekeeper (macOS) vão avisar. Confira o SHA-256. +> Os binários ainda **não são assinados**: o SmartScreen do Windows vai avisar. Confira o SHA-256. -**Captura e modo monitor exigem Linux e privilégio de root** (`CAP_NET_ADMIN`/`CAP_NET_RAW`): a captura crua usa `AF_PACKET` e o controle de interface usa netlink. A **análise de `.pcap` e a quebra offline** rodam também em Windows e macOS. O app desktop pede elevação de administrador sozinho ao abrir. +**Captura e modo monitor exigem Linux e privilégio de root** — a única plataforma para a qual o CLI é compilado (`CAP_NET_ADMIN`/`CAP_NET_RAW`): a captura crua usa `AF_PACKET` e o controle de interface usa netlink. A **análise de `.pcap` e a quebra offline** rodam também em Windows e macOS. O app desktop pede elevação de administrador sozinho ao abrir. ## Começando @@ -74,11 +75,11 @@ App desktop (Tauri) com sidebar de interfaces, painel de captura com linha de si ## Limites conhecidos -- **Captura só no Linux**, com placa que suporte **modo monitor** (e injeção, para `deauth`). Em Windows e macOS o Sabiá faz só análise de `.pcap` e quebra offline. +- **Captura só no Linux**, com placa que suporte **modo monitor** (e injeção, para `deauth`); o CLI não é compilado para outras plataformas. Em Windows o app desktop do Sabiá faz só análise de `.pcap` e quebra offline. - **WPA3/SAE** não cai por dicionário de handshake — a quebra cobre **WPA/WPA2-PSK** (4-way e PMKID). - **5 e 6 GHz** dependem da placa e do _regulatory domain_; alguns canais ficam passivos (sem _probe_). - **Certificado autoassinado do Evil Twin Enterprise:** clientes que validam a cadeia de certificado da rede (comum em perfil corporativo/MDM atualizado) não confiam nele — é a defesa correta funcionando, não um bug. -- **Windows e macOS:** o código compila e é testado em CI, mas a captura ao vivo não roda nessas plataformas. +- **Windows:** o código compila e é testado em CI, mas a captura ao vivo não roda lá; o app desktop faz só análise offline. Não há build para macOS: o Tauri precisa do SDK do macOS e de assinatura, os dois presos a hardware Apple e a uma conta Apple Developer, que o CI deste projeto (um único runner Linux) não tem. ## Para onde vai @@ -88,6 +89,7 @@ Resumo do [ROADMAP](ROADMAP.pt-BR.md): |---|---| | **Feito** | Modo monitor por netlink (com recuperação do NetworkManager), varredura 2.4/5/6 GHz, captura de 4-way e PMKID, decriptação CCMP, quebra por dicionário/regras/máscara (WPA/WPA2-PSK), exportação `.hc22000`, escrita e leitura de `.pcap`, `deauth`/PMF/PMKID autorizados, ataque WPS, Evil Twin (PSK + Enterprise), pontuação de canais e achados, relatório de auditoria paginado, trilha de auditoria por hash, `doctor`, CLI + app desktop, atualização em um clique | | **Próximo** | Aceleração por GPU na quebra, captura em Windows (Npcap) | +| **Fora de plano** | Um build para macOS — veja [Limites conhecidos](#limites-conhecidos) | | **Depois** | WPA3/SAE _downgrade_, validação em hardware variado, binários de release assinados | ## Desenvolvimento diff --git a/apps/gui/src-tauri/Cargo.lock b/apps/gui/src-tauri/Cargo.lock index cfa1b22..499e215 100644 --- a/apps/gui/src-tauri/Cargo.lock +++ b/apps/gui/src-tauri/Cargo.lock @@ -2538,7 +2538,7 @@ checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" [[package]] name = "sabia-core" -version = "1.0.0" +version = "1.0.1" dependencies = [ "aes", "flate2", @@ -2555,7 +2555,7 @@ dependencies = [ [[package]] name = "sabia-gui" -version = "1.0.0" +version = "1.0.1" dependencies = [ "libc", "sabia-core", diff --git a/apps/gui/src-tauri/Cargo.toml b/apps/gui/src-tauri/Cargo.toml index 882ccf4..4919399 100644 --- a/apps/gui/src-tauri/Cargo.toml +++ b/apps/gui/src-tauri/Cargo.toml @@ -3,10 +3,10 @@ [package] name = "sabia-gui" description = "Sabiá: interface gráfica de auditoria de Wi-Fi" -version = "1.0.0" +version = "1.0.1" edition = "2021" license = "MIT OR Apache-2.0" -repository = "https://github.com/lucasrguerra/sabia" +repository = "https://git.lucasrguerra.dev.br/lucasrguerra/sabia" rust-version = "1.80" [workspace] diff --git a/apps/gui/src-tauri/tauri.conf.json b/apps/gui/src-tauri/tauri.conf.json index 0686c66..09d66d8 100644 --- a/apps/gui/src-tauri/tauri.conf.json +++ b/apps/gui/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "Sabia", - "version": "1.0.0", + "version": "1.0.1", "identifier": "dev.sabia.app", "build": { "frontendDist": "../ui" diff --git a/crates/sabia-core/src/update.rs b/crates/sabia-core/src/update.rs index 06b540d..ee762d2 100644 --- a/crates/sabia-core/src/update.rs +++ b/crates/sabia-core/src/update.rs @@ -1,4 +1,4 @@ -//! Auto-atualização simples: verifica a última release no GitHub, baixa o +//! Auto-atualização simples: verifica a última release no Gitea, baixa o //! binário certo para a plataforma atual, confere o checksum e troca o //! executável em uso — sem o usuário precisar baixar nada manualmente. //! @@ -12,7 +12,13 @@ use std::fs; use std::path::PathBuf; use std::process::Command; -const REPO: &str = "lucasrguerra/sabia"; +/// A API do Gitea devolve o mesmo formato de `releases/latest` que o GitHub devolvia +/// (`tag_name`, `assets[].name`, `assets[].browser_download_url`). +const LATEST_RELEASE_URL: &str = + "https://git.lucasrguerra.dev.br/api/v1/repos/lucasrguerra/sabia/releases/latest"; + +/// Página de downloads, para quem usa o app desktop. +const RELEASES_PAGE_URL: &str = "https://git.lucasrguerra.dev.br/lucasrguerra/sabia/releases"; #[derive(Debug, Deserialize)] struct Release { @@ -92,8 +98,8 @@ fn asset_suffix_for_platform() -> String { /// Consulta a última release publicada e compara com a versão atual /// (`CARGO_PKG_VERSION` do binário chamador). pub fn check(current_version: &str) -> Result