"""
InboundPPR
-----------
And possibly other classes related to outbound traffic, but right now there is
only one, which is an outbound-only subclass of
:py:class:`chapps.util.PostfixPolicyRequest`.
"""
from typing import List
from functools import cached_property
from chapps.util import PostfixPolicyRequest
# from chapps.config import config, CHAPPSConfig
from chapps.signals import NoRecipientsException
import logging
logger = logging.getLogger(__name__)
[docs]class InboundPPR(PostfixPolicyRequest):
"""Encapsulates logic to identify the client domain for inbound mail
"""
[docs] def __init__(self, payload: List[str], **kwargs):
"""Create a new inbound policy request"""
super().__init__(payload)
@cached_property
def recipient_domain(self):
if not len(self.recipients):
raise NoRecipientsException(
f"PPR {ppr.instance} contains no recipients"
)
domains = set([self.domain_from(e) for e in self.recipients])
if len(domains) > 1:
# raise MultipleInboundRecipientsException ?
logger.debug(
f"Using first recipient {ppr.recipients[0]} for domain flags."
)
return self.domain_from(self.recipients[0])
def __str__(self):
"""In certain contexts, `str(<o_ppr>)` is used for brevity
The routine tries to use the `user` which is the point of the class,
but if it cannot determine a non-nil user name, it falls back to
printing a bit of extra detail.
"""
try:
return (
f"i={self.instance} "
f"domain={self.recipient_domain} "
f"sender={self.sender or 'None'} "
f"client_address={self.client_address} "
f"recipient={self.recipient}"
)
except Exception:
return (
f"i={self.instance} "
f"sender={self.sender or 'None'} "
f"client_address={self.client_address} "
f"recipient={self.recipient}"
)