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, логика сохранения путей к сертификатам)
Шаги воспроизведения
- Создать новое подключение PostgreSQL через поля формы
Host, Port, Username, Password.
- В секции
SSL Certificates (optional) выбрать файлы Root CA, Client Cert и Client Key.
- Нажать Connect / Test Connection.
- Фактический результат: Так как
_usesConnectionString == false, метод connect() вызывает _buildSettings(), где передаётся лишь sslMode: SslMode.require. Сертификаты с диска не загружаются в SecurityContext, и подключение сбрасывается сервером PostgreSQL.
- Ожидаемый результат: Метод
connect() (и _buildSettings()) должен извлекать пути к сертификатам (из полей подключения или параметров URI) и создавать SecurityContext(withTrustedRoots: true)..useCertificateChain(cert)..usePrivateKey(key) для ConnectionSettings.
Acceptance Criteria / Критерии приемки
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не создаётся и не передаётсяSecurityContextс путями к сертификатам. В результате, если пользователь настроил подключение через поля формы и выбрал клиентские SSL-сертификаты, при попытке подключения они полностью игнорируются, и соединение завершается ошибкой TLS-аутентификации.Scope & Component
desktopPostgreSQL Driver / Connectionsbughighdev / 0.5.0Местоположение в коде
lib/core/database/postgres_connection.dart(строки ~94-138, методы_buildSettingsиconnect)lib/features/postgresql/postgresql_connection_form.dart(строки ~138-196, логика сохранения путей к сертификатам)Шаги воспроизведения
Host,Port,Username,Password.SSL Certificates (optional)выбрать файлыRoot CA,Client CertиClient Key._usesConnectionString == false, методconnect()вызывает_buildSettings(), где передаётся лишьsslMode: SslMode.require. Сертификаты с диска не загружаются вSecurityContext, и подключение сбрасывается сервером PostgreSQL.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.