This commit is contained in:
2024-01-08 14:34:02 +01:00
parent 4da1a0e9b3
commit 1c81505126
5 changed files with 57 additions and 73 deletions

View File

@@ -24,7 +24,7 @@ __all__ = [
"rule", "rule",
"run", "run",
"storage", "storage",
"list", "lists",
"QuarantineMilter"] "QuarantineMilter"]
__version__ = "2.1.0" __version__ = "2.1.0"

View File

@@ -24,7 +24,7 @@ import time
from pyquarantine.action import Action from pyquarantine.action import Action
from pyquarantine.config import get_milter_config, ActionConfig, StorageConfig, NotificationConfig, ListConfig from pyquarantine.config import get_milter_config, ActionConfig, StorageConfig, NotificationConfig, ListConfig
from pyquarantine.storage import Quarantine from pyquarantine.storage import Quarantine
from pyquarantine.list import DatabaseList from pyquarantine.lists import DatabaseList
from pyquarantine import __version__ as version from pyquarantine import __version__ as version
@@ -110,7 +110,7 @@ def print_table(columns, rows):
print(row_format.format(*row)) print(row_format.format(*row))
def llist(cfg, args): def show(cfg, args):
quarantines = _get_quarantines(cfg) quarantines = _get_quarantines(cfg)
if args.batch: if args.batch:
print("\n".join([q["name"] for q in quarantines])) print("\n".join([q["name"] for q in quarantines]))
@@ -120,9 +120,9 @@ def llist(cfg, args):
qcfg = q["options"] qcfg = q["options"]
if "notify" in qcfg: if "notify" in qcfg:
notification = cfg["notifications"][qcfg["notify"]]["name"] notify_type = cfg["notifications"][qcfg["notify"]]["type"]
else: else:
notification = "NONE" notify_type = "NONE"
if "allowlist" in qcfg: if "allowlist" in qcfg:
allowlist = qcfg["allowlist"] allowlist = qcfg["allowlist"]
@@ -134,12 +134,12 @@ def llist(cfg, args):
else: else:
milter_action = "NONE" milter_action = "NONE"
storage_name = cfg["storages"][qcfg["store"]]["name"] storage_type = cfg["storages"][qcfg["store"]]["type"]
qlist.append({ qlist.append({
"name": q["name"], "name": q["name"],
"storage": storage_name, "storage": storage_type,
"notification": notification, "notification": notify_type,
"lists": allowlist, "lists": allowlist,
"action": milter_action}) "action": milter_action})
@@ -152,34 +152,6 @@ def llist(cfg, args):
qlist qlist
) )
if "storages" in cfg:
storages = []
for name, options in cfg["storages"].items():
storages.append({
"name": name,
"type": options["type"]})
print("\n")
print_table(
[("Storage", "name"),
("Type", "type")],
storages
)
if "notifications" in cfg:
notifications = []
for name, options in cfg["notifications"].items():
notifications.append({
"name": name,
"type": options["type"]})
print("\n")
print_table(
[("Notification", "name"),
("Type", "type")],
notifications
)
if "lists" in cfg: if "lists" in cfg:
lst_list = [] lst_list = []
for name, options in cfg["lists"].items(): for name, options in cfg["lists"].items():
@@ -244,10 +216,10 @@ def list_quarantine_emails(cfg, args):
def list_list(cfg, args): def list_list(cfg, args):
lists = _get_list(cfg, args.list, args.debug) lst = _get_list(cfg, args.list, args.debug)
# find lists entries # find lists entries
entries = lists.find( entries = lst.find(
mailfrom=args.mailfrom, mailfrom=args.mailfrom,
recipients=args.recipients, recipients=args.recipients,
older_than=args.older_than) older_than=args.older_than)
@@ -275,10 +247,10 @@ def list_list(cfg, args):
def add_list_entry(cfg, args): def add_list_entry(cfg, args):
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
lists = _get_list(cfg, args.list, args.debug) lst = _get_list(cfg, args.list, args.debug)
# check existing entries # check existing entries
entries = lists.check(args.mailfrom, args.recipient, logger) entries = lst.check(args.mailfrom, args.recipient, logger)
if entries: if entries:
# check if the exact entry exists already # check if the exact entry exists already
for entry in entries.values(): for entry in entries.values():
@@ -309,13 +281,13 @@ def add_list_entry(cfg, args):
"use --force to override.") "use --force to override.")
# add entry to lists # add entry to lists
lists.add(args.mailfrom, args.recipient, args.comment, args.permanent) lst.add(args.mailfrom, args.recipient, args.comment, args.permanent)
print("list entry added successfully") print("list entry added successfully")
def delete_list_entry(cfg, args): def delete_list_entry(cfg, args):
lists = _get_list(cfg, args.list, args.debug) lst = _get_list(cfg, args.list, args.debug)
lists.delete(args.lists_id) lst.delete(args.list_id)
print("list entry deleted successfully") print("list entry deleted successfully")
@@ -402,15 +374,15 @@ def main():
subparsers.required = True subparsers.required = True
# list command # list command
list_parser = subparsers.add_parser( show_parser = subparsers.add_parser(
"list", "show",
help="List available quarantines.", help="Show quarantines.",
formatter_class=formatter_class) formatter_class=formatter_class)
list_parser.add_argument( show_parser.add_argument(
"-b", "--batch", "-b", "--batch",
help="Print results using only quarantine names, each on a new line.", help="Print results using only quarantine names, each on a new line.",
action="store_true") action="store_true")
list_parser.set_defaults(func=llist) show_parser.set_defaults(func=show)
# quarantine command group # quarantine command group
quar_parser = subparsers.add_parser( quar_parser = subparsers.add_parser(
@@ -574,86 +546,86 @@ def main():
help="Quarantine ID.") help="Quarantine ID.")
quar_metadata_parser.set_defaults(func=metadata) quar_metadata_parser.set_defaults(func=metadata)
# lists command group # list command group
lists_parser = subparsers.add_parser( list_parser = subparsers.add_parser(
"lists", "list",
description="Manage lists.", description="Manage lists.",
help="Manage lists.", help="Manage lists.",
formatter_class=formatter_class) formatter_class=formatter_class)
lists_parser.add_argument( list_parser.add_argument(
"list", "list",
metavar="LIST", metavar="LIST",
help="List name.") help="List name.")
lists_subparsers = lists_parser.add_subparsers( list_subparsers = list_parser.add_subparsers(
dest="command", dest="command",
title="Lists commands.") title="Lists commands.")
lists_subparsers.required = True list_subparsers.required = True
# lists list command # lists list command
lists_list_parser = lists_subparsers.add_parser( list_list_parser = list_subparsers.add_parser(
"list", "list",
description="List list entries.", description="List list entries.",
help="List list entries.", help="List list entries.",
formatter_class=formatter_class) formatter_class=formatter_class)
lists_list_parser.add_argument( list_list_parser.add_argument(
"-f", "--from", "-f", "--from",
dest="mailfrom", dest="mailfrom",
help="Filter entries by from address.", help="Filter entries by from address.",
default=None, default=None,
nargs="+") nargs="+")
lists_list_parser.add_argument( list_list_parser.add_argument(
"-t", "--to", "-t", "--to",
dest="recipients", dest="recipients",
help="Filter entries by recipient address.", help="Filter entries by recipient address.",
default=None, default=None,
nargs="+") nargs="+")
lists_list_parser.add_argument( list_list_parser.add_argument(
"-o", "--older-than", "-o", "--older-than",
dest="older_than", dest="older_than",
help="Filter emails by last used date (days).", help="Filter emails by last used date (days).",
default=None, default=None,
type=float) type=float)
lists_list_parser.set_defaults(func=list_list) list_list_parser.set_defaults(func=list_list)
# lists add command # lists add command
lists_add_parser = lists_subparsers.add_parser( list_add_parser = list_subparsers.add_parser(
"add", "add",
description="Add list entry.", description="Add list entry.",
help="Add list entry.", help="Add list entry.",
formatter_class=formatter_class) formatter_class=formatter_class)
lists_add_parser.add_argument( list_add_parser.add_argument(
"-f", "--from", "-f", "--from",
dest="mailfrom", dest="mailfrom",
help="From address.", help="From address.",
required=True) required=True)
lists_add_parser.add_argument( list_add_parser.add_argument(
"-t", "--to", "-t", "--to",
dest="recipient", dest="recipient",
help="Recipient address.", help="Recipient address.",
required=True) required=True)
lists_add_parser.add_argument( list_add_parser.add_argument(
"-c", "--comment", "-c", "--comment",
help="Comment.", help="Comment.",
default="added by CLI") default="added by CLI")
lists_add_parser.add_argument( list_add_parser.add_argument(
"-p", "--permanent", "-p", "--permanent",
help="Add a permanent entry.", help="Add a permanent entry.",
action="store_true") action="store_true")
lists_add_parser.add_argument( list_add_parser.add_argument(
"--force", "--force",
help="Force adding an entry, " help="Force adding an entry, "
"even if already covered by another entry.", "even if already covered by another entry.",
action="store_true") action="store_true")
lists_add_parser.set_defaults(func=add_list_entry) list_add_parser.set_defaults(func=add_list_entry)
# lists delete command # lists delete command
lists_delete_parser = lists_subparsers.add_parser( list_delete_parser = list_subparsers.add_parser(
"delete", "delete",
description="Delete list entry.", description="Delete list entry.",
help="Delete list entry.", help="Delete list entry.",
formatter_class=formatter_class) formatter_class=formatter_class)
lists_delete_parser.add_argument( list_delete_parser.add_argument(
"lists_id", "list_id",
metavar="ID", metavar="ID",
help="List ID.") help="List ID.")
lists_delete_parser.set_defaults(func=delete_list_entry) list_delete_parser.set_defaults(func=delete_list_entry)
args = parser.parse_args() args = parser.parse_args()

