1 个不稳定版本
0.1.0 | 2024年2月26日 |
---|
#150 在 电子邮件
24KB
289 行
Miltr
这是一个 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 规范,但有以下例外
- 最低支持的 Rust 版本
将 MSRV 更新视为仅是次要的 semver 变更,而不是主要的 semver 变更。 - 以
_
开头的功能。这些被视为 '内部' 和 '私有'。这主要用于模糊测试。这使得直接模糊测试内部变得更加容易。外部用户不需要启用这些功能。
开发
待办事项
解析传入宏:
在 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协议的外部文档
- Postfix Milter Readme:https://www.postfix.org/MILTER_README.html
- Sendmail Libmilter文档概述:https://fossies.org/linux/sendmail/libmilter/docs/overview.html
- Purepythonmilter对Milter的评论:https://github.com/gertvdijk/purepythonmilter/blob/develop/docs/milter-protocol.md
致谢
purepythonmilter
特别感谢purepythonmilter,这是一个包含完整milter实现的Python包。没有这个资源来查看“他们是如何做到的”,这个实现就不会出现。
Anh Vu
再次向Anh Vu([email protected])表示感谢,他在Retarus担任工作学生,编写了大部分集成测试,并为实现改进提供了宝贵的反馈。谢谢!
依赖关系
~2–3MB
~57K SLoC