Wire Tauri AppImage to native keyring
Client checks / checks (push) Canceled after 0s
Client dependency and security checks / audit (push) Canceled after 0s

This commit is contained in:
2026-10-25 05:47:28 +01:00
parent 9854cc4c4f
commit 9167e04e77
17 changed files with 9347 additions and 1 deletions
+37 -1
View File
@@ -1,5 +1,35 @@
<script lang="ts">
import { onMount } from 'svelte';
import { invoke } from '@tauri-apps/api/core';
type ClientSettings = { server_address: string; username: string };
function nativeClientAvailable() {
return typeof window !== 'undefined' && '__TAURI_INTERNALS__' in window;
}
async function saveNativeSession() {
if (!nativeClientAvailable() || !username || !serverAddress || !sessionToken) return;
const settings: ClientSettings = { server_address: serverAddress, username };
await invoke('save_client_settings', { settings });
await invoke('store_server_session', { settings, session: sessionToken });
}
async function clearNativeSession() {
if (!nativeClientAvailable() || !username || !serverAddress) return;
await invoke('clear_server_session', { settings: { server_address: serverAddress, username } satisfies ClientSettings });
}
async function loadNativeSettings() {
if (!nativeClientAvailable()) return;
try {
const settings = await invoke<ClientSettings>('load_client_settings');
serverAddress = settings.server_address;
username = settings.username;
} catch {
authError = 'Native settings could not be read. Enter the server address and username again.';
}
}
let serverAddress = 'http://127.0.0.1:8787';
let connectionState = 'OFFLINE';
@@ -205,6 +235,9 @@
sessionToken = result.session_token;
authenticated = true;
mustReplaceCredentials = result.must_replace_credentials;
await saveNativeSession().catch(() => {
authError = 'Login succeeded, but the session could not be stored in the Linux keyring.';
});
connectionState = 'CONNECTED';
await loadActivity();
await loadNotifications();
@@ -267,6 +300,7 @@
sessionToken = '';
authenticated = false;
mustReplaceCredentials = false;
await clearNativeSession().catch(() => undefined);
username = newUsername;
password = '';
newPassword = '';
@@ -285,6 +319,7 @@
if (sessionToken) {
await fetch(`${serverAddress}/api/v1/auth/logout`, { method: 'POST', headers: { authorization: `Bearer ${sessionToken}` } }).catch(() => undefined);
}
await clearNativeSession().catch(() => undefined);
sessionToken = '';
authenticated = false;
mustReplaceCredentials = false;
@@ -1026,7 +1061,8 @@
});
}
onMount(() => {
onMount(async () => {
await loadNativeSettings();
void checkServer();
void loadPublicCommands();
});