@@ -249,8 +249,12 @@ def _parse_tls_version(tls_version):
249249 )
250250
251251
252- def _dot_postgresql_path (filename ) -> pathlib .Path :
253- return (pathlib .Path .home () / '.postgresql' / filename ).resolve ()
252+ def _dot_postgresql_path (filename ) -> typing .Optional [pathlib .Path ]:
253+ homedir = compat .get_pg_home_directory ()
254+ if homedir is None :
255+ return None
256+
257+ return (homedir / '.postgresql' / filename ).resolve ()
254258
255259
256260def _parse_connect_dsn_and_args (* , dsn , host , port , user ,
@@ -501,11 +505,16 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
501505 ssl .load_verify_locations (cafile = sslrootcert )
502506 ssl .verify_mode = ssl_module .CERT_REQUIRED
503507 else :
504- sslrootcert = _dot_postgresql_path ('root.crt' )
505508 try :
509+ sslrootcert = _dot_postgresql_path ('root.crt' )
510+ assert sslrootcert is not None
506511 ssl .load_verify_locations (cafile = sslrootcert )
507- except FileNotFoundError :
512+ except ( AssertionError , FileNotFoundError ) :
508513 if sslmode > SSLMode .require :
514+ if sslrootcert is None :
515+ raise RuntimeError (
516+ 'Cannot determine home directory'
517+ )
509518 raise ValueError (
510519 f'root certificate file "{ sslrootcert } " does '
511520 f'not exist\n Either provide the file or '
@@ -526,18 +535,20 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
526535 ssl .verify_flags |= ssl_module .VERIFY_CRL_CHECK_CHAIN
527536 else :
528537 sslcrl = _dot_postgresql_path ('root.crl' )
529- try :
530- ssl .load_verify_locations (cafile = sslcrl )
531- except FileNotFoundError :
532- pass
533- else :
534- ssl .verify_flags |= ssl_module .VERIFY_CRL_CHECK_CHAIN
538+ if sslcrl is not None :
539+ try :
540+ ssl .load_verify_locations (cafile = sslcrl )
541+ except FileNotFoundError :
542+ pass
543+ else :
544+ ssl .verify_flags |= \
545+ ssl_module .VERIFY_CRL_CHECK_CHAIN
535546
536547 if sslkey is None :
537548 sslkey = os .getenv ('PGSSLKEY' )
538549 if not sslkey :
539550 sslkey = _dot_postgresql_path ('postgresql.key' )
540- if not sslkey .exists ():
551+ if sslkey is not None and not sslkey .exists ():
541552 sslkey = None
542553 if not sslpassword :
543554 sslpassword = ''
@@ -549,12 +560,15 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
549560 )
550561 else :
551562 sslcert = _dot_postgresql_path ('postgresql.crt' )
552- try :
553- ssl .load_cert_chain (
554- sslcert , keyfile = sslkey , password = lambda : sslpassword
555- )
556- except FileNotFoundError :
557- pass
563+ if sslcert is not None :
564+ try :
565+ ssl .load_cert_chain (
566+ sslcert ,
567+ keyfile = sslkey ,
568+ password = lambda : sslpassword
569+ )
570+ except FileNotFoundError :
571+ pass
558572
559573 # OpenSSL 1.1.1 keylog file, copied from create_default_context()
560574 if hasattr (ssl , 'keylog_filename' ):
0 commit comments