def fix_maintainer(maintainer): """ Parses a Maintainer or Changed-By field and returns: 1. an RFC822 compatible version, 2. an RFC2047 compatible version, 3. the name 4. the email The name is forced to UTF-8 for both 1. and 3.. If the name field contains '.' or ',' (as allowed by Debian policy), 1. and 2. are switched to 'email (name)' format. """ maintainer = maintainer.strip() if not maintainer: return ("", "", "", "") if maintainer.find("<") == -1: email = maintainer name = "" elif maintainer[0] == "<" and maintainer[-1:] == ">": email = maintainer[1:-1] name = "" else: m = re_parse_maintainer.match(maintainer) if not m: raise ParseMaintError("Doesn't parse as a valid Maintainer field.") name = m.group(1) email = m.group(2) # Get an RFC2047 compliant version of the name rfc2047_name = rfc2047_encode(name) # Force the name to be UTF-8 name = force_to_utf8(name) if name.find(",") != -1 or name.find(".") != -1: rfc822_maint = "%s (%s)" % (email, name) rfc2047_maint = "%s (%s)" % (email, rfc2047_name) else: rfc822_maint = "%s <%s>" % (name, email) rfc2047_maint = "%s <%s>" % (rfc2047_name, email) if email.find("@") == -1 and email.find("buildd_") != 0: raise ParseMaintError("No @ found in email address part.") return (rfc822_maint, rfc2047_maint, name, email)
def fix_maintainer(maintainer): """ Parses a Maintainer or Changed-By field and returns: 1. an RFC822 compatible version, 2. an RFC2047 compatible version, 3. the name 4. the email The name is forced to UTF-8 for both 1. and 3.. If the name field contains '.' or ',' (as allowed by Debian policy), 1. and 2. are switched to 'email (name)' format. """ maintainer = maintainer.strip() if not maintainer: return ('', '', '', '') if maintainer.find("<") == -1: email = maintainer name = "" elif (maintainer[0] == "<" and maintainer[-1:] == ">"): email = maintainer[1:-1] name = "" else: m = re_parse_maintainer.match(maintainer) if not m: raise ParseMaintError("Doesn't parse as a valid Maintainer field.") name = m.group(1) email = m.group(2) # Get an RFC2047 compliant version of the name rfc2047_name = rfc2047_encode(name) # Force the name to be UTF-8 name = force_to_utf8(name) if name.find(',') != -1 or name.find('.') != -1: rfc822_maint = "%s (%s)" % (email, name) rfc2047_maint = "%s (%s)" % (email, rfc2047_name) else: rfc822_maint = "%s <%s>" % (name, email) rfc2047_maint = "%s <%s>" % (rfc2047_name, email) if email.find("@") == -1 and email.find("buildd_") != 0: raise ParseMaintError("No @ found in email address part.") return (rfc822_maint, rfc2047_maint, name, email)
def gpg_get_key_addresses(fingerprint): """retreive email addresses from gpg key uids for a given fingerprint""" addresses = key_uid_email_cache.get(fingerprint) if addresses != None: return addresses addresses = list() try: with open(os.devnull, "wb") as devnull: output = daklib.daksubprocess.check_output( ["gpg", "--no-default-keyring"] + gpg_keyring_args().split() + ["--with-colons", "--list-keys", fingerprint], stderr=devnull) except subprocess.CalledProcessError: pass else: for l in output.split('\n'): parts = l.split(':') if parts[0] not in ("uid", "pub"): continue if parts[1] in ("i", "d", "r"): # Skip uid that is invalid, disabled or revoked continue try: uid = parts[9] except IndexError: continue try: # Do not use unicode_escape, because it is locale-specific uid = codecs.decode(uid, "string_escape").decode("utf-8") except UnicodeDecodeError: uid = uid.decode("latin1") # does not fail m = re_parse_maintainer.match(uid) if not m: continue address = m.group(2) address = address.encode("utf8") # dak still uses bytes if address.endswith('@debian.org'): # prefer @debian.org addresses # TODO: maybe not hardcode the domain addresses.insert(0, address) else: addresses.append(address) key_uid_email_cache[fingerprint] = addresses return addresses
def gpg_get_key_addresses(fingerprint): """retreive email addresses from gpg key uids for a given fingerprint""" addresses = key_uid_email_cache.get(fingerprint) if addresses != None: return addresses addresses = list() try: with open(os.devnull, "wb") as devnull: output = daklib.daksubprocess.check_output( ["gpg", "--no-default-keyring"] + gpg_keyring_args().split() + ["--with-colons", "--list-keys", fingerprint], stderr=devnull, ) except subprocess.CalledProcessError: pass else: for l in output.split("\n"): parts = l.split(":") if parts[0] not in ("uid", "pub"): continue try: uid = parts[9] except IndexError: continue try: # Do not use unicode_escape, because it is locale-specific uid = codecs.decode(uid, "string_escape").decode("utf-8") except UnicodeDecodeError: uid = uid.decode("latin1") # does not fail m = re_parse_maintainer.match(uid) if not m: continue address = m.group(2) address = address.encode("utf8") # dak still uses bytes if address.endswith("@debian.org"): # prefer @debian.org addresses # TODO: maybe not hardcode the domain addresses.insert(0, address) else: addresses.append(address) key_uid_email_cache[fingerprint] = addresses return addresses