diff --git a/presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/spain/es_nie_recognizer.py b/presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/spain/es_nie_recognizer.py index 38ac2573fa..cc8a9601a3 100644 --- a/presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/spain/es_nie_recognizer.py +++ b/presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/spain/es_nie_recognizer.py @@ -60,7 +60,7 @@ def validate_result(self, pattern_text: str) -> bool: pattern_text = EntityRecognizer.sanitize_value( pattern_text, self.replacement_pairs - ) + ).upper() letters = "TRWAGMYFPDXBNJZSQVHLCKE" letter = pattern_text[-1] diff --git a/presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/spain/es_nif_recognizer.py b/presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/spain/es_nif_recognizer.py index 0b1af99999..ce364bb35b 100644 --- a/presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/spain/es_nif_recognizer.py +++ b/presidio-analyzer/presidio_analyzer/predefined_recognizers/country_specific/spain/es_nif_recognizer.py @@ -53,7 +53,7 @@ def __init__( def validate_result(self, pattern_text: str) -> bool: # noqa: D102 pattern_text = EntityRecognizer.sanitize_value( pattern_text, self.replacement_pairs - ) + ).upper() letter = pattern_text[-1] number = int("".join(filter(str.isdigit, pattern_text))) letters = "TRWAGMYFPDXBNJZSQVHLCKE" diff --git a/presidio-analyzer/tests/test_es_nie_recognizer.py b/presidio-analyzer/tests/test_es_nie_recognizer.py index 2f9c4e6585..0b91d1b98e 100644 --- a/presidio-analyzer/tests/test_es_nie_recognizer.py +++ b/presidio-analyzer/tests/test_es_nie_recognizer.py @@ -28,11 +28,19 @@ def entities(): ("Z8078221M en mi NIE", 1, ((0, 9),),), ("Mi Número de identificación de extranjero es Y8063915-Z", 1, \ ((45, 55),),), + # valid NIE in lowercase (prefix and control letter are upper-cased + # before checksum) + ("x9613851n", 1, ((0, 9),),), + ("z8078221m", 1, ((0, 9),),), + # uppercase still detected + ("X9613851N", 1, ((0, 9),),), # invalid NIE scores ("Y8063915Q", 0, ()), ("Y806391Q", 0, ()), ("58063915Q", 0, ()), ("W8063915Q", 0, ()), + # invalid checksum stays rejected regardless of case + ("x9613851q", 0, ()), ], ) def test_when_all_es_nie_then_succeed( diff --git a/presidio-analyzer/tests/test_es_nif_recognizer.py b/presidio-analyzer/tests/test_es_nif_recognizer.py index ea5ae909e8..a32db15125 100644 --- a/presidio-analyzer/tests/test_es_nif_recognizer.py +++ b/presidio-analyzer/tests/test_es_nif_recognizer.py @@ -24,8 +24,15 @@ def entities(): ("1111111-G", 1, ((0, 9),),), ("1111111G", 1, ((0, 8),),), ("01111111G", 1, ((0, 9),),), + # valid NIF in lowercase (control letter is upper-cased before checksum) + ("55555555k", 1, ((0, 9),),), + ("12345678z", 1, ((0, 9),),), + # uppercase still detected + ("12345678Z", 1, ((0, 9),),), # invalid NIF scores ("401-023-2138", 0, ()), + # invalid checksum stays rejected regardless of case + ("12345678a", 0, ()), # fmt: on ], )