@@ -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,14 @@ 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 ('Cannot determine home directory' )
509516 raise ValueError (
510517 f'root certificate file "{ sslrootcert } " does '
511518 f'not exist\n Either provide the file or '
@@ -526,18 +533,19 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
526533 ssl .verify_flags |= ssl_module .VERIFY_CRL_CHECK_CHAIN
527534 else :
528535 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
536+ if sslcrl is not None :
537+ try :
538+ ssl .load_verify_locations (cafile = sslcrl )
539+ except FileNotFoundError :
540+ pass
541+ else :
542+ ssl .verify_flags |= ssl_module .VERIFY_CRL_CHECK_CHAIN
535543
536544 if sslkey is None :
537545 sslkey = os .getenv ('PGSSLKEY' )
538546 if not sslkey :
539547 sslkey = _dot_postgresql_path ('postgresql.key' )
540- if not sslkey .exists ():
548+ if sslkey is not None and not sslkey .exists ():
541549 sslkey = None
542550 if not sslpassword :
543551 sslpassword = ''
@@ -549,12 +557,13 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
549557 )
550558 else :
551559 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
560+ if sslcert is not None :
561+ try :
562+ ssl .load_cert_chain (
563+ sslcert , keyfile = sslkey , password = lambda : sslpassword
564+ )
565+ except FileNotFoundError :
566+ pass
558567
559568 # OpenSSL 1.1.1 keylog file, copied from create_default_context()
560569 if hasattr (ssl , 'keylog_filename' ):
0 commit comments