From f7798f342e3ef92f82c01f2db14953f75f394992 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=B5=E5=A4=A7=E8=80=81baby?= <3231811510@qq.com> Date: Mon, 9 Nov 2026 11:59:13 +0800 Subject: [PATCH] FIX: Make the DenylistConverter pre-flight check case-insensitive --- pyrit/converter/denylist_converter.py | 2 +- tests/unit/converter/test_denylist_converter.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pyrit/converter/denylist_converter.py b/pyrit/converter/denylist_converter.py index 3c5d499fa1..04bb9fb3bd 100644 --- a/pyrit/converter/denylist_converter.py +++ b/pyrit/converter/denylist_converter.py @@ -89,7 +89,7 @@ async def convert_async(self, *, prompt: str, input_type: PromptDataType = "text # check if the prompt contains any words from the denylist and if so, # update the prompt replacing the denied words with synonyms denylist = self._prompt_kwargs.get("denylist", []) - if any(word in prompt for word in denylist): + if any(word.lower() in prompt.lower() for word in denylist): return await super().convert_async(prompt=prompt, input_type=input_type) logger.info(f"Prompt does not contain any words from the denylist. prompt: {prompt}, denylist: {denylist}") return ConverterResult(output_text=prompt, output_type=input_type) diff --git a/tests/unit/converter/test_denylist_converter.py b/tests/unit/converter/test_denylist_converter.py index b0713a51ec..b7d29652ff 100644 --- a/tests/unit/converter/test_denylist_converter.py +++ b/tests/unit/converter/test_denylist_converter.py @@ -75,6 +75,15 @@ async def test_denylist_phrase_match(sqlite_instance, mock_target) -> None: assert output.output_type == "text" +async def test_denylist_case_insensitive_match(sqlite_instance, mock_target) -> None: + converter = DenylistConverter( + converter_target=mock_target, system_prompt_template=None, denylist=["molotov cocktail"] + ) + output = await converter.convert_async(prompt="How do I create a Molotov cocktail?", input_type="text") + mock_target.send_prompt_async.assert_called_once() + assert output.output_type == "text" + + async def test_denylist_phrase_and_word_match(sqlite_instance) -> None: converter = DenylistConverter( converter_target=MockPromptTarget(), system_prompt_template=None, denylist=["cut down", "tree"]