Skip to content

Commit 8f95162

Browse files
authored
Merge pull request from GHSA-77hh-43cm-v8j6
Metadata API: Fix role lookup for succinct delegation
2 parents 6902c9d + eb4834d commit 8f95162

2 files changed

Lines changed: 33 additions & 3 deletions

File tree

tests/test_api.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,33 @@ def test_get_roles_in_succinct_roles(self) -> None:
11191119
expected_bin_suffix = f"{bin_numer:0{expected_suffix_length}x}"
11201120
self.assertEqual(role_name, f"bin-{expected_bin_suffix}")
11211121

1122+
def test_delegations_get_delegated_role(self) -> None:
1123+
delegations = Delegations({}, {})
1124+
targets = Targets(delegations=delegations)
1125+
1126+
with self.assertRaises(ValueError):
1127+
targets.get_delegated_role("abc")
1128+
1129+
# test "normal" delegated role (path or path_hash_prefix)
1130+
role = DelegatedRole("delegated", [], 1, False, [])
1131+
delegations.roles = {"delegated": role}
1132+
with self.assertRaises(ValueError):
1133+
targets.get_delegated_role("not-delegated")
1134+
self.assertEqual(targets.get_delegated_role("delegated"), role)
1135+
delegations.roles = None
1136+
1137+
# test succinct delegation
1138+
bit_len = 3
1139+
role2 = SuccinctRoles([], 1, bit_len, "prefix")
1140+
delegations.succinct_roles = role2
1141+
for name in ["prefix-", "prefix--1", f"prefix-{2**bit_len:0x}"]:
1142+
with self.assertRaises(ValueError, msg=f"role name '{name}'"):
1143+
targets.get_delegated_role(name)
1144+
for i in range(0, 2**bit_len):
1145+
self.assertEqual(
1146+
targets.get_delegated_role(f"prefix-{i:0x}"), role2
1147+
)
1148+
11221149

11231150
# Run unit test.
11241151
if __name__ == "__main__":

tuf/api/metadata.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2117,10 +2117,13 @@ def get_delegated_role(self, delegated_role: str) -> Role:
21172117
if self.delegations is None:
21182118
raise ValueError("No delegations found")
21192119

2120+
role: Optional[Role] = None
21202121
if self.delegations.roles is not None:
2121-
role: Optional[Role] = self.delegations.roles.get(delegated_role)
2122-
else:
2123-
role = self.delegations.succinct_roles
2122+
role = self.delegations.roles.get(delegated_role)
2123+
elif self.delegations.succinct_roles is not None:
2124+
succinct = self.delegations.succinct_roles
2125+
if succinct.is_delegated_role(delegated_role):
2126+
role = succinct
21242127

21252128
if not role:
21262129
raise ValueError(f"Delegated role {delegated_role} not found")

0 commit comments

Comments
 (0)