Skip to content

Commit ce14e93

Browse files
author
Jussi Kukkonen
committed
Rename MetadataBundle to TrustedMetadataSet
TrustedMetadataSet is a long name but * it better describes the main feature * the name isn't used in too many places Change the variable names "bundle" -> "trusted_set" Signed-off-by: Jussi Kukkonen <[email protected]>
1 parent 85f2219 commit ce14e93

File tree

3 files changed

+81
-77
lines changed

3 files changed

+81
-77
lines changed

tests/test_metadata_bundle.py renamed to tests/test_trusted_metadata_set.py

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,31 @@
88

99
from tuf import exceptions
1010
from tuf.api.metadata import Metadata
11-
from tuf.ngclient._internal.metadata_bundle import MetadataBundle
11+
from tuf.ngclient._internal.trusted_metadata_set import TrustedMetadataSet
1212

1313
from tests import utils
1414

1515
logger = logging.getLogger(__name__)
1616

17-
class TestMetadataBundle(unittest.TestCase):
17+
class TestTrustedMetadataSet(unittest.TestCase):
1818

1919
def test_update(self):
2020
repo_dir = os.path.join(os.getcwd(), 'repository_data', 'repository', 'metadata')
2121

2222
with open(os.path.join(repo_dir, "root.json"), "rb") as f:
23-
bundle = MetadataBundle(f.read())
24-
bundle.root_update_finished()
23+
trusted_set = TrustedMetadataSet(f.read())
24+
trusted_set.root_update_finished()
2525

2626
with open(os.path.join(repo_dir, "timestamp.json"), "rb") as f:
27-
bundle.update_timestamp(f.read())
27+
trusted_set.update_timestamp(f.read())
2828
with open(os.path.join(repo_dir, "snapshot.json"), "rb") as f:
29-
bundle.update_snapshot(f.read())
29+
trusted_set.update_snapshot(f.read())
3030
with open(os.path.join(repo_dir, "targets.json"), "rb") as f:
31-
bundle.update_targets(f.read())
31+
trusted_set.update_targets(f.read())
3232
with open(os.path.join(repo_dir, "role1.json"), "rb") as f:
33-
bundle.update_delegated_targets(f.read(), "role1", "targets")
33+
trusted_set.update_delegated_targets(f.read(), "role1", "targets")
3434
with open(os.path.join(repo_dir, "role2.json"), "rb") as f:
35-
bundle.update_delegated_targets(f.read(), "role2", "role1")
35+
trusted_set.update_delegated_targets(f.read(), "role2", "role1")
3636

3737
def test_out_of_order_ops(self):
3838
repo_dir = os.path.join(os.getcwd(), 'repository_data', 'repository', 'metadata')
@@ -41,38 +41,38 @@ def test_out_of_order_ops(self):
4141
with open(os.path.join(repo_dir, f"{md}.json"), "rb") as f:
4242
data[md] = f.read()
4343

44-
bundle = MetadataBundle(data["root"])
44+
trusted_set = TrustedMetadataSet(data["root"])
4545

4646
# Update timestamp before root is finished
4747
with self.assertRaises(RuntimeError):
48-
bundle.update_timestamp(data["timestamp"])
48+
trusted_set.update_timestamp(data["timestamp"])
4949

50-
bundle.root_update_finished()
50+
trusted_set.root_update_finished()
5151
with self.assertRaises(RuntimeError):
52-
bundle.root_update_finished()
52+
trusted_set.root_update_finished()
5353

5454
# Update snapshot before timestamp
5555
with self.assertRaises(RuntimeError):
56-
bundle.update_snapshot(data["snapshot"])
56+
trusted_set.update_snapshot(data["snapshot"])
5757

58-
bundle.update_timestamp(data["timestamp"])
58+
trusted_set.update_timestamp(data["timestamp"])
5959

6060
# Update targets before snapshot
6161
with self.assertRaises(RuntimeError):
62-
bundle.update_targets(data["targets"])
62+
trusted_set.update_targets(data["targets"])
6363

64-
bundle.update_snapshot(data["snapshot"])
64+
trusted_set.update_snapshot(data["snapshot"])
6565

6666
#update timestamp after snapshot
6767
with self.assertRaises(RuntimeError):
68-
bundle.update_timestamp(data["timestamp"])
68+
trusted_set.update_timestamp(data["timestamp"])
6969

7070
# Update delegated targets before targets
7171
with self.assertRaises(RuntimeError):
72-
bundle.update_delegated_targets(data["role1"], "role1", "targets")
72+
trusted_set.update_delegated_targets(data["role1"], "role1", "targets")
7373

74-
bundle.update_targets(data["targets"])
75-
bundle.update_delegated_targets(data["role1"], "role1", "targets")
74+
trusted_set.update_targets(data["targets"])
75+
trusted_set.update_delegated_targets(data["role1"], "role1", "targets")
7676

