Skip to content

Commit efba02f

Browse files
authored
Make sure only supported parameters are written to connection string (patroni#3207)
Close patroni#3206
1 parent e1faa38 commit efba02f

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

patroni/postgresql/config.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,10 @@ def format_dsn(self, params: Dict[str, Any]) -> str:
617617
def escape(value: Any) -> str:
618618
return re.sub(r'([\'\\ ])', r'\\\1', str(value))
619619

620-
return ' '.join('{0}={1}'.format(kw, escape(params[kw])) for kw in keywords if params.get(kw) is not None)
620+
key_ver = {'target_session_attrs': 100000, 'gssencmode': 120000, 'channel_binding': 130000,
621+
'sslpassword': 130000, 'sslcrldir': 140000, 'sslnegotiation': 170000}
622+
return ' '.join('{0}={1}'.format(kw, escape(params[kw])) for kw in keywords
623+
if params.get(kw) is not None and self._postgresql.major_version >= key_ver.get(kw, 0))
621624

622625
def _write_recovery_params(self, fd: ConfigWriter, recovery_params: CaseInsensitiveDict) -> None:
623626
if self._postgresql.major_version >= 90500:

tests/test_postgresql.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,3 +1182,26 @@ def test_load_current_server_parameters(self):
11821182
self.assertEqual(dict(self.p.config._recovery_params),
11831183
{'primary_conninfo': {'host': 'a', 'port': '5433', 'passfile': '/blabla', 'sslmode': 'prefer',
11841184
'gssencmode': 'prefer', 'channel_binding': 'prefer', 'sslnegotiation': 'postgres'}})
1185+
1186+
def test_format_dsn(self):
1187+
params = {'host': '1', 'port': 2, 'target_session_attrs': 'read-write', 'gssencmode': 'prefer',
1188+
'channel_binding': 'prefer', 'sslpassword': 'pwd', 'sslcrldir': '/', 'sslnegotiation': 'postgres'}
1189+
self.p._major_version = 90600
1190+
self.assertEqual(self.p.config.format_dsn(params), 'host=1 port=2')
1191+
self.p._major_version = 100000
1192+
self.assertEqual(self.p.config.format_dsn(params), 'host=1 port=2 target_session_attrs=read-write')
1193+
self.p._major_version = 120000
1194+
self.assertEqual(self.p.config.format_dsn(params),
1195+
'host=1 port=2 gssencmode=prefer target_session_attrs=read-write')
1196+
self.p._major_version = 130000
1197+
self.assertEqual(self.p.config.format_dsn(params),
1198+
'host=1 port=2 sslpassword=pwd gssencmode=prefer '
1199+
'channel_binding=prefer target_session_attrs=read-write')
1200+
self.p._major_version = 140000
1201+
self.assertEqual(self.p.config.format_dsn(params),
1202+
'host=1 port=2 sslpassword=pwd sslcrldir=/ gssencmode=prefer '
1203+
'channel_binding=prefer target_session_attrs=read-write')
1204+
self.p._major_version = 170000
1205+
self.assertEqual(self.p.config.format_dsn(params),
1206+
'host=1 port=2 sslpassword=pwd sslcrldir=/ gssencmode=prefer channel_binding=prefer '
1207+
'target_session_attrs=read-write sslnegotiation=postgres')

0 commit comments

Comments
 (0)