View File

@@ -19,7 +19,7 @@ import re
from netaddr import IPAddress, IPNetwork, AddrFormatError from netaddr import IPAddress, IPNetwork, AddrFormatError
from pyquarantine import CustomLogger from pyquarantine import CustomLogger
from pyquarantine.list import DatabaseList from pyquarantine.lists import DatabaseList
class Conditions: class Conditions:
@@ -121,6 +121,17 @@ class Conditions:
return True return True
def update_msginfo_from_match(self, milter, match):
if self.metavar is None:
return
named_subgroups = match.groupdict(default=None)
for group, value in named_subgroups.items():
if value is None:
continue
name = f"{self.metavar}_{group}"
milter.msginfo["vars"][name] = value
def match(self, milter): def match(self, milter):
logger = CustomLogger( logger = CustomLogger(
self.logger, {"qid": milter.qid, "name": self.cfg["name"]}) self.logger, {"qid": milter.qid, "name": self.cfg["name"]})

View File

@@ -31,7 +31,7 @@ from time import gmtime
from pyquarantine import mailer from pyquarantine import mailer
from pyquarantine.base import CustomLogger, MilterMessage from pyquarantine.base import CustomLogger, MilterMessage
from pyquarantine.list import DatabaseList from pyquarantine.lists import DatabaseList
from pyquarantine.notify import Notify from pyquarantine.notify import Notify
@@ -371,6 +371,7 @@ class Store:
def __init__(self, cfg, local_addrs, debug): def __init__(self, cfg, local_addrs, debug):
self.cfg = cfg self.cfg = cfg
self.name = cfg["name"]
self.logger = logging.getLogger(cfg["name"]) self.logger = logging.getLogger(cfg["name"])
del cfg["name"] del cfg["name"]
self.logger.setLevel(cfg.get_loglevel(debug)) self.logger.setLevel(cfg.get_loglevel(debug))
@@ -392,7 +393,7 @@ class Store:
def execute(self, milter): def execute(self, milter):
logger = CustomLogger( logger = CustomLogger(
self.logger, {"name": self.cfg["name"], "qid": milter.qid}) self.logger, {"name": self.name, "qid": milter.qid})
self._storage.execute(milter, logger) self._storage.execute(milter, logger)