diff --git a/fortivault/client/app/src-tauri/Cargo.lock b/fortivault/client/app/src-tauri/Cargo.lock index aa53c97..3fc77e0 100644 --- a/fortivault/client/app/src-tauri/Cargo.lock +++ b/fortivault/client/app/src-tauri/Cargo.lock @@ -23,6 +23,18 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -72,9 +84,8 @@ checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" name = "app" version = "0.1.0" dependencies = [ - "diesel", - "diesel_migrations", - "dotenvy", + "dotenv", + "rusqlite", "serde", "serde_json", "tauri", @@ -502,7 +513,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -512,7 +523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" dependencies = [ "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -536,7 +547,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -547,7 +558,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -570,51 +581,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.76", -] - -[[package]] -name = "diesel" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e13bab2796f412722112327f3e575601a3e9cdcbe426f0d30dbf43f3f5dc71" -dependencies = [ - "diesel_derives", - "libsqlite3-sys", - "time", -] - -[[package]] -name = "diesel_derives" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4" -dependencies = [ - "diesel_table_macro_syntax", - "dsl_auto_type", - "proc-macro2", - "quote", - "syn 2.0.76", -] - -[[package]] -name = "diesel_migrations" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a73ce704bad4231f001bff3314d91dce4aba0770cee8b233991859abc15c1f6" -dependencies = [ - "diesel", - "migrations_internals", - "migrations_macros", -] - -[[package]] -name = "diesel_table_macro_syntax" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" -dependencies = [ - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -655,24 +622,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" [[package]] -name = "dotenvy" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" - -[[package]] -name = "dsl_auto_type" -version = "0.1.2" +name = "dotenv" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d9abe6314103864cc2d8901b7ae224e0ab1a103a0a416661b4097b0779b607" -dependencies = [ - "darling", - "either", - "heck 0.5.0", - "proc-macro2", - "quote", - "syn 2.0.76", -] +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" [[package]] name = "dtoa" @@ -695,12 +648,6 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - [[package]] name = "embed-resource" version = "2.4.3" @@ -746,6 +693,18 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "fallible-iterator" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" + +[[package]] +name = "fallible-streaming-iterator" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" + [[package]] name = "fastrand" version = "2.1.1" @@ -882,7 +841,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -1222,6 +1181,18 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashlink" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af" +dependencies = [ + "hashbrown 0.14.5", +] [[package]] name = "heck" @@ -1371,9 +1342,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ead53efc7ea8ed3cfb0c79fc8023fbb782a5432b52830b6518941cebe6505c" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown 0.14.5", @@ -1523,10 +1494,11 @@ dependencies = [ [[package]] name = "libsqlite3-sys" -version = "0.22.2" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290b64917f8b0cb885d9de0f9959fe1f775d7fa12f1da2db9001c1c8ab60f89d" +checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149" dependencies = [ + "cc", "pkg-config", "vcpkg", ] @@ -1627,27 +1599,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "migrations_internals" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd01039851e82f8799046eabbb354056283fb265c8ec0996af940f4e85a380ff" -dependencies = [ - "serde", - "toml 0.8.19", -] - -[[package]] -name = "migrations_macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb161cc72176cb37aa47f1fc520d3ef02263d67d661f44f05d05a079e1237fd" -dependencies = [ - "migrations_internals", - "proc-macro2", - "quote", -] - [[package]] name = "miniz_oxide" version = "0.7.4" @@ -1783,9 +1734,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.3" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b64972346851a39438c60b341ebc01bba47464ae329e55cf343eb93964efd9" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] @@ -1960,7 +1911,7 @@ dependencies = [ "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2015,7 +1966,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", - "indexmap 2.4.0", + "indexmap 2.5.0", "quick-xml", "serde", "time", @@ -2273,6 +2224,20 @@ version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +[[package]] +name = "rusqlite" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e" +dependencies = [ + "bitflags 2.6.0", + "fallible-iterator", + "fallible-streaming-iterator", + "hashlink", + "libsqlite3-sys", + "smallvec", +] + [[package]] name = "rustc-demangle" version = "0.1.24" @@ -2380,7 +2345,7 @@ checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2389,7 +2354,7 @@ version = "1.0.127" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8043c06d9f82bd7271361ed64f415fe5e12a77fdb52e573e7f06a516dea329ad" dependencies = [ - "indexmap 2.4.0", + "indexmap 2.5.0", "itoa 1.0.11", "memchr", "ryu", @@ -2404,7 +2369,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2426,7 +2391,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.4.0", + "indexmap 2.5.0", "serde", "serde_derive", "serde_json", @@ -2443,7 +2408,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2465,7 +2430,7 @@ checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2619,9 +2584,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.76" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578e081a14e0cefc3279b0472138c513f37b41a08d5a3cca9b6e4e8ceb6cd525" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -2709,7 +2674,7 @@ checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -2962,7 +2927,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -3023,9 +2988,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.39.3" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babc99b9923bfa4804bd74722ff02c0381021eafa4db9949217e3be8e84fff5" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -3080,7 +3045,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.4.0", + "indexmap 2.5.0", "serde", "serde_spanned", "toml_datetime", @@ -3093,7 +3058,7 @@ version = "0.22.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ - "indexmap 2.4.0", + "indexmap 2.5.0", "serde", "serde_spanned", "toml_datetime", @@ -3119,7 +3084,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] [[package]] @@ -3315,7 +3280,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", "wasm-bindgen-shared", ] @@ -3337,7 +3302,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3831,5 +3796,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.76", + "syn 2.0.77", ] diff --git a/fortivault/client/app/src-tauri/Cargo.toml b/fortivault/client/app/src-tauri/Cargo.toml index d8c14cf..d0e730f 100644 --- a/fortivault/client/app/src-tauri/Cargo.toml +++ b/fortivault/client/app/src-tauri/Cargo.toml @@ -18,12 +18,8 @@ tauri-build = { version = "1.5.4", features = [] } serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.7.2", features = [] } -diesel = { version = "2.0", features = ["sqlite"] } -dotenvy = "0.15" - -[dependencies.diesel_migrations] -version = "2.0" -features = ["sqlite"] +rusqlite = { version = "0.32.1", features = ["bundled"] } +dotenv = "0.15.0" [features] # this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. diff --git a/fortivault/client/app/src-tauri/db.sqlite b/fortivault/client/app/src-tauri/db.sqlite deleted file mode 100644 index 069a036..0000000 Binary files a/fortivault/client/app/src-tauri/db.sqlite and /dev/null differ diff --git a/fortivault/client/app/src-tauri/dbschema.png b/fortivault/client/app/src-tauri/dbschema.png deleted file mode 100644 index 4510311..0000000 Binary files a/fortivault/client/app/src-tauri/dbschema.png and /dev/null differ diff --git a/fortivault/client/app/src-tauri/diesel.toml b/fortivault/client/app/src-tauri/diesel.toml deleted file mode 100644 index e08cabb..0000000 --- a/fortivault/client/app/src-tauri/diesel.toml +++ /dev/null @@ -1,5 +0,0 @@ -[print_schema] -file = "src/schema.rs" - -[migrations_directory] -dir = "./migrations" diff --git a/fortivault/client/app/src-tauri/migrations/.keep b/fortivault/client/app/src-tauri/migrations/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/fortivault/client/app/src-tauri/migrations/2024-08-27-201525_initmigration/down.sql b/fortivault/client/app/src-tauri/migrations/2024-08-27-201525_initmigration/down.sql deleted file mode 100644 index d9a93fe..0000000 --- a/fortivault/client/app/src-tauri/migrations/2024-08-27-201525_initmigration/down.sql +++ /dev/null @@ -1 +0,0 @@ --- This file should undo anything in `up.sql` diff --git a/fortivault/client/app/src-tauri/migrations/2024-08-27-201525_initmigration/up.sql b/fortivault/client/app/src-tauri/migrations/2024-08-27-201525_initmigration/up.sql deleted file mode 100644 index c980219..0000000 --- a/fortivault/client/app/src-tauri/migrations/2024-08-27-201525_initmigration/up.sql +++ /dev/null @@ -1,98 +0,0 @@ -CREATE TABLE users ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - username TEXT NOT NULL UNIQUE, - password_hash TEXT NOT NULL, -- Hash seguro da senha do usuário - recovery_data BLOB, -- Dados de recuperação de conta encriptados (opcional) - two_factor_key TEXT, -- Chave secreta para 2FA (opcional) - biometric_enabled BOOLEAN DEFAULT 0, -- Indica se a biometria está habilitada - backup_code_hash TEXT, -- Hash dos códigos de backup para recuperação (opcional) - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -CREATE TABLE passwords ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER NOT NULL, - name TEXT NOT NULL, -- Nome para identificar a senha (por exemplo, "Conta do Gmail") - username TEXT, -- Nome de utilizador associado à senha (por exemplo, "usuario@gmail.com") - password_hash TEXT NOT NULL, -- Senha encriptada - url TEXT, -- URL opcional associada à senha - tags TEXT, -- Tags para organização, por exemplo, "trabalho, pessoal" - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE -); - -CREATE TABLE sync ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER NOT NULL, - device_id INTEGER NOT NULL, - action TEXT NOT NULL, -- Ação de sincronização: 'backup', 'sync' - status TEXT NOT NULL, -- Status da sincronização: 'success', 'error' - message TEXT, -- Mensagem descritiva sobre o status ou erro - data BLOB, -- Dados encriptados relacionados à sincronização (JSON ou outra estrutura) - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE, - FOREIGN KEY (device_id) REFERENCES devices (id) ON DELETE CASCADE -); - -CREATE TABLE devices ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER NOT NULL, - name TEXT NOT NULL, -- Nome do dispositivo - os TEXT, -- Sistema operacional do dispositivo - version TEXT, -- Versão do sistema operacional - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE -); - -CREATE TABLE client_server_settings ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER NOT NULL, -- Usuário ao qual as configurações se aplicam - server_ip TEXT NOT NULL, -- IP do servidor para conexão - server_port INTEGER NOT NULL, -- Porta do servidor para conexão - auto_sync BOOLEAN NOT NULL DEFAULT 0, -- Sincronização automática (1 - Ativado, 0 - Desativado) - preferred_encryption TEXT NOT NULL DEFAULT 'AES-256', -- Protocolo de criptografia preferido - theme TEXT NOT NULL DEFAULT 'light', -- Tema da aplicação (light, dark) - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE -); - -CREATE TABLE logs ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER NOT NULL, - action TEXT NOT NULL, -- Ação realizada (por exemplo, 'login', 'backup', 'sync') - status TEXT NOT NULL, -- Status da ação (por exemplo, 'success', 'failed') - message TEXT, -- Mensagem detalhada do log - data BLOB, -- Dados adicionais relacionados à ação (encriptados) - ip TEXT, -- IP do dispositivo (pode ser NULL) - device_id INTEGER, -- Identificador do dispositivo (pode ser NULL) - server_id INTEGER, -- Identificador do servidor (pode ser NULL) - password_id INTEGER, -- Identificador da senha (pode ser NULL) - sync_id INTEGER, -- Identificador da sincronização (pode ser NULL) - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE, - FOREIGN KEY (device_id) REFERENCES devices (id), - FOREIGN KEY (server_id) REFERENCES servers (id), - FOREIGN KEY (password_id) REFERENCES passwords (id), - FOREIGN KEY (sync_id) REFERENCES sync (id) -); - -CREATE TABLE configurations ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - user_id INTEGER, - device_id INTEGER, - server_id INTEGER, - name TEXT NOT NULL, -- Nome da configuração - value TEXT NOT NULL, -- Valor da configuração - scope TEXT NOT NULL, -- Escopo da configuração ('user', 'server', 'device', 'app') - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE, - FOREIGN KEY (device_id) REFERENCES devices (id), - FOREIGN KEY (server_id) REFERENCES servers (id) -); \ No newline at end of file diff --git a/fortivault/client/app/src-tauri/dbschema.md b/fortivault/client/app/src-tauri/src/crud/dbschema.md similarity index 99% rename from fortivault/client/app/src-tauri/dbschema.md rename to fortivault/client/app/src-tauri/src/crud/dbschema.md index a33bdc2..68946a3 100644 --- a/fortivault/client/app/src-tauri/dbschema.md +++ b/fortivault/client/app/src-tauri/src/crud/dbschema.md @@ -314,5 +314,4 @@ CREATE TABLE configurations ( 7. **Autenticação de Dispositivos**: Adicione uma coluna `auth_token` ou algo semelhante em `devices` para autenticação segura de dispositivos. -Essas melhorias ajudarão a garantir que o FortiVault seja seguro, escalável e fácil de usar. Se precisar de mais ajustes ou quiser detalhar mais algum ponto, estou à disposição! -*/ +Essas melhorias ajudarão a garantir que o FortiVault seja seguro, escalável e fácil de usar. Se precisar de mais ajustes ou quiser detalhar mais algum ponto, estou à disposição! \ No newline at end of file diff --git a/fortivault/client/app/src-tauri/src/crud/mod.rs b/fortivault/client/app/src-tauri/src/crud/mod.rs new file mode 100644 index 0000000..90a8be7 --- /dev/null +++ b/fortivault/client/app/src-tauri/src/crud/mod.rs @@ -0,0 +1,2 @@ +// Mod file +pub mod users; \ No newline at end of file diff --git a/fortivault/client/app/src-tauri/src/crud/passwords.rs b/fortivault/client/app/src-tauri/src/crud/passwords.rs new file mode 100644 index 0000000..50cd2e7 --- /dev/null +++ b/fortivault/client/app/src-tauri/src/crud/passwords.rs @@ -0,0 +1,138 @@ +/* +CREATE TABLE passwords ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL, + name TEXT NOT NULL, -- Nome para identificar a senha (por exemplo, "Conta do Gmail") + username TEXT, -- Nome de utilizador associado à senha (por exemplo, "usuario@gmail.com") + password_hash TEXT NOT NULL, -- Senha encriptada + url TEXT, -- URL opcional associada à senha + tags TEXT, -- Tags para organização, por exemplo, "trabalho, pessoal" + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE +); +*/ + +use rusqlite::{Connection, Result}; + +#[derive(Debug)] +pub struct Password { + pub(crate) id: i32, + pub(crate) user_id: i32, + pub(crate) name: String, + pub(crate) username: Option, + pub(crate) password_hash: String, + pub(crate) url: Option, + pub(crate) tags: Option, + pub(crate) created_at: String, + pub(crate) updated_at: String, +} + +// Create table if not exists +pub fn create_table(conn: &Connection) -> Result<()> { + conn.execute( + "CREATE TABLE IF NOT EXISTS passwords ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL, + name TEXT NOT NULL, + username TEXT, + password_hash TEXT NOT NULL, + url TEXT, + tags TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE + )", + [], + )?; + Ok(()) +} + +// Create a new password +pub fn create_password( + conn: &Connection, + user_id: i32, + name: &str, + username: Option<&str>, + password_hash: &str, + url: Option<&str>, + tags: Option<&str>, +) -> Result<()> { + conn.execute( + "INSERT INTO passwords (user_id, name, username, password_hash, url, tags) VALUES (?1, ?2, ?3, ?4, ?5, ?6)", + &[user_id, name, username, password_hash, url, tags], + )?; + Ok(()) +} + +// Get all passwords +pub fn get_passwords(conn: &Connection) -> Result> { + let mut stmt = conn.prepare("SELECT * FROM passwords")?; + let password_iter = stmt.query_map([], |row| { + Ok(Password { + id: row.get(0)?, + user_id: row.get(1)?, + name: row.get(2)?, + username: row.get(3)?, + password_hash: row.get(4)?, + url: row.get(5)?, + tags: row.get(6)?, + created_at: row.get(7)?, + updated_at: row.get(8)?, + }) + })?; + let mut passwords = Vec::new(); + for password in password_iter { + passwords.push(password?); + } + Ok(passwords) +} + +// Get a password by id +pub fn get_password_by_id(conn: &Connection, id: i32) -> Result { + let mut stmt = conn.prepare("SELECT * FROM passwords WHERE id = ?1")?; + let password_iter = stmt.query_map(&[id], |row| { + Ok(Password { + id: row.get(0)?, + user_id: row.get(1)?, + name: row.get(2)?, + username: row.get(3)?, + password_hash: row.get(4)?, + url: row.get(5)?, + tags: row.get(6)?, + created_at: row.get(7)?, + updated_at: row.get(8)?, + }) + })?; + for password in password_iter { + return password; + } + Err(rusqlite::Error::QueryReturnedNoRows) +} + +// Update a password +pub fn update_password(conn: &Connection, id: i32, user_id: i32, password: Password) -> Result<()> { + conn.execute( + "UPDATE passwords SET user_id = ?1, name = ?2, username = ?3, password_hash = ?4, url = ?5, tags = ?6, created_at = ?7, updated_at = ?8 WHERE id = ?9", + (&user_id, &password.name, &password.username, &password.password_hash, &password.url, &password.tags, &password.created_at, &password.updated_at, &id), + )?; + Ok(()) +} + +// Delete a password +pub fn delete_password(conn: &Connection, id: i32) -> Result<()> { + conn.execute("DELETE FROM passwords WHERE id = ?1", &[id])?; + Ok(()) +} + +// Delete all passwords +pub fn delete_all_passwords(conn: &Connection) -> Result<()> { + conn.execute("DELETE FROM passwords", [])?; + Ok(()) +} + +// Delete all passwords from a user +pub fn delete_all_passwords_from_user(conn: &Connection, user_id: i32) -> Result<()> { + conn.execute("DELETE FROM passwords WHERE user_id = ?1", &[user_id])?; + Ok(()) +} diff --git a/fortivault/client/app/src-tauri/src/crud/users.rs b/fortivault/client/app/src-tauri/src/crud/users.rs new file mode 100644 index 0000000..64e7539 --- /dev/null +++ b/fortivault/client/app/src-tauri/src/crud/users.rs @@ -0,0 +1,149 @@ +/* +Crud: +CREATE TABLE users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT NOT NULL UNIQUE, + password_hash TEXT NOT NULL, -- Hash seguro da senha do usuário + recovery_data BLOB, -- Dados de recuperação de conta encriptados (opcional) + two_factor_key TEXT, -- Chave secreta para 2FA (opcional) + biometric_enabled BOOLEAN DEFAULT 0, -- Indica se a biometria está habilitada + backup_code_hash TEXT, -- Hash dos códigos de backup para recuperação (opcional) + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +*/ + +use rusqlite::{Connection, Result}; +// use crate::Serialize; + +// This struct should be public +// struct User { +// id: i32, +// username: String, +// password_hash: String, +// recovery_data: Option>, +// two_factor_key: Option, +// biometric_enabled: bool, +// backup_code_hash: Option, +// created_at: String, +// updated_at: String, +// } + +#[derive(Debug)] +pub struct User { + pub(crate) id: i32, + pub(crate) username: String, + pub(crate) password_hash: String, + pub(crate) recovery_data: Option>, + pub(crate) two_factor_key: Option, + pub(crate) biometric_enabled: bool, + pub(crate) backup_code_hash: Option, + pub(crate) created_at: String, + pub(crate) updated_at: String, +} + +// Create table if not exists +pub fn create_table(conn: &Connection) -> Result<()> { + conn.execute( + "CREATE TABLE IF NOT EXISTS users ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + username TEXT NOT NULL UNIQUE, + password_hash TEXT NOT NULL, + recovery_data BLOB, + two_factor_key TEXT, + biometric_enabled BOOLEAN DEFAULT 0, + backup_code_hash TEXT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP + )", + [], + )?; + Ok(()) +} + +// Create a new user +pub fn create_user(conn: &Connection, username: &str, password_hash: &str) -> Result<()> { + conn.execute( + "INSERT INTO users (username, password_hash) VALUES (?1, ?2)", + &[username, password_hash], + )?; + Ok(()) +} + +// Read a user +pub fn read_user(conn: &Connection, username: &str) -> Result { + let mut stmt = conn.prepare("SELECT * FROM users WHERE username = ?1")?; + let user_iter = stmt.query_map(&[username], |row| { + Ok(User { + id: row.get(0)?, + username: row.get(1)?, + password_hash: row.get(2)?, + recovery_data: row.get(3)?, + two_factor_key: row.get(4)?, + biometric_enabled: row.get(5)?, + backup_code_hash: row.get(6)?, + created_at: row.get(7)?, + updated_at: row.get(8)?, + }) + })?; + + for user in user_iter { + return user; + } + + Err(rusqlite::Error::QueryReturnedNoRows) +} + +// Update a user +// User { id, username, password_hash, recovery_data, two_factor_key, biometric_enabled, backup_code_hash, created_at, updated_at }: User +pub fn update_user(conn: &Connection, user: User, username: &str) -> Result<()> { + conn.execute( + "UPDATE users SET username = ?1, password_hash = ?2, recovery_data = ?3, two_factor_key = ?4, biometric_enabled = ?5, backup_code_hash = ?6, created_at = ?7, updated_at = ?8 WHERE username = ?9", + (&user.username, &user.password_hash, &user.recovery_data, &user.two_factor_key, &user.biometric_enabled, &user.backup_code_hash, &user.created_at, &user.updated_at, &username), + )?; + Ok(()) +} + +// Delete a user +pub fn delete_user(conn: &Connection, username: &str) -> Result<()> { + conn.execute("DELETE FROM users WHERE username = ?1", &[username])?; + Ok(()) +} + +// List all users +pub fn list_users(conn: &Connection) -> Result> { + let mut stmt = conn.prepare("SELECT * FROM users")?; + let user_iter = stmt.query_map([], |row| { + Ok(User { + id: row.get(0)?, + username: row.get(1)?, + password_hash: row.get(2)?, + recovery_data: row.get(3)?, + two_factor_key: row.get(4)?, + biometric_enabled: row.get(5)?, + backup_code_hash: row.get(6)?, + created_at: row.get(7)?, + updated_at: row.get(8)?, + }) + })?; + + let mut users = Vec::new(); + for user in user_iter { + users.push(user?); + } + + Ok(users) +} + +// Delete all users +pub fn delete_all_users(conn: &Connection) -> Result<()> { + conn.execute("DELETE FROM users", [])?; + Ok(()) +} + +// Count all users +pub fn count_users(conn: &Connection) -> Result { + let mut stmt = conn.prepare("SELECT COUNT(*) FROM users")?; + let count = stmt.query_row([], |row| row.get(0))?; + Ok(count) +} \ No newline at end of file diff --git a/fortivault/client/app/src-tauri/src/handlers.rs b/fortivault/client/app/src-tauri/src/handlers.rs deleted file mode 100644 index 6ed794e..0000000 --- a/fortivault/client/app/src-tauri/src/handlers.rs +++ /dev/null @@ -1,13 +0,0 @@ -// We using sqlite for the database, no need to connect to the database -// the database is db.sqlite we using diesel for the ORM -use diesel::prelude::*; -use diesel::result::QueryResult; -use crate::models::User; -use crate::schema::*; -use diesel::sqlite::SqliteConnection; - -pub fn create_user(conn: &SqliteConnection, new_user: User) -> QueryResult { - diesel::insert_into(users::table) - .values(&new_user) - .execute(conn) -} \ No newline at end of file diff --git a/fortivault/client/app/src-tauri/src/main.rs b/fortivault/client/app/src-tauri/src/main.rs index a8b0afd..a2e7a4e 100644 --- a/fortivault/client/app/src-tauri/src/main.rs +++ b/fortivault/client/app/src-tauri/src/main.rs @@ -1,67 +1,13 @@ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -#[macro_use] -use diesel::prelude::*; -use diesel::sqlite::SqliteConnection; -use dotenvy::dotenv; -use std::env; +// use rusqlite::Connection; -mod schema; -mod models; - -use models::{NewUser, User}; - -pub fn establish_connection() -> SqliteConnection { - dotenv().ok(); - - let database_url = env::var("DATABASE_URL").expect("DATABASE_URL deve estar no .env"); - SqliteConnection::establish(&database_url) - .unwrap_or_else(|_| panic!("Erro ao conectar com {}", database_url)) -} - -/* -pub struct User { - pub id: Option, - pub username: String, - pub password_hash: String, - pub recovery_data: Option>, - pub two_factor_key: Option, - pub biometric_enabled: Option, - pub backup_code_hash: Option, - pub created_at: Option, - pub updated_at: Option, -} -*/ +pub mod crud; fn main() { - // Função para criar um novo usuário - pub fn create_user(conn: &SqliteConnection, - new_user: NewUser - ) -> usize { - use schema::users; - - diesel::insert_into(users::table) - .values(&new_user) - .execute(conn) - .expect("Erro ao inserir novo usuário") - } - - // Teste para criar um novo usuário - let connection = establish_connection(); - let new_user = NewUser { - username: "admin", - password_hash: "admin", - recovery_data: None, - two_factor_key: None, - biometric_enabled: None, - backup_code_hash: None, - }; - - let user_id = create_user(&connection, new_user); - println!("Novo usuário criado com id {}", user_id); - tauri::Builder::default() - .run(tauri::generate_context!()) - .expect("error while running tauri application"); + tauri::Builder::default() + .run(tauri::generate_context!()) + .expect("error while running tauri application"); } diff --git a/fortivault/client/app/src-tauri/src/models.rs b/fortivault/client/app/src-tauri/src/models.rs deleted file mode 100644 index e271c71..0000000 --- a/fortivault/client/app/src-tauri/src/models.rs +++ /dev/null @@ -1,207 +0,0 @@ -use super::schema::*; -use serde::{Deserialize, Serialize}; -use diesel::prelude::*; - -/* -diesel::table! { - client_server_settings (id) { - id -> Nullable, - user_id -> Integer, - server_ip -> Text, - server_port -> Integer, - auto_sync -> Bool, - preferred_encryption -> Text, - theme -> Text, - created_at -> Nullable, - updated_at -> Nullable, - } -} - -diesel::table! { - configurations (id) { - id -> Nullable, - user_id -> Nullable, - device_id -> Nullable, - server_id -> Nullable, - name -> Text, - value -> Text, - scope -> Text, - created_at -> Nullable, - updated_at -> Nullable, - } -} - -diesel::table! { - devices (id) { - id -> Nullable, - user_id -> Integer, - name -> Text, - os -> Nullable, - version -> Nullable, - created_at -> Nullable, - updated_at -> Nullable, - } -} - -diesel::table! { - logs (id) { - id -> Nullable, - user_id -> Integer, - action -> Text, - status -> Text, - message -> Nullable, - data -> Nullable, - ip -> Nullable, - device_id -> Nullable, - server_id -> Nullable, - password_id -> Nullable, - sync_id -> Nullable, - created_at -> Nullable, - updated_at -> Nullable, - } -} - -diesel::table! { - passwords (id) { - id -> Nullable, - user_id -> Integer, - name -> Text, - username -> Nullable, - password_hash -> Text, - url -> Nullable, - tags -> Nullable, - created_at -> Nullable, - updated_at -> Nullable, - } -} - -diesel::table! { - sync (id) { - id -> Nullable, - user_id -> Integer, - device_id -> Integer, - action -> Text, - status -> Text, - message -> Nullable, - data -> Nullable, - created_at -> Nullable, - updated_at -> Nullable, - } -} - -diesel::table! { - users (id) { - id -> Nullable, - username -> Text, - password_hash -> Text, - recovery_data -> Nullable, - two_factor_key -> Nullable, - biometric_enabled -> Nullable, - backup_code_hash -> Nullable, - created_at -> Nullable, - updated_at -> Nullable, - } -} -*/ - -#[derive(Debug, Serialize, Deserialize, Queryable)] -#[diesel(table_name = users)] -pub struct User { - pub id: Option, - pub username: String, - pub password_hash: String, - pub recovery_data: Option>, - pub two_factor_key: Option, - pub biometric_enabled: Option, - pub backup_code_hash: Option, - pub created_at: Option, - pub updated_at: Option, -} - -#[derive(Debug, Serialize, Deserialize, Queryable)] -#[diesel(table_name = passwords)] -pub struct Password { - pub id: Option, - pub user_id: i32, - pub name: String, - pub username: Option, - pub password_hash: String, - pub url: Option, - pub tags: Option, - pub created_at: Option, - pub updated_at: Option, -} - -#[derive(Debug, Serialize, Deserialize, Queryable)] -#[diesel(table_name = logs)] -pub struct Log { - pub id: Option, - pub user_id: i32, - pub action: String, - pub status: String, - pub message: Option, - pub data: Option>, - pub ip: Option, - pub device_id: Option, - pub server_id: Option, - pub password_id: Option, - pub sync_id: Option, - pub created_at: Option, - pub updated_at: Option, -} - -#[derive(Debug, Serialize, Deserialize, Queryable)] -#[diesel(table_name = sync)] -pub struct Sync { - pub id: Option, - pub user_id: i32, - pub device_id: i32, - pub action: String, - pub status: String, - pub message: Option, - pub data: Option>, - pub created_at: Option, - pub updated_at: Option, -} - -#[derive(Debug, Serialize, Deserialize, Queryable)] -#[diesel(table_name = devices)] -pub struct Device { - pub id: Option, - pub user_id: i32, - pub name: String, - pub os: Option, - pub version: Option, - pub created_at: Option, - pub updated_at: Option, -} - -#[derive(Debug, Serialize, Deserialize, Queryable)] -#[diesel(table_name = configurations)] -pub struct Configuration { - pub id: Option, - pub user_id: Option, - pub device_id: Option, - pub server_id: Option, - pub name: String, - pub value: String, - pub scope: String, - pub created_at: Option, - pub updated_at: Option, -} - -#[derive(Debug, Serialize, Deserialize, Queryable)] -#[diesel(table_name = client_server_settings)] -pub struct ClientServerSetting { - pub id: Option, - pub user_id: i32, - pub server_ip: String, - pub server_port: i32, - pub auto_sync: bool, - pub preferred_encryption: String, - pub theme: String, - pub created_at: Option, - pub updated_at: Option, -} - - diff --git a/fortivault/client/app/src-tauri/src/schema.rs b/fortivault/client/app/src-tauri/src/schema.rs deleted file mode 100644 index 45319bd..0000000 Binary files a/fortivault/client/app/src-tauri/src/schema.rs and /dev/null differ diff --git a/fortivault/client/app/src-tauri/tauri.conf.json b/fortivault/client/app/src-tauri/tauri.conf.json index 3050f69..dc146d5 100644 --- a/fortivault/client/app/src-tauri/tauri.conf.json +++ b/fortivault/client/app/src-tauri/tauri.conf.json @@ -7,7 +7,7 @@ "distDir": "../out" }, "package": { - "productName": "FortiVault", + "productName": "app", "version": "0.1.0" }, "tauri": { diff --git a/fortivault/client/app/src-tauri/test.db b/fortivault/client/app/src-tauri/test.db new file mode 100644 index 0000000..c3e0f9e Binary files /dev/null and b/fortivault/client/app/src-tauri/test.db differ