X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=ud-mailgate;h=d8dfbffa7a9bdedafed885da94e5b2dfbff495ec;hb=1220c314db3886b9dc78326e8a0ee1528c3f4001;hp=e853056a7950eea8ca5ca8e3ccbfebb6966c78a6;hpb=0e05227cc784dc56d5d7609def55ea679ecbbaf4;p=mirror%2Fuserdir-ldap.git diff --git a/ud-mailgate b/ud-mailgate index e853056..d8dfbff 100755 --- a/ud-mailgate +++ b/ud-mailgate @@ -17,6 +17,10 @@ EX_PERMFAIL = 65; # EX_DATAERR Error = 'Message Error'; SeenKey = 0; SeenDNS = 0; +mailRBL = {} +mailRHSBL = {} +mailWhitelist = {} +SeenList = {} DNS = {} ArbChanges = {"c": "..", @@ -27,10 +31,15 @@ ArbChanges = {"c": "..", "postalCode": ".*", "loginShell": ".*", "emailForward": "^([^<>@]+@.+)?$", + "jabberJID": "^([^<>@]+@.+)?$", "ircNick": ".*", "icqUin": "^[0-9]*$", "onVacation": ".*", - "labeledURI": ".*"}; + "labeledURI": ".*", + "mailDisableMessage": ".*", + "mailGreylisting": "^(TRUE|FALSE)$", + "mailCallout": "^(TRUE|FALSE)$", +}; DelItems = {"c": None, "l": None, @@ -45,9 +54,19 @@ DelItems = {"c": None, "latitude": None, "longitude": None, "icqUin": None, + "jabberJID": None, + "jpegPhoto": None, "dnsZoneEntry": None, "sshRSAAuthKey": None, - "sshDSAAuthKey": None}; + "sshDSAAuthKey": None, + "birthDate" : None, + "mailGreylisting": None, + "mailCallout": None, + "mailRBL": None, + "mailRHSBL": None, + "mailWhitelist": None, + "mailDisableMessage": None, + }; # Decode a GPS location from some common forms def LocDecode(Str,Dir): @@ -174,6 +193,9 @@ def DoPosition(Str,Attrs): def DoSSH(Str,Attrs): Match = SSH2AuthSplit.match(Str); if Match == None: + Match = re.compile('^1024 (\d+) ').match(Str) + if Match is not None: + return "SSH1 keys not supported anymore" return None; global SeenKey; @@ -200,7 +222,12 @@ def DoDNS(Str,Attrs,DnRecord): # Check for collisions global l; - Rec = l.search_s(BaseDn,ldap.SCOPE_ONELEVEL,"dnsZoneEntry="+G[0]+" *",["uid"]); + # [JT 20070409 - search for both tab and space suffixed hostnames + # since we accept either. It'd probably be better to parse the + # incoming string in order to construct what we feed LDAP rather + # than just passing it through as is.] + filter = "(|(dnsZoneEntry=%s *)(dnsZoneEntry=%s *))" % (G[0], G[0]) + Rec = l.search_s(BaseDn,ldap.SCOPE_ONELEVEL,filter,["uid"]); for x in Rec: if GetAttr(x,"uid") != GetAttr(DnRecord,"uid"): return "DNS entry is already owned by " + GetAttr(x,"uid") @@ -227,6 +254,29 @@ def DoDNS(Str,Attrs,DnRecord): SeenDNS = 1; return "DNS Entry replaced with "+Str; +# Handle an RBL list (mailRBL, mailRHSBL, mailWhitelist) +def DoRBL(Str,Attrs): + Match = re.compile('^mail(rbl|rhsbl|whitelist) ([-a-z0-9.]+)$').match(string.lower(Str)) + if Match == None: + return None + + if Match.group(1) == "rbl": + Key = "mailRBL" + if Match.group(1) == "rhsbl": + Key = "mailRHSBL" + if Match.group(1) == "whitelist": + Key = "mailWhitelist" + Host = Match.group(2) + + global SeenList + if SeenList.has_key(Key): + Attrs.append((ldap.MOD_ADD,Key,Host)) + return "%s added %s" % (Key,Host) + + Attrs.append((ldap.MOD_REPLACE,Key,Host)) + SeenList[Key] = 1; + return "%s replaced with %s" % (Key,Host) + # Handle an [almost] arbitary change def HandleChange(Reply,DnRecord,Key): global PlainText; @@ -249,7 +299,7 @@ def HandleChange(Reply,DnRecord,Key): else: Res = DoPosition(Line,Attrs) or DoDNS(Line,Attrs,DnRecord) or \ DoArbChange(Line,Attrs) or DoSSH(Line,Attrs) or \ - DoDel(Line,Attrs); + DoDel(Line,Attrs) or DoRBL(Line,Attrs); except: Res = None; Result = Result + "==> %s: %s\n" %(sys.exc_type,sys.exc_value);