···11+mod auth;
12mod commands;
23mod db;
34mod error;
45mod state;
5666-use commands::{get_app_bootstrap, list_accounts, set_active_account};
77+use auth::emit_at_uri_navigation;
88+use commands::{get_app_bootstrap, list_accounts, login, logout, set_active_account, switch_account};
79use db::initialize_database;
810use state::AppState;
911use tauri::Manager;
1212+use tauri_plugin_deep_link::DeepLinkExt;
10131114#[cfg_attr(mobile, tauri::mobile_entry_point)]
1215pub fn run() {
···1417 .setup(|app| {
1518 let db_pool =
1619 initialize_database(app.handle()).expect("database initialization should succeed during startup");
1717- let app_state =
1818- AppState::bootstrap(db_pool).expect("application state should be bootstrapped from database");
2020+ let app_state = tauri::async_runtime::block_on(AppState::bootstrap(db_pool))
2121+ .expect("application state should be bootstrapped from database");
19222023 app.manage(app_state);
2424+2525+ let app_handle = app.handle().clone();
2626+ app.deep_link().on_open_url(move |event| {
2727+ for url in event.urls() {
2828+ let _ = emit_at_uri_navigation(&app_handle, url.as_str());
2929+ }
3030+ });
3131+3232+ if let Some(urls) = app.deep_link().get_current()? {
3333+ for url in urls {
3434+ emit_at_uri_navigation(app.handle(), url.as_str())?;
3535+ }
3636+ }
3737+2138 Ok(())
2239 })
2340 .plugin(tauri_plugin_notification::init())
···3148 .invoke_handler(tauri::generate_handler![
3249 get_app_bootstrap,
3350 list_accounts,
5151+ login,
5252+ logout,
5353+ switch_account,
3454 set_active_account
3555 ])
3656 .run(tauri::generate_context!())
+20
src-tauri/src/migrations/002_auth_storage.sql
···11+ALTER TABLE accounts ADD COLUMN session_id TEXT;
22+33+CREATE TABLE IF NOT EXISTS oauth_sessions (
44+ did TEXT NOT NULL,
55+ session_id TEXT NOT NULL,
66+ session_json TEXT NOT NULL,
77+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
88+ updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
99+ PRIMARY KEY (did, session_id),
1010+ FOREIGN KEY (did) REFERENCES accounts(did) ON DELETE CASCADE
1111+);
1212+1313+CREATE TABLE IF NOT EXISTS oauth_auth_requests (
1414+ state TEXT PRIMARY KEY,
1515+ auth_request_json TEXT NOT NULL,
1616+ created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
1717+);
1818+1919+CREATE INDEX IF NOT EXISTS idx_accounts_active_handle
2020+ ON accounts(active DESC, handle COLLATE NOCASE ASC);