X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Futils.py;h=c4c55723ddee9f87fc64e3fab805ed4e56688c95;hb=ebc80c6941140d9d81a18069d45097478c8d1c60;hp=8f9084d137483417ffd5155f6158b1598c17ab74;hpb=f56058049885c86071f354d70d69959de8a4cd53;p=dak.git diff --git a/daklib/utils.py b/daklib/utils.py index 8f9084d1..c4c55723 100755 --- a/daklib/utils.py +++ b/daklib/utils.py @@ -43,6 +43,7 @@ re_taint_free = re.compile(r"^[-+~/\.\w]+$") re_parse_maintainer = re.compile(r"^\s*(\S.*\S)\s*\<([^\>]+)\>") re_srchasver = re.compile(r"^(\S+)\s+\((\S+)\)$") +re_verwithext = re.compile(r"^(\d+)(?:\.(\d+))(?:\s+\((\S+)\))?$") changes_parse_error_exc = "Can't parse line in .changes file" invalid_dsc_format_exc = "Invalid .dsc file" @@ -58,6 +59,8 @@ tried_too_hard_exc = "Tried too hard to find a free filename." default_config = "/etc/dak/dak.conf" default_apt_config = "/etc/dak/apt.conf" +alias_cache = None + ################################################################################ class Error(Exception): @@ -227,135 +230,50 @@ The rules for (signing_rules == 1)-mode are: ################################################################################ -# Determine what parts in a .changes are NEW - -def determine_new (changes, files, projectB, warn=1): - new = {} - - # Build up a list of potentially new things - for file in files.keys(): - f = files[file] - # Skip byhand elements - if f["type"] == "byhand": - continue - pkg = f["package"] - priority = f["priority"] - section = f["section"] - type = get_type(f) - component = f["component"] - - if type == "dsc": - priority = "source" - if not new.has_key(pkg): - new[pkg] = {} - new[pkg]["priority"] = priority - new[pkg]["section"] = section - new[pkg]["type"] = type - new[pkg]["component"] = component - new[pkg]["files"] = [] - else: - old_type = new[pkg]["type"] - if old_type != type: - # source gets trumped by deb or udeb - if old_type == "dsc": - new[pkg]["priority"] = priority - new[pkg]["section"] = section - new[pkg]["type"] = type - new[pkg]["component"] = component - new[pkg]["files"].append(file) - if f.has_key("othercomponents"): - new[pkg]["othercomponents"] = f["othercomponents"] - - for suite in changes["suite"].keys(): - suite_id = database.get_suite_id(suite) - for pkg in new.keys(): - component_id = database.get_component_id(new[pkg]["component"]) - type_id = database.get_override_type_id(new[pkg]["type"]) - q = projectB.query("SELECT package FROM override WHERE package = '%s' AND suite = %s AND component = %s AND type = %s" % (pkg, suite_id, component_id, type_id)) - ql = q.getresult() - if ql: - for file in new[pkg]["files"]: - if files[file].has_key("new"): - del files[file]["new"] - del new[pkg] - - if warn: - if changes["suite"].has_key("stable"): - print "WARNING: overrides will be added for stable!" - if changes["suite"].has_key("oldstable"): - print "WARNING: overrides will be added for OLDstable!" - for pkg in new.keys(): - if new[pkg].has_key("othercomponents"): - print "WARNING: %s already present in %s distribution." % (pkg, new[pkg]["othercomponents"]) - - return new - -################################################################################ - -def get_type (f): - # Determine the type - if f.has_key("dbtype"): - type = f["dbtype"] - elif f["type"] in [ "orig.tar.gz", "orig.tar.bz2", "tar.gz", "tar.bz2", "diff.gz", "diff.bz2", "dsc" ]: - type = "dsc" - else: - fubar("invalid type (%s) for new. Dazed, confused and sure as heck not continuing." % (type)) - - # Validate the override type - type_id = database.get_override_type_id(type) - if type_id == -1: - fubar("invalid type (%s) for new. Say wha?" % (type)) - - return type - -################################################################################ - -# check if section/priority values are valid - -def check_valid (new): - for pkg in new.keys(): - section = new[pkg]["section"] - priority = new[pkg]["priority"] - type = new[pkg]["type"] - new[pkg]["section id"] = database.get_section_id(section) - new[pkg]["priority id"] = database.get_priority_id(new[pkg]["priority"]) - # Sanity checks - di = section.find("debian-installer") != -1 - if (di and type != "udeb") or (not di and type == "udeb"): - new[pkg]["section id"] = -1 - if (priority == "source" and type != "dsc") or \ - (priority != "source" and type == "dsc"): - new[pkg]["priority id"] = -1 - -################################################################################ - # Dropped support for 1.4 and ``buggy dchanges 3.4'' (?!) compared to di.pl -def build_file_list(changes, is_a_dsc=0): +def build_file_list(changes, is_a_dsc=0, field="files", hashname="md5sum"): files = {} # Make sure we have a Files: field to parse... - if not changes.has_key("files"): - raise no_files_exc + if not changes.has_key(field): + raise no_files_exc # Make sure we recognise the format of the Files: field - format = changes.get("format", "") - if format != "": - format = float(format) - if not is_a_dsc and (format < 1.5 or format > 2.0): - raise nk_format_exc, format + format = re_verwithext.search(changes.get("format", "0.0")) + if not format: + raise nk_format_exc, "%s" % (changes.get("format","0.0")) + + format = format.groups() + if format[1] == None: + format = int(float(format[0])), 0, format[2] + else: + format = int(format[0]), int(format[1]), format[2] + if format[2] == None: + format = format[:2] + + if is_a_dsc: + if format != (1,0): + raise nk_format_exc, "%s" % (changes.get("format","0.0")) + else: + if (format < (1,5) or format > (1,8)): + raise nk_format_exc, "%s" % (changes.get("format","0.0")) + if field != "files" and format < (1,8): + raise nk_format_exc, "%s" % (changes.get("format","0.0")) + + includes_section = (not is_a_dsc) and field == "files" # Parse each entry/line: - for i in changes["files"].split('\n'): + for i in changes[field].split('\n'): if not i: break s = i.split() section = priority = "" try: - if is_a_dsc: - (md5, size, name) = s - else: + if includes_section: (md5, size, section, priority, name) = s + else: + (md5, size, name) = s except ValueError: raise changes_parse_error_exc, i @@ -366,8 +284,9 @@ def build_file_list(changes, is_a_dsc=0): (section, component) = extract_component_from_section(section) - files[name] = Dict(md5sum=md5, size=size, section=section, + files[name] = Dict(size=size, section=section, priority=priority, component=component) + files[name][hashname] = md5 return files @@ -551,6 +470,14 @@ def which_apt_conf_file (): else: return default_apt_config +def which_alias_file(): + hostname = socket.gethostbyaddr(socket.gethostname())[0] + aliasfn = '/var/lib/misc/'+hostname+'/forward-alias' + if os.path.exists(aliasfn): + return aliasfn + else: + return None + ################################################################################ # Escape characters which have meaning to SQL's regex comparison operator ('~') @@ -1111,6 +1038,9 @@ used.""" reject("no signature found in %s." % (sig_filename)) bad = 1 if keywords.has_key("KEYEXPIRED") and not keywords.has_key("GOODSIG"): + args = keywords["KEYEXPIRED"] + if len(args) >= 1: + key = args[0] reject("The key (0x%s) used to sign %s has expired." % (key, sig_filename)) bad = 1 @@ -1228,6 +1158,21 @@ If 'dotprefix' is non-null, the filename will be prefixed with a '.'.""" ################################################################################ +# checks if the user part of the email is listed in the alias file + +def is_email_alias(email): + global alias_cache + if alias_cache == None: + aliasfn = which_alias_file() + alias_cache = set() + if aliasfn: + for l in open(aliasfn): + alias_cache.add(l.split(':')[0]) + uid = email.split('@')[0] + return uid in alias_cache + +################################################################################ + apt_pkg.init() Cnf = apt_pkg.newConfiguration()