From 6c47c0afa36c87c292b43f923d34d5c2fb01951b Mon Sep 17 00:00:00 2001 From: Aris Ripandi Date: Wed, 31 Aug 2022 10:51:07 +0700 Subject: [PATCH] changed passphrase algorithm and vault lock method --- apps/desktop/src-tauri/Cargo.lock | 13 +-- apps/desktop/src-tauri/Cargo.toml | 2 +- apps/desktop/src-tauri/src/main.rs | 2 +- apps/desktop/src-tauri/src/security.rs | 18 ++- apps/desktop/src/App.tsx | 16 ++- apps/desktop/src/components/AppMenu.tsx | 104 +++++++++--------- apps/desktop/src/components/EmptyState.tsx | 3 +- apps/desktop/src/screens/AuthScreen.tsx | 4 +- apps/desktop/src/screens/LockScreen.tsx | 27 ++--- apps/desktop/src/screens/MainScreen.tsx | 2 +- apps/desktop/src/utils/guards.ts | 11 ++ apps/desktop/src/utils/string-helpers.ts | 4 +- .../migrations/20220816204614_profiles.sql | 5 +- 13 files changed, 107 insertions(+), 104 deletions(-) create mode 100644 apps/desktop/src/utils/guards.ts diff --git a/apps/desktop/src-tauri/Cargo.lock b/apps/desktop/src-tauri/Cargo.lock index 6ea09d1..16ac143 100644 --- a/apps/desktop/src-tauri/Cargo.lock +++ b/apps/desktop/src-tauri/Cargo.lock @@ -1706,7 +1706,7 @@ dependencies = [ "crc-any", "des", "digest 0.9.0", - "md-5 0.9.1", + "md-5", "sha2 0.9.9", "tiger", ] @@ -1760,15 +1760,6 @@ dependencies = [ "opaque-debug", ] -[[package]] -name = "md-5" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "274fd6bd98a3c75c9515d9393b063099f60f9b47f09ee20a34fd76287fd017f4" -dependencies = [ - "digest 0.10.3", -] - [[package]] name = "memchr" version = "2.5.0" @@ -2110,9 +2101,9 @@ dependencies = [ "libreauth", "machine-uid", "magic-crypt", - "md-5 0.10.2", "serde", "serde_json", + "sha2 0.10.2", "sysinfo", "tauri", "tauri-build", diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 1800d9b..4a50b6d 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -19,10 +19,10 @@ serde = { version = "1.0", features = ["derive"] } tauri = { version = "1.0.5", features = ["api-all", "macos-private-api", "system-tray", "updater"] } # uuid = { version = "1.1", features = ["v4", "fast-rng", "serde", "js"] } libreauth = { version = "^0.15", features = ["key", "oath", "pass"] } +sha2 = { version = "0.10", default-features = false } cocoa = "0.24" magic-crypt = "^3.1" bcrypt = "^0.13" -md-5 = "0.10" sysinfo = "0.26" machine-uid = "0.2" diff --git a/apps/desktop/src-tauri/src/main.rs b/apps/desktop/src-tauri/src/main.rs index 6c80755..785476d 100644 --- a/apps/desktop/src-tauri/src/main.rs +++ b/apps/desktop/src-tauri/src/main.rs @@ -102,7 +102,7 @@ fn main() { security::decrypt_str, security::create_hash, security::verify_hash, - security::md5_hash, + security::generate_passphrase, exit_app, ]) .build(tauri::generate_context!()) diff --git a/apps/desktop/src-tauri/src/security.rs b/apps/desktop/src-tauri/src/security.rs index 9ca1289..7c4bbc0 100644 --- a/apps/desktop/src-tauri/src/security.rs +++ b/apps/desktop/src-tauri/src/security.rs @@ -5,12 +5,13 @@ use tauri::command; use bcrypt::{hash, verify, DEFAULT_COST}; use magic_crypt::{new_magic_crypt, MagicCryptTrait}; -use md5::{Digest, Md5}; +use sha2::{Digest, Sha256}; #[command] pub(crate) async fn encrypt_str(plain_str: String, passphrase: String) -> String { let mc = new_magic_crypt!(passphrase, 256); let encrypted = mc.encrypt_str_to_base64(plain_str); + // println!("Encrypted string: {:?}", encrypted); encrypted.into() } @@ -34,15 +35,12 @@ pub(crate) async fn verify_hash(plaintext: String, hashed_str: String) -> bool { } #[command] -pub(crate) async fn md5_hash(str: String) -> String { - let mut hasher = Md5::new(); - hasher.update(&str); - - let encoded = hasher.finalize(); - let result = format!("{:x}", encoded); - // println!("MD5-encoded hash: {:?}", result); - - result.into() +pub(crate) async fn generate_passphrase(user_id: String, password: String) -> String { + let uid = user_id.replace("-", "").to_uppercase(); + let hash = Sha256::new().chain_update(&uid).chain_update(&password).finalize(); + let encoded = format!("{:x}", hash); + // println!("SHA2-encoded hash: {:?}", encoded); + encoded.into() } #[command] diff --git a/apps/desktop/src/App.tsx b/apps/desktop/src/App.tsx index 82cb60d..278a1b0 100644 --- a/apps/desktop/src/App.tsx +++ b/apps/desktop/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect } from 'react' +import { useEffect, useState } from 'react' import { QueryClientProvider } from '@tanstack/react-query' import { sendNotification } from '@tauri-apps/api/notification' import { Offline, Online } from 'react-detect-offline' @@ -55,12 +55,22 @@ export default function App() {
- handleOffline(online)}> + { + handleOffline(online) + }} + > - handleOnline(online)}> + { + handleOnline(online) + }} + > diff --git a/apps/desktop/src/components/AppMenu.tsx b/apps/desktop/src/components/AppMenu.tsx index 0dec96c..5c98d55 100644 --- a/apps/desktop/src/components/AppMenu.tsx +++ b/apps/desktop/src/components/AppMenu.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react-hooks/exhaustive-deps */ import { Fragment, useEffect, useState } from 'react' import { invoke } from '@tauri-apps/api/tauri' import { ask, open, save } from '@tauri-apps/api/dialog' @@ -34,59 +35,6 @@ export const AppMenu = () => { const [menuPayload, setMenuPayload] = useState('') const [listenTauriEvent, setListenTauriEvent] = useState(false) - useEffect(() => { - // Listen tauri event - listen('app-event', (e) => { - setMenuPayload(e.payload) - setListenTauriEvent(true) - }) - }, [setMenuPayload, setListenTauriEvent]) - - useEffect(() => { - if (listenTauriEvent) { - switch (menuPayload) { - case 'quit': - handleQuit() - break - - case 'close': - handleQuit() - break - - case 'export': - handleExport() - break - - case 'import': - handleImport() - break - - case 'lock_vault': - setLockStreenState(true) - break - - case 'new_item': - setFormCreateOpen(true) - break - - case 'signout': - handleSignOut() - break - - case 'sync_vault': - setForceFetch(true) - break - - case 'update_check': - break - - default: - break - } - } - setListenTauriEvent(false) - }, [listenTauriEvent, menuPayload]) - // Reset all states before quit. const resetStates = () => { setLockStreenState(true) @@ -147,6 +95,56 @@ export const AppMenu = () => { } } + useEffect(() => { + // Listen tauri event + listen('app-event', (e) => { + setMenuPayload(e.payload) + setListenTauriEvent(true) + }) + }, [setMenuPayload, setListenTauriEvent]) + + useEffect(() => { + if (listenTauriEvent) { + switch (menuPayload) { + case 'quit': + handleQuit() + break + + case 'close': + handleQuit() + break + + case 'export': + handleExport() + break + + case 'import': + handleImport() + break + + case 'lock_vault': + setLockStreenState(true) + break + + case 'new_item': + setFormCreateOpen(true) + break + + case 'signout': + handleSignOut() + break + + case 'sync_vault': + setForceFetch(true) + break + + default: + break + } + } + setListenTauriEvent(false) + }, [listenTauriEvent, menuPayload]) + return (
diff --git a/apps/desktop/src/components/EmptyState.tsx b/apps/desktop/src/components/EmptyState.tsx index 06aeb14..ab94b50 100644 --- a/apps/desktop/src/components/EmptyState.tsx +++ b/apps/desktop/src/components/EmptyState.tsx @@ -3,6 +3,7 @@ import { useStores } from '../stores/stores' export const EmptyState = () => { const setFormCreateOpen = useStores((state) => state.setFormCreateOpen) + const handleAction = async () => setFormCreateOpen(true) return (
@@ -13,7 +14,7 @@ export const EmptyState = () => {
-