X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils.py;h=a40133f4ea88cbecdb2a111e142ce820ea9b96e2;hb=889f6e5eb50e1efd87c9caa64f98561a7827e873;hp=8058d3bea9b0305477a75ce08e465125c80a7e98;hpb=6c68616c83b577e687f91a6ee75a8139757f213f;p=dak.git diff --git a/utils.py b/utils.py index 8058d3be..a40133f4 100644 --- a/utils.py +++ b/utils.py @@ -1,6 +1,6 @@ # Utility functions # Copyright (C) 2000 James Troup -# $Id: utils.py,v 1.12 2001-01-25 06:00:07 troup Exp $ +# $Id: utils.py,v 1.14 2001-02-04 04:28:34 troup Exp $ # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -23,8 +23,11 @@ re_no_epoch = re.compile(r"^\d*\:") re_no_revision = re.compile(r"\-[^-]*$") re_arch_from_filename = re.compile(r"/binary-[^/]+/") re_extract_src_version = re.compile (r"(\S+)\s*\((.*)\)") +re_isadeb = re.compile (r'.*\.u?deb$'); +re_issource = re.compile (r'(.+)_(.+?)\.(orig\.tar\.gz|diff\.gz|tar\.gz|dsc)'); changes_parse_error_exc = "Can't parse line in .changes file"; +invalid_dsc_format_exc = "Invalid .dsc file"; nk_format_exc = "Unknown Format: in .changes file"; no_files_exc = "No Files: field in .dsc file."; cant_open_exc = "Can't read file."; @@ -77,15 +80,58 @@ def extract_component_from_section(section): ###################################################################################### -def parse_changes(filename): +# dsc_whitespace_rules turns on strict format checking to avoid +# allowing in source packages which are unextracable by the +# inappropriately fragile dpkg-source. +# +# The rules are: +# +# +# o The PGP header consists of "-----BEGIN PGP SIGNED MESSAGE-----" +# followed by any PGP header data and must end with a blank line. +# +# o The data section must end with a blank line and must be followed by +# "-----BEGIN PGP SIGNATURE-----". + +def parse_changes(filename, dsc_whitespace_rules): changes_in = open_file(filename,'r'); - error = "" + error = ""; changes = {}; lines = changes_in.readlines(); + + # Reindex by line number so we can easily verify the format of + # .dsc files... + index = 0; + indexed_lines = {}; for line in lines: + index = index + 1; + indexed_lines[index] = line[:-1]; + + inside_signature = 0; + + indices = indexed_lines.keys() + index = 0; + while index < max(indices): + index = index + 1; + line = indexed_lines[index]; + if line == "": + if dsc_whitespace_rules: + index = index + 1; + if index > max(indices): + raise invalid_dsc_format_exc, index; + line = indexed_lines[index]; + if not re.match('^-----BEGIN PGP SIGNATURE', line): + raise invalid_dsc_format_exc, index; + inside_signature = 0; + break; if re.match('^-----BEGIN PGP SIGNATURE', line): break; - if re.match(r'^\s*$|^-----BEGIN PGP SIGNED MESSAGE', line): + if re.match(r'^-----BEGIN PGP SIGNED MESSAGE', line): + if dsc_whitespace_rules: + inside_signature = 1; + while index < max(indices) and line != "": + index = index + 1; + line = indexed_lines[index]; continue; slf = re.match(r'^(\S*)\s*:\s*(.*)', line); if slf: @@ -101,10 +147,16 @@ def parse_changes(filename): changes[field] = changes[field] + mlf.groups()[0] + '\n'; continue; error = error + line; + + if dsc_whitespace_rules and inside_signature: + raise invalid_dsc_format_exc, index; + changes_in.close(); changes["filecontents"] = string.join (lines, ""); + if error != "": raise changes_parse_error_exc, error; + return changes; ######################################################################################