@@ -682,7 +682,7 @@ def __init__(self):
682
682
self ._repository_name = None
683
683
684
684
685
- def add_verification_key (self , key , expires = None ):
685
+ def add_verification_key (self , key , expires = None , delegating_rolename = 'root' ):
686
686
"""
687
687
<Purpose>
688
688
Add 'key' to the role. Adding a key, which should contain only the
@@ -728,6 +728,12 @@ def add_verification_key(self, key, expires=None):
728
728
# 'securesystemslib.exceptions.FormatError' if any are improperly formatted.
729
729
securesystemslib .formats .ANYKEY_SCHEMA .check_match (key )
730
730
731
+ # top level roles go in the default keydb, delegated roles go in the keydb
732
+ # of their parent role
733
+ repository_name = self ._repository_name
734
+ if delegating_rolename != 'root' :
735
+ repository_name = repository_name + ' ' + delegating_rolename
736
+
731
737
# If 'expires' is unset, choose a default expiration for 'key'. By
732
738
# default, Root, Targets, Snapshot, and Timestamp keys are set to expire
733
739
# 1 year, 3 months, 1 week, and 1 day from the current time, respectively.
@@ -779,7 +785,7 @@ def add_verification_key(self, key, expires=None):
779
785
# Keys may be shared, so do not raise an exception if 'key' has already
780
786
# been loaded.
781
787
try :
782
- tuf .keydb .add_key (key , repository_name = self . _repository_name )
788
+ tuf .keydb .add_key (key , repository_name = repository_name )
783
789
784
790
except tuf .exceptions .KeyAlreadyExistsError :
785
791
logger .warning ('Adding a verification key that has already been used.' )
@@ -797,7 +803,7 @@ def add_verification_key(self, key, expires=None):
797
803
roleinfo ['keyids' ].append (keyid )
798
804
roleinfo ['previous_keyids' ] = previous_keyids
799
805
800
- tuf .roledb .update_roleinfo (self ._rolename , roleinfo ,
806
+ tuf .roledb .update_roleinfo (self .rolename , roleinfo ,
801
807
repository_name = self ._repository_name )
802
808
803
809
@@ -2251,7 +2257,8 @@ def _create_delegated_target(self, rolename, keyids, threshold, paths):
2251
2257
roleinfo = {'name' : rolename , 'keyids' : keyids , 'signing_keyids' : [],
2252
2258
'threshold' : threshold , 'version' : 0 ,
2253
2259
'expires' : expiration , 'signatures' : [], 'partial_loaded' : False ,
2254
- 'paths' : paths , 'delegations' : {'keys' : {}, 'roles' : []}}
2260
+ 'paths' : paths , 'delegations' : {'keys' : {}, 'roles' : []},
2261
+ 'parent_role' : self ._parent_targets_object .rolename }
2255
2262
2256
2263
# The new targets object is added as an attribute to this Targets object.
2257
2264
new_targets_object = Targets (self ._targets_directory , rolename , roleinfo ,
@@ -2425,8 +2432,13 @@ def delegate(self, rolename, public_keys, paths, threshold=1,
2425
2432
del roleinfo ['paths' ]
2426
2433
2427
2434
# Update the public keys of 'new_targets_object'.
2435
+ try :
2436
+ tuf .keydb .create_keydb (self ._repository_name + ' ' + self ._rolename )
2437
+ except securesystemslib .exceptions .InvalidNameError :
2438
+ # keydb already created
2439
+ pass
2428
2440
for key in public_keys :
2429
- new_targets_object .add_verification_key (key )
2441
+ new_targets_object .add_verification_key (key , delegating_rolename = self . _rolename )
2430
2442
2431
2443
# Add the new delegation to the top-level 'targets' role object (i.e.,
2432
2444
# 'repository.targets()'). For example, 'django', which was delegated by
0 commit comments