3737import threading
3838from datetime import timedelta
3939
40+ import _hashlib
41+
4042from elasticapm .conf .constants import BASE_SANITIZE_FIELD_NAMES , TRACE_CONTINUATION_STRATEGY
4143from elasticapm .utils import compat , starmatch_to_regex
4244from elasticapm .utils .logging import get_logger
@@ -220,6 +222,8 @@ class _BoolConfigValue(_ConfigValue):
220222 def __init__ (self , dict_key , true_string = "true" , false_string = "false" , ** kwargs ) -> None :
221223 self .true_string = true_string
222224 self .false_string = false_string
225+ # this is necessary to have the bool type preserved in _validate
226+ kwargs ["type" ] = bool
223227 super (_BoolConfigValue , self ).__init__ (dict_key , ** kwargs )
224228
225229 def __set__ (self , instance , value ) -> None :
@@ -228,6 +232,7 @@ def __set__(self, instance, value) -> None:
228232 value = True
229233 elif value .lower () == self .false_string :
230234 value = False
235+ value = self ._validate (instance , value )
231236 self ._callback_if_changed (instance , value )
232237 instance ._values [self .dict_key ] = bool (value )
233238
@@ -373,6 +378,30 @@ def __call__(self, value, field_name):
373378 return value
374379
375380
381+ def _in_fips_mode ():
382+ try :
383+ return _hashlib .get_fips_mode () == 1
384+ except AttributeError :
385+ # versions older of Python3.9 do not have the helper
386+ return False
387+
388+
389+ class SupportedValueInFipsModeValidator (object ):
390+ """If FIPS mode is enabled only supported_value is accepted"""
391+
392+ def __init__ (self , supported_value ) -> None :
393+ self .supported_value = supported_value
394+
395+ def __call__ (self , value , field_name ):
396+ if _in_fips_mode ():
397+ if value != self .supported_value :
398+ raise ConfigurationError (
399+ "{}={} must be set to {} if FIPS mode is enabled" .format (field_name , value , self .supported_value ),
400+ field_name ,
401+ )
402+ return value
403+
404+
376405class EnumerationValidator (object ):
377406 """
378407 Validator which ensures that a given config value is chosen from a list
@@ -579,7 +608,9 @@ class Config(_ConfigBase):
579608 server_url = _ConfigValue ("SERVER_URL" , default = "http://127.0.0.1:8200" , required = True )
580609 server_cert = _ConfigValue ("SERVER_CERT" , validators = [FileIsReadableValidator ()])
581610 server_ca_cert_file = _ConfigValue ("SERVER_CA_CERT_FILE" , validators = [FileIsReadableValidator ()])
582- verify_server_cert = _BoolConfigValue ("VERIFY_SERVER_CERT" , default = True )
611+ verify_server_cert = _BoolConfigValue (
612+ "VERIFY_SERVER_CERT" , default = True , validators = [SupportedValueInFipsModeValidator (supported_value = True )]
613+ )
583614 use_certifi = _BoolConfigValue ("USE_CERTIFI" , default = True )
584615 include_paths = _ListConfigValue ("INCLUDE_PATHS" )
585616 exclude_paths = _ListConfigValue ("EXCLUDE_PATHS" , default = compat .get_default_library_patters ())
0 commit comments