+ Res = ""
+
+ # PGP 2.x Print
+ if (len(Str) == 32):
+ indent = 0
+ while (indent < len(Str)):
+ if indent == 32 / 2:
+ Res = "%s %s%s " % (Res, Str[indent], Str[indent + 1])
+ else:
+ Res = "%s%s%s " % (Res, Str[indent], Str[indent + 1])
+ indent += 2
+ elif (len(Str) == 40):
+ # OpenPGP Print
+ indent = 0
+ while (indent < len(Str)):
+ if indent == 40 / 2:
+ Res = "%s %s%s%s%s " % (Res, Str[indent], Str[indent + 1], Str[indent + 2], Str[indent + 3])
+ else:
+ Res = "%s%s%s%s%s " % (Res, Str[indent], Str[indent + 1], Str[indent + 2], Str[indent + 3])
+ indent += 4
+ else:
+ Res = Str
+ return Res.strip()
+
+
+# Take an email address and split it into 3 parts, (Name,UID,Domain)
+def SplitEmail(Addr):
+ # Is not an email address at all
+ if Addr.find('@') == -1:
+ return (Addr, "", "")
+
+ Res1 = rfc822.AddrlistClass(Addr).getaddress()
+ if len(Res1) != 1:
+ return ("", "", Addr)
+ Res1 = Res1[0]
+ if Res1[1] is None:
+ return (Res1[0], "", "")
+
+ # If there is no @ then the address was not parsed well. Try the alternate
+ # Parsing scheme. This is particularly important when scanning PGP keys.
+ Res2 = Res1[1].split("@")
+ if len(Res2) != 2:
+ Match = AddressSplit.match(Addr)
+ if Match is None:
+ return ("", "", Addr)
+ return Match.groups()
+
+ return (Res1[0], Res2[0], Res2[1])
+
+
+# Convert the PGP name string to a uid value. The return is a tuple of
+# (uid,[message strings]). UnknownMpa is a hash from email to uid that
+# overrides normal searching.
+def GetUID(l, Name, UnknownMap={}):
+ # Crack up the email address into a best guess first/middle/last name
+ (cn, mn, sn) = NameSplit(re.sub('["]', '', Name[0]))
+
+ # Brackets anger the ldap searcher
+ cn = re.sub('[(")]', '?', cn)
+ sn = re.sub('[(")]', '?', sn)
+
+ # First check the unknown map for the email address
+ if Name[1] + '@' + Name[2] in UnknownMap:
+ Stat = "unknown map hit for " + str(Name)
+ return (UnknownMap[Name[1] + '@' + Name[2]], [Stat])
+
+ # Then the cruft component (ie there was no email address to match)
+ if Name[2] in UnknownMap:
+ Stat = "unknown map hit for" + str(Name)
+ return (UnknownMap[Name[2]], [Stat])
+
+ # Then the name component (another ie there was no email address to match)
+ if Name[0] in UnknownMap:
+ Stat = "unknown map hit for" + str(Name)
+ return (UnknownMap[Name[0]], [Stat])
+
+ # Search for a possible first/last name hit
+ try:
+ Attrs = l.search_s(BaseDn, ldap.SCOPE_ONELEVEL, "(&(cn=%s)(sn=%s))" % (cn, sn), ["uid"])
+ except ldap.FILTER_ERROR:
+ Stat = "Filter failure: (&(cn=%s)(sn=%s))" % (cn, sn)
+ return (None, [Stat])
+
+ # Try matching on the email address
+ if len(Attrs) != 1:
+ try:
+ Attrs = l.search_s(BaseDn, ldap.SCOPE_ONELEVEL, "emailforward=%s" % (Name[2]), ["uid"])
+ except ldap.FILTER_ERROR:
+ pass
+
+ # Hmm, more than one/no return
+ if len(Attrs) != 1:
+ # Key claims a local address
+ if Name[2] == EmailAppend:
+
+ # Pull out the record for the claimed user
+ Attrs = l.search_s(BaseDn, ldap.SCOPE_ONELEVEL, "(uid=%s)" % (Name[1]), ["uid", "sn", "cn"])
+
+ # We require the UID surname to be someplace in the key name, this
+ # deals with special purpose keys like 'James Troup (Alternate Debian key)'
+ # Some people put their names backwards on their key too.. check that as well
+ if len(Attrs) == 1 and \
+ (sn.lower().find(Attrs[0][1]["sn"][0].lower()) != -1 or
+ cn.lower().find(Attrs[0][1]["sn"][0].lower()) != -1):
+ Stat = EmailAppend + " hit for " + str(Name)
+ return (Name[1], [Stat])
+
+ # Attempt to give some best guess suggestions for use in editing the
+ # override file.
+ Attrs = l.search_s(BaseDn, ldap.SCOPE_ONELEVEL, "(sn~=%s)" % (sn,), ["uid", "sn", "cn"])
+
+ Stat = []
+ if len(Attrs) != 0:
+ Stat = ["None for %s" % (str(Name))]
+ for x in Attrs:
+ Stat.append("But might be: %s %s <%s@debian.org>" % (x[1]["cn"][0], x[1]["sn"][0], x[1]["uid"][0]))
+ return (None, Stat)
+ else:
+ return (Attrs[0][1]["uid"][0], None)
+
+ return (None, None)
+
+
+def Group2GID(l, name):
+ """
+ Returns the numerical id of a common group
+ on error returns -1
+ """
+ for g in DebianGroups.keys():
+ if name == g:
+ return DebianGroups[g]
+
+ filter = "(gid=%s)" % name
+ res = l.search_s(BaseDn, ldap.SCOPE_ONELEVEL, filter, ["gidNumber"])
+ if res:
+ return int(GetAttr(res[0], "gidNumber"))
+
+ return -1
+
+
+def make_hmac(str):
+ if 'UD_HMAC_KEY' in os.environ:
+ HmacKey = os.environ['UD_HMAC_KEY']
+ else:
+ File = open(PassDir + "/key-hmac-" + pwd.getpwuid(os.getuid())[0], "r")
+ HmacKey = File.readline().strip()
+ File.close()
+ return hmac.new(HmacKey, str, hashlib.sha1).hexdigest()
+
+
+def make_passwd_hmac(status, purpose, uid, uuid, hosts, cryptedpass):
+ return make_hmac(':'.join([status, purpose, uid, uuid, hosts, cryptedpass]))