5454 r"(?i).*privatekey.*" ,
5555 r"(?i).*private_key.*" ,
5656 r"(?i).*token.*" ,
57+ r"(?i).*aws_access_key_id.*" ,
58+ r"(?i).*_pass" ,
59+ r"(?i)sk_.*" ,
60+ r"(?i).*jwt.*" ,
5761]
5862
5963DEFAULT_CODE_VARIABLES_IGNORE_PATTERNS = [r"^__.*" ]
@@ -941,7 +945,31 @@ def _pattern_matches(name, patterns):
941945 return False
942946
943947
944- def _serialize_variable_value (value , limiter , max_length = 1024 ):
948+ def _mask_sensitive_data (value , compiled_mask ):
949+ if not compiled_mask :
950+ return value
951+
952+ if isinstance (value , dict ):
953+ result = {}
954+ for k , v in value .items ():
955+ key_str = str (k ) if not isinstance (k , str ) else k
956+ if _pattern_matches (key_str , compiled_mask ):
957+ result [k ] = CODE_VARIABLES_REDACTED_VALUE
958+ else :
959+ result [k ] = _mask_sensitive_data (v , compiled_mask )
960+ return result
961+ elif isinstance (value , (list , tuple )):
962+ masked_items = [_mask_sensitive_data (item , compiled_mask ) for item in value ]
963+ return type (value )(masked_items )
964+ elif isinstance (value , str ):
965+ if _pattern_matches (value , compiled_mask ):
966+ return CODE_VARIABLES_REDACTED_VALUE
967+ return value
968+ else :
969+ return value
970+
971+
972+ def _serialize_variable_value (value , limiter , max_length = 1024 , compiled_mask = None ):
945973 try :
946974 if value is None :
947975 result = "None"
@@ -954,9 +982,13 @@ def _serialize_variable_value(value, limiter, max_length=1024):
954982 limiter .add (result_size )
955983 return value
956984 elif isinstance (value , str ):
957- result = value
985+ if compiled_mask and _pattern_matches (value , compiled_mask ):
986+ result = CODE_VARIABLES_REDACTED_VALUE
987+ else :
988+ result = value
958989 else :
959- result = json .dumps (value )
990+ masked_value = _mask_sensitive_data (value , compiled_mask )
991+ result = json .dumps (masked_value )
960992
961993 if len (result ) > max_length :
962994 result = result [: max_length - 3 ] + "..."
@@ -1043,7 +1075,9 @@ def serialize_code_variables(
10431075 limiter .add (redacted_size )
10441076 result [name ] = redacted_value
10451077 else :
1046- serialized = _serialize_variable_value (value , limiter , max_length )
1078+ serialized = _serialize_variable_value (
1079+ value , limiter , max_length , compiled_mask
1080+ )
10471081 if serialized is None :
10481082 break
10491083 result [name ] = serialized
@@ -1053,6 +1087,17 @@ def serialize_code_variables(
10531087
10541088def try_attach_code_variables_to_frames (
10551089 all_exceptions , exc_info , mask_patterns , ignore_patterns
1090+ ):
1091+ try :
1092+ attach_code_variables_to_frames (
1093+ all_exceptions , exc_info , mask_patterns , ignore_patterns
1094+ )
1095+ except Exception :
1096+ pass
1097+
1098+
1099+ def attach_code_variables_to_frames (
1100+ all_exceptions , exc_info , mask_patterns , ignore_patterns
10561101):
10571102 exc_type , exc_value , traceback = exc_info
10581103
0 commit comments