Skip to content

bug(postgresql): client SSL certificates picked in form are ignored when connecting via host/port fields #273

Description

@ZhuchkaTriplesix

Summary / Описание проблемы

В форме подключения к PostgreSQL реализован выбор SSL-сертификатов (Root CA, Client Cert, Client Key в postgresql_connection_form.dart:L138). Эти пути сохраняются в модели путём генерации query-параметров URI (sslrootcert=...&sslcert=...&sslkey=... в _syncUriSslParams).
Однако при подключении к БД в режиме заполнения отдельных полей Host, Port, Username, Password (где флаг _usesConnectionString == false), метод connect() в PostgresConnection использует настройки _buildSettings():

ConnectionSettings _buildSettings() {
  return ConnectionSettings(
    sslMode: useSSL ? SslMode.require : SslMode.disable,
    connectTimeout: const Duration(seconds: 10),
    queryTimeout: const Duration(seconds: 30),
  );
}

При этом в ConnectionSettings не создаётся и не передаётся SecurityContext с путями к сертификатам. В результате, если пользователь настроил подключение через поля формы и выбрал клиентские SSL-сертификаты, при попытке подключения они полностью игнорируются, и соединение завершается ошибкой TLS-аутентификации.

Scope & Component

  • Scope: desktop
  • Component: PostgreSQL Driver / Connections
  • Kind: bug
  • Severity: high
  • Detected in version: dev / 0.5.0

Местоположение в коде

  • Файлы:
    • lib/core/database/postgres_connection.dart (строки ~94-138, методы _buildSettings и connect)
    • lib/features/postgresql/postgresql_connection_form.dart (строки ~138-196, логика сохранения путей к сертификатам)

Шаги воспроизведения

  1. Создать новое подключение PostgreSQL через поля формы Host, Port, Username, Password.
  2. В секции SSL Certificates (optional) выбрать файлы Root CA, Client Cert и Client Key.
  3. Нажать Connect / Test Connection.
  4. Фактический результат: Так как _usesConnectionString == false, метод connect() вызывает _buildSettings(), где передаётся лишь sslMode: SslMode.require. Сертификаты с диска не загружаются в SecurityContext, и подключение сбрасывается сервером PostgreSQL.
  5. Ожидаемый результат: Метод connect()_buildSettings()) должен извлекать пути к сертификатам (из полей подключения или параметров URI) и создавать SecurityContext(withTrustedRoots: true)..useCertificateChain(cert)..usePrivateKey(key) для ConnectionSettings.

Acceptance Criteria / Критерии приемки

  • В postgres_connection.dart метод _buildSettings() (или connect) создает и передает корректный SecurityContext в ConnectionSettings, если в подключении (или в query-параметрах connectionString) заданы пути к sslrootcert, sslcert или sslkey.
  • Клиентские SSL-сертификаты успешно применяются как при подключении через готовый URI, так и при подключении через отдельные поля Host/Port.

Metadata

Metadata

Labels

bugSomething isn't workingcoreCore library logic and services

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions