#recipient #milter #async-trait #postfix #action #testing

miltr-common

一个纯 Rust 编写的 miltr 公共库

1 个不稳定版本

0.1.0 2024年2月26日

#329邮件


用于 2 crate

MIT 许可证

99KB
2.5K SLoC

Miltr

此 crate 是 postfix 和 sendmail 所使用的 milter 协议的实现。

最小可行用途是

use async_trait::async_trait;
use miltr_common::{actions::{Action, Continue}, commands::Recipient};
use miltr_server::Milter;

struct PrintRcptMilter;

#[async_trait]
impl Milter for PrintRcptMilter {
    type Error = &'static str;

    /// Just print the recipient
    async fn rcpt(&mut self, recipient: Recipient) -> Result<Action, Self::Error> {
        println!("Received recipient: {:?}", recipient);

        Ok(Continue.into())
    }

    /// Abort has to be implemented. It is called at least once per mail
    /// handling an can occur at any time during the milter conversation.
    /// As this milter does not have any state, nothing has to be cleared.
    async fn abort(&mut self) -> Result<Action, Self::Error> {
        Ok(Continue.into())
    }
}

有关如何使用它的示例,请参阅 ./examples 目录。

安全性

此 crate 在它的 linting 中使用 unsafe_code = "forbid",但同时也使用 cast-possible-truncation = "allow"。因此请自行承担风险。

语义版本

此 crate 遵循 semver 规范,但有以下例外

  1. 最低支持的 Rust 版本
    将 MSRV 的提升视为 semver 的次要更改,而不是主要更改。
  2. _ 开头的功能。这些被视为 '内部' 和 '私有'。这主要用于模糊测试。这使得直接模糊测试内部变得更加容易。外部用户不应需要启用这些功能。

开发

待办事项

解析传入宏:
protocol::commands::optneg::Optneg::parse() 中,实现解析传入宏。目前该功能是空的。

设计决策

这试图给出关于实现细节的 '论证'。

BytesMut 和所有权

使用 BytesMut::(split_to|split_off) 解析此协议相对容易。这允许所有解析命令仅拥有自己的数据,而无需任何借用复杂性,同时在解析步骤中(而不是在结构体的访问函数/获取器)拥有解析逻辑。

这会带来一些额外的分配,但就目前而言,这种简化是值得的。这可能在将来得到优化。

长度 & 数学 & 溢出

目前,此库在处理参数长度方面并不严格。
这意味着,实现者可以向 milter 编解码器传递过长数据。

编解码器将拒绝在编码时以及拒绝从网络中解码过长的数据。

在这种情况下拒绝将导致 milter 编解码器出错。这种行为可能不是理想的,但就目前而言,这是我能想到的最佳方案。

此外,这个软件包还存在溢出崩溃的问题。如果在32位系统上传递一个参数(例如,一个标题值),其长度为usize::MAX(约4GiB),编码器将尝试获取项目长度:name.len() + value.len()。这将导致溢出并在调试模式下崩溃,在发布模式下包装,从而中断连接。

这是目前接受的权衡,因为邮件可能比现代系统上的usize小得多。

这可以通过更好的方式实现。

集成测试

要运行集成测试,此存储库需要一些软件

  • postfix
  • swaks

集成测试假设它们可以自由调用这些组件。为了避免在您的系统上安装它们,此存储库包含一个docker-compose.yml,安装一个包含所有必需工具的容器。

然后可以运行测试

docker compose run test_milter

Milter协议的外部文档

致谢

purepythonmilter

特别感谢purepythonmilter,这是一个包含完整milter实现的Python包。没有这个资源来查看“他们是怎样做到的”,这个实现就不会发生。

Nguyen Vu

还要感谢Nguyen Vu([email protected]),他在Retarus担任工作学生,编写了大部分集成测试,并为实现改进提供了宝贵的反馈。谢谢!

依赖关系

~1.8–2.7MB
~53K SLoC