2021-06-26 17:13:27 -04:00
|
|
|
import ipaddress
|
2021-08-31 22:20:45 -04:00
|
|
|
import re
|
2021-06-26 17:13:27 -04:00
|
|
|
import socket
|
|
|
|
from unittest.mock import Mock
|
|
|
|
|
|
|
|
import Milter
|
|
|
|
|
|
|
|
import csc_milter.main as csc_milter
|
|
|
|
|
|
|
|
|
|
|
|
def setup_module():
|
|
|
|
csc_milter.MYNETWORKS = [
|
|
|
|
ipaddress.ip_network('129.97.134.0/24'),
|
|
|
|
]
|
|
|
|
csc_milter.MYORIGIN = 'csclub.uwaterloo.ca'
|
2021-08-31 22:20:45 -04:00
|
|
|
csc_milter.RECEIVED_REGEX = re.compile(r"\bby ([\w-]+\.)?csclub\.uwaterloo\.ca\b")
|
2021-06-26 17:13:27 -04:00
|
|
|
|
|
|
|
|
|
|
|
def teardown_module():
|
|
|
|
csc_milter.MYNETWORKS = []
|
|
|
|
csc_milter.MYORIGIN = ''
|
2021-08-31 22:20:45 -04:00
|
|
|
csc_milter.RECEIVED_REGEX = None
|
2021-06-26 17:13:27 -04:00
|
|
|
|
|
|
|
|
2021-08-31 22:20:45 -04:00
|
|
|
def get_milter(dst_port, auth=False):
|
2021-06-26 17:13:27 -04:00
|
|
|
milter = csc_milter.CSCMilter()
|
2021-08-31 22:20:45 -04:00
|
|
|
def getsymval(s):
|
|
|
|
if s == '{daemon_port}':
|
|
|
|
return str(dst_port)
|
|
|
|
if s == '{auth_type}' and auth:
|
|
|
|
return 'PLAIN'
|
|
|
|
return None
|
|
|
|
milter.getsymval = Mock(side_effect=getsymval)
|
2021-06-26 17:13:27 -04:00
|
|
|
milter._protocol = 18266 # to make the @Milter.noreply work
|
|
|
|
milter.setreply = Mock()
|
|
|
|
return milter
|
|
|
|
|
|
|
|
|
|
|
|
def test_local_port_25():
|
|
|
|
milter = get_milter(25)
|
|
|
|
ret = milter.connect('caffeine.csclub.uwaterloo.ca', socket.AF_INET, ('129.97.134.17', 10000))
|
|
|
|
assert ret == Milter.ACCEPT
|
|
|
|
|
|
|
|
|
|
|
|
def test_local_port_587():
|
|
|
|
milter = get_milter(587)
|
|
|
|
ret = milter.connect('caffeine.csclub.uwaterloo.ca', socket.AF_INET, ('129.97.134.17', 10000))
|
|
|
|
assert ret == Milter.ACCEPT
|
|
|
|
|
|
|
|
|
2021-08-31 22:20:45 -04:00
|
|
|
def remote_connect(milter):
|
|
|
|
return milter.connect('[24.114.29.182]', socket.AF_INET, ('24.114.29.182', 10000))
|
|
|
|
|
|
|
|
|
2021-06-26 17:13:27 -04:00
|
|
|
def test_remote_port_25_csc_address():
|
|
|
|
milter = get_milter(25)
|
2021-08-31 22:20:45 -04:00
|
|
|
ret = remote_connect(milter)
|
2021-06-26 17:13:27 -04:00
|
|
|
assert ret == Milter.CONTINUE
|
|
|
|
milter.envfrom('<user@example.com>')
|
|
|
|
ret = milter.header('From', '<syscom@csclub.uwaterloo.ca>')
|
|
|
|
assert ret == Milter.REJECT
|
|
|
|
|
|
|
|
|
|
|
|
def test_remote_port_25_non_csc_address():
|
|
|
|
milter = get_milter(25)
|
2021-08-31 22:20:45 -04:00
|
|
|
remote_connect(milter)
|
2021-06-26 17:13:27 -04:00
|
|
|
milter.envfrom('<user@example.com>')
|
|
|
|
ret = milter.header('From', 'John Doe <user@example.com>')
|
|
|
|
assert ret == Milter.CONTINUE
|
|
|
|
|
|
|
|
|
|
|
|
def test_remote_port_587():
|
|
|
|
milter = get_milter(587)
|
2021-08-31 22:20:45 -04:00
|
|
|
ret = remote_connect(milter)
|
|
|
|
assert ret == Milter.ACCEPT
|
|
|
|
|
|
|
|
|
|
|
|
def test_remote_port_25_with_auth():
|
|
|
|
milter = get_milter(25, auth=True)
|
|
|
|
remote_connect(milter)
|
|
|
|
ret = milter.envfrom('<user@csclub.uwaterloo.ca>')
|
2021-06-26 17:13:27 -04:00
|
|
|
assert ret == Milter.ACCEPT
|
2021-08-31 22:20:45 -04:00
|
|
|
|
|
|
|
|
|
|
|
def test_remote_port_25_with_received_origin():
|
|
|
|
milter = get_milter(25)
|
|
|
|
remote_connect(milter)
|
|
|
|
milter.envfrom('<user@csclub.uwaterloo.ca>')
|
|
|
|
ret = milter.header('Received', 'from 24.114.29.182\n\tby mail.csclub.uwaterloo.ca (Postfix)')
|
|
|
|
assert ret == Milter.ACCEPT
|
|
|
|
|
|
|
|
|
|
|
|
def test_remote_port_25_with_received_nonorigin():
|
|
|
|
milter = get_milter(25)
|
|
|
|
remote_connect(milter)
|
|
|
|
milter.envfrom('<user@csclub.uwaterloo.ca>')
|
|
|
|
ret = milter.header('Received', 'from 24.114.29.182\n\tby mail.example.com (Postfix)')
|
|
|
|
assert ret == Milter.CONTINUE
|
|
|
|
ret = milter.header('From', '<syscom@csclub.uwaterloo.ca>')
|
|
|
|
assert ret == Milter.REJECT
|