Skip to content

Commit 5de906e

Browse files
committed
Fix substring matches in WWW-Authenticate parsing
1 parent 0da9092 commit 5de906e

2 files changed

Lines changed: 9 additions & 2 deletions

File tree

src/mcp/client/auth/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ def extract_field_from_www_auth(response: Response, field_name: str) -> str | No
2626
if not www_auth_header:
2727
return None
2828

29-
# Pattern matches: field_name="value" or field_name=value (unquoted)
30-
pattern = rf'{field_name}=(?:"([^"]+)"|([^\s,]+))'
29+
# Match a complete auth-param name at the header start or after a separator.
30+
pattern = rf'(?:^|[\s,]){re.escape(field_name)}=(?:"([^"]+)"|([^\s,]+))'
3131
match = re.search(pattern, www_auth_header)
3232

3333
if match:

tests/client/test_auth.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,6 +2016,7 @@ class TestWWWAuthenticate:
20162016
"resource_metadata",
20172017
"https://api.example.com/auth/metadata?version=1",
20182018
),
2019+
('Bearer error_scope="decoy", scope="read write"', "scope", "read write"),
20192020
],
20202021
)
20212022
def test_extract_field_from_www_auth_valid_cases(
@@ -2047,6 +2048,12 @@ def test_extract_field_from_www_auth_valid_cases(
20472048
# Header without requested field
20482049
('Bearer realm="api", error="insufficient_scope"', "scope", "no scope parameter"),
20492050
('Bearer realm="api", scope="read write"', "resource_metadata", "no resource_metadata parameter"),
2051+
('Bearer custom_scope="leaked"', "scope", "field name appears only as a substring"),
2052+
(
2053+
'Bearer x_resource_metadata="https://decoy.example.com"',
2054+
"resource_metadata",
2055+
"field name appears only as a substring",
2056+
),
20502057
# Malformed field (empty value)
20512058
("Bearer scope=", "scope", "malformed scope parameter"),
20522059
("Bearer resource_metadata=", "resource_metadata", "malformed resource_metadata parameter"),

0 commit comments

Comments
 (0)