- Introduce exceptions to be raised upon transient and permanent delivery
failures, as specified by SMTP RFC. Depending on type of failure, return
either 451 or 554 reply code.
- When serialising a message, treat ValueError as a serialisation issue (and
try again to deliver in cleartext).
When we fail to produce byte representation of the email message being
processed, we may end up bouncing a message. An example of such case would be
a message with a Message-Id header that Python's email parser library cannot
process.
In such cases, just take whatever original content we have received and pass
it to the destination without touching it to minimise any chances of breaking
the overall flow.
- Provide a new reuqired parameter: [database]pooling_mode and use it during
SQLAlchemy engine initialisation.
- Update tests and configuration (including sample configuration).
- Adjust repository unit test to load config during setup.
- Pass an engine instance to repository constructors instead of connections.
Engine keeps a connection pool and we rely on it.
Introduce new Python modules:
- lacre.notify -- to send notifications from the cron script;
- lacre.dbschema -- to keep database schema definition as code (SQLAlchemy);
- lacre.repositories -- to define key and identity repositories with high
level APIs that we can then use elsewhere.
Also:
- rework GnuPG.add_key to return fingerprint so we can use it in the cron
script;
- rename cron-job's logger name, replacing dash with an underscore as logging
module doesn't like dashes.
- Polish implementation of mail operations (lacre/mailop.py). Add two
strategies: InlineOpenPGPEncrypt and MimeOpenPGPEncrypt, to support two modes
of OpenPGP encryption.
- In delivery_plan, only use those strategies that actually make sense with
the recipients we'd got.
- Add flag_enabled predicate (lacre/config.py) to make configuration checks
easier / simpler.
- Handle TypeError errors in Advanced Filter, indicating a delivery failure
when they appear.
- Add type hints to some of the functions.
- Add a "mailop" module to define mail operations. Each should inherit from
MailOperation class (which just defines the contract).
- Make lacre.mailgate.delivery_plan always return KeepIntact strategy to have
a daemon that just forwards messages without modifying them.
- Add sample configuration.
- Include daemon configuration in mandatory parameter check.
Also: extend failover logging configuration with file-based handler to make
sure that the user gets _some_ logs even if they do not configure Lacre at
all.
- Replace custom logging code with calls to logging module.
- Use logging.config to provide configuration parameters.
To make Lacre's logging more flexible, use fileConfig from logging.config to
set up all parameters. If the configuration file is missing, use dictConfig
with hardcoded reasonable defaults.
- Move configuration-processing code to a separate module (lacre.config) and
provide a simple API to access configuration parameters.
- Prepare to use builtin logging module to log diagnostic data.
- Rework the configuration-processing file to make it cleaner.
- Log additional information while processing configuration.
- Reorder functions.