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