From 0cbe2a20344255f62ca8e4b186e3db0ec930440e Mon Sep 17 00:00:00 2001 From: Martin Vrachev Date: Thu, 16 Dec 2021 19:58:39 +0200 Subject: [PATCH] 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 --- tests/test_trusted_metadata_set.py | 6 ++-- tests/test_updater_top_level_update.py | 11 ++++---- tuf/api/exceptions.py | 26 ----------------- .../_internal/trusted_metadata_set.py | 28 ++++++++----------- 4 files changed, 20 insertions(+), 51 deletions(-) diff --git a/tests/test_trusted_metadata_set.py b/tests/test_trusted_metadata_set.py index b746af88..b891aafd 100644 --- a/tests/test_trusted_metadata_set.py +++ b/tests/test_trusted_metadata_set.py @@ -245,7 +245,7 @@ def test_update_root_new_root_fail_threshold_verification(self) -> None: self.trusted_set.update_root(root.to_bytes()) def test_update_root_new_root_ver_same_as_trusted_root_ver(self) -> None: - with self.assertRaises(exceptions.ReplayedMetadataError): + with self.assertRaises(exceptions.BadVersionNumberError): self.trusted_set.update_root(self.metadata[Root.type]) def test_root_expired_final_root(self) -> None: @@ -266,7 +266,7 @@ def version_modifier(timestamp: Timestamp) -> None: timestamp = self.modify_metadata(Timestamp.type, version_modifier) self.trusted_set.update_timestamp(timestamp) - with self.assertRaises(exceptions.ReplayedMetadataError): + with self.assertRaises(exceptions.BadVersionNumberError): self.trusted_set.update_timestamp(self.metadata[Timestamp.type]) def test_update_timestamp_snapshot_ver_below_current(self) -> None: @@ -278,7 +278,7 @@ def bump_snapshot_version(timestamp: Timestamp) -> None: self.trusted_set.update_timestamp(timestamp) # newtimestamp.meta.version < trusted_timestamp.meta.version - with self.assertRaises(exceptions.ReplayedMetadataError): + with self.assertRaises(exceptions.BadVersionNumberError): self.trusted_set.update_timestamp(self.metadata[Timestamp.type]) def test_update_timestamp_expired(self) -> None: diff --git a/tests/test_updater_top_level_update.py b/tests/test_updater_top_level_update.py index ca949cf1..d8e28f09 100644 --- a/tests/test_updater_top_level_update.py +++ b/tests/test_updater_top_level_update.py @@ -19,7 +19,6 @@ from tuf.api.exceptions import ( BadVersionNumberError, ExpiredMetadataError, - ReplayedMetadataError, RepositoryError, UnsignedMetadataError, ) @@ -267,7 +266,7 @@ def test_new_root_same_version(self) -> None: # Check for a rollback_attack # Repository serves a root file with the same version as previous self.sim.publish_root() - with self.assertRaises(ReplayedMetadataError): + with self.assertRaises(BadVersionNumberError): self._run_refresh() # The update failed, latest root version is v1 @@ -278,7 +277,7 @@ def test_new_root_nonconsecutive_version(self) -> None: # Repository serves non-consecutive root version self.sim.root.version += 2 self.sim.publish_root() - with self.assertRaises(ReplayedMetadataError): + with self.assertRaises(BadVersionNumberError): self._run_refresh() # The update failed, latest root version is v1 @@ -313,7 +312,7 @@ def test_new_timestamp_version_rollback(self) -> None: self._run_refresh() self.sim.timestamp.version = 1 - with self.assertRaises(ReplayedMetadataError): + with self.assertRaises(BadVersionNumberError): self._run_refresh() self._assert_version_equals(Timestamp.type, 2) @@ -328,7 +327,7 @@ def test_new_timestamp_snapshot_rollback(self) -> None: self.sim.timestamp.snapshot_meta.version = 1 self.sim.timestamp.version += 1 # timestamp v3 - with self.assertRaises(ReplayedMetadataError): + with self.assertRaises(BadVersionNumberError): self._run_refresh() self._assert_version_equals(Timestamp.type, 2) @@ -423,7 +422,7 @@ def test_new_snapshot_version_rollback(self) -> None: self.sim.snapshot.version = 1 self.sim.update_timestamp() - with self.assertRaises(ReplayedMetadataError): + with self.assertRaises(BadVersionNumberError): self._run_refresh() self._assert_version_equals(Snapshot.type, 2) diff --git a/tuf/api/exceptions.py b/tuf/api/exceptions.py index 60a3041d..cd0c5b2d 100644 --- a/tuf/api/exceptions.py +++ b/tuf/api/exceptions.py @@ -39,32 +39,6 @@ class ExpiredMetadataError(RepositoryError): """Indicate that a TUF Metadata file has expired.""" -class ReplayedMetadataError(RepositoryError): - """Indicate that some metadata has been replayed to the client. - - Args: - metadata_role: Name of the role that has been replayed - downloaded_version: The replayed downloaded version of the metadata - current_version: The current locally available version. - """ - - def __init__( - self, metadata_role: str, downloaded_version: int, current_version: int - ) -> None: - super().__init__() - - self.metadata_role = metadata_role - self.downloaded_version = downloaded_version - self.current_version = current_version - - def __str__(self) -> str: - return ( - f"Downloaded {self.metadata_role} is older (" - f"{self.downloaded_version}) than the version currently installed" - f"({self.current_version})" - ) - - #### Download Errors #### diff --git a/tuf/ngclient/_internal/trusted_metadata_set.py b/tuf/ngclient/_internal/trusted_metadata_set.py index 427d7ecb..b93d473e 100644 --- a/tuf/ngclient/_internal/trusted_metadata_set.py +++ b/tuf/ngclient/_internal/trusted_metadata_set.py @@ -175,10 +175,9 @@ def update_root(self, data: bytes) -> Metadata[Root]: self.root.verify_delegate(Root.type, new_root) if new_root.signed.version != self.root.signed.version + 1: - raise exceptions.ReplayedMetadataError( - Root.type, - new_root.signed.version, - self.root.signed.version, + raise exceptions.BadVersionNumberError( + f"Expected root version {self.root.signed.version + 1}" + f" instead got version {new_root.signed.version}" ) # Verify that new root is signed by itself @@ -236,20 +235,17 @@ def update_timestamp(self, data: bytes) -> Metadata[Timestamp]: if self.timestamp is not None: # Prevent rolling back timestamp version if new_timestamp.signed.version < self.timestamp.signed.version: - raise exceptions.ReplayedMetadataError( - Timestamp.type, - new_timestamp.signed.version, - self.timestamp.signed.version, + raise exceptions.BadVersionNumberError( + f"New timestamp version {new_timestamp.signed.version} must" + f" be >= {self.timestamp.signed.version}" ) # Prevent rolling back snapshot version - if ( - new_timestamp.signed.snapshot_meta.version - < self.timestamp.signed.snapshot_meta.version - ): - raise exceptions.ReplayedMetadataError( - Snapshot.type, - new_timestamp.signed.snapshot_meta.version, - self.timestamp.signed.snapshot_meta.version, + snapshot_meta = self.timestamp.signed.snapshot_meta + new_snapshot_meta = new_timestamp.signed.snapshot_meta + if new_snapshot_meta.version < snapshot_meta.version: + raise exceptions.BadVersionNumberError( + f"New snapshot version must be >= {snapshot_meta.version}" + f", got version {new_snapshot_meta.version}" ) # expiry not checked to allow old timestamp to be used for rollback