From 989168a8d7a50f5c1e021896435dbadec498502e Mon Sep 17 00:00:00 2001 From: vladdd Date: Fri, 9 Aug 2013 16:05:49 -0400 Subject: [PATCH] Allow compressed versions of release.txt to properly update --- tuf/client/updater.py | 78 +++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/tuf/client/updater.py b/tuf/client/updater.py index 835d7701..d699cb04 100755 --- a/tuf/client/updater.py +++ b/tuf/client/updater.py @@ -824,56 +824,54 @@ def _update_metadata_if_changed(self, metadata_role, referenced_metadata='releas metadata_filename = metadata_role + '.txt' - # Need to ensure the referenced metadata has been loaded. - # The 'root' role may be updated without having 'release' - # available. + # Ensure the referenced metadata has been loaded. The 'root' role may be + # updated without having 'release' available. if referenced_metadata not in self.metadata['current']: - message = 'Cannot update '+repr(metadata_role)+' because ' \ - +referenced_metadata+' is missing.' + message = 'Cannot update '+repr(metadata_role)+' because '+\ + repr(referenced_metadata)+' is missing.' raise tuf.RepositoryError(message) - # The referenced metadata has been loaded. Extract the new - # fileinfo for 'metadata_role' from it. else: - new_fileinfo = self.metadata['current'][referenced_metadata] \ - ['meta'][metadata_filename] + message = repr(metadata_role)+' referenced in '+\ + repr(referenced_metadata)+'. '+repr(metadata_role)+' may be updated.' + logger.debug(message) + + # There might be a compressed version of 'release.txt' or Targets + # metadata available for download. Check the 'meta' field of + # 'referenced_metadata' to see if it is listed when 'metadata_role' + # is 'release'. The full rolename for delegated Targets metadata + # must begin with 'targets/'. The Release role lists all the Targets + # metadata available on the repository, including any that may be in + # compressed form. + compression = None + gzip_metadata_filename = metadata_filename + '.gz' + + # Extract the new fileinfo of the uncompressed version of 'metadata_role'. + new_fileinfo = self.metadata['current'][referenced_metadata] \ + ['meta'][metadata_filename] + + # Check for availability of compressed versions of 'release.txt', + # 'targets.txt', and delegated Targets, which also start with 'targets'. + # For 'targets.txt' and delegated metadata, 'referenced_metata' + # should always be 'release'. 'release.txt' specifies all roles + # provided by a repository, including their file sizes and hashes. + if metadata_role == 'release' or metadata_role.startswith('targets'): + if gzip_metadata_filename in self.metadata['current'] \ + [referenced_metadata]['meta']: + compression = 'gzip' + new_fileinfo = self.metadata['current'][referenced_metadata] \ + ['meta'][gzip_metadata_filename] + else: + message = 'Compressed version of '+repr(metadata_filename)+\ + ' not available.' + logger.debug(message) - # Simply return if the fileinfo has not changed according to the + # Simply return if the fileinfo has not changed, according to the # fileinfo provided by the referenced metadata. if not self._fileinfo_has_changed(metadata_filename, new_fileinfo): return logger.info('Metadata '+repr(metadata_filename)+' has changed.') - # There might be a compressed version of 'release.txt' or Targets - # metadata available for download. Check the 'meta' field of - # 'referenced_metadata' to see if it is listed when 'metadata_role' - # is 'release'. Check the 'meta' field of 'release' when 'metadata_role' - # is Targets metadata. The full rolename for delegated Targets metadata - # must begin with 'targets/'. The Release role lists all the Targets - # metadata available on the repository, including any that may be in - # compressed form. - compression = None - gzip_path = metadata_filename + '.gz' - - if metadata_role == 'release': - if gzip_path in self.metadata['current'][referenced_metadata]['meta']: - compression = 'gzip' - new_fileinfo = self.metadata['current'][referenced_metadata] \ - ['meta'][gzip_path] - # Check for available compressed versions of 'targets.txt' and delegated - # Targets, which also start with 'targets'. - elif metadata_role.startswith('targets'): - # For 'targets.txt' and delegated metadata, 'referenced_metata' - # should always be 'release'. 'release.txt' specifies all roles - # provided by a repository, including their file sizes and hashes. - if gzip_path in self.metadata['current'][referenced_metadata]['meta']: - compression = 'gzip' - new_fileinfo = self.metadata['current'][referenced_metadata] \ - ['meta'][gzip_path] - else: - message = 'Compressed version of '+repr(metadata_filename)+' not available.' - logger.debug(message) - try: self._update_metadata(metadata_role, fileinfo=new_fileinfo, compression=compression)