@@ -251,8 +251,13 @@ def _parse_tls_version(tls_version):
251
251
)
252
252
253
253
254
- def _dot_postgresql_path (filename ) -> pathlib .Path :
255
- return (pathlib .Path .home () / '.postgresql' / filename ).resolve ()
254
+ def _dot_postgresql_path (filename ) -> typing .Optional [pathlib .Path ]:
255
+ try :
256
+ homedir = pathlib .Path .home ()
257
+ except (RuntimeError , KeyError ):
258
+ return None
259
+
260
+ return (homedir / '.postgresql' / filename ).resolve ()
256
261
257
262
258
263
def _parse_connect_dsn_and_args (* , dsn , host , port , user ,
@@ -504,11 +509,16 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
504
509
ssl .load_verify_locations (cafile = sslrootcert )
505
510
ssl .verify_mode = ssl_module .CERT_REQUIRED
506
511
else :
507
- sslrootcert = _dot_postgresql_path ('root.crt' )
508
512
try :
513
+ sslrootcert = _dot_postgresql_path ('root.crt' )
514
+ assert sslrootcert is not None
509
515
ssl .load_verify_locations (cafile = sslrootcert )
510
- except FileNotFoundError :
516
+ except ( AssertionError , FileNotFoundError ) :
511
517
if sslmode > SSLMode .require :
518
+ if sslrootcert is None :
519
+ raise RuntimeError (
520
+ 'Cannot determine home directory'
521
+ )
512
522
raise ValueError (
513
523
f'root certificate file "{ sslrootcert } " does '
514
524
f'not exist\n Either provide the file or '
@@ -529,18 +539,20 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
529
539
ssl .verify_flags |= ssl_module .VERIFY_CRL_CHECK_CHAIN
530
540
else :
531
541
sslcrl = _dot_postgresql_path ('root.crl' )
532
- try :
533
- ssl .load_verify_locations (cafile = sslcrl )
534
- except FileNotFoundError :
535
- pass
536
- else :
537
- ssl .verify_flags |= ssl_module .VERIFY_CRL_CHECK_CHAIN
542
+ if sslcrl is not None :
543
+ try :
544
+ ssl .load_verify_locations (cafile = sslcrl )
545
+ except FileNotFoundError :
546
+ pass
547
+ else :
548
+ ssl .verify_flags |= \
549
+ ssl_module .VERIFY_CRL_CHECK_CHAIN
538
550
539
551
if sslkey is None :
540
552
sslkey = os .getenv ('PGSSLKEY' )
541
553
if not sslkey :
542
554
sslkey = _dot_postgresql_path ('postgresql.key' )
543
- if not sslkey .exists ():
555
+ if sslkey is not None and not sslkey .exists ():
544
556
sslkey = None
545
557
if not sslpassword :
546
558
sslpassword = ''
@@ -552,12 +564,15 @@ def _parse_connect_dsn_and_args(*, dsn, host, port, user,
552
564
)
553
565
else :
554
566
sslcert = _dot_postgresql_path ('postgresql.crt' )
555
- try :
556
- ssl .load_cert_chain (
557
- sslcert , keyfile = sslkey , password = lambda : sslpassword
558
- )
559
- except FileNotFoundError :
560
- pass
567
+ if sslcert is not None :
568
+ try :
569
+ ssl .load_cert_chain (
570
+ sslcert ,
571
+ keyfile = sslkey ,
572
+ password = lambda : sslpassword
573
+ )
574
+ except FileNotFoundError :
575
+ pass
561
576
562
577
# OpenSSL 1.1.1 keylog file, copied from create_default_context()
563
578
if hasattr (ssl , 'keylog_filename' ):
0 commit comments