7777
def test_update_with_invalid_json(self):
7878
repo_dir = os.path.join(os.getcwd(), 'repository_data', 'repository', 'metadata')
@@ -83,20 +83,20 @@ def test_update_with_invalid_json(self):
8383

8484
# root.json not a json file at all
8585
with self.assertRaises(exceptions.RepositoryError):
86-
MetadataBundle(b"")
86+
TrustedMetadataSet(b"")
8787
# root.json is invalid
8888
root = Metadata.from_bytes(data["root"])
8989
root.signed.version += 1
9090
with self.assertRaises(exceptions.RepositoryError):
91-
MetadataBundle(json.dumps(root.to_dict()).encode())
91+
TrustedMetadataSet(json.dumps(root.to_dict()).encode())
9292

93-
bundle = MetadataBundle(data["root"])
94-
bundle.root_update_finished()
93+
trusted_set = TrustedMetadataSet(data["root"])
94+
trusted_set.root_update_finished()
9595

9696
top_level_md = [
97-
(data["timestamp"], bundle.update_timestamp),
98-
(data["snapshot"], bundle.update_snapshot),
99-
(data["targets"], bundle.update_targets),
97+
(data["timestamp"], trusted_set.update_timestamp),
98+
(data["snapshot"], trusted_set.update_snapshot),
99+
(data["targets"], trusted_set.update_targets),
100100
]
101101
for metadata, update_func in top_level_md:
102102
# metadata is not json

tuf/ngclient/_internal/metadata_bundle.py renamed to tuf/ngclient/_internal/trusted_metadata_set.py

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
# Copyright the TUF contributors
22
# SPDX-License-Identifier: MIT OR Apache-2.0
33

