From b14fda58799b3ec4a86b24f129d4ef1dcc7a7732 Mon Sep 17 00:00:00 2001 From: Richard McDaniel <1130888+rmcdaniel@users.noreply.github.com> Date: Fri, 13 Nov 2026 08:59:08 +0000 Subject: [PATCH 1/3] Add shared static credential constructor regression vectors --- tests/fixtures/auth_configuration/README.md | 9 + .../static-credentials-v1.json | 341 ++++++++++++++++++ tests/test_static_credential_validation.py | 58 +++ 3 files changed, 408 insertions(+) create mode 100644 tests/fixtures/auth_configuration/README.md create mode 100644 tests/fixtures/auth_configuration/static-credentials-v1.json create mode 100644 tests/test_static_credential_validation.py diff --git a/tests/fixtures/auth_configuration/README.md b/tests/fixtures/auth_configuration/README.md new file mode 100644 index 0000000..435c578 --- /dev/null +++ b/tests/fixtures/auth_configuration/README.md @@ -0,0 +1,9 @@ +# Static credential configuration + +`static-credentials-v1.json` is copied byte-for-byte from +[`durable-workflow/server`](https://github.com/durable-workflow/server/blob/c9a75838f0d70fd5237f4cbcf70f9f046f1e5d42/tests/Fixtures/AuthConfiguration/static-credentials-v1.json). +SHA-256: `0d4f01b763d72850943acbd9a74a0cc5da1ca6db5bc1b6fa5ca37fda11810acb`. + +The Python tests consume the common scalar cases, pre-selection cases and +Python role mappings. PHP byte-loader and adapter cases apply only to PHP. +All credential values in this fixture are synthetic. diff --git a/tests/fixtures/auth_configuration/static-credentials-v1.json b/tests/fixtures/auth_configuration/static-credentials-v1.json new file mode 100644 index 0000000..d27da5b --- /dev/null +++ b/tests/fixtures/auth_configuration/static-credentials-v1.json @@ -0,0 +1,341 @@ +{ + "schema": "durable-workflow.static-credential-configuration.v1", + "domain": "original configured static textual credentials; valid Unicode scalar text for common rows", + "white_space_code_points": ["U+0009","U+000A","U+000B","U+000C","U+000D","U+0020","U+0085","U+00A0","U+1680","U+2000","U+2001","U+2002","U+2003","U+2004","U+2005","U+2006","U+2007","U+2008","U+2009","U+200A","U+2028","U+2029","U+202F","U+205F","U+3000"], + "control_Cc_ranges": ["U+0000..U+001F","U+007F..U+009F"], + "common_scalar_cases": [ + {"id":"scalar-ordinary","expected":"preserve","expected_utf8_hex":"666978747572652d746f6b656e","input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"scalar-interior-space","expected":"preserve","expected_utf8_hex":"6669787475726520746f6b656e","input_code_points":[102,105,120,116,117,114,101,32,116,111,107,101,110]}, + {"id":"scalar-interior-nbsp","expected":"preserve","expected_utf8_hex":"66697874757265c2a0746f6b656e","input_code_points":[102,105,120,116,117,114,101,160,116,111,107,101,110]}, + {"id":"scalar-upper-case","expected":"preserve","expected_utf8_hex":"464958545552452d544f4b454e","input_code_points":[70,73,88,84,85,82,69,45,84,79,75,69,78]}, + {"id":"scalar-composed","expected":"preserve","expected_utf8_hex":"666978747572652dc3a9","input_code_points":[102,105,120,116,117,114,101,45,233]}, + {"id":"scalar-decomposed","expected":"preserve","expected_utf8_hex":"666978747572652d65cc81","input_code_points":[102,105,120,116,117,114,101,45,101,769]}, + {"id":"scalar-format-bom","expected":"preserve","expected_utf8_hex":"efbbbf66697874757265","input_code_points":[65279,102,105,120,116,117,114,101]}, + {"id":"scalar-format-zero-width","expected":"preserve","expected_utf8_hex":"66697874757265e2808b","input_code_points":[102,105,120,116,117,114,101,8203]}, + {"id":"scalar-format-lrm","expected":"preserve","expected_utf8_hex":"66697874757265e2808e","input_code_points":[102,105,120,116,117,114,101,8206]}, + {"id":"scalar-mongolian-vowel-separator","expected":"preserve","expected_utf8_hex":"66697874757265e1a08e","input_code_points":[102,105,120,116,117,114,101,6158]}, + {"id":"scalar-literal-empty","expected":"preserve","expected_utf8_hex":"","input_code_points":[]}, + {"id":"edge-white-space-0009-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[9,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-0009-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,9]}, + {"id":"edge-white-space-000A-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[10,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-000A-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,10]}, + {"id":"edge-white-space-000B-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[11,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-000B-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,11]}, + {"id":"edge-white-space-000C-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[12,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-000C-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,12]}, + {"id":"edge-white-space-000D-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[13,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-000D-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,13]}, + {"id":"edge-white-space-0020-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[32,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-0020-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,32]}, + {"id":"edge-white-space-0085-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[133,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-0085-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,133]}, + {"id":"edge-white-space-00A0-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[160,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-00A0-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,160]}, + {"id":"edge-white-space-1680-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[5760,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-1680-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,5760]}, + {"id":"edge-white-space-2000-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8192,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2000-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8192]}, + {"id":"edge-white-space-2001-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8193,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2001-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8193]}, + {"id":"edge-white-space-2002-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8194,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2002-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8194]}, + {"id":"edge-white-space-2003-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8195,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2003-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8195]}, + {"id":"edge-white-space-2004-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8196,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2004-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8196]}, + {"id":"edge-white-space-2005-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8197,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2005-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8197]}, + {"id":"edge-white-space-2006-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8198,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2006-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8198]}, + {"id":"edge-white-space-2007-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8199,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2007-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8199]}, + {"id":"edge-white-space-2008-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8200,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2008-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8200]}, + {"id":"edge-white-space-2009-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8201,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2009-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8201]}, + {"id":"edge-white-space-200A-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8202,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-200A-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8202]}, + {"id":"edge-white-space-2028-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8232,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2028-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8232]}, + {"id":"edge-white-space-2029-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8233,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-2029-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8233]}, + {"id":"edge-white-space-202F-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8239,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-202F-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8239]}, + {"id":"edge-white-space-205F-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8287,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-205F-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8287]}, + {"id":"edge-white-space-3000-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[12288,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"edge-white-space-3000-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,12288]}, + {"id":"control-Cc-0000-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[0,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0000-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,0,116,111,107,101,110]}, + {"id":"control-Cc-0000-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,0]}, + {"id":"control-Cc-0001-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[1,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0001-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,1,116,111,107,101,110]}, + {"id":"control-Cc-0001-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,1]}, + {"id":"control-Cc-0002-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[2,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0002-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,2,116,111,107,101,110]}, + {"id":"control-Cc-0002-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,2]}, + {"id":"control-Cc-0003-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[3,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0003-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,3,116,111,107,101,110]}, + {"id":"control-Cc-0003-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,3]}, + {"id":"control-Cc-0004-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[4,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0004-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,4,116,111,107,101,110]}, + {"id":"control-Cc-0004-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,4]}, + {"id":"control-Cc-0005-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[5,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0005-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,5,116,111,107,101,110]}, + {"id":"control-Cc-0005-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,5]}, + {"id":"control-Cc-0006-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[6,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0006-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,6,116,111,107,101,110]}, + {"id":"control-Cc-0006-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,6]}, + {"id":"control-Cc-0007-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[7,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0007-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,7,116,111,107,101,110]}, + {"id":"control-Cc-0007-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,7]}, + {"id":"control-Cc-0008-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0008-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,8,116,111,107,101,110]}, + {"id":"control-Cc-0008-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,8]}, + {"id":"control-Cc-0009-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[9,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0009-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,9,116,111,107,101,110]}, + {"id":"control-Cc-0009-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,9]}, + {"id":"control-Cc-000A-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[10,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-000A-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,10,116,111,107,101,110]}, + {"id":"control-Cc-000A-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,10]}, + {"id":"control-Cc-000B-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[11,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-000B-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,11,116,111,107,101,110]}, + {"id":"control-Cc-000B-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,11]}, + {"id":"control-Cc-000C-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[12,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-000C-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,12,116,111,107,101,110]}, + {"id":"control-Cc-000C-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,12]}, + {"id":"control-Cc-000D-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[13,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-000D-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,13,116,111,107,101,110]}, + {"id":"control-Cc-000D-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,13]}, + {"id":"control-Cc-000E-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[14,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-000E-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,14,116,111,107,101,110]}, + {"id":"control-Cc-000E-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,14]}, + {"id":"control-Cc-000F-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[15,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-000F-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,15,116,111,107,101,110]}, + {"id":"control-Cc-000F-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,15]}, + {"id":"control-Cc-0010-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[16,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0010-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,16,116,111,107,101,110]}, + {"id":"control-Cc-0010-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,16]}, + {"id":"control-Cc-0011-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[17,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0011-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,17,116,111,107,101,110]}, + {"id":"control-Cc-0011-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,17]}, + {"id":"control-Cc-0012-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[18,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0012-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,18,116,111,107,101,110]}, + {"id":"control-Cc-0012-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,18]}, + {"id":"control-Cc-0013-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[19,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0013-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,19,116,111,107,101,110]}, + {"id":"control-Cc-0013-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,19]}, + {"id":"control-Cc-0014-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[20,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0014-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,20,116,111,107,101,110]}, + {"id":"control-Cc-0014-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,20]}, + {"id":"control-Cc-0015-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[21,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0015-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,21,116,111,107,101,110]}, + {"id":"control-Cc-0015-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,21]}, + {"id":"control-Cc-0016-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[22,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0016-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,22,116,111,107,101,110]}, + {"id":"control-Cc-0016-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,22]}, + {"id":"control-Cc-0017-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[23,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0017-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,23,116,111,107,101,110]}, + {"id":"control-Cc-0017-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,23]}, + {"id":"control-Cc-0018-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[24,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0018-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,24,116,111,107,101,110]}, + {"id":"control-Cc-0018-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,24]}, + {"id":"control-Cc-0019-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[25,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0019-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,25,116,111,107,101,110]}, + {"id":"control-Cc-0019-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,25]}, + {"id":"control-Cc-001A-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[26,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-001A-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,26,116,111,107,101,110]}, + {"id":"control-Cc-001A-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,26]}, + {"id":"control-Cc-001B-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[27,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-001B-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,27,116,111,107,101,110]}, + {"id":"control-Cc-001B-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,27]}, + {"id":"control-Cc-001C-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[28,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-001C-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,28,116,111,107,101,110]}, + {"id":"control-Cc-001C-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,28]}, + {"id":"control-Cc-001D-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[29,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-001D-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,29,116,111,107,101,110]}, + {"id":"control-Cc-001D-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,29]}, + {"id":"control-Cc-001E-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[30,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-001E-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,30,116,111,107,101,110]}, + {"id":"control-Cc-001E-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,30]}, + {"id":"control-Cc-001F-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[31,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-001F-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,31,116,111,107,101,110]}, + {"id":"control-Cc-001F-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,31]}, + {"id":"control-Cc-007F-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[127,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-007F-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,127,116,111,107,101,110]}, + {"id":"control-Cc-007F-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,127]}, + {"id":"control-Cc-0080-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[128,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0080-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,128,116,111,107,101,110]}, + {"id":"control-Cc-0080-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,128]}, + {"id":"control-Cc-0081-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[129,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0081-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,129,116,111,107,101,110]}, + {"id":"control-Cc-0081-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,129]}, + {"id":"control-Cc-0082-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[130,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0082-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,130,116,111,107,101,110]}, + {"id":"control-Cc-0082-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,130]}, + {"id":"control-Cc-0083-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[131,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0083-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,131,116,111,107,101,110]}, + {"id":"control-Cc-0083-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,131]}, + {"id":"control-Cc-0084-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[132,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0084-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,132,116,111,107,101,110]}, + {"id":"control-Cc-0084-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,132]}, + {"id":"control-Cc-0085-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[133,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0085-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,133,116,111,107,101,110]}, + {"id":"control-Cc-0085-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,133]}, + {"id":"control-Cc-0086-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[134,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0086-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,134,116,111,107,101,110]}, + {"id":"control-Cc-0086-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,134]}, + {"id":"control-Cc-0087-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[135,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0087-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,135,116,111,107,101,110]}, + {"id":"control-Cc-0087-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,135]}, + {"id":"control-Cc-0088-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[136,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0088-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,136,116,111,107,101,110]}, + {"id":"control-Cc-0088-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,136]}, + {"id":"control-Cc-0089-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[137,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0089-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,137,116,111,107,101,110]}, + {"id":"control-Cc-0089-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,137]}, + {"id":"control-Cc-008A-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[138,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-008A-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,138,116,111,107,101,110]}, + {"id":"control-Cc-008A-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,138]}, + {"id":"control-Cc-008B-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[139,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-008B-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,139,116,111,107,101,110]}, + {"id":"control-Cc-008B-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,139]}, + {"id":"control-Cc-008C-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[140,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-008C-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,140,116,111,107,101,110]}, + {"id":"control-Cc-008C-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,140]}, + {"id":"control-Cc-008D-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[141,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-008D-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,141,116,111,107,101,110]}, + {"id":"control-Cc-008D-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,141]}, + {"id":"control-Cc-008E-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[142,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-008E-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,142,116,111,107,101,110]}, + {"id":"control-Cc-008E-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,142]}, + {"id":"control-Cc-008F-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[143,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-008F-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,143,116,111,107,101,110]}, + {"id":"control-Cc-008F-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,143]}, + {"id":"control-Cc-0090-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[144,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0090-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,144,116,111,107,101,110]}, + {"id":"control-Cc-0090-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,144]}, + {"id":"control-Cc-0091-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[145,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0091-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,145,116,111,107,101,110]}, + {"id":"control-Cc-0091-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,145]}, + {"id":"control-Cc-0092-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[146,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0092-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,146,116,111,107,101,110]}, + {"id":"control-Cc-0092-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,146]}, + {"id":"control-Cc-0093-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[147,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0093-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,147,116,111,107,101,110]}, + {"id":"control-Cc-0093-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,147]}, + {"id":"control-Cc-0094-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[148,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0094-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,148,116,111,107,101,110]}, + {"id":"control-Cc-0094-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,148]}, + {"id":"control-Cc-0095-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[149,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0095-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,149,116,111,107,101,110]}, + {"id":"control-Cc-0095-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,149]}, + {"id":"control-Cc-0096-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[150,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0096-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,150,116,111,107,101,110]}, + {"id":"control-Cc-0096-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,150]}, + {"id":"control-Cc-0097-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[151,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0097-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,151,116,111,107,101,110]}, + {"id":"control-Cc-0097-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,151]}, + {"id":"control-Cc-0098-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[152,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0098-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,152,116,111,107,101,110]}, + {"id":"control-Cc-0098-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,152]}, + {"id":"control-Cc-0099-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[153,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-0099-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,153,116,111,107,101,110]}, + {"id":"control-Cc-0099-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,153]}, + {"id":"control-Cc-009A-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[154,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-009A-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,154,116,111,107,101,110]}, + {"id":"control-Cc-009A-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,154]}, + {"id":"control-Cc-009B-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[155,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-009B-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,155,116,111,107,101,110]}, + {"id":"control-Cc-009B-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,155]}, + {"id":"control-Cc-009C-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[156,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-009C-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,156,116,111,107,101,110]}, + {"id":"control-Cc-009C-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,156]}, + {"id":"control-Cc-009D-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[157,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-009D-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,157,116,111,107,101,110]}, + {"id":"control-Cc-009D-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,157]}, + {"id":"control-Cc-009E-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[158,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-009E-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,158,116,111,107,101,110]}, + {"id":"control-Cc-009E-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,158]}, + {"id":"control-Cc-009F-prefix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[159,102,105,120,116,117,114,101,45,116,111,107,101,110]}, + {"id":"control-Cc-009F-middle","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,159,116,111,107,101,110]}, + {"id":"control-Cc-009F-suffix","expected":"reject","diagnostic_setting_only":true,"input_code_points":[102,105,120,116,117,114,101,45,116,111,107,101,110,159]}, + {"id":"white-space-only-0009","expected":"reject","diagnostic_setting_only":true,"input_code_points":[9]}, + {"id":"white-space-only-000A","expected":"reject","diagnostic_setting_only":true,"input_code_points":[10]}, + {"id":"white-space-only-000B","expected":"reject","diagnostic_setting_only":true,"input_code_points":[11]}, + {"id":"white-space-only-000C","expected":"reject","diagnostic_setting_only":true,"input_code_points":[12]}, + {"id":"white-space-only-000D","expected":"reject","diagnostic_setting_only":true,"input_code_points":[13]}, + {"id":"white-space-only-0020","expected":"reject","diagnostic_setting_only":true,"input_code_points":[32]}, + {"id":"white-space-only-0085","expected":"reject","diagnostic_setting_only":true,"input_code_points":[133]}, + {"id":"white-space-only-00A0","expected":"reject","diagnostic_setting_only":true,"input_code_points":[160]}, + {"id":"white-space-only-1680","expected":"reject","diagnostic_setting_only":true,"input_code_points":[5760]}, + {"id":"white-space-only-2000","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8192]}, + {"id":"white-space-only-2001","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8193]}, + {"id":"white-space-only-2002","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8194]}, + {"id":"white-space-only-2003","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8195]}, + {"id":"white-space-only-2004","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8196]}, + {"id":"white-space-only-2005","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8197]}, + {"id":"white-space-only-2006","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8198]}, + {"id":"white-space-only-2007","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8199]}, + {"id":"white-space-only-2008","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8200]}, + {"id":"white-space-only-2009","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8201]}, + {"id":"white-space-only-200A","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8202]}, + {"id":"white-space-only-2028","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8232]}, + {"id":"white-space-only-2029","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8233]}, + {"id":"white-space-only-202F","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8239]}, + {"id":"white-space-only-205F","expected":"reject","diagnostic_setting_only":true,"input_code_points":[8287]}, + {"id":"white-space-only-3000","expected":"reject","diagnostic_setting_only":true,"input_code_points":[12288]}, + {"id":"scalar-literal-zero","expected":"preserve","expected_utf8_hex":"30","input_code_points":[48]}, + {"id":"scalar-literal-false","expected":"preserve","expected_utf8_hex":"66616c7365","input_code_points":[102,97,108,115,101]}, + {"id":"scalar-literal-null","expected":"preserve","expected_utf8_hex":"6e756c6c","input_code_points":[110,117,108,108]}, + {"id":"scalar-literal-empty-word","expected":"preserve","expected_utf8_hex":"656d707479","input_code_points":[101,109,112,116,121]}, + {"id":"scalar-astral","expected":"preserve","expected_utf8_hex":"666978747572652df09f9982","input_code_points":[102,105,120,116,117,114,101,45,128578]} + ], + "php_byte_loader_cases": [ + {"id":"php-byte-loader-isolated-ff","input_hex":"ff","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-stray-continuation","input_hex":"80","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-truncated-two-byte","input_hex":"c2","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-truncated-three-byte","input_hex":"e282","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-broken-continuation","input_hex":"e228a1","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-overlong","input_hex":"c0af","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-surrogate","input_hex":"eda080","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-above-unicode-max","input_hex":"f4908080","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-truncated-astral","input_hex":"f09f99","expected":"reject-invalid-utf8","diagnostic_setting_only":true}, + {"id":"php-byte-loader-bad-four-byte-continuation","input_hex":"f0288cbc","expected":"reject-invalid-utf8","diagnostic_setting_only":true} + ], + "pre_selection_cases": [ + {"id":"malformed-unused-worker","selected_plane":"control","expected":"reject","offending_option":"worker","options_code_points":{"shared":[102,105,120,116,117,114,101,45,115,104,97,114,101,100],"control":[102,105,120,116,117,114,101,45,99,111,110,116,114,111,108],"worker":[102,105,120,116,117,114,101,45,119,111,114,107,101,114,160]}}, + {"id":"malformed-unused-control","selected_plane":"worker","expected":"reject","offending_option":"control","options_code_points":{"shared":[102,105,120,116,117,114,101,45,115,104,97,114,101,100],"control":[160,102,105,120,116,117,114,101,45,99,111,110,116,114,111,108],"worker":[102,105,120,116,117,114,101,45,119,111,114,107,101,114]}}, + {"id":"malformed-masked-shared","selected_plane":"control","expected":"reject","offending_option":"shared","options_code_points":{"shared":[102,105,120,116,117,114,101,45,115,104,97,114,101,100,10],"control":[102,105,120,116,117,114,101,45,99,111,110,116,114,111,108],"worker":[102,105,120,116,117,114,101,45,119,111,114,107,101,114]}} + ], + "language_mappings": {"php":{"logical_setting_names":{"shared":"token","control":"controlToken","worker":"workerToken"},"omitted_or_null":"existing-absence","literal_empty_optional":"existing-fallback","all_empty_required_token_authentication":"existing-required-token-error","client_anonymous_configuration":"preserve-existing-availability","pre_selection_loaders":["Client","TokenAuthentication","ServiceConfiguration","ProcessCredentialResolver"],"control_plane_order":["control","shared"],"worker_plane_order":["worker","shared"],"opposite_only":"existing-role-refusal"},"python":{"logical_setting_names":{"shared":"token","control":"control_token","worker":"worker_token"},"omitted_or_null":"existing-absence","literal_empty_optional":"existing-absence","discovery_order":["worker","control","shared"],"worker_plane_order":["worker","shared"],"control_plane_order":["control","shared"],"opposite_only":"existing-role-refusal"},"rust":{"logical_setting_names":{"shared":"token","control":"control_token","worker":"worker_token"},"none":"existing-absence","some_literal_empty":"preserve-supplied-empty-and-fallback-precedence","opposite_only":"existing-role-refusal"}}, + "binary_key_boundary": {"id":"decoded-entropy-is-not-token-text","configured_text":"base64:ACB/gJ//","decoded_bytes_hex":"00207f809fff","apply_text_guard_to_decoded_bytes":false,"production_encoding_change":false}, + "diagnostics": {"identify_setting_only":true,"forbid_value_prefix_digest_or_encoded_content":true,"before_role_selection_and_io":true}, + "exclusions": ["dynamic authentication","general static-header extensions","decoded binary key entropy","new token alphabet","case folding","Unicode normalization","trimming","production fixture-byte encoding"], + "server_setting_mappings": {"bearer_text":[{"primary":"DW_AUTH_TOKEN","legacy":"WORKFLOW_SERVER_AUTH_TOKEN","optionality":"preserve-existing-auth-mode-and-role-rules"},{"primary":"DW_WORKER_TOKEN","legacy":"WORKFLOW_SERVER_WORKER_TOKEN","optionality":"preserve-existing-auth-mode-and-role-rules"},{"primary":"DW_OPERATOR_TOKEN","legacy":"WORKFLOW_SERVER_OPERATOR_TOKEN","optionality":"preserve-existing-auth-mode-and-role-rules"},{"primary":"DW_ADMIN_TOKEN","legacy":"WORKFLOW_SERVER_ADMIN_TOKEN","optionality":"preserve-existing-auth-mode-and-role-rules"}],"request_signature_text":[{"primary":"DW_SIGNATURE_KEY","legacy":"WORKFLOW_SERVER_SIGNATURE_KEY","representation":"text-used-directly-as-HMAC-key-by-existing-PHP","native_auth_mode":"preserve-existing-unsupported-driver"},{"primary":"DW_WORKER_SIGNATURE_KEY","legacy":"WORKFLOW_SERVER_WORKER_SIGNATURE_KEY","representation":"text-used-directly-as-HMAC-key-by-existing-PHP","native_auth_mode":"preserve-existing-unsupported-driver"},{"primary":"DW_OPERATOR_SIGNATURE_KEY","legacy":"WORKFLOW_SERVER_OPERATOR_SIGNATURE_KEY","representation":"text-used-directly-as-HMAC-key-by-existing-PHP","native_auth_mode":"preserve-existing-unsupported-driver"},{"primary":"DW_ADMIN_SIGNATURE_KEY","legacy":"WORKFLOW_SERVER_ADMIN_SIGNATURE_KEY","representation":"text-used-directly-as-HMAC-key-by-existing-PHP","native_auth_mode":"preserve-existing-unsupported-driver"}],"history_export_signing_text":{"primary":"DW_V2_HISTORY_EXPORT_SIGNING_KEY","legacy":"WORKFLOW_V2_HISTORY_EXPORT_SIGNING_KEY","representation":"text-used-directly-as-HMAC-key","empty_optional":"preserve-unsigned-behavior"},"application_and_page_key_text":{"settings":["DW_SERVER_KEY","APP_KEY"],"representation":"existing-configured-text-or-documented-encoded-text","validate_before_documented_binary_decode":true,"change_derivation_or_generation":false},"principal_token_container":{"primary":"DW_PRINCIPAL_TOKENS","legacy":"WORKFLOW_SERVER_PRINCIPAL_TOKENS","validate_token_members_after_existing_container_parse":true,"validate_container_formatting_as_token_text":false,"native_mode":"preserve-existing-refusal"},"source_loader_boundary":{"parse_documented_source_quoting":true,"trim_credential_text":false,"validate_all_supplied_primary_and_legacy_candidates":true,"validate_before_role_or_alias_selection":true,"preserve_existing_env_literal_and_required_setting_rules":true},"signing_key_id_metadata_is_secret_key_input":false}, + "server_pre_selection_cases": [ + {"id":"server-unused-role","selected_role":"control","expected":"reject","offending_setting":"DW_WORKER_TOKEN","options_code_points":{"DW_AUTH_TOKEN":[102,105,120,116,117,114,101,45,115,104,97,114,101,100],"DW_WORKER_TOKEN":[102,105,120,116,117,114,101,45,119,111,114,107,101,114,160]}}, + {"id":"server-masked-legacy-alias","expected":"reject","offending_setting":"WORKFLOW_SERVER_AUTH_TOKEN","options_code_points":{"DW_AUTH_TOKEN":[102,105,120,116,117,114,101,45,115,104,97,114,101,100],"WORKFLOW_SERVER_AUTH_TOKEN":[102,105,120,116,117,114,101,45,111,108,100,10]}}, + {"id":"server-invalid-quoted-credential-after-source-parse","expected":"reject","offending_setting":"DW_AUTH_TOKEN","configured_text_code_points":[32,102,105,120,116,117,114,101,45,115,104,97,114,101,100,32],"source_code_points":[34,32,102,105,120,116,117,114,101,45,115,104,97,114,101,100,32,34]} + ], + "common_input_representation": "Unicode scalar integers, materialized as original test text only; not a production encoding", + "php_adapter_cases": [ + {"id":"php-valid-scoped-mode-unused-worker-scalar","selected_plane":"control","omitted_options":["shared"],"options_case_refs":{"control":"scalar-ordinary","worker":"edge-white-space-00A0-suffix"},"targets":["Client","TokenAuthentication","ServiceConfiguration","ProcessCredentialResolver"],"expected":"reject-credential","offending_option":"worker","diagnostic_setting_only":true,"generic_mode_or_missing_role_error_is_not_success":true}, + {"id":"php-valid-scoped-mode-unused-worker-invalid-utf8","selected_plane":"control","omitted_options":["shared"],"options_case_refs":{"control":"scalar-ordinary","worker":"php-byte-loader-isolated-ff"},"targets":["Client","TokenAuthentication","ServiceConfiguration","ProcessCredentialResolver"],"expected":"reject-credential","offending_option":"worker","diagnostic_setting_only":true,"generic_mode_or_missing_role_error_is_not_success":true}, + {"id":"php-valid-scoped-mode-unused-control-scalar","selected_plane":"worker","omitted_options":["shared"],"options_case_refs":{"worker":"scalar-ordinary","control":"edge-white-space-00A0-prefix"},"targets":["Client","TokenAuthentication","ServiceConfiguration","ProcessCredentialResolver"],"expected":"reject-credential","offending_option":"control","diagnostic_setting_only":true,"generic_mode_or_missing_role_error_is_not_success":true}, + {"id":"php-valid-scoped-mode-unused-control-invalid-utf8","selected_plane":"worker","omitted_options":["shared"],"options_case_refs":{"worker":"scalar-ordinary","control":"php-byte-loader-isolated-ff"},"targets":["Client","TokenAuthentication","ServiceConfiguration","ProcessCredentialResolver"],"expected":"reject-credential","offending_option":"control","diagnostic_setting_only":true,"generic_mode_or_missing_role_error_is_not_success":true}, + {"id":"php-process-handoff-client-scalar","target":"ProcessCredentialResolver","omitted_environment":["DURABLE_WORKFLOW_TOKEN","DURABLE_WORKFLOW_CLIENT_TOKEN","DURABLE_WORKFLOW_WORKER_TOKEN"],"process_role":"client","process_token_case_ref":"edge-white-space-00A0-suffix","expected":"reject-credential","offending_setting":"DURABLE_WORKFLOW_PROCESS_TOKEN","diagnostic_setting_only":true,"generic_mode_or_missing_role_error_is_not_success":true}, + {"id":"php-process-handoff-client-invalid-utf8","target":"ProcessCredentialResolver","omitted_environment":["DURABLE_WORKFLOW_TOKEN","DURABLE_WORKFLOW_CLIENT_TOKEN","DURABLE_WORKFLOW_WORKER_TOKEN"],"process_role":"client","process_token_case_ref":"php-byte-loader-isolated-ff","expected":"reject-credential","offending_setting":"DURABLE_WORKFLOW_PROCESS_TOKEN","diagnostic_setting_only":true,"generic_mode_or_missing_role_error_is_not_success":true}, + {"id":"php-process-handoff-worker-scalar","target":"ProcessCredentialResolver","omitted_environment":["DURABLE_WORKFLOW_TOKEN","DURABLE_WORKFLOW_CLIENT_TOKEN","DURABLE_WORKFLOW_WORKER_TOKEN"],"process_role":"worker","process_token_case_ref":"edge-white-space-00A0-suffix","expected":"reject-credential","offending_setting":"DURABLE_WORKFLOW_PROCESS_TOKEN","diagnostic_setting_only":true,"generic_mode_or_missing_role_error_is_not_success":true}, + {"id":"php-process-handoff-worker-invalid-utf8","target":"ProcessCredentialResolver","omitted_environment":["DURABLE_WORKFLOW_TOKEN","DURABLE_WORKFLOW_CLIENT_TOKEN","DURABLE_WORKFLOW_WORKER_TOKEN"],"process_role":"worker","process_token_case_ref":"php-byte-loader-isolated-ff","expected":"reject-credential","offending_setting":"DURABLE_WORKFLOW_PROCESS_TOKEN","diagnostic_setting_only":true,"generic_mode_or_missing_role_error_is_not_success":true}, + {"id":"php-control-scoped-before-shared","targets":["Client","TokenAuthentication"],"selected_plane":"control","options_case_refs":{"shared":"scalar-upper-case","control":"scalar-ordinary"},"expected":"preserve-selected-text","selected_option":"control","expected_case_ref":"scalar-ordinary"}, + {"id":"php-control-null-falls-back-to-shared","targets":["Client","TokenAuthentication"],"selected_plane":"control","options_case_refs":{"shared":"scalar-upper-case"},"null_options":["control"],"expected":"preserve-selected-text","selected_option":"shared","expected_case_ref":"scalar-upper-case"}, + {"id":"php-control-literal-empty-falls-back-to-shared","targets":["Client","TokenAuthentication"],"selected_plane":"control","options_case_refs":{"shared":"scalar-upper-case"},"empty_options":["control"],"expected":"preserve-selected-text","selected_option":"shared","expected_case_ref":"scalar-upper-case"}, + {"id":"php-control-opposite-only-refuses","targets":["Client","TokenAuthentication"],"selected_plane":"control","options_case_refs":{"worker":"scalar-ordinary"},"expected":"existing-role-refusal-before-request"}, + {"id":"php-worker-scoped-before-shared","targets":["Client","TokenAuthentication"],"selected_plane":"worker","options_case_refs":{"shared":"scalar-upper-case","worker":"scalar-ordinary"},"expected":"preserve-selected-text","selected_option":"worker","expected_case_ref":"scalar-ordinary"}, + {"id":"php-worker-null-falls-back-to-shared","targets":["Client","TokenAuthentication"],"selected_plane":"worker","options_case_refs":{"shared":"scalar-upper-case"},"null_options":["worker"],"expected":"preserve-selected-text","selected_option":"shared","expected_case_ref":"scalar-upper-case"}, + {"id":"php-worker-literal-empty-falls-back-to-shared","targets":["Client","TokenAuthentication"],"selected_plane":"worker","options_case_refs":{"shared":"scalar-upper-case"},"empty_options":["worker"],"expected":"preserve-selected-text","selected_option":"shared","expected_case_ref":"scalar-upper-case"}, + {"id":"php-worker-opposite-only-refuses","targets":["Client","TokenAuthentication"],"selected_plane":"worker","options_case_refs":{"control":"scalar-ordinary"},"expected":"existing-role-refusal-before-request"} + ], + "php_adapter_requirements": {"unrelated_configuration":"valid endpoint, namespace, queue, handlers and bridge settings; no unrelated validation refusal counts","shared_plus_scoped_rows":"the original three SDK pre-selection rows target direct Client/TokenAuthentication, not the bridge mode guard","ProcessCredentialResolver_option_environment":{"shared":"DURABLE_WORKFLOW_TOKEN","control":"DURABLE_WORKFLOW_CLIENT_TOKEN","worker":"DURABLE_WORKFLOW_WORKER_TOKEN"},"materialization":"case refs are materialized into original PHP strings before invocation; hex rows are decoded test input only","environment_limit":"NUL cannot be represented in OS environment values; direct string constructors cover NUL; environment/setup failures are never credential rejection","request_or_transport":"spy only, no HTTP/authentication or real credential; reject before role selection and I/O","positive_selection":"compare exact selected fixture UTF-8 only; no authentication or arbitrary-Unicode HTTP-header success claim"} +} diff --git a/tests/test_static_credential_validation.py b/tests/test_static_credential_validation.py new file mode 100644 index 0000000..c513196 --- /dev/null +++ b/tests/test_static_credential_validation.py @@ -0,0 +1,58 @@ +from __future__ import annotations + +import itertools +import json +from pathlib import Path + +import pytest + +from durable_workflow import Client + +FIXTURE = json.loads( + (Path(__file__).parent / "fixtures/auth_configuration/static-credentials-v1.json").read_text() +) +MAPPING = FIXTURE["language_mappings"]["python"] +OPTIONS = MAPPING["logical_setting_names"] + + +@pytest.mark.parametrize("option", OPTIONS.values()) +@pytest.mark.parametrize("case", FIXTURE["common_scalar_cases"], ids=lambda case: case["id"]) +async def test_common_static_credentials(case: dict, option: str) -> None: + value = "".join(map(chr, case["input_code_points"])) + if case["expected"] == "reject": + with pytest.raises(ValueError) as error: + Client("http://localhost:8080", **{option: value}) + assert str(error.value) == f"{option} must not have edge whitespace or control characters" + else: + async with Client("http://localhost:8080", **{option: value}) as client: + assert getattr(client, option).encode("utf-8").hex() == case["expected_utf8_hex"] + + +@pytest.mark.parametrize("case", FIXTURE["pre_selection_cases"], ids=lambda case: case["id"]) +def test_invalid_unused_credentials_are_refused(case: dict) -> None: + options = { + OPTIONS[name]: "".join(map(chr, points)) for name, points in case["options_code_points"].items() + } + with pytest.raises(ValueError) as error: + Client("http://localhost:8080", **options) + option = OPTIONS[case["offending_option"]] + assert str(error.value) == f"{option} must not have edge whitespace or control characters" + + +@pytest.mark.parametrize("values", list(itertools.product((None, "", "fixture-token"), repeat=3))) +async def test_absence_empty_values_and_role_precedence(values: tuple[str | None, ...]) -> None: + logical = dict(zip(OPTIONS, values, strict=True)) + options = {OPTIONS[name]: value for name, value in logical.items()} + async with Client("http://localhost:8080", **options) as client: + for name, value in options.items(): + assert getattr(client, name) == value + for plane in ("control", "worker"): + expected = next((logical[name] for name in MAPPING[f"{plane}_plane_order"] if logical[name]), None) + opposite = "worker" if plane == "control" else "control" + if expected is None and logical[opposite]: + with pytest.raises(ValueError, match=f"{plane}-plane requests require"): + client._auth_token(worker=plane == "worker") + else: + assert client._auth_token(worker=plane == "worker") == expected + discovery = next((logical[name] for name in MAPPING["discovery_order"] if logical[name]), None) + assert client._discovery_headers().get("Authorization") == (f"Bearer {discovery}" if discovery else None) From 2112796cc203980fe5df8fe45d638e4772e18466 Mon Sep 17 00:00:00 2001 From: Richard McDaniel <1130888+rmcdaniel@users.noreply.github.com> Date: Fri, 13 Nov 2026 09:00:44 +0000 Subject: [PATCH 2/3] Reject malformed static tokens before client role selection --- CHANGELOG.md | 2 ++ src/durable_workflow/client.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d716202..0ef80e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- `Client` refuses supplied `token`, `control_token` and `worker_token` values with edge whitespace or control characters before choosing a role or opening an HTTP client. The error names only the option. Values are never trimmed, and empty values retain their existing fallback behavior. (#304) + - A workflow-task completion the Server refuses as too large (Server 3.6.0's typed `413 payload_too_large` with `limit_kind: workflow_task_completion_bytes`, over 16 payload limits, 32 MiB by default) now raises `WorkflowTaskCompletionTooLarge` with the Server's `limit` and the encoded request `size` (durable-workflow/.github#228). The worker no longer reports this as a workflow-task failure, which made the Server retry the same oversized completion or block replay. It never resends the refused completion: it completes the same task once with a non-retryable `fail_workflow` command whose message starts with `Structural limit exceeded: workflow_task_completion_bytes:`, so the run fails with the `structural_limit` failure category and guidance to split the fan-out, use child workflows or continue-as-new. If that follow-up is rejected too, the worker logs it and never calls `/fail`. Other 413 responses and 5xx retries are unchanged. ## [2.16.0] - 2026-11-12 diff --git a/src/durable_workflow/client.py b/src/durable_workflow/client.py index 1d9aa5c..18e17e8 100644 --- a/src/durable_workflow/client.py +++ b/src/durable_workflow/client.py @@ -1885,6 +1885,16 @@ def _request_body_bytes(request: httpx.Request) -> int | None: return None +def _validate_static_credential(option: str, value: str | None) -> None: + if not value: + return + # Python's extra whitespace code points are Cc controls, also forbidden here. + # Validate the original value, including credentials masked by role fallback. + if (value[0].isspace() or value[-1].isspace() + or any(ord(char) <= 0x1F or 0x7F <= ord(char) <= 0x9F for char in value)): + raise ValueError(f"{option} must not have edge whitespace or control characters") + + class Client: """Async HTTP client for Durable Workflow control-plane and worker APIs. @@ -1897,6 +1907,9 @@ class Client: ``tls_context`` selects an explicit trust configuration. It must require certificate and hostname verification. Treat the context as read-only after construction; worker query clones and Nexus namespace views reuse it. + + Static tokens must have no edge whitespace or control characters. Invalid + values raise ``ValueError`` naming the option, without exposing its value. """ def __init__( @@ -1920,6 +1933,9 @@ def __init__( external_storage_cache: ExternalPayloadCache | None = None, telemetry: ExecutionTelemetry | None = None, ) -> None: + _validate_static_credential("token", token) + _validate_static_credential("control_token", control_token) + _validate_static_credential("worker_token", worker_token) if tls_context is not None: if not isinstance(tls_context, ssl.SSLContext): raise TypeError("tls_context must be an ssl.SSLContext") From 58e348755845a236d7162c191193a861aff70a35 Mon Sep 17 00:00:00 2001 From: Richard McDaniel <1130888+rmcdaniel@users.noreply.github.com> Date: Fri, 13 Nov 2026 09:21:00 +0000 Subject: [PATCH 3/3] Keep credential validation out of the published release notes --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de16525..a84cd8c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- `Client` refuses supplied `token`, `control_token` and `worker_token` values with edge whitespace or control characters before choosing a role or opening an HTTP client. The error names only the option. Values are never trimmed, and empty values retain their existing fallback behavior. (#304) + - Replay supports histories in which a run's own close settled the work it never awaited (server#1193, workflow#1117/#1121, Workflow 2.28.0). When a run completes, fails or continues as new, each still-open activity, such as a `select()` loser, gets an `ActivityCancelled` with `cancellation_reason: run_closed` just before the terminal event. Replay, query and update replay now skip that cancellation and leave the activity open, as the workflow saw it. It never resolves a selection member, never supplies replay time, and is never taken as a list group's first positional failure. Before this fix, a close's cancellation of a lower-index member could replace the failure the workflow handled. Replay also accepts the new `abandoned_activities` key on `WorkflowCompleted`, `WorkflowFailed` and `WorkflowContinuedAsNew`, which lists abandon-policy activities left running at close. - Activity workers treat a `run_closed` refusal as final. A completion refused with `recorded: false, reason: run_closed` is split on its `activity_status`, as in the PHP worker. When it is `completed` or `failed`, the activity was an abandon-policy activity that kept running after its run closed and its own outcome closed it: the task counts as completed and logs at info level. Otherwise the close cancelled the activity: its outcome is dropped, the task is reported as aborted (never completed), and a warning is logged. A failure or cancellation report refused with `run_closed` is not reported again and logs at info level. A claim refused with `run_closed` counts as an answered poll, with no failure backoff. A heartbeat refused with `run_closed` raises `ActivityLeaseAuthorityLost` and publishes no outcome, as before. @@ -25,8 +27,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed -- `Client` refuses supplied `token`, `control_token` and `worker_token` values with edge whitespace or control characters before choosing a role or opening an HTTP client. The error names only the option. Values are never trimmed, and empty values retain their existing fallback behavior. (#304) - - A workflow-task completion the Server refuses as too large (Server 3.6.0's typed `413 payload_too_large` with `limit_kind: workflow_task_completion_bytes`, over 16 payload limits, 32 MiB by default) now raises `WorkflowTaskCompletionTooLarge` with the Server's `limit` and the encoded request `size` (durable-workflow/.github#228). The worker no longer reports this as a workflow-task failure, which made the Server retry the same oversized completion or block replay. It never resends the refused completion: it completes the same task once with a non-retryable `fail_workflow` command whose message starts with `Structural limit exceeded: workflow_task_completion_bytes:`, so the run fails with the `structural_limit` failure category and guidance to split the fan-out, use child workflows or continue-as-new. If that follow-up is rejected too, the worker logs it and never calls `/fail`. Other 413 responses and 5xx retries are unchanged. ## [2.16.0] - 2026-11-12