Skip to content

Commit c6f8b58

Browse files
author
Lukas Pühringer
authored
Merge pull request #2197 from jku/client-robustness
ngclient: Fail gracefully on missing role
2 parents 99b200e + 6450a3a commit c6f8b58

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

tests/test_updater_fetch_target.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from tests import utils
1717
from tests.repository_simulator import RepositorySimulator
1818
from tuf.api.exceptions import RepositoryError
19+
from tuf.api.metadata import DelegatedRole, Delegations
1920
from tuf.ngclient import Updater
2021

2122

@@ -209,6 +210,19 @@ def test_invalid_target_cache(self) -> None:
209210
with open(path, "rb") as f:
210211
self.assertEqual(f.read(), target.content)
211212

213+
def test_meta_missing_delegated_role(self) -> None:
214+
"""Test a delegation where the role is not part of the snapshot"""
215+
216+
# Add new delegation, update snapshot. Do not add the actual role
217+
role = DelegatedRole("role1", [], 1, True, ["*"])
218+
self.sim.targets.delegations = Delegations({}, roles={role.name: role})
219+
self.sim.update_snapshot()
220+
221+
# assert that RepositoryError is raised when role1 is needed
222+
updater = self._init_updater()
223+
with self.assertRaises(RepositoryError):
224+
updater.get_targetinfo("")
225+
212226

213227
if __name__ == "__main__":
214228
if "--dump" in sys.argv:

tuf/ngclient/updater.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,14 @@ def _load_targets(self, role: str, parent_role: str) -> Metadata[Targets]:
391391
logger.debug("Failed to load local %s: %s", role, e)
392392

393393
assert self._trusted_set.snapshot is not None # nosec
394-
metainfo = self._trusted_set.snapshot.signed.meta[f"{role}.json"]
394+
395+
snapshot = self._trusted_set.snapshot.signed
396+
metainfo = snapshot.meta.get(f"{role}.json")
397+
if metainfo is None:
398+
raise exceptions.RepositoryError(
399+
f"Role {role} was delegated but is not part of snapshot"
400+
)
401+
395402
length = metainfo.length or self.config.targets_max_length
396403
version = None
397404
if self._trusted_set.root.signed.consistent_snapshot:

0 commit comments

Comments
 (0)