From fc73dff1e9c5f34d1d6b93ee4cfd5a68febc3a61 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Wed, 18 Mar 2026 08:17:39 +0700 Subject: [PATCH 1/2] fix: resolve pgpass password app-side with original host --- TablePro/Core/Database/DatabaseDriver.swift | 8 +++++++- TablePro/Core/Database/DatabaseManager.swift | 7 ++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/TablePro/Core/Database/DatabaseDriver.swift b/TablePro/Core/Database/DatabaseDriver.swift index b06e781e..0ab35698 100644 --- a/TablePro/Core/Database/DatabaseDriver.swift +++ b/TablePro/Core/Database/DatabaseDriver.swift @@ -336,7 +336,13 @@ enum DatabaseDriverFactory { private static func resolvePassword(for connection: DatabaseConnection) -> String { if connection.usePgpass { - return "" + let pgpassHost = connection.additionalFields["pgpassOriginalHost"] ?? connection.host + return PgpassReader.resolve( + host: pgpassHost.isEmpty ? "localhost" : pgpassHost, + port: connection.port, + database: connection.database, + username: connection.username + ) ?? "" } return ConnectionStorage.shared.loadPassword(for: connection.id) ?? "" } diff --git a/TablePro/Core/Database/DatabaseManager.swift b/TablePro/Core/Database/DatabaseManager.swift index 530c3c79..4879cbab 100644 --- a/TablePro/Core/Database/DatabaseManager.swift +++ b/TablePro/Core/Database/DatabaseManager.swift @@ -440,6 +440,11 @@ final class DatabaseManager { tunnelSSL.clientKeyPath = "" } + var effectiveFields = connection.additionalFields + if connection.usePgpass { + effectiveFields["pgpassOriginalHost"] = connection.host + } + return DatabaseConnection( id: connection.id, name: connection.name, @@ -450,7 +455,7 @@ final class DatabaseManager { type: connection.type, sshConfig: SSHConfiguration(), sslConfig: tunnelSSL, - additionalFields: connection.additionalFields + additionalFields: effectiveFields ) } From 7861bafc5b919952610dceb8904d67b7bd117560 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Wed, 18 Mar 2026 08:19:23 +0700 Subject: [PATCH 2/2] fix: also preserve original port for pgpass lookup through SSH tunnel --- TablePro/Core/Database/DatabaseDriver.swift | 4 +++- TablePro/Core/Database/DatabaseManager.swift | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/TablePro/Core/Database/DatabaseDriver.swift b/TablePro/Core/Database/DatabaseDriver.swift index 0ab35698..d3d185cf 100644 --- a/TablePro/Core/Database/DatabaseDriver.swift +++ b/TablePro/Core/Database/DatabaseDriver.swift @@ -337,9 +337,11 @@ enum DatabaseDriverFactory { private static func resolvePassword(for connection: DatabaseConnection) -> String { if connection.usePgpass { let pgpassHost = connection.additionalFields["pgpassOriginalHost"] ?? connection.host + let pgpassPort = connection.additionalFields["pgpassOriginalPort"] + .flatMap(Int.init) ?? connection.port return PgpassReader.resolve( host: pgpassHost.isEmpty ? "localhost" : pgpassHost, - port: connection.port, + port: pgpassPort, database: connection.database, username: connection.username ) ?? "" diff --git a/TablePro/Core/Database/DatabaseManager.swift b/TablePro/Core/Database/DatabaseManager.swift index 4879cbab..ff947de4 100644 --- a/TablePro/Core/Database/DatabaseManager.swift +++ b/TablePro/Core/Database/DatabaseManager.swift @@ -443,6 +443,7 @@ final class DatabaseManager { var effectiveFields = connection.additionalFields if connection.usePgpass { effectiveFields["pgpassOriginalHost"] = connection.host + effectiveFields["pgpassOriginalPort"] = String(connection.port) } return DatabaseConnection(