feat: implement native OS keyring for site logins

- Replaced plaintext local storage password fields with keyring v3 OS native integration.
- Tauri backend securely sets, gets, and deletes credentials via system keychains.
- Dynamic password injection occurs seamlessly on download start and metadata parsing.
This commit is contained in:
NimBold
2026-06-12 23:27:57 +03:30
parent 8cd6c1972d
commit 610eda203e
7 changed files with 81 additions and 10 deletions
+11
View File
@@ -1949,6 +1949,16 @@ dependencies = [
"unicode-segmentation",
]
[[package]]
name = "keyring"
version = "3.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eebcc3aff044e5944a8fbaf69eb277d11986064cba30c468730e8b9909fb551c"
dependencies = [
"log",
"zeroize",
]
[[package]]
name = "leb128fmt"
version = "0.1.0"
@@ -3813,6 +3823,7 @@ dependencies = [
name = "tauri-app"
version = "0.1.0"
dependencies = [
"keyring",
"regex",
"reqwest 0.12.28",
"serde",
+1
View File
@@ -28,4 +28,5 @@ regex = "1.10"
reqwest = "0.12"
tauri-plugin-notification = "2.3.3"
sysinfo = "0.39.3"
keyring = "3"
+22 -1
View File
@@ -902,6 +902,26 @@ fn get_free_space(app_handle: tauri::AppHandle, path: String) -> Result<String,
}
}
#[tauri::command]
fn set_keychain_password(id: String, password: String) -> Result<(), String> {
let entry = keyring::Entry::new("com.firelink.app", &id).map_err(|e| e.to_string())?;
entry.set_password(&password).map_err(|e| e.to_string())?;
Ok(())
}
#[tauri::command]
fn get_keychain_password(id: String) -> Result<String, String> {
let entry = keyring::Entry::new("com.firelink.app", &id).map_err(|e| e.to_string())?;
entry.get_password().map_err(|e| e.to_string())
}
#[tauri::command]
fn delete_keychain_password(id: String) -> Result<(), String> {
let entry = keyring::Entry::new("com.firelink.app", &id).map_err(|e| e.to_string())?;
let _ = entry.delete_credential(); // Ignore error if it doesn't exist
Ok(())
}
#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
tauri::Builder::default()
@@ -915,7 +935,8 @@ pub fn run() {
greet, test_ytdlp, test_aria2c, test_ffmpeg, test_deno, open_file, show_in_folder,
start_download, start_media_download, pause_download, fetch_metadata, fetch_media_metadata,
update_dock_badge, set_prevent_sleep, get_free_space, perform_system_action,
request_automation_permission, open_automation_settings
request_automation_permission, open_automation_settings,
set_keychain_password, get_keychain_password, delete_keychain_password
])
.run(tauri::generate_context!())
.expect("error while running tauri application");