10
10
network IO, which are not handled here.
11
11
12
12
Loaded metadata can be accessed via index access with rolename as key
13
- (trusted_set["root" ]) or, in the case of top-level metadata, using the helper
13
+ (trusted_set[Root.type ]) or, in the case of top-level metadata, using the helper
14
14
properties (trusted_set.root).
15
15
16
16
The rules that TrustedMetadataSet follows for top-level metadata are
35
35
>>> trusted_set = TrustedMetadataSet(f.read())
36
36
>>>
37
37
>>> # update root from remote until no more are available
38
- >>> with download("root" , trusted_set.root.signed.version + 1) as f:
38
+ >>> with download(Root.type , trusted_set.root.signed.version + 1) as f:
39
39
>>> trusted_set.update_root(f.read())
40
40
>>>
41
41
>>> # load local timestamp, then update from remote
45
45
>>> except (RepositoryError, OSError):
46
46
>>> pass # failure to load a local file is ok
47
47
>>>
48
- >>> with download("timestamp" ) as f:
48
+ >>> with download(Timestamp.type ) as f:
49
49
>>> trusted_set.update_timestamp(f.read())
50
50
>>>
51
51
>>> # load local snapshot, then update from remote if needed
55
55
>>> except (RepositoryError, OSError):
56
56
>>> # local snapshot is not valid, load from remote
57
57
>>> # (RepositoryErrors here stop the update)
58
- >>> with download("snapshot" , version) as f:
58
+ >>> with download(Snapshot.type , version) as f:
59
59
>>> trusted_set.update_snapshot(f.read())
60
60
61
61
TODO:
@@ -123,22 +123,22 @@ def __iter__(self) -> Iterator[Metadata]:
123
123
@property
124
124
def root (self ) -> Metadata [Root ]:
125
125
"""Current root Metadata"""
126
- return self ._trusted_set ["root" ]
126
+ return self ._trusted_set [Root . type ]
127
127
128
128
@property
129
129
def timestamp (self ) -> Optional [Metadata [Timestamp ]]:
130
130
"""Current timestamp Metadata or None"""
131
- return self ._trusted_set .get ("timestamp" )
131
+ return self ._trusted_set .get (Timestamp . type )
132
132
133
133
@property
134
134
def snapshot (self ) -> Optional [Metadata [Snapshot ]]:
135
135
"""Current snapshot Metadata or None"""
136
- return self ._trusted_set .get ("snapshot" )
136
+ return self ._trusted_set .get (Snapshot . type )
137
137
138
138
@property
139
139
def targets (self ) -> Optional [Metadata [Targets ]]:
140
140
"""Current targets Metadata or None"""
141
- return self ._trusted_set .get ("targets" )
141
+ return self ._trusted_set .get (Targets . type )
142
142
143
143
# Methods for updating metadata
144
144
def update_root (self , data : bytes ) -> Metadata [Root ]:
@@ -166,23 +166,25 @@ def update_root(self, data: bytes) -> Metadata[Root]:
166
166
except DeserializationError as e :
167
167
raise exceptions .RepositoryError ("Failed to load root" ) from e
168
168
169
- if new_root .signed .type != "root" :
169
+ if new_root .signed .type != Root . type :
170
170
raise exceptions .RepositoryError (
171
171
f"Expected 'root', got '{ new_root .signed .type } '"
172
172
)
173
173
174
174
# Verify that new root is signed by trusted root
175
- self .root .verify_delegate ("root" , new_root )
175
+ self .root .verify_delegate (Root . type , new_root )
176
176
177
177
if new_root .signed .version != self .root .signed .version + 1 :
178
178
raise exceptions .ReplayedMetadataError (
179
- "root" , new_root .signed .version , self .root .signed .version
179
+ Root .type ,
180
+ new_root .signed .version ,
181
+ self .root .signed .version ,
180
182
)
181
183
182
184
# Verify that new root is signed by itself
183
- new_root .verify_delegate ("root" , new_root )
185
+ new_root .verify_delegate (Root . type , new_root )
184
186
185
- self ._trusted_set ["root" ] = new_root
187
+ self ._trusted_set [Root . type ] = new_root
186
188
logger .info ("Updated root v%d" , new_root .signed .version )
187
189
188
190
return new_root
@@ -222,20 +224,20 @@ def update_timestamp(self, data: bytes) -> Metadata[Timestamp]:
222
224
except DeserializationError as e :
223
225
raise exceptions .RepositoryError ("Failed to load timestamp" ) from e
224
226
225
- if new_timestamp .signed .type != "timestamp" :
227
+ if new_timestamp .signed .type != Timestamp . type :
226
228
raise exceptions .RepositoryError (
227
229
f"Expected 'timestamp', got '{ new_timestamp .signed .type } '"
228
230
)
229
231
230
- self .root .verify_delegate ("timestamp" , new_timestamp )
232
+ self .root .verify_delegate (Timestamp . type , new_timestamp )
231
233
232
234
# If an existing trusted timestamp is updated,
233
235
# check for a rollback attack
234
236
if self .timestamp is not None :
235
237
# Prevent rolling back timestamp version
236
238
if new_timestamp .signed .version < self .timestamp .signed .version :
237
239
raise exceptions .ReplayedMetadataError (
238
- "timestamp" ,
240
+ Timestamp . type ,
239
241
new_timestamp .signed .version ,
240
242
self .timestamp .signed .version ,
241
243
)
@@ -245,15 +247,15 @@ def update_timestamp(self, data: bytes) -> Metadata[Timestamp]:
245
247
< self .timestamp .signed .snapshot_meta .version
246
248
):
247
249
raise exceptions .ReplayedMetadataError (
248
- "snapshot" ,
250
+ Snapshot . type ,
249
251
new_timestamp .signed .snapshot_meta .version ,
250
252
self .timestamp .signed .snapshot_meta .version ,
251
253
)
252
254
253
255
# expiry not checked to allow old timestamp to be used for rollback
254
256
# protection of new timestamp: expiry is checked in update_snapshot()
255
257
256
- self ._trusted_set ["timestamp" ] = new_timestamp
258
+ self ._trusted_set [Timestamp . type ] = new_timestamp
257
259
logger .info ("Updated timestamp v%d" , new_timestamp .signed .version )
258
260
259
261
# timestamp is loaded: raise if it is not valid _final_ timestamp
@@ -323,12 +325,12 @@ def update_snapshot(
323
325
except DeserializationError as e :
324
326
raise exceptions .RepositoryError ("Failed to load snapshot" ) from e
325
327
326
- if new_snapshot .signed .type != "snapshot" :
328
+ if new_snapshot .signed .type != Snapshot . type :
327
329
raise exceptions .RepositoryError (
328
330
f"Expected 'snapshot', got '{ new_snapshot .signed .type } '"
329
331
)
330
332
331
- self .root .verify_delegate ("snapshot" , new_snapshot )
333
+ self .root .verify_delegate (Snapshot . type , new_snapshot )
332
334
333
335
# version not checked against meta version to allow old snapshot to be
334
336
# used in rollback protection: it is checked when targets is updated
@@ -354,7 +356,7 @@ def update_snapshot(
354
356
# expiry not checked to allow old snapshot to be used for rollback
355
357
# protection of new snapshot: it is checked when targets is updated
356
358
357
- self ._trusted_set ["snapshot" ] = new_snapshot
359
+ self ._trusted_set [Snapshot . type ] = new_snapshot
358
360
logger .info ("Updated snapshot v%d" , new_snapshot .signed .version )
359
361
360
362
# snapshot is loaded, but we raise if it's not valid _final_ snapshot
@@ -389,7 +391,7 @@ def update_targets(self, data: bytes) -> Metadata[Targets]:
389
391
Returns:
390
392
Deserialized and verified targets Metadata object
391
393
"""
392
- return self .update_delegated_targets (data , "targets" , "root" )
394
+ return self .update_delegated_targets (data , Targets . type , Root . type )
393
395
394
396
def update_delegated_targets (
395
397
self , data : bytes , role_name : str , delegator_name : str
@@ -440,7 +442,7 @@ def update_delegated_targets(
440
442
except DeserializationError as e :
441
443
raise exceptions .RepositoryError ("Failed to load snapshot" ) from e
442
444
443
- if new_delegate .signed .type != "targets" :
445
+ if new_delegate .signed .type != Targets . type :
444
446
raise exceptions .RepositoryError (
445
447
f"Expected 'targets', got '{ new_delegate .signed .type } '"
446
448
)
@@ -472,12 +474,12 @@ def _load_trusted_root(self, data: bytes) -> None:
472
474
except DeserializationError as e :
473
475
raise exceptions .RepositoryError ("Failed to load root" ) from e
474
476
475
- if new_root .signed .type != "root" :
477
+ if new_root .signed .type != Root . type :
476
478
raise exceptions .RepositoryError (
477
479
f"Expected 'root', got '{ new_root .signed .type } '"
478
480
)
479
481
480
- new_root .verify_delegate ("root" , new_root )
482
+ new_root .verify_delegate (Root . type , new_root )
481
483
482
- self ._trusted_set ["root" ] = new_root
484
+ self ._trusted_set [Root . type ] = new_root
483
485
logger .info ("Loaded trusted root v%d" , new_root .signed .version )
0 commit comments