Move parse_addr, iniplist, ip4re to Milter.utils
This commit is contained in:
+6
-57
@@ -14,6 +14,8 @@ import struct
|
||||
import socket
|
||||
import syslog
|
||||
|
||||
from Milter.utils import iniplist,parse_addr
|
||||
|
||||
syslog.openlog('spfmilter',0,syslog.LOG_MAIL)
|
||||
|
||||
# list of trusted forwarder domains. An SPF record for a forwarder
|
||||
@@ -27,60 +29,7 @@ trusted_relay = []
|
||||
|
||||
socketname = "/var/run/milter/spfmiltersock"
|
||||
#socketname = os.getenv("HOME") + "/pythonsock"
|
||||
|
||||
ip4re = re.compile(r'^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$')
|
||||
|
||||
# from spf.py
|
||||
def addr2bin(str):
|
||||
"Convert a string IPv4 address into an unsigned integer."
|
||||
return struct.unpack("!L", socket.inet_aton(str))[0]
|
||||
|
||||
MASK = 0xFFFFFFFFL
|
||||
|
||||
def cidr(i,n):
|
||||
return ~(MASK >> n) & MASK & i
|
||||
|
||||
def iniplist(ipaddr,iplist):
|
||||
"""Return whether ip is in cidr list
|
||||
>>> iniplist('66.179.26.146',['127.0.0.1','66.179.26.128/26'])
|
||||
True
|
||||
>>> iniplist('127.0.0.1',['127.0.0.1','66.179.26.128/26'])
|
||||
True
|
||||
>>> iniplist('192.168.0.45',['192.168.0.*'])
|
||||
True
|
||||
"""
|
||||
ipnum = addr2bin(ipaddr)
|
||||
for pat in iplist:
|
||||
p = pat.split('/',1)
|
||||
if ip4re.match(p[0]):
|
||||
if len(p) > 1:
|
||||
n = int(p[1])
|
||||
else:
|
||||
n = 32
|
||||
if cidr(addr2bin(p[0]),n) == cidr(ipnum,n):
|
||||
return True
|
||||
elif fnmatchcase(ipaddr,pat):
|
||||
return True
|
||||
return False
|
||||
|
||||
def parse_addr(t):
|
||||
"""Split email into user,domain.
|
||||
|
||||
>>> parse_addr('user@example.com')
|
||||
['user', 'example.com']
|
||||
>>> parse_addr('"user@example.com"')
|
||||
['user@example.com']
|
||||
>>> parse_addr('"user@bar"@example.com')
|
||||
['user@bar', 'example.com']
|
||||
>>> parse_addr('foo')
|
||||
['foo']
|
||||
"""
|
||||
if t.startswith('<') and t.endswith('>'): t = t[1:-1]
|
||||
if t.startswith('"'):
|
||||
if t.endswith('"'): return [t[1:-1]]
|
||||
pos = t.find('"@')
|
||||
if pos > 0: return [t[1:pos],t[pos+2:]]
|
||||
return t.split('@')
|
||||
miltername = "pyspffilter"
|
||||
|
||||
class spfMilter(Milter.Milter):
|
||||
"Milter to check SPF."
|
||||
@@ -221,11 +170,11 @@ if __name__ == "__main__":
|
||||
Milter.set_flags(Milter.CHGHDRS + Milter.ADDHDRS)
|
||||
print """To use this with sendmail, add the following to sendmail.cf:
|
||||
|
||||
O InputMailFilters=pyspffilter
|
||||
Xpyspffilter, S=local:%s
|
||||
O InputMailFilters=%s
|
||||
X%s, S=local:%s
|
||||
|
||||
See the sendmail README for libmilter.
|
||||
sample spfmilter startup""" % socketname
|
||||
sample spfmilter startup""" % (miltername,miltername,socketname)
|
||||
sys.stdout.flush()
|
||||
Milter.runmilter("pyspffilter",socketname,240)
|
||||
print "sample spfmilter shutdown"
|
||||
|
||||
Reference in New Issue
Block a user