Skip to content

Commit 0ac86c6

Browse files
authored
repository: handle online key changes (#2650)
* repository: Handle online key change situations in do_snapshot() and do_timestamp(): always create a new version if current version is not correctly signed * remove expectedFailure marks from the related tests Signed-off-by: h4l0gen <ks3913688@gmail.com> Signed-off-by: Kapil Sharma <ks3913688@gmail.com>
1 parent d2afc09 commit 0ac86c6

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

tests/test_repository.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,6 @@ def test_do_snapshot_after_new_targets_delegation(self) -> None:
186186
self.assertEqual(2, len(snapshot_versions))
187187
self.assertEqual(2, snapshot_versions[-1].signed.version)
188188

189-
@unittest.expectedFailure # Issue 2438
190189
def test_do_snapshot_after_snapshot_key_change(self) -> None:
191190
# change snapshot signing keys
192191
with self.repo.edit_root() as root:
@@ -228,7 +227,6 @@ def test_do_timestamp_after_snapshot_change(self) -> None:
228227
self.assertEqual(2, len(timestamp_versions))
229228
self.assertEqual(2, timestamp_versions[-1].signed.version)
230229

231-
@unittest.expectedFailure # Issue 2438
232230
def test_do_timestamp_after_timestamp_key_change(self) -> None:
233231
# change timestamp signing keys
234232
with self.repo.edit_root() as root:

tuf/repository/_repository.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from copy import deepcopy
1010
from typing import Dict, Generator, Optional, Tuple
1111

12+
from tuf.api.exceptions import UnsignedMetadataError
1213
from tuf.api.metadata import (
1314
Metadata,
1415
MetaFile,
@@ -188,6 +189,18 @@ def do_snapshot(
188189
update_version = force
189190
removed: Dict[str, MetaFile] = {}
190191

192+
root = self.root()
193+
snapshot_md = self.open(Snapshot.type)
194+
195+
try:
196+
root.verify_delegate(
197+
Snapshot.type,
198+
snapshot_md.signed_bytes,
199+
snapshot_md.signatures,
200+
)
201+
except UnsignedMetadataError:
202+
update_version = True
203+
191204
with self.edit_snapshot() as snapshot:
192205
for keyname, new_meta in self.targets_infos.items():
193206
if keyname not in snapshot.meta:
@@ -228,6 +241,19 @@ def do_timestamp(
228241
"""
229242
update_version = force
230243
removed = None
244+
245+
root = self.root()
246+
timestamp_md = self.open(Timestamp.type)
247+
248+
try:
249+
root.verify_delegate(
250+
Timestamp.type,
251+
timestamp_md.signed_bytes,
252+
timestamp_md.signatures,
253+
)
254+
except UnsignedMetadataError:
255+
update_version = True
256+
231257
with self.edit_timestamp() as timestamp:
232258
if self.snapshot_info.version < timestamp.snapshot_meta.version:
233259
raise ValueError("snapshot version rollback")

0 commit comments

Comments
 (0)