Skip to content

Commit 6ab2bc3

Browse files
committed
Remove ReplayedMetadataError
ReplayedMetadataError is a subset of BadVersionNumberError and in a discussion with Jussi we realized that ReplayedMetadataError can be replaced by BadVersionNumberError with a good message. Signed-off-by: Martin Vrachev <[email protected]>
1 parent 62e2c9c commit 6ab2bc3

File tree

4 files changed

+20
-51
lines changed

4 files changed

+20
-51
lines changed

tests/test_trusted_metadata_set.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def test_update_root_new_root_fail_threshold_verification(self) -> None:
245245
self.trusted_set.update_root(root.to_bytes())
246246

247247
def test_update_root_new_root_ver_same_as_trusted_root_ver(self) -> None:
248-
with self.assertRaises(exceptions.ReplayedMetadataError):
248+
with self.assertRaises(exceptions.BadVersionNumberError):
249249
self.trusted_set.update_root(self.metadata[Root.type])
250250

251251
def test_root_expired_final_root(self) -> None:
@@ -266,7 +266,7 @@ def version_modifier(timestamp: Timestamp) -> None:
266266

267267
timestamp = self.modify_metadata(Timestamp.type, version_modifier)
268268
self.trusted_set.update_timestamp(timestamp)
269-
with self.assertRaises(exceptions.ReplayedMetadataError):
269+
with self.assertRaises(exceptions.BadVersionNumberError):
270270
self.trusted_set.update_timestamp(self.metadata[Timestamp.type])
271271

272272
def test_update_timestamp_snapshot_ver_below_current(self) -> None:
@@ -278,7 +278,7 @@ def bump_snapshot_version(timestamp: Timestamp) -> None:
278278
self.trusted_set.update_timestamp(timestamp)
279279

280280
# newtimestamp.meta.version < trusted_timestamp.meta.version
281-
with self.assertRaises(exceptions.ReplayedMetadataError):
281+
with self.assertRaises(exceptions.BadVersionNumberError):
282282
self.trusted_set.update_timestamp(self.metadata[Timestamp.type])
283283

284284
def test_update_timestamp_expired(self) -> None:

tests/test_updater_top_level_update.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
from tuf.api.exceptions import (
1818
BadVersionNumberError,
1919
ExpiredMetadataError,
20-
ReplayedMetadataError,
2120
RepositoryError,
2221
UnsignedMetadataError,
2322
)
@@ -263,7 +262,7 @@ def test_new_root_same_version(self) -> None:
263262
# Check for a rollback_attack
264263
# Repository serves a root file with the same version as previous
265264
self.sim.publish_root()
266-
with self.assertRaises(ReplayedMetadataError):
265+
with self.assertRaises(BadVersionNumberError):
267266
self._run_refresh()
268267

269268
# The update failed, latest root version is v1
@@ -274,7 +273,7 @@ def test_new_root_nonconsecutive_version(self) -> None:
274273
# Repository serves non-consecutive root version
275274
self.sim.root.version += 2
276275
self.sim.publish_root()
277-
with self.assertRaises(ReplayedMetadataError):
276+
with self.assertRaises(BadVersionNumberError):
278277
self._run_refresh()
279278

280279
# The update failed, latest root version is v1
@@ -309,7 +308,7 @@ def test_new_timestamp_version_rollback(self) -> None:
309308
self._run_refresh()
310309

311310
self.sim.timestamp.version = 1
312-
with self.assertRaises(ReplayedMetadataError):
311+
with self.assertRaises(BadVersionNumberError):
313312
self._run_refresh()
314313

315314
self._assert_version_equals(Timestamp.type, 2)
@@ -324,7 +323,7 @@ def test_new_timestamp_snapshot_rollback(self) -> None:
324323
self.sim.timestamp.snapshot_meta.version = 1
325324
self.sim.timestamp.version += 1 # timestamp v3
326325

