Add sendmail style MTA policy query module
This commit is contained in:
+1
-1
@@ -42,7 +42,7 @@ class MTAPolicy(object):
|
||||
self.acf = dbmopen(self.access_file,'r')
|
||||
except:
|
||||
print('%s: Cannot open for reading'%self.access_file)
|
||||
syslog.syslog('%s: Cannot open for reading'%self.access_file)
|
||||
raise
|
||||
return self
|
||||
def __exit__(self,t,v,b): self.close()
|
||||
|
||||
|
||||
@@ -1,87 +1,3 @@
|
||||
# $Log$
|
||||
# Revision 1.8 2011/11/05 15:51:03 customdesigned
|
||||
# New example
|
||||
#
|
||||
# Revision 1.7 2009/06/13 21:15:12 customdesigned
|
||||
# Doxygen updates.
|
||||
#
|
||||
# Revision 1.6 2009/06/09 03:13:13 customdesigned
|
||||
# More doxygen docs.
|
||||
#
|
||||
# Revision 1.5 2005/07/20 14:49:43 customdesigned
|
||||
# Handle corrupt and empty ZIP files.
|
||||
#
|
||||
# Revision 1.4 2005/06/17 01:49:39 customdesigned
|
||||
# Handle zip within zip.
|
||||
#
|
||||
# Revision 1.3 2005/06/02 15:00:17 customdesigned
|
||||
# Configure banned extensions. Scan zipfile option with test case.
|
||||
#
|
||||
# Revision 1.2 2005/06/02 04:18:55 customdesigned
|
||||
# Update copyright notices after reading article on /.
|
||||
#
|
||||
# Revision 1.1.1.4 2005/05/31 18:23:49 customdesigned
|
||||
# Development changes since 0.7.2
|
||||
#
|
||||
# Revision 1.62 2005/02/14 22:31:17 stuart
|
||||
# _parseparam replacement not needed for python2.4
|
||||
#
|
||||
# Revision 1.61 2005/02/12 02:11:11 stuart
|
||||
# Pass unit tests with python2.4.
|
||||
#
|
||||
# Revision 1.60 2005/02/11 18:34:14 stuart
|
||||
# Handle garbage after quote in boundary.
|
||||
#
|
||||
# Revision 1.59 2005/02/10 01:10:59 stuart
|
||||
# Fixed MimeMessage.ismodified()
|
||||
#
|
||||
# Revision 1.58 2005/02/10 00:56:49 stuart
|
||||
# Runs with python2.4. Defang not working correctly - more work needed.
|
||||
#
|
||||
# Revision 1.57 2004/11/20 16:37:52 stuart
|
||||
# fix regex for splitting header and body
|
||||
#
|
||||
# Revision 1.56 2004/11/09 20:33:51 stuart
|
||||
# Recognize more dynamic PTR variations.
|
||||
#
|
||||
# Revision 1.55 2004/10/06 21:39:20 stuart
|
||||
# Handle message attachments with boundary errors by not parsing them
|
||||
# until needed.
|
||||
#
|
||||
# Revision 1.54 2004/08/18 01:59:46 stuart
|
||||
# Handle mislabeled multipart messages
|
||||
#
|
||||
# Revision 1.53 2004/04/24 22:53:20 stuart
|
||||
# Rename some local variables to avoid shadowing builtins
|
||||
#
|
||||
# Revision 1.52 2004/04/24 22:47:13 stuart
|
||||
# Convert header values to str
|
||||
#
|
||||
# Revision 1.51 2004/03/25 03:19:10 stuart
|
||||
# Correctly defang rfc822 attachments when boundary specified with
|
||||
# content-type message/rfc822.
|
||||
#
|
||||
# Revision 1.50 2003/10/15 22:01:00 stuart
|
||||
# Test for and work around email bug with encoded filenames.
|
||||
#
|
||||
# Revision 1.49 2003/09/04 18:48:13 stuart
|
||||
# Support python-2.2.3
|
||||
#
|
||||
# Revision 1.48 2003/09/02 00:27:27 stuart
|
||||
# Should have full milter based dspam support working
|
||||
#
|
||||
# Revision 1.47 2003/08/26 06:08:18 stuart
|
||||
# Use new python boolean since we now require 2.2.2
|
||||
#
|
||||
# Revision 1.46 2003/08/26 05:01:38 stuart
|
||||
# Release 0.6.0
|
||||
#
|
||||
# Revision 1.45 2003/08/26 04:01:24 stuart
|
||||
# Use new email module for parsing mail. Still need mime module to
|
||||
# provide various bug fixes to email module, and maintain some compatibility
|
||||
# with old milter code.
|
||||
#
|
||||
|
||||
## @package mime
|
||||
# This module provides a "defang" function to replace naughty attachments.
|
||||
#
|
||||
|
||||
@@ -4,6 +4,7 @@ import testsample
|
||||
import testutils
|
||||
import testgrey
|
||||
import testcfg
|
||||
import testpolicy
|
||||
import os
|
||||
|
||||
def suite():
|
||||
@@ -13,6 +14,7 @@ def suite():
|
||||
s.addTest(testutils.suite())
|
||||
s.addTest(testgrey.suite())
|
||||
s.addTest(testcfg.suite())
|
||||
s.addTest(testpolicy.suite())
|
||||
return s
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
SPF-Pass:example.com OK
|
||||
SPF-Neutral:example.com REJECT
|
||||
HELO-Neutral:example.com OK
|
||||
SPF-Permerror:foo@bad.example.com OK
|
||||
SPF-Permerror: REJECT
|
||||
SMTP-Auth:good@example.com OK
|
||||
SMTP-Auth:example.com REJECT
|
||||
SMTP-Auth:bad@localhost.localdomain REJECT
|
||||
SMTP-Test: REJECT
|
||||
+3
-28
@@ -1,31 +1,6 @@
|
||||
# $Log$
|
||||
# Revision 1.5 2011/06/09 17:27:42 customdesigned
|
||||
# Documentation updates.
|
||||
#
|
||||
# Revision 1.4 2005/07/20 14:49:44 customdesigned
|
||||
# Handle corrupt and empty ZIP files.
|
||||
#
|
||||
# Revision 1.3 2005/06/17 01:49:39 customdesigned
|
||||
# Handle zip within zip.
|
||||
#
|
||||
# Revision 1.2 2005/06/02 15:00:17 customdesigned
|
||||
# Configure banned extensions. Scan zipfile option with test case.
|
||||
#
|
||||
# Revision 1.1.1.2 2005/05/31 18:23:49 customdesigned
|
||||
# Development changes since 0.7.2
|
||||
#
|
||||
# Revision 1.23 2005/02/11 18:34:14 stuart
|
||||
# Handle garbage after quote in boundary.
|
||||
#
|
||||
# Revision 1.22 2005/02/10 01:10:59 stuart
|
||||
# Fixed MimeMessage.ismodified()
|
||||
#
|
||||
# Revision 1.21 2005/02/10 00:56:49 stuart
|
||||
# Runs with python2.4. Defang not working correctly - more work needed.
|
||||
#
|
||||
# Revision 1.20 2004/11/20 16:38:17 stuart
|
||||
# Add rcs log
|
||||
#
|
||||
# @author Stuart D. Gathman <stuart@bmsi.com>
|
||||
# Copyright 2005,2009,2020 Business Management Systems, Inc.
|
||||
# This code is under the GNU General Public License. See COPYING for details.
|
||||
from __future__ import print_function
|
||||
import unittest
|
||||
import mime
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
from __future__ import print_function
|
||||
import unittest
|
||||
import sys
|
||||
import os
|
||||
from Milter.policy import MTAPolicy
|
||||
|
||||
class Config(object):
|
||||
def __init__(self):
|
||||
self.access_file='test/access.db'
|
||||
self.access_file_nulls=True
|
||||
|
||||
class PolicyTestCase(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.config = Config()
|
||||
if os.access('test/access',os.R_OK):
|
||||
if not os.path.exists('test/access.db') or \
|
||||
os.path.getmtime('test/access') > os.path.getmtime('test/access.db'):
|
||||
cmd = 'tr : ! <test/access | makemap hash test/access.db'
|
||||
if os.system(cmd):
|
||||
print('failed!')
|
||||
else:
|
||||
print("Missing test/access")
|
||||
|
||||
def testPolicy(self):
|
||||
with MTAPolicy('good@example.com',conf=self.config) as p:
|
||||
pol = p.getPolicy('smtp-auth')
|
||||
self.assertEqual(pol,'OK')
|
||||
with MTAPolicy('bad@example.com',conf=self.config) as p:
|
||||
pol = p.getPolicy('smtp-auth')
|
||||
self.assertEqual(pol,'REJECT')
|
||||
with MTAPolicy('bad@bad.example.com',conf=self.config) as p:
|
||||
pol = p.getPolicy('smtp-auth')
|
||||
self.assertEqual(pol,None)
|
||||
with MTAPolicy('any@random.com',conf=self.config) as p:
|
||||
pol = p.getPolicy('smtp-test')
|
||||
self.assertEqual(pol,'REJECT')
|
||||
|
||||
def suite(): return unittest.makeSuite(PolicyTestCase,'test')
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) < 2:
|
||||
unittest.main()
|
||||
else:
|
||||
a = sys.argv[1:]
|
||||
while len(a) >= 2:
|
||||
e,k = a[:2]
|
||||
with MTAPolicy(e,conf=Config()) as p:
|
||||
pol = p.getPolicy(k)
|
||||
print(pol)
|
||||
a = a[2:]
|
||||
Reference in New Issue
Block a user