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
@@ -326,12 +326,20 @@ export const AddDownloadsModal = () => {
const { mediaCookieSource } = settingsStore;
const browserArg = mediaCookieSource !== 'none' ? mediaCookieSource : null;
const login = getSiteLogin(url, settingsStore);
let keychainPassword = null;
if (login) {
try {
keychainPassword = await invoke<string>('get_keychain_password', { id: login.id });
} catch (e) {
console.warn("Could not fetch keychain password:", e);
}
}
const jsonStr = await invoke<string>('fetch_media_metadata', {
url,
cookieBrowser: browserArg,
username: login?.username || null,
password: login?.password || null
password: keychainPassword
});
const mediaData = parseMediaFormats(jsonStr);
if (mediaData && mediaData.formats.length > 0) {
@@ -351,10 +359,18 @@ export const AddDownloadsModal = () => {
} else {
const settingsStore = useSettingsStore.getState();
const login = getSiteLogin(url, settingsStore);
let keychainPassword = null;
if (login) {
try {
keychainPassword = await invoke<string>('get_keychain_password', { id: login.id });
} catch (e) {
console.warn("Could not fetch keychain password:", e);
}
}
const meta = await invoke<{filename: string, size: string, size_bytes: number}>('fetch_metadata', {
url,
username: login?.username || null,
password: login?.password || null
password: keychainPassword
});
updatedItems[i] = { url, file: meta.filename, size: meta.size, sizeBytes: meta.size_bytes, status: 'Ready' };
}