4-
"""TUF client bundle-of-metadata
4+
"""Trusted collection of client-side TUF Metadata
55
6-
MetadataBundle keeps track of current valid set of metadata for the client,
6+
TrustedMetadataSet keeps track of current valid set of metadata for the client,
77
and handles almost every step of the "Detailed client workflow" (
88
https://theupdateframework.github.io/specification/latest#detailed-client-workflow)
99
in the TUF specification: the remaining steps are related to filesystem and
1010
network IO which is not handled here.
1111
1212
Loaded metadata can be accessed via the index access with rolename as key
13-
(bundle["root"]) or, in the case of top-level metadata using the helper
14-
properties (bundle.root).
13+
(trusted_set["root"]) or, in the case of top-level metadata using the helper
14+
properties (trusted_set.root).
1515
1616
The rules for top-level metadata are
1717
* Metadata is loadable only if metadata it depends on is loaded
@@ -26,33 +26,33 @@
2626
2727
>>> # Load local root (RepositoryErrors here stop the update)
2828
>>> with open(root_path, "rb") as f:
29-
>>> bundle = MetadataBundle(f.read())
29+
>>> trusted_set = TrustedMetadataSet(f.read())
3030
>>>
3131
>>> # update root from remote until no more are available
32-
>>> with download("root", bundle.root.signed.version + 1) as f:
33-
>>> bundle.update_root(f.read())
32+
>>> with download("root", trusted_set.root.signed.version + 1) as f:
33+
>>> trusted_set.update_root(f.read())
3434
>>> # ...
35-
>>> bundle.root_update_finished()
35+
>>> trusted_set.root_update_finished()
3636
>>>
3737
>>> # load local timestamp, then update from remote
3838
>>> try:
3939
>>> with open(timestamp_path, "rb") as f:
40-
>>> bundle.update_timestamp(f.read())
40+
>>> trusted_set.update_timestamp(f.read())
4141
>>> except (RepositoryError, OSError):
4242
>>> pass # failure to load a local file is ok
4343
>>>
4444
>>> with download("timestamp") as f:
45-
>>> bundle.update_timestamp(f.read())
45+
>>> trusted_set.update_timestamp(f.read())
4646
>>>
4747
>>> # load local snapshot, then update from remote if needed
4848
>>> try:
4949
>>> with open(snapshot_path, "rb") as f:
50-
>>> bundle.update_snapshot(f.read())
50+
>>> trusted_set.update_snapshot(f.read())
5151
>>> except (RepositoryError, OSError):
5252
>>> # local snapshot is not valid, load from remote
5353
>>> # (RepositoryErrors here stop the update)
5454
>>> with download("snapshot", version) as f:
55-
>>> bundle.update_snapshot(f.read())
55+
>>> trusted_set.update_snapshot(f.read())
5656
5757
TODO:
5858
* exceptions are not final: the idea is that client could just handle
@@ -116,27 +116,27 @@ def verify_with_threshold(
116116
return len(unique_keys) >= role.threshold
117117

118118

119-
class MetadataBundle(abc.Mapping):
120-
"""Internal class to keep track of valid metadata in Updater
119+
class TrustedMetadataSet(abc.Mapping):
120+
"""Internal class to keep track of trusted metadata in Updater
121121
122-
MetadataBundle ensures that the collection of metadata in the bundle is
123-
valid. It provides easy ways to update the metadata with the caller making
124-
decisions on what is updated.
122+
TrustedMetadataSet ensures that the collection of metadata in it is valid
123+
and trusted through the whole client update workflow. It provides easy ways
124+
to update the metadata with the caller making decisions on what is updated.
125125
"""
126126

127127
def __init__(self, root_data: bytes):
128-
"""Initialize bundle by loading trusted root metadata
128+
"""Initialize TrustedMetadataSet by loading trusted root metadata
129129
130130
Args:
131131
root_data: Trusted root metadata as bytes. Note that this metadata
132132
will only be verified by itself: it is the source of trust for
133-
all metadata in the bundle.
133+
all metadata in the TrustedMetadataSet
134134
135135
Raises:
136136
RepositoryError: Metadata failed to load or verify. The actual
137137
error type and content will contain more details.
138138
"""
139-
self._bundle = {} # type: Dict[str: Metadata]
139+
self._trusted_set = {} # type: Dict[str: Metadata]
140140
self.reference_time = datetime.utcnow()
141141
self._root_update_finished = False
142142

@@ -147,36 +147,36 @@ def __init__(self, root_data: bytes):
147147

148148
def __getitem__(self, role: str) -> Metadata:
149149
"""Returns current Metadata for 'role'"""
150-
return self._bundle[role]
150+
return self._trusted_set[role]
151151

152152
def __len__(self) -> int:
153-
"""Returns number of Metadata objects in bundle"""
154-
return len(self._bundle)
153+
"""Returns number of Metadata objects in TrustedMetadataSet"""
154+
return len(self._trusted_set)
155155

156156
def __iter__(self) -> Iterator[Metadata]:
157-
"""Returns iterator over all Metadata objects in bundle"""
158-
return iter(self._bundle)
157+
"""Returns iterator over all Metadata objects in TrustedMetadataSet"""
158+
return iter(self._trusted_set)
159159

160160
# Helper properties for top level metadata
161161
@property
162162
def root(self) -> Optional[Metadata]:
163163
"""Current root Metadata or None"""
164-
return self._bundle.get("root")
164+
return self._trusted_set.get("root")
165165

166166
@property
167167
def timestamp(self) -> Optional[Metadata]:
168168
"""Current timestamp Metadata or None"""
169-
return self._bundle.get("timestamp")
169+
return self._trusted_set.get("timestamp")
170170

171171
@property
172172
def snapshot(self) -> Optional[Metadata]:
173173
"""Current snapshot Metadata or None"""
174-
return self._bundle.get("snapshot")
174+
return self._trusted_set.get("snapshot")
175175

176176
@property
177177
def targets(self) -> Optional[Metadata]:
178178
"""Current targets Metadata or None"""
179-
return self._bundle.get("targets")
179+
return self._trusted_set.get("targets")
180180

181181
# Methods for updating metadata
182182
def update_root(self, data: bytes):
@@ -225,7 +225,7 @@ def update_root(self, data: bytes):
225225
"New root is not signed by itself", new_root.signed
226226
)
227227

228-
self._bundle["root"] = new_root
228+
self._trusted_set["root"] = new_root
229229
logger.debug("Updated root")
230230

231231
def root_update_finished(self):
@@ -302,7 +302,7 @@ def update_timestamp(self, data: bytes):
302302
if new_timestamp.signed.is_expired(self.reference_time):
303303
raise exceptions.ExpiredMetadataError("New timestamp is expired")
304304

305-
self._bundle["timestamp"] = new_timestamp
305+
self._trusted_set["timestamp"] = new_timestamp
306306
logger.debug("Updated timestamp")
307307

308308
# TODO: remove pylint disable once the hash verification is in metadata.py
@@ -381,7 +381,7 @@ def update_snapshot(self, data: bytes): # pylint: disable=too-many-branches
381381
if new_snapshot.signed.is_expired(self.reference_time):
382382
raise exceptions.ExpiredMetadataError("New snapshot is expired")
383383

384-
self._bundle["snapshot"] = new_snapshot
384+
self._trusted_set["snapshot"] = new_snapshot
385385
logger.debug("Updated snapshot")
386386

387387
def update_targets(self, data: bytes):
@@ -460,5 +460,5 @@ def update_delegated_targets(
460460
if new_delegate.signed.is_expired(self.reference_time):
461461
raise exceptions.ExpiredMetadataError(f"New {role_name} is expired")
462462

463-
self._bundle[role_name] = new_delegate
463+
self._trusted_set[role_name] = new_delegate
464464
logger.debug("Updated %s delegated by %s", role_name, delegator_name)

0 commit comments

Comments
 (0)