327-
with self.assertRaises(ReplayedMetadataError):
326+
with self.assertRaises(BadVersionNumberError):
328327
self._run_refresh()
329328

330329
self._assert_version_equals(Timestamp.type, 2)
@@ -388,7 +387,7 @@ def test_new_snapshot_version_rollback(self) -> None:
388387
self.sim.snapshot.version = 1
389388
self.sim.update_timestamp()
390389

391-
with self.assertRaises(ReplayedMetadataError):
390+
with self.assertRaises(BadVersionNumberError):
392391
self._run_refresh()
393392

394393
self._assert_version_equals(Snapshot.type, 2)

tuf/api/exceptions.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -39,32 +39,6 @@ class ExpiredMetadataError(RepositoryError):
3939
"""Indicate that a TUF Metadata file has expired."""
4040

4141

42-
class ReplayedMetadataError(RepositoryError):
43-
"""Indicate that some metadata has been replayed to the client.
44-
45-
Args:
46-
metadata_role: Name of the role that has been replayed
47-
downloaded_version: The replayed downloaded version of the metadata
48-
current_version: The current locally available version.
49-
"""
50-
51-
def __init__(
52-
self, metadata_role: str, downloaded_version: int, current_version: int
53-
) -> None:
54-
super().__init__()
55-
56-
self.metadata_role = metadata_role
57-
self.downloaded_version = downloaded_version
58-
self.current_version = current_version
59-
60-
def __str__(self) -> str:
61-
return (
62-
f"Downloaded {self.metadata_role} is older ("
63-
f"{self.downloaded_version}) than the version currently installed"
64-
f"({self.current_version})"
65-
)
66-
67-
6842
#### Download Errors ####
6943

7044

tuf/ngclient/_internal/trusted_metadata_set.py

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -175,10 +175,9 @@ def update_root(self, data: bytes) -> Metadata[Root]:
175175
self.root.verify_delegate(Root.type, new_root)
176176

177177
if new_root.signed.version != self.root.signed.version + 1:
178-
raise exceptions.ReplayedMetadataError(
179-
Root.type,
180-
new_root.signed.version,
181-
self.root.signed.version,
178+
raise exceptions.BadVersionNumberError(
179+
f"Expected root version {self.root.signed.version + 1}"
180+
f" instead got version {new_root.signed.version}"
182181
)
183182

184183
# Verify that new root is signed by itself
@@ -236,20 +235,17 @@ def update_timestamp(self, data: bytes) -> Metadata[Timestamp]:
236235
if self.timestamp is not None:
237236
# Prevent rolling back timestamp version
238237
if new_timestamp.signed.version < self.timestamp.signed.version:
239-
raise exceptions.ReplayedMetadataError(
240-
Timestamp.type,
241-
new_timestamp.signed.version,
242-
self.timestamp.signed.version,
238+
raise exceptions.BadVersionNumberError(
239+
f"New timestamp version {new_timestamp.signed.version} must"
240+
f" be above {self.timestamp.signed.version}"
243241
)
244242
# Prevent rolling back snapshot version
245-
if (
246-
new_timestamp.signed.snapshot_meta.version
247-
< self.timestamp.signed.snapshot_meta.version
248-
):
249-
raise exceptions.ReplayedMetadataError(
250-
Snapshot.type,
251-
new_timestamp.signed.snapshot_meta.version,
252-
self.timestamp.signed.snapshot_meta.version,
243+
snapshot_meta = self.timestamp.signed.snapshot_meta
244+
new_snapshot_meta = new_timestamp.signed.snapshot_meta
245+
if new_snapshot_meta.version < snapshot_meta.version:
246+
raise exceptions.BadVersionNumberError(
247+
f"New snapshot version must be > {snapshot_meta.version}"
248+
f", got version {new_snapshot_meta.version}"
253249
)
254250

255251
# expiry not checked to allow old timestamp to be used for rollback

0 commit comments

Comments
 (0)