From 69eca2652bb9571ef25e9b04994723c41b0aa9e2 Mon Sep 17 00:00:00 2001 From: LukeGus Date: Sun, 15 Mar 2026 00:52:21 -0500 Subject: [PATCH] feat: add migration to fix host loading errors --- src/backend/database/db/index.ts | 39 ++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/backend/database/db/index.ts b/src/backend/database/db/index.ts index 513955a9..ff47e6cb 100644 --- a/src/backend/database/db/index.ts +++ b/src/backend/database/db/index.ts @@ -933,6 +933,45 @@ const migrateSchema = () => { } } + const sshDataMigrations: Array<{ column: string; sql: string }> = [ + { column: "connection_type", sql: "ALTER TABLE ssh_data ADD COLUMN connection_type TEXT NOT NULL DEFAULT 'ssh'" }, + { column: "credential_id", sql: "ALTER TABLE ssh_data ADD COLUMN credential_id INTEGER" }, + { column: "override_credential_username", sql: "ALTER TABLE ssh_data ADD COLUMN override_credential_username INTEGER" }, + { column: "jump_hosts", sql: "ALTER TABLE ssh_data ADD COLUMN jump_hosts TEXT" }, + { column: "show_terminal_in_sidebar", sql: "ALTER TABLE ssh_data ADD COLUMN show_terminal_in_sidebar INTEGER NOT NULL DEFAULT 1" }, + { column: "show_file_manager_in_sidebar", sql: "ALTER TABLE ssh_data ADD COLUMN show_file_manager_in_sidebar INTEGER NOT NULL DEFAULT 0" }, + { column: "show_tunnel_in_sidebar", sql: "ALTER TABLE ssh_data ADD COLUMN show_tunnel_in_sidebar INTEGER NOT NULL DEFAULT 0" }, + { column: "show_docker_in_sidebar", sql: "ALTER TABLE ssh_data ADD COLUMN show_docker_in_sidebar INTEGER NOT NULL DEFAULT 0" }, + { column: "show_server_stats_in_sidebar", sql: "ALTER TABLE ssh_data ADD COLUMN show_server_stats_in_sidebar INTEGER NOT NULL DEFAULT 0" }, + { column: "quick_actions", sql: "ALTER TABLE ssh_data ADD COLUMN quick_actions TEXT" }, + { column: "domain", sql: "ALTER TABLE ssh_data ADD COLUMN domain TEXT" }, + { column: "security", sql: "ALTER TABLE ssh_data ADD COLUMN security TEXT" }, + { column: "ignore_cert", sql: "ALTER TABLE ssh_data ADD COLUMN ignore_cert INTEGER NOT NULL DEFAULT 0" }, + { column: "guacamole_config", sql: "ALTER TABLE ssh_data ADD COLUMN guacamole_config TEXT" }, + { column: "socks5_proxy_chain", sql: "ALTER TABLE ssh_data ADD COLUMN socks5_proxy_chain TEXT" }, + { column: "host_key_fingerprint", sql: "ALTER TABLE ssh_data ADD COLUMN host_key_fingerprint TEXT" }, + { column: "host_key_type", sql: "ALTER TABLE ssh_data ADD COLUMN host_key_type TEXT" }, + { column: "host_key_algorithm", sql: "ALTER TABLE ssh_data ADD COLUMN host_key_algorithm TEXT NOT NULL DEFAULT 'sha256'" }, + { column: "host_key_first_seen", sql: "ALTER TABLE ssh_data ADD COLUMN host_key_first_seen TEXT" }, + { column: "host_key_last_verified", sql: "ALTER TABLE ssh_data ADD COLUMN host_key_last_verified TEXT" }, + { column: "host_key_changed_count", sql: "ALTER TABLE ssh_data ADD COLUMN host_key_changed_count INTEGER NOT NULL DEFAULT 0" }, + ]; + + for (const migration of sshDataMigrations) { + try { + sqlite.prepare(`SELECT ${migration.column} FROM ssh_data LIMIT 1`).get(); + } catch { + try { + sqlite.exec(migration.sql); + } catch (alterError) { + databaseLogger.warn(`Failed to add ${migration.column} column`, { + operation: "schema_migration", + error: alterError, + }); + } + } + } + try { sqlite.prepare("SELECT id FROM roles LIMIT 1").get(); } catch {