@@ -193,6 +193,10 @@ def __init__(self,
193
193
user : str = "postgres" ,
194
194
password : str = "postgres" ,
195
195
database_name : str = "postgres" ,
196
+ ssl_mode : str = "disabled" ,
197
+ ssl_cert_path : str = None ,
198
+ ssl_key_path : str = None ,
199
+ ssl_root_cert_path : str = None ,
196
200
prefix = "MF_METADATA_DB_" ,
197
201
pool_min : int = 1 ,
198
202
pool_max : int = 10 ,
@@ -209,6 +213,10 @@ def __init__(self,
209
213
self ._user = os .environ .get (prefix + "USER" , user )
210
214
self ._password = os .environ .get (prefix + "PSWD" , password )
211
215
self ._database_name = os .environ .get (prefix + "NAME" , database_name )
216
+ self ._ssl_mode = os .environ .get (prefix + "SSL_MODE" , ssl_mode )
217
+ self ._ssl_cert_path = os .environ .get (prefix + "SSL_CERT_PATH" , ssl_cert_path )
218
+ self ._ssl_key_path = os .environ .get (prefix + "SSL_KEY_PATH" , ssl_key_path ),
219
+ self ._ssl_root_cert_path = os .environ .get (prefix + "SSL_ROOT_CERT_PATH" , ssl_root_cert_path )
212
220
conn_str_required_values = [
213
221
self ._host ,
214
222
self ._port ,
@@ -247,19 +255,44 @@ def _is_valid_dsn(dsn):
247
255
248
256
@property
249
257
def connection_string_url (self ):
250
- # postgresql://[user[:password]@][host][:port][/dbname][?param1=value1&...]
251
- return f'postgresql://{ quote (self ._user )} :{ quote (self ._password )} @{ self ._host } :{ self ._port } /{ self ._database_name } ?sslmode=disable'
258
+ base_url = f'postgresql://{ quote (self ._user )} :{ quote (self ._password )} @{ self ._host } :{ self ._port } /{ self ._database_name } '
259
+ if (self ._ssl_mode in ['allow' , 'prefer' , 'require' , 'verify-ca' , 'verify-full' ]):
260
+ ssl_query = f'sslmode={ self ._ssl_mode } '
261
+ if self ._ssl_cert_path is not None :
262
+ ssl_query = f'{ ssl_query } &sslcert={ self ._ssl_cert_path } '
263
+ if self ._ssl_key_path is not None :
264
+ ssl_query = f'{ ssl_query } &sslkey={ self ._ssl_key_path } '
265
+ if self ._ssl_root_cert_path is not None :
266
+ ssl_query = f'{ ssl_query } &sslrootcert={ self ._ssl_root_cert_path } '
267
+ else :
268
+ ssl_query = f'sslmode=disable'
269
+
270
+ return f'{ base_url } ?{ ssl_query } '
252
271
253
272
@property
254
273
def dsn (self ):
255
274
if self ._dsn is None :
256
- return psycopg2 .extensions .make_dsn (
257
- dbname = self ._database_name ,
258
- user = self ._user ,
259
- host = self ._host ,
260
- port = self ._port ,
261
- password = self ._password
262
- )
275
+ ssl_mode = self ._ssl_mode
276
+ sslcert = self ._ssl_cert_path
277
+ sslkey = self ._ssl_key_path
278
+ sslrootcert = self ._ssl_root_cert_path
279
+ if (ssl_mode not in ['allow' , 'prefer' , 'require' , 'verify-ca' , 'verify-full' ]):
280
+ ssl_mode = None
281
+ sslcert = None
282
+ sslkey = None
283
+ sslrootcert = None
284
+ kwargs = {
285
+ 'dbname' : self ._database_name ,
286
+ 'user' : self ._user ,
287
+ 'host' : self ._host ,
288
+ 'port' : self ._port ,
289
+ 'password' : self ._password ,
290
+ 'sslmode' : ssl_mode ,
291
+ 'sslcert' : sslcert ,
292
+ 'sslkey' : sslkey ,
293
+ 'sslrootcert' : sslrootcert
294
+ }
295
+ return psycopg2 .extensions .make_dsn (** {k : v for k , v in kwargs .items () if v is not None })
263
296
else :
264
297
return self ._dsn
265
298
0 commit comments