X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=dak%2Fprocess_unchecked.py;h=f2efe8c0393439dbfe812bd542e30514d240845c;hb=536cb00b606a8581a76b66f55a58eabdf9f7fd3d;hp=93187709cf78bc4dedf12c998b8b3539b13f2441;hpb=6c793f19473346ffb891d9a3b777775ca9790207;p=dak.git diff --git a/dak/process_unchecked.py b/dak/process_unchecked.py index 93187709..f2efe8c0 100755 --- a/dak/process_unchecked.py +++ b/dak/process_unchecked.py @@ -777,8 +777,6 @@ def check_dsc(): files[orig_tar_gz] = {} files[orig_tar_gz]["size"] = os.stat(orig_tar_gz)[stat.ST_SIZE] files[orig_tar_gz]["md5sum"] = dsc_files[orig_tar_gz]["md5sum"] - files[orig_tar_gz]["sha1sum"] = dsc_files[orig_tar_gz]["sha1sum"] - files[orig_tar_gz]["sha256sum"] = dsc_files[orig_tar_gz]["sha256sum"] files[orig_tar_gz]["section"] = files[dsc_filename]["section"] files[orig_tar_gz]["priority"] = files[dsc_filename]["priority"] files[orig_tar_gz]["component"] = files[dsc_filename]["component"] @@ -926,13 +924,77 @@ def check_hashes (): else: format = int(float(format[0])), 0 - utils.check_hash(".changes", files, "md5sum", apt_pkg.md5sum) - utils.check_hash(".dsc", dsc_files, "md5sum", apt_pkg.md5sum) + check_hash(".changes", files, "md5sum", apt_pkg.md5sum) + check_hash(".dsc", dsc_files, "md5sum", apt_pkg.md5sum) - # This is stupid API, but it'll have to do for now until - # we actually have proper abstraction - for m in utils.ensure_hashes(Upload): - reject(m) + if format >= (1,8): + hashes = [("sha1", apt_pkg.sha1sum), + ("sha256", apt_pkg.sha256sum)] + else: + hashes = [] + + for x in changes: + if x.startswith("checksum-"): + h = x.split("-",1)[1] + if h not in dict(hashes): + reject("Unsupported checksum field in .changes" % (h)) + + for x in dsc: + if x.startswith("checksum-"): + h = x.split("-",1)[1] + if h not in dict(hashes): + reject("Unsupported checksum field in .dsc" % (h)) + + for h,f in hashes: + try: + fs = utils.build_file_list(changes, 0, "checksums-%s" % h, h) + check_hash(".changes %s" % (h), fs, h, f, files) + except NoFilesFieldError: + reject("No Checksums-%s: field in .changes" % (h)) + except UnknownFormatError, format: + reject("%s: unknown format of .changes" % (format)) + except ParseChangesError, line: + reject("parse error for Checksums-%s in .changes, can't grok: %s." % (h, line)) + + if "source" not in changes["architecture"]: continue + + try: + fs = utils.build_file_list(dsc, 1, "checksums-%s" % h, h) + check_hash(".dsc %s" % (h), fs, h, f, dsc_files) + except UnknownFormatError, format: + reject("%s: unknown format of .dsc" % (format)) + except NoFilesFieldError: + reject("No Checksums-%s: field in .dsc" % (h)) + except ParseChangesError, line: + reject("parse error for Checksums-%s in .dsc, can't grok: %s." % (h, line)) + +################################################################################ + +def check_hash (where, lfiles, key, testfn, basedict = None): + if basedict: + for f in basedict.keys(): + if f not in lfiles: + reject("%s: no %s checksum" % (f, key)) + + for f in lfiles.keys(): + if basedict and f not in basedict: + reject("%s: extraneous entry in %s checksums" % (f, key)) + + try: + file_handle = utils.open_file(f) + except CantOpenError: + continue + + # Check hash + if testfn(file_handle) != lfiles[f][key]: + reject("%s: %s check failed." % (f, key)) + file_handle.close() + # Check size + actual_size = os.stat(f)[stat.ST_SIZE] + size = int(lfiles[f]["size"]) + if size != actual_size: + reject("%s: actual file size (%s) does not match size (%s) in %s" + % (f, actual_size, size, where)) ################################################################################