Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
5991f722ec
|
|||
|
74bcfb6639
|
|||
|
bc6d706dc7
|
|||
|
5212201cd1
|
|||
|
1130ec8e95
|
|||
|
5dd76e327c
|
|||
|
d5f030151f
|
|||
|
d7f8f40e03
|
|||
|
ed5575bd2d
|
@@ -37,7 +37,7 @@ RDEPEND="
|
|||||||
lxml? ( dev-python/lxml[${PYTHON_USEDEP}] )
|
lxml? ( dev-python/lxml[${PYTHON_USEDEP}] )
|
||||||
dev-python/netaddr[${PYTHON_USEDEP}]
|
dev-python/netaddr[${PYTHON_USEDEP}]
|
||||||
dev-python/peewee[${PYTHON_USEDEP}]
|
dev-python/peewee[${PYTHON_USEDEP}]
|
||||||
dev-python/pymilter[${PYTHON_USEDEP}]"
|
>=dev-python/pymilter-1.5[${PYTHON_USEDEP}]"
|
||||||
|
|
||||||
python_install_all() {
|
python_install_all() {
|
||||||
distutils-r1_python_install_all
|
distutils-r1_python_install_all
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ __all__ = [
|
|||||||
"whitelist",
|
"whitelist",
|
||||||
"QuarantineMilter"]
|
"QuarantineMilter"]
|
||||||
|
|
||||||
__version__ = "2.0.4"
|
__version__ = "2.0.7"
|
||||||
|
|
||||||
from pyquarantine import _runtime_patches
|
from pyquarantine import _runtime_patches
|
||||||
|
|
||||||
@@ -208,6 +208,7 @@ class QuarantineMilter(Milter.Base):
|
|||||||
|
|
||||||
return Milter.CONTINUE
|
return Milter.CONTINUE
|
||||||
|
|
||||||
|
@Milter.decode("replace")
|
||||||
def envfrom(self, mailfrom, *str):
|
def envfrom(self, mailfrom, *str):
|
||||||
try:
|
try:
|
||||||
self.mailfrom = "@".join(parse_addr(mailfrom)).lower()
|
self.mailfrom = "@".join(parse_addr(mailfrom)).lower()
|
||||||
@@ -219,6 +220,7 @@ class QuarantineMilter(Milter.Base):
|
|||||||
|
|
||||||
return Milter.CONTINUE
|
return Milter.CONTINUE
|
||||||
|
|
||||||
|
@Milter.decode("replace")
|
||||||
def envrcpt(self, to, *str):
|
def envrcpt(self, to, *str):
|
||||||
try:
|
try:
|
||||||
self.rcpts.add("@".join(parse_addr(to)).lower())
|
self.rcpts.add("@".join(parse_addr(to)).lower())
|
||||||
@@ -243,6 +245,7 @@ class QuarantineMilter(Milter.Base):
|
|||||||
|
|
||||||
return Milter.CONTINUE
|
return Milter.CONTINUE
|
||||||
|
|
||||||
|
@Milter.decode("replace")
|
||||||
def header(self, field, value):
|
def header(self, field, value):
|
||||||
try:
|
try:
|
||||||
# remove CR and LF from address fields, otherwise pythons
|
# remove CR and LF from address fields, otherwise pythons
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
# along with pyquarantine. If not, see <http://www.gnu.org/licenses/>.
|
# along with pyquarantine. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from sys import version_info
|
||||||
import encodings
|
import encodings
|
||||||
|
|
||||||
|
|
||||||
@@ -150,68 +151,6 @@ def get_obs_local_part(value):
|
|||||||
setattr(email._header_value_parser, "get_obs_local_part", get_obs_local_part)
|
setattr(email._header_value_parser, "get_obs_local_part", get_obs_local_part)
|
||||||
|
|
||||||
|
|
||||||
# https://bugs.python.org/issue30681
|
|
||||||
#
|
|
||||||
# fix: https://github.com/python/cpython/pull/22090
|
|
||||||
|
|
||||||
import email.errors
|
|
||||||
from email.errors import HeaderDefect
|
|
||||||
|
|
||||||
|
|
||||||
class InvalidDateDefect(HeaderDefect):
|
|
||||||
"""Header has unparseable or invalid date"""
|
|
||||||
|
|
||||||
|
|
||||||
setattr(email.errors, "InvalidDateDefect", InvalidDateDefect)
|
|
||||||
|
|
||||||
|
|
||||||
import email.utils
|
|
||||||
from email.utils import _parsedate_tz
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
|
|
||||||
def parsedate_to_datetime(data):
|
|
||||||
parsed_date_tz = _parsedate_tz(data)
|
|
||||||
if parsed_date_tz is None:
|
|
||||||
raise ValueError('Invalid date value or format "%s"' % str(data))
|
|
||||||
*dtuple, tz = parsed_date_tz
|
|
||||||
if tz is None:
|
|
||||||
return datetime.datetime(*dtuple[:6])
|
|
||||||
return datetime.datetime(*dtuple[:6],
|
|
||||||
tzinfo=datetime.timezone(datetime.timedelta(seconds=tz)))
|
|
||||||
|
|
||||||
|
|
||||||
setattr(email.utils, "parsedate_to_datetime", parsedate_to_datetime)
|
|
||||||
|
|
||||||
|
|
||||||
import email.headerregistry
|
|
||||||
from email import utils, _header_value_parser as parser
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def parse(cls, value, kwds):
|
|
||||||
if not value:
|
|
||||||
kwds['defects'].append(errors.HeaderMissingRequiredValue())
|
|
||||||
kwds['datetime'] = None
|
|
||||||
kwds['decoded'] = ''
|
|
||||||
kwds['parse_tree'] = parser.TokenList()
|
|
||||||
return
|
|
||||||
if isinstance(value, str):
|
|
||||||
kwds['decoded'] = value
|
|
||||||
try:
|
|
||||||
value = utils.parsedate_to_datetime(value)
|
|
||||||
except ValueError:
|
|
||||||
kwds['defects'].append(errors.InvalidDateDefect('Invalid date value or format'))
|
|
||||||
kwds['datetime'] = None
|
|
||||||
kwds['parse_tree'] = parser.TokenList()
|
|
||||||
return
|
|
||||||
kwds['datetime'] = value
|
|
||||||
kwds['decoded'] = utils.format_datetime(kwds['datetime'])
|
|
||||||
kwds['parse_tree'] = cls.value_parser(kwds['decoded'])
|
|
||||||
|
|
||||||
|
|
||||||
setattr(email.headerregistry.DateHeader, "parse", parse)
|
|
||||||
|
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# add charset alias for windows-874 #
|
# add charset alias for windows-874 #
|
||||||
#######################################
|
#######################################
|
||||||
@@ -227,3 +166,66 @@ for alias in ["windows-874", "windows_874"]:
|
|||||||
aliases[alias] = "cp874"
|
aliases[alias] = "cp874"
|
||||||
|
|
||||||
setattr(encodings.aliases, "aliases", aliases)
|
setattr(encodings.aliases, "aliases", aliases)
|
||||||
|
|
||||||
|
|
||||||
|
if version_info.major == 3 and version_info.minor < 10:
|
||||||
|
# https://bugs.python.org/issue30681
|
||||||
|
#
|
||||||
|
# fix: https://github.com/python/cpython/pull/22090
|
||||||
|
|
||||||
|
import email.errors
|
||||||
|
from email.errors import HeaderDefect
|
||||||
|
|
||||||
|
|
||||||
|
class InvalidDateDefect(HeaderDefect):
|
||||||
|
"""Header has unparseable or invalid date"""
|
||||||
|
|
||||||
|
|
||||||
|
setattr(email.errors, "InvalidDateDefect", InvalidDateDefect)
|
||||||
|
|
||||||
|
|
||||||
|
import email.utils
|
||||||
|
from email.utils import _parsedate_tz
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
|
||||||
|
def parsedate_to_datetime(data):
|
||||||
|
parsed_date_tz = _parsedate_tz(data)
|
||||||
|
if parsed_date_tz is None:
|
||||||
|
raise ValueError('Invalid date value or format "%s"' % str(data))
|
||||||
|
*dtuple, tz = parsed_date_tz
|
||||||
|
if tz is None:
|
||||||
|
return datetime.datetime(*dtuple[:6])
|
||||||
|
return datetime.datetime(*dtuple[:6],
|
||||||
|
tzinfo=datetime.timezone(datetime.timedelta(seconds=tz)))
|
||||||
|
|
||||||
|
|
||||||
|
setattr(email.utils, "parsedate_to_datetime", parsedate_to_datetime)
|
||||||
|
|
||||||
|
|
||||||
|
import email.headerregistry
|
||||||
|
from email import utils, _header_value_parser as parser
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def parse(cls, value, kwds):
|
||||||
|
if not value:
|
||||||
|
kwds['defects'].append(errors.HeaderMissingRequiredValue())
|
||||||
|
kwds['datetime'] = None
|
||||||
|
kwds['decoded'] = ''
|
||||||
|
kwds['parse_tree'] = parser.TokenList()
|
||||||
|
return
|
||||||
|
if isinstance(value, str):
|
||||||
|
kwds['decoded'] = value
|
||||||
|
try:
|
||||||
|
value = utils.parsedate_to_datetime(value)
|
||||||
|
except ValueError:
|
||||||
|
kwds['defects'].append(errors.InvalidDateDefect('Invalid date value or format'))
|
||||||
|
kwds['datetime'] = None
|
||||||
|
kwds['parse_tree'] = parser.TokenList()
|
||||||
|
return
|
||||||
|
kwds['datetime'] = value
|
||||||
|
kwds['decoded'] = utils.format_datetime(kwds['datetime'])
|
||||||
|
kwds['parse_tree'] = cls.value_parser(kwds['decoded'])
|
||||||
|
|
||||||
|
|
||||||
|
setattr(email.headerregistry.DateHeader, "parse", parse)
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ def main():
|
|||||||
sysloghandler = logging.handlers.SysLogHandler(
|
sysloghandler = logging.handlers.SysLogHandler(
|
||||||
address="/dev/log", facility=logging.handlers.SysLogHandler.LOG_MAIL)
|
address="/dev/log", facility=logging.handlers.SysLogHandler.LOG_MAIL)
|
||||||
sysloghandler.setFormatter(
|
sysloghandler.setFormatter(
|
||||||
logging.Formatter("pyquarantine: %(message)s"))
|
logging.Formatter(f"{name}[%(process)d]: %(message)s"))
|
||||||
root_logger.addHandler(sysloghandler)
|
root_logger.addHandler(sysloghandler)
|
||||||
|
|
||||||
logger.info("milter starting")
|
logger.info("milter starting")
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -48,6 +48,6 @@ setup(name = "pyquarantine",
|
|||||||
]
|
]
|
||||||
)
|
)
|
||||||
],
|
],
|
||||||
install_requires = ["pymilter", "jsonschema", "netaddr", "beautifulsoup4[lxml]", "peewee"],
|
install_requires = ["pymilter >= 1.5", "jsonschema", "netaddr", "beautifulsoup4[lxml]", "peewee"],
|
||||||
python_requires = ">=3.9"
|
python_requires = ">=3.9"
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user