From f47d66c3c4ef25fe5d5e7d960861e58790565094 Mon Sep 17 00:00:00 2001 From: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com> Date: Wed, 11 Feb 2026 14:04:32 -0800 Subject: [PATCH 1/2] fix: reject control characteres in job names Signed-off-by: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com> --- src/openjd/model/v2023_09/_model.py | 2 ++ .../model/v2023_09/test_job_template.py | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/openjd/model/v2023_09/_model.py b/src/openjd/model/v2023_09/_model.py index 1255017c..0d785488 100644 --- a/src/openjd/model/v2023_09/_model.py +++ b/src/openjd/model/v2023_09/_model.py @@ -203,6 +203,8 @@ class JobTemplateName(FormatString): _min_length = 1 # Max length is validated after resolution in Job model, not here # because the template name can contain format strings + # All unicode except the [Cc] (control characters) category + _regex = f"(?-m:^[^{_Cc_characters}]+\\Z)" def __new__(cls, value: str, *, context: ModelParsingContextInterface = ModelParsingContext()): return super().__new__(cls, value, context=context) diff --git a/test/openjd/model/v2023_09/test_job_template.py b/test/openjd/model/v2023_09/test_job_template.py index 94df84f6..2c9c3061 100644 --- a/test/openjd/model/v2023_09/test_job_template.py +++ b/test/openjd/model/v2023_09/test_job_template.py @@ -195,6 +195,33 @@ def test_parse_success(self, data: dict[str, Any]) -> None: 1, id="unknown key", ), + pytest.param( + { + "specificationVersion": "jobtemplate-2023-09", + "name": "Job\x1fName", + "steps": [STEP_TEMPLATE], + }, + 1, + id="name with control char 0x1F", + ), + pytest.param( + { + "specificationVersion": "jobtemplate-2023-09", + "name": "Job\x7fName", + "steps": [STEP_TEMPLATE], + }, + 1, + id="name with control char 0x7F", + ), + pytest.param( + { + "specificationVersion": "jobtemplate-2023-09", + "name": "Job\x9fName", + "steps": [STEP_TEMPLATE], + }, + 1, + id="name with control char 0x9F", + ), pytest.param( { "name": "Foo", From de55f4840c699689eae8cfce0c92684c6bde81d7 Mon Sep 17 00:00:00 2001 From: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com> Date: Wed, 18 Feb 2026 12:28:23 -0800 Subject: [PATCH 2/2] Add additional tests Signed-off-by: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com> --- .../openjd/model/v2023_09/test_job_template.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/openjd/model/v2023_09/test_job_template.py b/test/openjd/model/v2023_09/test_job_template.py index 2c9c3061..d58d4baa 100644 --- a/test/openjd/model/v2023_09/test_job_template.py +++ b/test/openjd/model/v2023_09/test_job_template.py @@ -222,6 +222,24 @@ def test_parse_success(self, data: dict[str, Any]) -> None: 1, id="name with control char 0x9F", ), + pytest.param( + { + "specificationVersion": "jobtemplate-2023-09", + "name": "JobName\n", + "steps": [STEP_TEMPLATE], + }, + 1, + id="name with trailing newline", + ), + pytest.param( + { + "specificationVersion": "jobtemplate-2023-09", + "name": "Job\nName", + "steps": [STEP_TEMPLATE], + }, + 1, + id="name with embedded newline", + ), pytest.param( { "name": "Foo",