1
- import ast
2
1
import asyncio
3
2
import copy
4
3
import enum
5
4
import inspect
6
- import re
7
5
import socket
8
6
import sys
9
7
import warnings
@@ -796,7 +794,8 @@ def __init__(
796
794
ssl_keyfile : Optional [str ] = None ,
797
795
ssl_certfile : Optional [str ] = None ,
798
796
ssl_cert_reqs : Union [str , ssl .VerifyMode ] = "required" ,
799
- ssl_verify_flags_config : Optional [List [Tuple ["ssl.VerifyFlags" , bool ]]] = None ,
797
+ ssl_include_verify_flags : Optional [List ["ssl.VerifyFlags" ]] = None ,
798
+ ssl_exclude_verify_flags : Optional [List ["ssl.VerifyFlags" ]] = None ,
800
799
ssl_ca_certs : Optional [str ] = None ,
801
800
ssl_ca_data : Optional [str ] = None ,
802
801
ssl_check_hostname : bool = True ,
@@ -811,7 +810,8 @@ def __init__(
811
810
keyfile = ssl_keyfile ,
812
811
certfile = ssl_certfile ,
813
812
cert_reqs = ssl_cert_reqs ,
814
- verify_flags_config = ssl_verify_flags_config ,
813
+ include_verify_flags = ssl_include_verify_flags ,
814
+ exclude_verify_flags = ssl_exclude_verify_flags ,
815
815
ca_certs = ssl_ca_certs ,
816
816
ca_data = ssl_ca_data ,
817
817
check_hostname = ssl_check_hostname ,
@@ -838,8 +838,12 @@ def cert_reqs(self):
838
838
return self .ssl_context .cert_reqs
839
839
840
840
@property
841
- def verify_flags_config (self ):
842
- return self .ssl_context .verify_flags_config
841
+ def include_verify_flags (self ):
842
+ return self .ssl_context .include_verify_flags
843
+
844
+ @property
845
+ def exclude_verify_flags (self ):
846
+ return self .ssl_context .exclude_verify_flags
843
847
844
848
@property
845
849
def ca_certs (self ):
@@ -863,7 +867,8 @@ class RedisSSLContext:
863
867
"keyfile" ,
864
868
"certfile" ,
865
869
"cert_reqs" ,
866
- "verify_flags_config" ,
870
+ "include_verify_flags" ,
871
+ "exclude_verify_flags" ,
867
872
"ca_certs" ,
868
873
"ca_data" ,
869
874
"context" ,
@@ -877,7 +882,8 @@ def __init__(
877
882
keyfile : Optional [str ] = None ,
878
883
certfile : Optional [str ] = None ,
879
884
cert_reqs : Optional [Union [str , ssl .VerifyMode ]] = None ,
880
- verify_flags_config : Optional [List [Tuple [ssl .VerifyFlags , bool ]]] = None ,
885
+ include_verify_flags : Optional [List ["ssl.VerifyFlags" ]] = None ,
886
+ exclude_verify_flags : Optional [List ["ssl.VerifyFlags" ]] = None ,
881
887
ca_certs : Optional [str ] = None ,
882
888
ca_data : Optional [str ] = None ,
883
889
check_hostname : bool = False ,
@@ -903,7 +909,8 @@ def __init__(
903
909
)
904
910
cert_reqs = CERT_REQS [cert_reqs ]
905
911
self .cert_reqs = cert_reqs
906
- self .verify_flags_config = verify_flags_config
912
+ self .include_verify_flags = include_verify_flags
913
+ self .exclude_verify_flags = exclude_verify_flags
907
914
self .ca_certs = ca_certs
908
915
self .ca_data = ca_data
909
916
self .check_hostname = (
@@ -918,12 +925,12 @@ def get(self) -> SSLContext:
918
925
context = ssl .create_default_context ()
919
926
context .check_hostname = self .check_hostname
920
927
context .verify_mode = self .cert_reqs
921
- if self .verify_flags_config :
922
- for flag , enabled in self .verify_flags_config :
923
- if enabled :
924
- context . options |= flag
925
- else :
926
- context .options &= ~ flag
928
+ if self .include_verify_flags :
929
+ for flag in self .include_verify_flags :
930
+ context . verify_flags |= flag
931
+ if self . exclude_verify_flags :
932
+ for flag in self . exclude_verify_flags :
933
+ context .verify_flags &= ~ flag
927
934
if self .certfile and self .keyfile :
928
935
context .load_cert_chain (certfile = self .certfile , keyfile = self .keyfile )
929
936
if self .ca_certs or self .ca_data :
@@ -971,6 +978,20 @@ def to_bool(value) -> Optional[bool]:
971
978
return bool (value )
972
979
973
980
981
+ def parse_ssl_verify_flags (value ):
982
+ # flags are passed in as a string representation of a list,
983
+ # e.g. VERIFY_X509_STRICT, VERIFY_X509_PARTIAL_CHAIN
984
+ verify_flags_str = value .replace ("[" , "" ).replace ("]" , "" )
985
+
986
+ verify_flags = []
987
+ for flag in verify_flags_str .split ("," ):
988
+ flag = flag .strip ()
989
+ if not hasattr (VerifyFlags , flag ):
990
+ raise ValueError (f"Invalid ssl verify flag: { flag } " )
991
+ verify_flags .append (getattr (VerifyFlags , flag ))
992
+ return verify_flags
993
+
994
+
974
995
URL_QUERY_ARGUMENT_PARSERS : Mapping [str , Callable [..., object ]] = MappingProxyType (
975
996
{
976
997
"db" : int ,
@@ -981,6 +1002,8 @@ def to_bool(value) -> Optional[bool]:
981
1002
"max_connections" : int ,
982
1003
"health_check_interval" : int ,
983
1004
"ssl_check_hostname" : to_bool ,
1005
+ "ssl_include_verify_flags" : parse_ssl_verify_flags ,
1006
+ "ssl_exclude_verify_flags" : parse_ssl_verify_flags ,
984
1007
"timeout" : float ,
985
1008
}
986
1009
)
@@ -1040,33 +1063,6 @@ def parse_url(url: str) -> ConnectKwargs:
1040
1063
if parsed .scheme == "rediss" :
1041
1064
kwargs ["connection_class" ] = SSLConnection
1042
1065
1043
- if "ssl_verify_flags_config" in kwargs :
1044
- # flags are passed in as a string representation of a list,
1045
- # e.g. [(VERIFY_X509_STRICT, False), (VERIFY_X509_PARTIAL_CHAIN, True)]
1046
- # To parse it successfully, we need to transform the flags to strings with quotes.
1047
- verify_flags_config_str = kwargs .pop ("ssl_verify_flags_config" )
1048
- # First wrap any VERIFY_* name in quotes
1049
- verify_flags_config_str = re .sub (
1050
- r"\b(VERIFY_[A-Z0-9_]+)\b" , r'"\1"' , verify_flags_config_str
1051
- )
1052
-
1053
- # transform the string to a list of tuples - the first element of each tuple is a string containing the name of the flag,
1054
- # and the second is a boolean that indicates if the flag should be enabled or disabled
1055
- verify_flags_config = ast .literal_eval (verify_flags_config_str )
1056
-
1057
- verify_flags_config_config_parsed = []
1058
- for flag , enabled in verify_flags_config :
1059
- if not hasattr (VerifyFlags , flag ):
1060
- raise ValueError (f"Invalid verify flag: { flag } " )
1061
- if not isinstance (enabled , bool ):
1062
- raise ValueError (
1063
- f"Invalid verify flag enabled/disabled value: { enabled } "
1064
- )
1065
- verify_flags_config_config_parsed .append (
1066
- (getattr (VerifyFlags , flag ), enabled )
1067
- )
1068
-
1069
- kwargs ["ssl_verify_flags_config" ] = verify_flags_config_config_parsed
1070
1066
else :
1071
1067
valid_schemes = "redis://, rediss://, unix://"
1072
1068
raise ValueError (
0 commit comments