diff --git a/tests/repository_data/client/map.json b/tests/repository_data/client/map.json new file mode 100644 index 00000000..2f21b912 Binary files /dev/null and b/tests/repository_data/client/map.json differ diff --git a/tuf/client/updater.py b/tuf/client/updater.py index ae0ca862..842248da 100755 --- a/tuf/client/updater.py +++ b/tuf/client/updater.py @@ -145,11 +145,13 @@ class MultiRepoUpdater(object): """ Provide a way for clients to request a target file from multiple - repositories. Which repositories to query is determined by a map + repositories. Which repositories to query is determined by the map file (i.e,. map.json). See TAP 4 for more information on the map file and requesting updates from - multiple repositories. + multiple repositories. TAP 4 describes how users may specify that a + certain repository should be used for some targets, while other + repositories should be used for other targets. map_file: @@ -232,7 +234,7 @@ def get_one_valid_targetinfo(target_filename): else: logger.debug('Found Root file at ' + repr(root_file)) - # Iterate over mappings. + # Iterate mappings. # [{"paths": [], "repositories": [], "terminating": Boolean}, ...] for mapping in self.map_file['mappings']: # If this mapping is relevant to the target... @@ -242,7 +244,7 @@ def get_one_valid_targetinfo(target_filename): # Use the *unmodified* TUF updater for a single repository to fetch the # targetinfo from each repository. for repository_name in mapping['repositories']: - targetinfo = update_from_repository(repository_name, + targetinfo = _update_from_repository(repository_name, repository_names_to_mirrors, target_filename) targetinfos.append(targetinfo) @@ -291,7 +293,8 @@ def get_updater(repository_name, repository_names_to_mirrors): updater = self.repository_names_to_updaters.get(repository_name) if not updater: - # Unimportant: some massaging for unmodified TUF client. + # Create repository mirrors object needed by the tuf.client.updater.Updater(). + # Each 'repository_name' can have more than one mirror. mirrors = {} for url in repository_names_to_mirrors[repository_name]: mirrors[url] = { @@ -319,10 +322,10 @@ def get_updater(repository_name, repository_names_to_mirrors): - def _update_from_repository(dirname, dirname_to_mirrors, target_filename): + def _update_from_repository(repository_name, repository_names_to_mirrors, + target_filename): # Set the repository directory containing the metadata. - tuf.settings.repository_directory = dirname - updater = get_updater(dirname, dirname_to_mirrors) + updater = get_updater(repository_name, repository_names_to_mirrors) try: return updater.get_one_valid_targetinfo(target_filename) @@ -348,26 +351,33 @@ def _targets_are_equal_and_not_empty(targetinfos): prev_targetinfo = targetinfos[0] # Target is empty. - if not prev_targetinfo: return False + if not prev_targetinfo: + return False + else: for curr_targetinfo in targetinfos[1:]: # Target is empty. - if not curr_targetinfo: return False + if not curr_targetinfo: + return False + else: prev_length = prev_targetinfo['length'] curr_length = curr_targetinfo['length'] - if prev_length != curr_length: return False + if prev_length != curr_length: + return False prev_hashes = prev_targetinfo['hashes'] curr_hashes = curr_targetinfo['hashes'] - if prev_hashes.keys() != curr_hashes.keys(): return False + if prev_hashes.keys() != curr_hashes.keys(): + return False for function, prev_digest in prev_hashes.items(): - if prev_digest != curr_hashes[function]: return False + if prev_digest != curr_hashes[function]: + return False prev_targetinfo = curr_targetinfo - # If we are here, then all the targets are equal. + # If we are here, then all the targets are equal. return True