@@ -249,8 +249,12 @@ def _parse_tls_version(tls_version):
249
249
)
250
250
251
251
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 ()
254
258
255
259
256
260
def _parse_connect_dsn_and_args (* , dsn , host , port , user ,
@@ -501,11 +505,16 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
501
505
ssl .load_verify_locations (cafile = sslrootcert )
502
506
ssl .verify_mode = ssl_module .CERT_REQUIRED
503
507
else :
504
- sslrootcert = _dot_postgresql_path ('root.crt' )
505
508
try :
509
+ sslrootcert = _dot_postgresql_path ('root.crt' )
510
+ assert sslrootcert is not None
506
511
ssl .load_verify_locations (cafile = sslrootcert )
507
- except FileNotFoundError :
512
+ except ( AssertionError , FileNotFoundError ) :
508
513
if sslmode > SSLMode .require :
514
+ if sslrootcert is None :
515
+ raise RuntimeError (
516
+ 'Cannot determine home directory'
517
+ )
509
518
raise ValueError (
510
519
f'root certificate file "{ sslrootcert } " does '
511
520
f'not exist\n Either provide the file or '
@@ -526,18 +535,20 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
526
535
ssl .verify_flags |= ssl_module .VERIFY_CRL_CHECK_CHAIN
527
536
else :
528
537
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
535
546
536
547
if sslkey is None :
537
548
sslkey = os .getenv ('PGSSLKEY' )
538
549
if not sslkey :
539
550
sslkey = _dot_postgresql_path ('postgresql.key' )
540
- if not sslkey .exists ():
551
+ if sslkey is not None and not sslkey .exists ():
541
552
sslkey = None
542
553
if not sslpassword :
543
554
sslpassword = ''
@@ -549,12 +560,15 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
549
560
)
550
561
else :
551
562
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
558
572
559
573
# OpenSSL 1.1.1 keylog file, copied from create_default_context()
560
574
if hasattr (ssl , 'keylog_filename' ):
0 commit comments