diff --git a/CHANGELOG.md b/CHANGELOG.md index cd75e52..443cb7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,22 @@ Formato baseado em [Keep a Changelog](https://keepachangelog.com/pt-BR/1.1.0/); versões seguem SemVer. +## [1.0.0] - 2026-10-19 + +### Adicionado +- **Sistemas de arquivos com metadados:** ext4 (inodes apagados e cópias antigas no diário), HFS+ (sobras de nós e diário), Btrfs (versões antigas das árvores; extensões zlib, zstd e lzo), XFS (inodes liberados e nomes de entradas liberadas) e APFS (instantâneos e nós antigos). ReFS ainda é só detectado. +- **Volumes cifrados:** BitLocker (senha, chave de recuperação, .BEK, chave limpa), LUKS1/LUKS2 e FileVault 2 (Core Storage) abrem com a senha ou a chave e são varridos por dentro. As senhas nunca vão para o arquivo de sessão. +- **RAID e LVM:** RAID 0, 1, 4, 5, 6, 10 e linear a partir de superblocos do mdadm, inclusive degradado; descoberta automática de nível, faixa, layout e ordem quando não há metadados; LVM2 (linear, em faixas, espelhado e RAID). +- **Imagens forenses:** leitura de E01/Ex01 e AFF4; gravação de E01 e AFF4; comando `guara verify`. +- **Carving:** JPEG fragmentado remontado (até três fragmentos), reconstrução do índice de MP4/MOV sem moov (H.264/HEVC, com vídeo de referência) e 24 formatos reconhecidos pela estrutura. +- **Interface:** campos de senha, RAID, vídeo de referência e formato da imagem. + +### Corrigido +- Abrir de novo uma sessão recente já aberta não cria mais cópias iguais na aba de sessões. + +### Limitações +- Storage Spaces e ReFS (metadados) não suportados; XFS e APFS testados com exclusões simuladas; áudio não é reconstruído em MP4 sem moov. + ## [0.6.0] - 2026-10-18 ### Adicionado diff --git a/Cargo.lock b/Cargo.lock index 3ba6481..63a5188 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,17 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "anstream" version = "1.0.0" @@ -58,6 +69,27 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "arbitrary" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bc62ac97cc33321f50863d514c3bc38a453947a8f9e781137e47c7401020aed" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "argon2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3610892ee6e0cbce8ae2700349fcf8f98adb0dbfbee85aec3c9179d29cc072" +dependencies = [ + "base64ct", + "blake2", + "cpufeatures", + "password-hash", +] + [[package]] name = "ascii" version = "1.1.0" @@ -70,12 +102,27 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bitflags" version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -94,18 +141,45 @@ dependencies = [ "objc2", ] +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + [[package]] name = "bytemuck" version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "byteorder-lite" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "bzip2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a53fac24f34a81bc9954b5d6cfce0c21e18ec6959f44f56e8e90e4bb7c346c" +dependencies = [ + "libbz2-rs-sys", +] + [[package]] name = "cfg-if" version = "1.0.5" @@ -124,6 +198,16 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + [[package]] name = "clap" version = "4.6.7" @@ -155,7 +239,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 3.0.9", ] [[package]] @@ -194,6 +278,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + [[package]] name = "crypto-common" version = "0.1.7" @@ -215,6 +305,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "derive_arbitrary" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b034bd7d5f032402a2479444dcc6f74e36a03f31854d41680fb240ef682a1ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + [[package]] name = "digest" version = "0.10.7" @@ -223,6 +324,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", + "subtle", ] [[package]] @@ -237,6 +339,12 @@ dependencies = [ "objc2", ] +[[package]] +name = "equivalent" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00d174d5400e5e8fd687ad1049e2f578285fa914201b1af7e8b112a4546bd826" + [[package]] name = "errno" version = "0.3.14" @@ -317,42 +425,69 @@ dependencies = [ [[package]] name = "guara-cli" -version = "0.6.0" +version = "1.0.0" dependencies = [ "clap", "ctrlc", "getrandom 0.2.17", "guara-core", + "rpassword", "serde_json", "tiny_http", ] [[package]] name = "guara-core" -version = "0.6.0" +version = "1.0.0" dependencies = [ + "aes", + "argon2", + "bzip2", "flate2", + "hmac", "image", "jpeg-decoder", "jpeg-encoder", "libc", + "lz4_flex", "md-5", + "mp4", + "pbkdf2", + "ripemd", + "ruzstd", "serde", "serde_json", "sha1", "sha2", + "snap", "tempfile", - "thiserror", + "thiserror 2.0.21", "tiny_http", "windows-sys 0.59.0", + "zip", ] +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + [[package]] name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "httpdate" version = "1.0.3" @@ -385,6 +520,25 @@ dependencies = [ "quick-error", ] +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.2" @@ -409,6 +563,12 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b454d911ac55068f53495488d8ccd0646eaa540c033a28ee15b07838afafb01f" +[[package]] +name = "libbz2-rs-sys" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34b357333733e8260735ba5894eb928c02ecc69c78715f01a8019e7fa7f2db4c" + [[package]] name = "libc" version = "0.2.191" @@ -427,6 +587,12 @@ version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" +[[package]] +name = "lz4_flex" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "373f5eceeeab7925e0c1098212f2fbc4d416adec9d35051a6ab251e824c1854a" + [[package]] name = "md-5" version = "0.10.6" @@ -473,6 +639,20 @@ dependencies = [ "pxfm", ] +[[package]] +name = "mp4" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9ef834d5ed55e494a2ae350220314dc4aacd1c43a9498b00e320e0ea352a5c3" +dependencies = [ + "byteorder", + "bytes", + "num-rational", + "serde", + "serde_json", + "thiserror 1.0.69", +] + [[package]] name = "nix" version = "0.31.3" @@ -485,6 +665,37 @@ dependencies = [ "libc", ] +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -521,6 +732,27 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +[[package]] +name = "password-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + [[package]] name = "png" version = "0.18.1" @@ -570,6 +802,42 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] + +[[package]] +name = "rpassword" +version = "7.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da316a15f47e3d053de9cb2c439650bd8fa4aaeb9365f2e5f27f492ff73c196" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.61.2", +] + +[[package]] +name = "rtoolbox" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a1efe12a1469752d0e6ff5ebec0b6ef4924cc5c4c71046b0ec730040535819d" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "rustix" version = "1.1.5" @@ -583,6 +851,15 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "ruzstd" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad02996bfc73da3e301efe90b1837be9ed8f4a462b6ed410aa35d00381de89f" +dependencies = [ + "twox-hash", +] + [[package]] name = "serde" version = "1.0.229" @@ -610,7 +887,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.9", ] [[package]] @@ -654,12 +931,41 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" +[[package]] +name = "snap" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199905e6153d6405f9728fe44daace35f8f837bbf830bb6e85fbd5828709a886" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "strsim" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "3.0.9" @@ -684,13 +990,33 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + [[package]] name = "thiserror" version = "2.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" dependencies = [ - "thiserror-impl", + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", ] [[package]] @@ -701,7 +1027,7 @@ checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 3.0.9", ] [[package]] @@ -716,6 +1042,16 @@ dependencies = [ "log", ] +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + [[package]] name = "typenum" version = "1.20.1" @@ -840,6 +1176,21 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "zip" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dcb24d0152526ae49b9b96c1dcf71850ca1e0b882e4e28ed898a93c41334744" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "flate2", + "indexmap", + "memchr", + "zopfli", +] + [[package]] name = "zlib-rs" version = "0.6.8" @@ -851,3 +1202,15 @@ name = "zmij" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zopfli" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf7fc5d30c28483d93805c4a5e12b05bbb52407fa67c5f8bd552374cd01fb11" +dependencies = [ + "bumpalo", + "crc32fast", + "log", + "simd-adler32", +] diff --git a/Cargo.toml b/Cargo.toml index c484105..bfbf0d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ resolver = "2" members = ["crates/guara-core", "crates/guara-cli"] [workspace.package] -version = "0.6.0" +version = "1.0.0" edition = "2021" license = "MIT OR Apache-2.0" repository = "https://github.com/lucasrguerra/guara" @@ -16,3 +16,7 @@ codegen-units = 1 opt-level = 3 strip = true panic = "abort" + +# Dependências otimizadas também em debug: os testes de cifra fazem milhões de SHA-256. +[profile.dev.package."*"] +opt-level = 3 diff --git a/README.md b/README.md index 710b77b..cc5bba3 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,10 @@ Veja [CONTRIBUTING.md](CONTRIBUTING.md). Versões seguem [SemVer](https://semver [MIT](LICENSE-MIT) ou [Apache-2.0](LICENSE-APACHE), à sua escolha. +## Novidades da 1.0.0 + +Metadados de ext4, HFS+, Btrfs, XFS e APFS; abertura de volumes BitLocker, LUKS e FileVault 2 com senha ou chave; RAID (0/1/4/5/6/10) e LVM remontados, com parâmetros descobertos sozinhos; imagens E01, Ex01 e AFF4; JPEG fragmentado e MP4 sem índice. Detalhes e limitações no [CHANGELOG](CHANGELOG.md). + ## Novidades da 0.6.0 - Saúde do disco completa, no estilo do CrystalDiskInfo: estado com % de vida útil, temperatura, horas e vezes ligado, total lido e gravado, ficha do dispositivo (modelo, firmware, interface, modo de transferência, rotação, recursos) e a tabela inteira de atributos SMART (ATA e NVMe). diff --git a/apps/gui/src-tauri/Cargo.toml b/apps/gui/src-tauri/Cargo.toml index 77e1179..a21411b 100644 --- a/apps/gui/src-tauri/Cargo.toml +++ b/apps/gui/src-tauri/Cargo.toml @@ -3,7 +3,7 @@ [package] name = "guara-gui" description = "Guará: interface gráfica de recuperação de arquivos" -version = "0.6.0" +version = "1.0.0" edition = "2021" license = "MIT OR Apache-2.0" repository = "https://github.com/lucasrguerra/guara" diff --git a/apps/gui/src-tauri/icons/64x64.png b/apps/gui/src-tauri/icons/64x64.png new file mode 100644 index 0000000..7d2beb3 Binary files /dev/null and b/apps/gui/src-tauri/icons/64x64.png differ diff --git a/apps/gui/src-tauri/icons/Square107x107Logo.png b/apps/gui/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..8dc4b6b Binary files /dev/null and b/apps/gui/src-tauri/icons/Square107x107Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square142x142Logo.png b/apps/gui/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..c0747e3 Binary files /dev/null and b/apps/gui/src-tauri/icons/Square142x142Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square150x150Logo.png b/apps/gui/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..566bf6e Binary files /dev/null and b/apps/gui/src-tauri/icons/Square150x150Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square284x284Logo.png b/apps/gui/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..d7ecf4b Binary files /dev/null and b/apps/gui/src-tauri/icons/Square284x284Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square30x30Logo.png b/apps/gui/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..b182f88 Binary files /dev/null and b/apps/gui/src-tauri/icons/Square30x30Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square310x310Logo.png b/apps/gui/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..645d9ad Binary files /dev/null and b/apps/gui/src-tauri/icons/Square310x310Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square44x44Logo.png b/apps/gui/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..83ab07f Binary files /dev/null and b/apps/gui/src-tauri/icons/Square44x44Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square71x71Logo.png b/apps/gui/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..1db2bee Binary files /dev/null and b/apps/gui/src-tauri/icons/Square71x71Logo.png differ diff --git a/apps/gui/src-tauri/icons/Square89x89Logo.png b/apps/gui/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..ad30090 Binary files /dev/null and b/apps/gui/src-tauri/icons/Square89x89Logo.png differ diff --git a/apps/gui/src-tauri/icons/StoreLogo.png b/apps/gui/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..12b1680 Binary files /dev/null and b/apps/gui/src-tauri/icons/StoreLogo.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml b/apps/gui/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..2ffbf24 --- /dev/null +++ b/apps/gui/src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..853ba1f Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..83b6487 Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..480ed85 Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..e59011d Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d432ec9 Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..0c132ad Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..743b0d3 Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..ae41b3e Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..97e949c Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..7263127 Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0ce4103 Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..08b1c1c Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..97c6eda Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0a628c4 Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..3ef3c65 Binary files /dev/null and b/apps/gui/src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/apps/gui/src-tauri/icons/android/values/ic_launcher_background.xml b/apps/gui/src-tauri/icons/android/values/ic_launcher_background.xml new file mode 100644 index 0000000..16cdd5a --- /dev/null +++ b/apps/gui/src-tauri/icons/android/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/apps/gui/src-tauri/icons/icon.icns b/apps/gui/src-tauri/icons/icon.icns new file mode 100644 index 0000000..68f78eb Binary files /dev/null and b/apps/gui/src-tauri/icons/icon.icns differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png new file mode 100644 index 0000000..510c4e1 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@1x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png new file mode 100644 index 0000000..390efc3 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x-1.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x.png new file mode 100644 index 0000000..390efc3 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-20x20@3x.png b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@3x.png new file mode 100644 index 0000000..fb74756 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-20x20@3x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@1x.png b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@1x.png new file mode 100644 index 0000000..9504745 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@1x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png new file mode 100644 index 0000000..6593b40 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x-1.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x.png new file mode 100644 index 0000000..6593b40 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-29x29@3x.png b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@3x.png new file mode 100644 index 0000000..4c06189 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-29x29@3x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@1x.png b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@1x.png new file mode 100644 index 0000000..390efc3 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@1x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png new file mode 100644 index 0000000..24b49dd Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x-1.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png new file mode 100644 index 0000000..24b49dd Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png new file mode 100644 index 0000000..4167407 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-40x40@3x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-512@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-512@2x.png new file mode 100644 index 0000000..3c5e275 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-512@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png new file mode 100644 index 0000000..4167407 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-60x60@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-60x60@3x.png b/apps/gui/src-tauri/icons/ios/AppIcon-60x60@3x.png new file mode 100644 index 0000000..be8fd0f Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-60x60@3x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-76x76@1x.png b/apps/gui/src-tauri/icons/ios/AppIcon-76x76@1x.png new file mode 100644 index 0000000..6f11713 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-76x76@1x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-76x76@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-76x76@2x.png new file mode 100644 index 0000000..75088f8 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-76x76@2x.png differ diff --git a/apps/gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png b/apps/gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png new file mode 100644 index 0000000..04c1bb7 Binary files /dev/null and b/apps/gui/src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png differ diff --git a/apps/gui/src-tauri/tauri.conf.json b/apps/gui/src-tauri/tauri.conf.json index 086d624..ba0a5ad 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": "Guara", - "version": "0.6.0", + "version": "1.0.0", "identifier": "dev.guara.app", "build": { "frontendDist": "../ui" diff --git a/apps/gui/ui/app.js b/apps/gui/ui/app.js index 1dbb556..95c3deb 100644 --- a/apps/gui/ui/app.js +++ b/apps/gui/ui/app.js @@ -316,7 +316,7 @@ function paintHealth() { tile('Total gravado', h.host_writes == null ? null : human(h.host_writes)), ].join(''); const info = (h.info || []).map(([k, v]) => `
${esc(k)}
${esc(v)}
`).join(''); - const dash = (x) => x == null ? '–' : x; + const dash = (x) => x == null ? '-' : x; const attrs = h.attributes || []; const table = attrs.length ? `
Atributos SMART (${attrs.length})
@@ -409,10 +409,33 @@ function renderDevice(err) {
${CATS.map(([k, n]) => ``).join('')}
Sem nenhuma categoria marcada, todos os tipos são procurados.
+
Volumes cifrados, RAID e vídeos + + + + + + + +
`; $('#elevate')?.addEventListener('click', () => tauri.core.invoke('relaunch_elevated').catch((e) => toast(String(e)))); const opts = (mode) => ({ mode, + assembly: (() => { + const v = (id) => ($(id)?.value || '').trim(); + const secrets = []; + if (v('#optPw')) secrets.push({ kind: 'password', value: v('#optPw') }); + if (v('#optRk')) secrets.push({ kind: 'recovery', value: v('#optRk') }); + if (v('#optKf')) secrets.push({ kind: 'keyfile', path: v('#optKf') }); + return { + secrets, + members: v('#optMembers').split('\n').map((x) => x.trim()).filter(Boolean), + raid: $('#optRaid')?.checked ? {} : null, + remember_keys: $('#optRemember')?.checked || false, + }; + })(), + references: $('#optRef')?.value.trim() ? [$('#optRef').value.trim()] : [], include_allocated: $('#optAlloc')?.checked || false, categories: [...document.querySelectorAll('#optCats input:checked')].map((i) => i.value), }); @@ -442,10 +465,18 @@ async function startScan(options) { async function startImage() { const base = (S.defaults.home || '') + (S.defaults.sep || '/'); - const dest = await ask({ title: 'Criar imagem do disco', text: 'Onde salvar o arquivo de imagem? Use outro disco com espaço suficiente e um nome que ainda não exista.', value: base + 'disco-guara.img', ok: 'Criar imagem' }); - if (!dest) return; + const f = await askForm({ title: 'Criar imagem do disco', text: 'Onde salvar o arquivo de imagem? Use outro disco com espaço suficiente e um nome que ainda não exista.', ok: 'Criar imagem', fields: [ + { name: 'dest', label: 'Arquivo de destino', value: base + 'disco-guara.img' }, + { name: 'format', label: 'Formato', value: 'raw', options: [['raw', 'Bruta (.img)'], ['e01', 'Expert Witness (.E01, com hash e metadados)'], ['aff4', 'AFF4 (.aff4)']] }, + { name: 'case', label: 'Número do caso (E01/AFF4)', value: '' }, + { name: 'examiner', label: 'Examinador (E01/AFF4)', value: '' }, + ] }); + if (!f || !f.dest) return; + const dest = f.dest; + const format = f.format === 'e01' ? { kind: 'e01', case_number: f.case, examiner: f.examiner } + : f.format === 'aff4' ? { kind: 'aff4', case_number: f.case, examiner: f.examiner } : { kind: 'raw' }; try { - const { job } = await rpc('image_start', { path: S.device.path, dest }); + const { job } = await rpc('image_start', { path: S.device.path, dest, format }); watchAux(job, 'Criando imagem do disco', (st) => { const r = st.report || {}; const bad = (r.bad_ranges || []).length;
IDAtributoAtualPiorLimiteBruto