Skip to content

Commit 8f9f72d

Browse files
committed
Reject delegated role names that match a top-level role in any case
Signed-off-by: Arpit Jain <arpitjain099@gmail.com>
1 parent 1db1526 commit 8f9f72d

2 files changed

Lines changed: 10 additions & 1 deletion

File tree

‎tests/test_metadata_serialization.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,11 @@ def test_invalid_succinct_roles_serialization(self, test_data: str) -> None:
490490
{"keyids": ["keyid1"], "name": "b", "terminating": true, "paths": ["fn1"], "threshold": 3}, \
491491
{"keyids": ["keyid2"], "name": "root", "terminating": true, "paths": ["fn2"], "threshold": 4} ] \
492492
}',
493+
"using top-level role name in a different case": '{"keys": { \
494+
"keyid1" : {"keytype": "rsa", "scheme": "rsassa-pss-sha256", "keyval": {"public": "foo"}}}, \
495+
"roles": [ \
496+
{"keyids": ["keyid1"], "name": "Root", "terminating": true, "paths": ["fn1"], "threshold": 3}] \
497+
}',
493498
"roles and succinct_roles set": '{"keys": { \
494499
"keyid1" : {"keytype": "rsa", "scheme": "rsassa-pss-sha256", "keyval": {"public": "foo"}}, \
495500
"keyid2" : {"keytype": "ed25519", "scheme": "ed25519", "keyval": {"public": "bar"}}}, \

‎tuf/api/_payload.py‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1428,7 +1428,11 @@ def __init__(
14281428

14291429
if roles is not None:
14301430
for role in roles:
1431-
if not role or role in TOP_LEVEL_ROLE_NAMES:
1431+
# Compare case-insensitively: the client stores delegated
1432+
# metadata as "<quoted rolename>.json", and quoting leaves
1433+
# ASCII letters alone, so "Root" and "root" are the same file
1434+
# on a case-insensitive filesystem.
1435+
if not role or role.lower() in TOP_LEVEL_ROLE_NAMES:
14321436
raise ValueError(
14331437
"Delegated roles cannot be empty or use top-level "
14341438
"role names"

0 commit comments

Comments
 (0)