mirror of
https://github.com/stalwartlabs/mail-server.git
synced 2025-12-11 22:06:31 +08:00
Bump to smtp-proto 0.2
This commit is contained in:
parent
dde4663efc
commit
7b48d9022f
22 changed files with 341 additions and 210 deletions
366
Cargo.lock
generated
366
Cargo.lock
generated
|
|
@ -109,12 +109,6 @@ version = "0.2.21"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
|
||||
|
||||
[[package]]
|
||||
name = "android-tzdata"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
|
||||
|
||||
[[package]]
|
||||
name = "android_system_properties"
|
||||
version = "0.1.5"
|
||||
|
|
@ -1022,9 +1016,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.36"
|
||||
version = "1.2.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5252b3d2648e5eedbc1a6f501e3c795e07025c1e93bbf8bbdd6eef7f447a6d54"
|
||||
checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"jobserver",
|
||||
|
|
@ -1090,18 +1084,17 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
|||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.41"
|
||||
version = "0.4.42"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
|
||||
checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2"
|
||||
dependencies = [
|
||||
"android-tzdata",
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
"num-traits",
|
||||
"pure-rust-locales",
|
||||
"serde",
|
||||
"wasm-bindgen",
|
||||
"windows-link 0.1.3",
|
||||
"windows-link 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1248,7 +1241,7 @@ dependencies = [
|
|||
"idna",
|
||||
"imagesize",
|
||||
"imap_proto",
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"infer 0.19.0",
|
||||
"jmap_proto",
|
||||
"libc",
|
||||
|
|
@ -1297,7 +1290,7 @@ dependencies = [
|
|||
"whatlang",
|
||||
"x509-parser 0.17.0",
|
||||
"xxhash-rust",
|
||||
"zip",
|
||||
"zip 4.6.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1403,9 +1396,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "const_panic"
|
||||
version = "0.2.14"
|
||||
version = "0.2.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb8a602185c3c95b52f86dc78e55a6df9a287a7a93ddbcf012509930880cf879"
|
||||
checksum = "e262cdaac42494e3ae34c43969f9cdeb7da178bdb4b66fa6a1ea2edb4c8ae652"
|
||||
dependencies = [
|
||||
"typewit",
|
||||
]
|
||||
|
|
@ -1460,6 +1453,21 @@ dependencies = [
|
|||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crc"
|
||||
version = "3.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675"
|
||||
dependencies = [
|
||||
"crc-catalog",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crc-catalog"
|
||||
version = "2.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
|
||||
|
||||
[[package]]
|
||||
name = "crc16"
|
||||
version = "0.4.0"
|
||||
|
|
@ -2294,22 +2302,22 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
|||
|
||||
[[package]]
|
||||
name = "erased-serde"
|
||||
version = "0.4.6"
|
||||
version = "0.4.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7"
|
||||
checksum = "110ca254af04e46794fcc4be0991e72e13fdd8c78119e02c76a5473f6f74e049"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_core",
|
||||
"typeid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
version = "0.3.13"
|
||||
version = "0.3.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
|
||||
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.60.2",
|
||||
"windows-sys 0.61.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -2693,15 +2701,6 @@ dependencies = [
|
|||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fxhash"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
|
||||
dependencies = [
|
||||
"byteorder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "generator"
|
||||
version = "0.8.7"
|
||||
|
|
@ -2780,7 +2779,7 @@ dependencies = [
|
|||
"js-sys",
|
||||
"libc",
|
||||
"r-efi",
|
||||
"wasi 0.14.4+wasi-0.2.4",
|
||||
"wasi 0.14.5+wasi-0.2.4",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
|
|
@ -2870,7 +2869,7 @@ dependencies = [
|
|||
"futures-sink",
|
||||
"futures-util",
|
||||
"http 0.2.12",
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
|
|
@ -2889,7 +2888,7 @@ dependencies = [
|
|||
"futures-core",
|
||||
"futures-sink",
|
||||
"http 1.3.1",
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
|
|
@ -3277,9 +3276,9 @@ checksum = "9994b79e8c1a39b3166c63ae7823bb2b00831e2a96a31399c50fe69df408eaeb"
|
|||
|
||||
[[package]]
|
||||
name = "humantime"
|
||||
version = "2.2.0"
|
||||
version = "2.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f"
|
||||
checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424"
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
|
|
@ -3398,9 +3397,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
version = "0.1.63"
|
||||
version = "0.1.64"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8"
|
||||
checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb"
|
||||
dependencies = [
|
||||
"android_system_properties",
|
||||
"core-foundation-sys",
|
||||
|
|
@ -3408,7 +3407,7 @@ dependencies = [
|
|||
"js-sys",
|
||||
"log",
|
||||
"wasm-bindgen",
|
||||
"windows-core",
|
||||
"windows-core 0.62.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -3558,7 +3557,7 @@ dependencies = [
|
|||
"directory",
|
||||
"email",
|
||||
"imap_proto",
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"jmap_proto",
|
||||
"mail-parser",
|
||||
"mail-send",
|
||||
|
|
@ -3640,9 +3639,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.11.0"
|
||||
version = "2.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9"
|
||||
checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.15.5",
|
||||
|
|
@ -3825,25 +3824,25 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "jieba-macros"
|
||||
version = "0.8.0"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6105f38f083bb1a79ad523bd32fa0d8ffcb6abd2fc4da9da203c32bca5b6ace3"
|
||||
checksum = "348294e44ee7e3c42685da656490f8febc7359632544019621588902216da95c"
|
||||
dependencies = [
|
||||
"phf_codegen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jieba-rs"
|
||||
version = "0.8.0"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47982a320106da83b0c5d6aec0fb83e109f0132b69670b063adaa6fa5b4f3f4a"
|
||||
checksum = "766bd7012aa5ba49411ebdf4e93bddd59b182d2918e085d58dec5bb9b54b7105"
|
||||
dependencies = [
|
||||
"cedarwood",
|
||||
"fxhash",
|
||||
"include-flate",
|
||||
"jieba-macros",
|
||||
"phf 0.12.1",
|
||||
"phf 0.13.1",
|
||||
"regex",
|
||||
"rustc-hash 2.1.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -4012,7 +4011,7 @@ version = "0.4.2"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4ee7893dab2e44ae5f9d0173f26ff4aa327c10b01b06a72b52dd9405b628640d"
|
||||
dependencies = [
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -4249,9 +4248,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
|
|||
|
||||
[[package]]
|
||||
name = "linux-raw-sys"
|
||||
version = "0.9.4"
|
||||
version = "0.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12"
|
||||
checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
|
||||
|
||||
[[package]]
|
||||
name = "litemap"
|
||||
|
|
@ -4332,17 +4331,28 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "mail-auth"
|
||||
version = "0.7.1"
|
||||
name = "lzma-rust2"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "628034968911ec4ac1d03468d55113c182af3848b4f6da19e736c5fa2bc684a3"
|
||||
checksum = "c60a23ffb90d527e23192f1246b14746e2f7f071cb84476dd879071696c18a4a"
|
||||
dependencies = [
|
||||
"crc",
|
||||
"sha2 0.10.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mail-auth"
|
||||
version = "0.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94cf926be0f7007993709797fcb467b16b0d22acea729af7543c8b4eed5a8bb7"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"flate2",
|
||||
"hashify",
|
||||
"hickory-resolver",
|
||||
"mail-builder",
|
||||
"mail-parser",
|
||||
"quick-xml 0.37.5",
|
||||
"quick-xml 0.38.3",
|
||||
"quick_cache",
|
||||
"rand 0.8.5",
|
||||
"ring 0.17.14",
|
||||
|
|
@ -4351,7 +4361,7 @@ dependencies = [
|
|||
"rustls-pemfile 2.2.0",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"zip",
|
||||
"zip 5.1.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -4377,13 +4387,13 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "mail-send"
|
||||
version = "0.5.1"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aac383831b06755f2ad93f65dd04e9927790c75b5cb9366034e0af11ae369bd7"
|
||||
checksum = "114a4e27f3cfaf8918783e8fa4149b820c813b1bedc7755e20e12eff4518331e"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"gethostname",
|
||||
"md5 0.7.0",
|
||||
"md5 0.8.0",
|
||||
"rustls 0.23.31",
|
||||
"rustls-pki-types",
|
||||
"smtp-proto",
|
||||
|
|
@ -5249,9 +5259,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
|
|||
|
||||
[[package]]
|
||||
name = "pest"
|
||||
version = "2.8.1"
|
||||
version = "2.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323"
|
||||
checksum = "21e0a3a33733faeaf8651dfee72dd0f388f0c8e5ad496a3478fa5a922f49cfa8"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"thiserror 2.0.16",
|
||||
|
|
@ -5260,9 +5270,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "pest_derive"
|
||||
version = "2.8.1"
|
||||
version = "2.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc"
|
||||
checksum = "bc58706f770acb1dbd0973e6530a3cff4746fb721207feb3a8a6064cd0b6c663"
|
||||
dependencies = [
|
||||
"pest",
|
||||
"pest_generator",
|
||||
|
|
@ -5270,9 +5280,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "pest_generator"
|
||||
version = "2.8.1"
|
||||
version = "2.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966"
|
||||
checksum = "6d4f36811dfe07f7b8573462465d5cb8965fffc2e71ae377a33aecf14c2c9a2f"
|
||||
dependencies = [
|
||||
"pest",
|
||||
"pest_meta",
|
||||
|
|
@ -5283,9 +5293,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "pest_meta"
|
||||
version = "2.8.1"
|
||||
version = "2.8.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5"
|
||||
checksum = "42919b05089acbd0a5dcd5405fb304d17d1053847b81163d09c4ad18ce8e8420"
|
||||
dependencies = [
|
||||
"pest",
|
||||
"sha2 0.10.9",
|
||||
|
|
@ -5298,7 +5308,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db"
|
||||
dependencies = [
|
||||
"fixedbitset",
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -5318,17 +5328,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7"
|
||||
dependencies = [
|
||||
"phf_shared 0.12.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "phf"
|
||||
version = "0.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
|
||||
dependencies = [
|
||||
"phf_shared 0.13.1",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "phf_codegen"
|
||||
version = "0.12.1"
|
||||
version = "0.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "efbdcb6f01d193b17f0b9c3360fa7e0e620991b193ff08702f78b3ce365d7e61"
|
||||
checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1"
|
||||
dependencies = [
|
||||
"phf_generator 0.12.1",
|
||||
"phf_shared 0.12.1",
|
||||
"phf_generator 0.13.1",
|
||||
"phf_shared 0.13.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -5343,12 +5362,12 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "phf_generator"
|
||||
version = "0.12.1"
|
||||
version = "0.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2cbb1126afed61dd6368748dae63b1ee7dc480191c6262a3b4ff1e29d86a6c5b"
|
||||
checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
|
||||
dependencies = [
|
||||
"fastrand 2.3.0",
|
||||
"phf_shared 0.12.1",
|
||||
"phf_shared 0.13.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -5382,6 +5401,15 @@ dependencies = [
|
|||
"siphasher",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "phf_shared"
|
||||
version = "0.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266"
|
||||
dependencies = [
|
||||
"siphasher",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pin-project"
|
||||
version = "1.1.10"
|
||||
|
|
@ -5740,9 +5768,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "psl"
|
||||
version = "2.1.140"
|
||||
version = "2.1.141"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89a33878b44e45231ecbc8c619cc8059e4adab882b25812192676fe08dcf352f"
|
||||
checksum = "98c10a4dce9ad24c1fad826cffc79a624cf626bfaddb466e969368a53d877b30"
|
||||
dependencies = [
|
||||
"psl-types",
|
||||
]
|
||||
|
|
@ -5814,15 +5842,6 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-xml"
|
||||
version = "0.37.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-xml"
|
||||
version = "0.38.3"
|
||||
|
|
@ -6393,9 +6412,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "resolv-conf"
|
||||
version = "0.7.4"
|
||||
version = "0.7.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3"
|
||||
checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799"
|
||||
|
||||
[[package]]
|
||||
name = "rev_lines"
|
||||
|
|
@ -6473,7 +6492,7 @@ dependencies = [
|
|||
"bytecheck",
|
||||
"bytes",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"munge",
|
||||
"ptr_meta",
|
||||
"rancor",
|
||||
|
|
@ -6697,15 +6716,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "1.0.8"
|
||||
version = "1.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8"
|
||||
checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e"
|
||||
dependencies = [
|
||||
"bitflags 2.9.4",
|
||||
"errno",
|
||||
"libc",
|
||||
"linux-raw-sys",
|
||||
"windows-sys 0.60.2",
|
||||
"windows-sys 0.61.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -6744,7 +6763,7 @@ dependencies = [
|
|||
"once_cell",
|
||||
"ring 0.17.14",
|
||||
"rustls-pki-types",
|
||||
"rustls-webpki 0.103.4",
|
||||
"rustls-webpki 0.103.5",
|
||||
"subtle",
|
||||
"zeroize",
|
||||
]
|
||||
|
|
@ -6783,7 +6802,7 @@ dependencies = [
|
|||
"openssl-probe",
|
||||
"rustls-pki-types",
|
||||
"schannel",
|
||||
"security-framework 3.3.0",
|
||||
"security-framework 3.4.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -6828,8 +6847,8 @@ dependencies = [
|
|||
"rustls 0.23.31",
|
||||
"rustls-native-certs 0.8.1",
|
||||
"rustls-platform-verifier-android",
|
||||
"rustls-webpki 0.103.4",
|
||||
"security-framework 3.3.0",
|
||||
"rustls-webpki 0.103.5",
|
||||
"security-framework 3.4.0",
|
||||
"security-framework-sys",
|
||||
"webpki-root-certs",
|
||||
"windows-sys 0.59.0",
|
||||
|
|
@ -6864,9 +6883,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "rustls-webpki"
|
||||
version = "0.103.4"
|
||||
version = "0.103.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc"
|
||||
checksum = "b5a37813727b78798e53c2bec3f5e8fe12a6d6f8389bf9ca7802add4c9905ad8"
|
||||
dependencies = [
|
||||
"ring 0.17.14",
|
||||
"rustls-pki-types",
|
||||
|
|
@ -6920,11 +6939,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "schannel"
|
||||
version = "0.1.27"
|
||||
version = "0.1.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
|
||||
checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
"windows-sys 0.61.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -7064,9 +7083,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "security-framework"
|
||||
version = "3.3.0"
|
||||
version = "3.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "80fb1d92c5028aa318b4b8bd7302a5bfcf48be96a37fc6fc790f806b0004ee0c"
|
||||
checksum = "60b369d18893388b345804dc0007963c99b7d665ae71d275812d828c6f089640"
|
||||
dependencies = [
|
||||
"bitflags 2.9.4",
|
||||
"core-foundation 0.10.1",
|
||||
|
|
@ -7077,9 +7096,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "security-framework-sys"
|
||||
version = "2.14.0"
|
||||
version = "2.15.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32"
|
||||
checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0"
|
||||
dependencies = [
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
|
|
@ -7166,10 +7185,11 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.219"
|
||||
version = "1.0.221"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6"
|
||||
checksum = "341877e04a22458705eb4e131a1508483c877dca2792b3781d4e5d8a6019ec43"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
|
|
@ -7183,10 +7203,19 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.219"
|
||||
name = "serde_core"
|
||||
version = "1.0.221"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
|
||||
checksum = "0c459bc0a14c840cb403fc14b148620de1e0778c96ecd6e0c8c3cacb6d8d00fe"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.221"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d6185cf75117e20e62b1ff867b9518577271e58abe0037c40bb4794969355ab0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
@ -7206,15 +7235,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.143"
|
||||
version = "1.0.144"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a"
|
||||
checksum = "56177480b00303e689183f110b4e727bb4211d692c62d4fcd16d02be93077d40"
|
||||
dependencies = [
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"itoa",
|
||||
"memchr",
|
||||
"ryu",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -7280,7 +7309,7 @@ dependencies = [
|
|||
"chrono",
|
||||
"hex",
|
||||
"indexmap 1.9.3",
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"schemars 0.9.0",
|
||||
"schemars 1.0.4",
|
||||
"serde",
|
||||
|
|
@ -7320,7 +7349,7 @@ version = "0.9.34+deprecated"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
|
||||
dependencies = [
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"itoa",
|
||||
"ryu",
|
||||
"serde",
|
||||
|
|
@ -7611,9 +7640,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "smtp-proto"
|
||||
version = "0.1.7"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8003eb09806ff2ae4661dd0dca27cbd9f65ba85de06cc0302c364b0d661ba368"
|
||||
checksum = "d55cc1c74d3b758d7dd1fa4dc4cf694cad2732cac14f304228477c2b0ce6233a"
|
||||
dependencies = [
|
||||
"rkyv",
|
||||
"serde",
|
||||
|
|
@ -8366,7 +8395,7 @@ version = "0.22.27"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
|
||||
dependencies = [
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"toml_datetime",
|
||||
"winnow",
|
||||
]
|
||||
|
|
@ -8663,9 +8692,9 @@ checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
|
|||
|
||||
[[package]]
|
||||
name = "typewit"
|
||||
version = "1.14.1"
|
||||
version = "1.14.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c98488b93df24b7c794d6a58c4198d7a2abde676324beaca84f7fb5b39c0811"
|
||||
checksum = "f8c1ae7cc0fdb8b842d65d127cb981574b0d2b249b74d1c7a2986863dc134f71"
|
||||
dependencies = [
|
||||
"typewit_proc_macros",
|
||||
]
|
||||
|
|
@ -8710,9 +8739,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
|
|||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.18"
|
||||
version = "1.0.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
|
||||
checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-normalization"
|
||||
|
|
@ -8996,9 +9025,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
|||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.14.4+wasi-0.2.4"
|
||||
version = "0.14.5+wasi-0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "88a5f4a424faf49c3c2c344f166f0662341d470ea185e939657aaff130f0ec4a"
|
||||
checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4"
|
||||
dependencies = [
|
||||
"wasip2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasip2"
|
||||
version = "1.0.0+wasi-0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24"
|
||||
dependencies = [
|
||||
"wit-bindgen",
|
||||
]
|
||||
|
|
@ -9192,11 +9230,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
|||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.10"
|
||||
version = "0.1.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22"
|
||||
checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
|
||||
dependencies = [
|
||||
"windows-sys 0.60.2",
|
||||
"windows-sys 0.61.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -9212,7 +9250,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
|
||||
dependencies = [
|
||||
"windows-collections",
|
||||
"windows-core",
|
||||
"windows-core 0.61.2",
|
||||
"windows-future",
|
||||
"windows-link 0.1.3",
|
||||
"windows-numerics",
|
||||
|
|
@ -9224,7 +9262,7 @@ version = "0.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
|
||||
dependencies = [
|
||||
"windows-core",
|
||||
"windows-core 0.61.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -9236,8 +9274,21 @@ dependencies = [
|
|||
"windows-implement",
|
||||
"windows-interface",
|
||||
"windows-link 0.1.3",
|
||||
"windows-result",
|
||||
"windows-strings",
|
||||
"windows-result 0.3.4",
|
||||
"windows-strings 0.4.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.62.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c"
|
||||
dependencies = [
|
||||
"windows-implement",
|
||||
"windows-interface",
|
||||
"windows-link 0.2.0",
|
||||
"windows-result 0.4.0",
|
||||
"windows-strings 0.5.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -9246,7 +9297,7 @@ version = "0.2.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
|
||||
dependencies = [
|
||||
"windows-core",
|
||||
"windows-core 0.61.2",
|
||||
"windows-link 0.1.3",
|
||||
"windows-threading",
|
||||
]
|
||||
|
|
@ -9291,7 +9342,7 @@ version = "0.2.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
|
||||
dependencies = [
|
||||
"windows-core",
|
||||
"windows-core 0.61.2",
|
||||
"windows-link 0.1.3",
|
||||
]
|
||||
|
||||
|
|
@ -9304,6 +9355,15 @@ dependencies = [
|
|||
"windows-link 0.1.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-result"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f"
|
||||
dependencies = [
|
||||
"windows-link 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-strings"
|
||||
version = "0.4.2"
|
||||
|
|
@ -9313,6 +9373,15 @@ dependencies = [
|
|||
"windows-link 0.1.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-strings"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda"
|
||||
dependencies = [
|
||||
"windows-link 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-sys"
|
||||
version = "0.45.0"
|
||||
|
|
@ -10327,7 +10396,7 @@ dependencies = [
|
|||
"flate2",
|
||||
"getrandom 0.3.3",
|
||||
"hmac 0.12.1",
|
||||
"indexmap 2.11.0",
|
||||
"indexmap 2.11.1",
|
||||
"liblzma",
|
||||
"memchr",
|
||||
"pbkdf2",
|
||||
|
|
@ -10339,6 +10408,33 @@ dependencies = [
|
|||
"zstd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zip"
|
||||
version = "5.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f852905151ac8d4d06fdca66520a661c09730a74c6d4e2b0f27b436b382e532"
|
||||
dependencies = [
|
||||
"aes",
|
||||
"arbitrary",
|
||||
"bzip2",
|
||||
"constant_time_eq",
|
||||
"crc32fast",
|
||||
"deflate64",
|
||||
"flate2",
|
||||
"getrandom 0.3.3",
|
||||
"hmac 0.12.1",
|
||||
"indexmap 2.11.1",
|
||||
"lzma-rust2",
|
||||
"memchr",
|
||||
"pbkdf2",
|
||||
"ppmd-rust",
|
||||
"sha1",
|
||||
"time",
|
||||
"zeroize",
|
||||
"zopfli",
|
||||
"zstd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zlib-rs"
|
||||
version = "0.5.2"
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ mail-parser = { version = "0.11", features = ["full_encoding"] }
|
|||
mail-builder = { version = "0.4" }
|
||||
mail-auth = { version = "0.7.1" }
|
||||
mail-send = { version = "0.5", default-features = false, features = ["cram-md5", "ring", "tls12"] }
|
||||
smtp-proto = { version = "0.1", features = ["rkyv"] }
|
||||
smtp-proto = { version = "0.2", features = ["rkyv"] }
|
||||
dns-update = { version = "0.1.5" }
|
||||
calcard = { version = "0.1.3", features = ["rkyv"] }
|
||||
ahash = { version = "0.8.2", features = ["serde"] }
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ store = { path = "../store" }
|
|||
trc = { path = "../trc" }
|
||||
nlp = { path = "../nlp" }
|
||||
jmap_proto = { path = "../jmap-proto" }
|
||||
smtp-proto = { version = "0.1" }
|
||||
smtp-proto = { version = "0.2" }
|
||||
mail-parser = { version = "0.11", features = ["full_encoding", "rkyv"] }
|
||||
mail-send = { version = "0.5", default-features = false, features = ["cram-md5", "ring", "tls12"] }
|
||||
mail-builder = { version = "0.4" }
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ impl SmtpDirectory {
|
|||
.unwrap_or("[127.0.0.1]")
|
||||
.to_string(),
|
||||
say_ehlo: false,
|
||||
local_ip: None,
|
||||
},
|
||||
max_rcpt: config
|
||||
.property_or_default((&prefix, "limits.rcpt"), "10")
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ common = { path = "../common" }
|
|||
directory = { path = "../directory" }
|
||||
groupware = { path = "../groupware" }
|
||||
spam-filter = { path = "../spam-filter" }
|
||||
smtp-proto = { version = "0.1", features = ["rkyv"] }
|
||||
smtp-proto = { version = "0.2", features = ["rkyv"] }
|
||||
mail-parser = { version = "0.11", features = ["full_encoding"] }
|
||||
mail-builder = { version = "0.4" }
|
||||
sieve-rs = { version = "0.7", features = ["rkyv"] }
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ http_proto = { path = "../http-proto" }
|
|||
jmap_proto = { path = "../jmap-proto" }
|
||||
directory = { path = "../directory" }
|
||||
services = { path = "../services" }
|
||||
smtp-proto = { version = "0.1" }
|
||||
smtp-proto = { version = "0.2" }
|
||||
mail-parser = { version = "0.11", features = ["full_encoding", "rkyv"] }
|
||||
mail-builder = { version = "0.4" }
|
||||
mail-auth = { version = "0.7.1", features = ["generate"] }
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ directory = { path = "../directory" }
|
|||
trc = { path = "../trc" }
|
||||
spam-filter = { path = "../spam-filter" }
|
||||
email = { path = "../email" }
|
||||
smtp-proto = { version = "0.1" }
|
||||
smtp-proto = { version = "0.2" }
|
||||
mail-parser = { version = "0.11", features = ["full_encoding", "rkyv"] }
|
||||
mail-builder = { version = "0.4" }
|
||||
mail-send = { version = "0.5", default-features = false, features = ["cram-md5", "ring", "tls12"] }
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ use smtp::{
|
|||
queue::spool::SmtpSpool,
|
||||
};
|
||||
use smtp_proto::{MailFrom, RcptTo, request::parser::Rfc5321Parser};
|
||||
use std::future::Future;
|
||||
use std::{borrow::Cow, future::Future};
|
||||
use std::{collections::HashMap, sync::Arc, time::Duration};
|
||||
use store::write::{BatchBuilder, now};
|
||||
use trc::AddContext;
|
||||
|
|
@ -320,8 +320,8 @@ impl EmailSubmissionSet for Server {
|
|||
thread_id: u32::MAX,
|
||||
..Default::default()
|
||||
};
|
||||
let mut mail_from: Option<MailFrom<String>> = None;
|
||||
let mut rcpt_to: Vec<RcptTo<String>> = Vec::new();
|
||||
let mut mail_from: Option<MailFrom<Cow<'_, str>>> = None;
|
||||
let mut rcpt_to: Vec<RcptTo<Cow<'_, str>>> = Vec::new();
|
||||
|
||||
for (property, value) in object.0 {
|
||||
let value = match response.eval_object_references(value) {
|
||||
|
|
@ -350,14 +350,14 @@ impl EmailSubmissionSet for Server {
|
|||
.map_or(&b"\n"[..], |p| p.as_bytes())
|
||||
.iter(),
|
||||
)
|
||||
.mail_from_parameters(addr)
|
||||
.mail_from_parameters(addr.into())
|
||||
{
|
||||
Ok(addr) => {
|
||||
submission.envelope.mail_from = Address {
|
||||
email: addr.address.clone(),
|
||||
email: addr.address.as_ref().to_string(),
|
||||
parameters: params,
|
||||
};
|
||||
mail_from = addr.into();
|
||||
mail_from = from_into_static(addr).into();
|
||||
}
|
||||
Err(err) => {
|
||||
return Ok(Err(SetError::invalid_properties()
|
||||
|
|
@ -382,7 +382,7 @@ impl EmailSubmissionSet for Server {
|
|||
.map_or(&b"\n"[..], |p| p.as_bytes())
|
||||
.iter(),
|
||||
)
|
||||
.rcpt_to_parameters(addr)
|
||||
.rcpt_to_parameters(addr.into())
|
||||
{
|
||||
Ok(addr) => {
|
||||
if !rcpt_to
|
||||
|
|
@ -390,10 +390,13 @@ impl EmailSubmissionSet for Server {
|
|||
.any(|rcpt| rcpt.address == addr.address)
|
||||
{
|
||||
submission.envelope.rcpt_to.push(Address {
|
||||
email: addr.address.clone(),
|
||||
email: addr
|
||||
.address
|
||||
.as_ref()
|
||||
.to_string(),
|
||||
parameters: params,
|
||||
});
|
||||
rcpt_to.push(addr);
|
||||
rcpt_to.push(rcpt_into_static(addr));
|
||||
}
|
||||
}
|
||||
Err(err) => {
|
||||
|
|
@ -473,7 +476,7 @@ impl EmailSubmissionSet for Server {
|
|||
parameters: None,
|
||||
};
|
||||
MailFrom {
|
||||
address: identity_mail_from,
|
||||
address: Cow::Owned(identity_mail_from),
|
||||
..Default::default()
|
||||
}
|
||||
};
|
||||
|
|
@ -519,7 +522,7 @@ impl EmailSubmissionSet for Server {
|
|||
parameters: None,
|
||||
});
|
||||
rcpt_to.push(RcptTo {
|
||||
address,
|
||||
address: Cow::Owned(address),
|
||||
..Default::default()
|
||||
});
|
||||
}
|
||||
|
|
@ -734,3 +737,35 @@ fn parse_envelope_address(
|
|||
.with_description("Invalid envelope object."))
|
||||
}
|
||||
}
|
||||
|
||||
fn from_into_static(from: MailFrom<Cow<'_, str>>) -> MailFrom<Cow<'static, str>> {
|
||||
MailFrom {
|
||||
address: from.address.into_owned().into(),
|
||||
flags: from.flags,
|
||||
size: from.size,
|
||||
trans_id: from.trans_id.map(Cow::into_owned).map(Cow::Owned),
|
||||
by: from.by,
|
||||
env_id: from.env_id.map(Cow::into_owned).map(Cow::Owned),
|
||||
solicit: from.solicit.map(Cow::into_owned).map(Cow::Owned),
|
||||
mtrk: from
|
||||
.mtrk
|
||||
.map(smtp_proto::Mtrk::into_owned)
|
||||
.map(|v| smtp_proto::Mtrk {
|
||||
certifier: Cow::Owned(v.certifier),
|
||||
timeout: v.timeout,
|
||||
}),
|
||||
auth: from.auth.map(Cow::into_owned).map(Cow::Owned),
|
||||
hold_for: from.hold_for,
|
||||
hold_until: from.hold_until,
|
||||
mt_priority: from.mt_priority,
|
||||
}
|
||||
}
|
||||
|
||||
fn rcpt_into_static(rcpt: RcptTo<Cow<'_, str>>) -> RcptTo<Cow<'static, str>> {
|
||||
RcptTo {
|
||||
address: rcpt.address.into_owned().into(),
|
||||
orcpt: rcpt.orcpt.map(Cow::into_owned).map(Cow::Owned),
|
||||
rrvs: rcpt.rrvs,
|
||||
flags: rcpt.flags,
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ smtp = { path = "../smtp" }
|
|||
groupware = { path = "../groupware" }
|
||||
jmap_proto = { path = "../jmap-proto" }
|
||||
directory = { path = "../directory" }
|
||||
smtp-proto = { version = "0.1.6", features = ["rkyv", "serde"] }
|
||||
smtp-proto = { version = "0.2", features = ["rkyv", "serde"] }
|
||||
tokio = { version = "1.47", features = ["rt"] }
|
||||
mail-parser = { version = "0.11", features = ["full_encoding", "rkyv"] }
|
||||
mail-builder = { version = "0.4" }
|
||||
|
|
|
|||
|
|
@ -202,7 +202,7 @@ async fn send_alarm(
|
|||
// MAIL FROM
|
||||
let _ = session
|
||||
.handle_mail_from(MailFrom {
|
||||
address: mail_from,
|
||||
address: mail_from.into(),
|
||||
..Default::default()
|
||||
})
|
||||
.await;
|
||||
|
|
@ -214,7 +214,7 @@ async fn send_alarm(
|
|||
session.params.rcpt_errors_wait = Duration::from_secs(0);
|
||||
let _ = session
|
||||
.handle_rcpt_to(RcptTo {
|
||||
address: to,
|
||||
address: to.into(),
|
||||
..Default::default()
|
||||
})
|
||||
.await;
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@ async fn send_imip(
|
|||
// MAIL FROM
|
||||
let _ = session
|
||||
.handle_mail_from(MailFrom {
|
||||
address: from.clone(),
|
||||
address: from.as_str().into(),
|
||||
..Default::default()
|
||||
})
|
||||
.await;
|
||||
|
|
@ -243,7 +243,7 @@ async fn send_imip(
|
|||
session.params.rcpt_errors_wait = Duration::from_secs(0);
|
||||
let _ = session
|
||||
.handle_rcpt_to(RcptTo {
|
||||
address: to.clone(),
|
||||
address: to.as_str().into(),
|
||||
..Default::default()
|
||||
})
|
||||
.await;
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ mail-auth = { version = "0.7.1", features = ["rkyv"] }
|
|||
mail-send = { version = "0.5", default-features = false, features = ["cram-md5", "ring", "tls12"] }
|
||||
mail-parser = { version = "0.11", features = ["full_encoding"] }
|
||||
mail-builder = { version = "0.4" }
|
||||
smtp-proto = { version = "0.1.6", features = ["rkyv", "serde"] }
|
||||
smtp-proto = { version = "0.2", features = ["rkyv", "serde"] }
|
||||
sieve-rs = { version = "0.7", features = ["rkyv"] }
|
||||
ahash = { version = "0.8" }
|
||||
rustls = { version = "0.23.5", default-features = false, features = ["std", "ring", "tls12"] }
|
||||
|
|
|
|||
|
|
@ -4,32 +4,33 @@
|
|||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
||||
*/
|
||||
|
||||
use std::time::{Duration, Instant, SystemTime};
|
||||
|
||||
use crate::{core::Session, scripts::ScriptResult};
|
||||
use common::{
|
||||
config::smtp::session::{Mechanism, Stage},
|
||||
listener::SessionStream,
|
||||
};
|
||||
|
||||
use mail_auth::{
|
||||
SpfResult,
|
||||
spf::verify::{HasValidLabels, SpfParameters},
|
||||
};
|
||||
use smtp_proto::*;
|
||||
use std::{
|
||||
borrow::Cow,
|
||||
time::{Duration, Instant, SystemTime},
|
||||
};
|
||||
use trc::SmtpEvent;
|
||||
|
||||
impl<T: SessionStream> Session<T> {
|
||||
pub async fn handle_ehlo(&mut self, domain: String, is_extended: bool) -> Result<(), ()> {
|
||||
pub async fn handle_ehlo(&mut self, domain: Cow<'_, str>, is_extended: bool) -> Result<(), ()> {
|
||||
// Set EHLO domain
|
||||
|
||||
if domain != self.data.helo_domain {
|
||||
// Reject non-FQDN EHLO domains - simply checks that the hostname has at least one dot
|
||||
if self.params.ehlo_reject_non_fqdn && !domain.as_str().has_valid_labels() {
|
||||
if self.params.ehlo_reject_non_fqdn && !domain.as_ref().has_valid_labels() {
|
||||
trc::event!(
|
||||
Smtp(SmtpEvent::InvalidEhlo),
|
||||
SpanId = self.data.session_id,
|
||||
Domain = domain,
|
||||
Domain = domain.as_ref().to_string(),
|
||||
);
|
||||
|
||||
return self.write(b"550 5.5.0 Invalid EHLO domain.\r\n").await;
|
||||
|
|
@ -38,11 +39,12 @@ impl<T: SessionStream> Session<T> {
|
|||
trc::event!(
|
||||
Smtp(SmtpEvent::Ehlo),
|
||||
SpanId = self.data.session_id,
|
||||
Domain = domain.clone(),
|
||||
Domain = domain.as_ref().to_string(),
|
||||
);
|
||||
|
||||
// SPF check
|
||||
let prev_helo_domain = std::mem::replace(&mut self.data.helo_domain, domain);
|
||||
let prev_helo_domain =
|
||||
std::mem::replace(&mut self.data.helo_domain, domain.into_owned());
|
||||
if self.params.spf_ehlo.verify() {
|
||||
let time = Instant::now();
|
||||
let spf_output = self
|
||||
|
|
|
|||
|
|
@ -4,23 +4,23 @@
|
|||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
||||
*/
|
||||
|
||||
use std::time::{Duration, Instant, SystemTime};
|
||||
|
||||
use common::{config::smtp::session::Stage, listener::SessionStream, scripts::ScriptModification};
|
||||
|
||||
use mail_auth::{IprevOutput, IprevResult, SpfOutput, SpfResult, spf::verify::SpfParameters};
|
||||
use smtp_proto::{MAIL_BY_NOTIFY, MAIL_BY_RETURN, MAIL_REQUIRETLS, MailFrom, MtPriority};
|
||||
use trc::SmtpEvent;
|
||||
use utils::config::Rate;
|
||||
|
||||
use crate::{
|
||||
core::{Session, SessionAddress},
|
||||
queue::DomainPart,
|
||||
scripts::ScriptResult,
|
||||
};
|
||||
use common::{config::smtp::session::Stage, listener::SessionStream, scripts::ScriptModification};
|
||||
use mail_auth::{IprevOutput, IprevResult, SpfOutput, SpfResult, spf::verify::SpfParameters};
|
||||
use smtp_proto::{MAIL_BY_NOTIFY, MAIL_BY_RETURN, MAIL_REQUIRETLS, MailFrom, MtPriority};
|
||||
use std::{
|
||||
borrow::Cow,
|
||||
time::{Duration, Instant, SystemTime},
|
||||
};
|
||||
use trc::SmtpEvent;
|
||||
use utils::config::Rate;
|
||||
|
||||
impl<T: SessionStream> Session<T> {
|
||||
pub async fn handle_mail_from(&mut self, from: MailFrom<String>) -> Result<(), ()> {
|
||||
pub async fn handle_mail_from(&mut self, from: MailFrom<Cow<'_, str>>) -> Result<(), ()> {
|
||||
if self.data.helo_domain.is_empty()
|
||||
&& (self.params.ehlo_require
|
||||
|| self.params.spf_ehlo.verify()
|
||||
|
|
@ -111,7 +111,7 @@ impl<T: SessionStream> Session<T> {
|
|||
let (address, address_lcase, domain) = if !from.address.is_empty() {
|
||||
let address_lcase = from.address.to_lowercase();
|
||||
let domain = address_lcase.domain_part().into();
|
||||
(from.address, address_lcase, domain)
|
||||
(from.address.into_owned(), address_lcase, domain)
|
||||
} else {
|
||||
(String::new(), String::new(), String::new())
|
||||
};
|
||||
|
|
@ -122,7 +122,7 @@ impl<T: SessionStream> Session<T> {
|
|||
address_lcase,
|
||||
domain,
|
||||
flags: from.flags,
|
||||
dsn_info: from.env_id,
|
||||
dsn_info: from.env_id.map(|e| e.into_owned()),
|
||||
}
|
||||
.into();
|
||||
|
||||
|
|
|
|||
|
|
@ -316,11 +316,11 @@ impl SessionData {
|
|||
if !args.is_empty() {
|
||||
args.push('\n');
|
||||
match Rfc5321Parser::new(&mut args.as_bytes().iter())
|
||||
.mail_from_parameters(String::new())
|
||||
.mail_from_parameters(Cow::Borrowed(""))
|
||||
{
|
||||
Ok(addr) => {
|
||||
mail_from.flags = addr.flags;
|
||||
mail_from.dsn_info = addr.env_id;
|
||||
mail_from.dsn_info = addr.env_id.map(|e| e.into_owned());
|
||||
}
|
||||
Err(err) => {
|
||||
trc::event!(
|
||||
|
|
@ -352,11 +352,11 @@ impl SessionData {
|
|||
if !args.is_empty() {
|
||||
args.push('\n');
|
||||
match Rfc5321Parser::new(&mut args.as_bytes().iter())
|
||||
.rcpt_to_parameters(String::new())
|
||||
.rcpt_to_parameters(Cow::Borrowed(""))
|
||||
{
|
||||
Ok(addr) => {
|
||||
rcpt.flags = addr.flags;
|
||||
rcpt.dsn_info = addr.orcpt;
|
||||
rcpt.dsn_info = addr.orcpt.map(|e| e.into_owned());
|
||||
}
|
||||
Err(err) => {
|
||||
trc::event!(
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
||||
*/
|
||||
|
||||
use std::borrow::Cow;
|
||||
|
||||
use common::{
|
||||
KV_GREYLIST, config::smtp::session::Stage, listener::SessionStream, scripts::ScriptModification,
|
||||
};
|
||||
|
|
@ -22,7 +24,7 @@ use crate::{
|
|||
};
|
||||
|
||||
impl<T: SessionStream> Session<T> {
|
||||
pub async fn handle_rcpt_to(&mut self, to: RcptTo<String>) -> Result<(), ()> {
|
||||
pub async fn handle_rcpt_to(&mut self, to: RcptTo<Cow<'_, str>>) -> Result<(), ()> {
|
||||
#[cfg(feature = "test_mode")]
|
||||
if self.instance.id.ends_with("-debug") {
|
||||
if to.address.contains("fail@") {
|
||||
|
|
@ -72,9 +74,9 @@ impl<T: SessionStream> Session<T> {
|
|||
let rcpt = SessionAddress {
|
||||
domain: address_lcase.domain_part().into(),
|
||||
address_lcase,
|
||||
address: to.address,
|
||||
address: to.address.into_owned(),
|
||||
flags: to.flags,
|
||||
dsn_info: to.orcpt,
|
||||
dsn_info: to.orcpt.map(|e| e.into_owned()),
|
||||
};
|
||||
|
||||
if self.data.rcpt_to.contains(&rcpt) {
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ impl<T: SessionStream> Session<T> {
|
|||
'outer: loop {
|
||||
match &mut state {
|
||||
State::Request(receiver) => loop {
|
||||
match receiver.ingest(&mut iter, bytes) {
|
||||
match receiver.ingest(&mut iter) {
|
||||
Ok(request) => match request {
|
||||
Request::Rcpt { to } => {
|
||||
self.handle_rcpt_to(to).await?;
|
||||
|
|
@ -301,7 +301,7 @@ impl<T: SessionStream> Session<T> {
|
|||
|
||||
if !self.params.ehlo_reject_non_fqdn && syntax.starts_with("EHLO ")
|
||||
{
|
||||
self.handle_ehlo("null".to_string(), true).await?
|
||||
self.handle_ehlo("null".into(), true).await?
|
||||
} else {
|
||||
self.write(
|
||||
format!("501 5.5.2 Syntax error, expected: {syntax}\r\n")
|
||||
|
|
|
|||
|
|
@ -4,15 +4,13 @@
|
|||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
||||
*/
|
||||
|
||||
use crate::core::Session;
|
||||
use common::listener::SessionStream;
|
||||
|
||||
use std::{borrow::Cow, fmt::Write};
|
||||
use trc::SmtpEvent;
|
||||
|
||||
use crate::core::Session;
|
||||
use std::fmt::Write;
|
||||
|
||||
impl<T: SessionStream> Session<T> {
|
||||
pub async fn handle_vrfy(&mut self, address: String) -> Result<(), ()> {
|
||||
pub async fn handle_vrfy(&mut self, address: Cow<'_, str>) -> Result<(), ()> {
|
||||
match self
|
||||
.server
|
||||
.eval_if::<String, _>(
|
||||
|
|
@ -43,7 +41,7 @@ impl<T: SessionStream> Session<T> {
|
|||
trc::event!(
|
||||
Smtp(SmtpEvent::Vrfy),
|
||||
SpanId = self.data.session_id,
|
||||
To = address,
|
||||
To = address.as_ref().to_string(),
|
||||
Result = values,
|
||||
);
|
||||
|
||||
|
|
@ -53,7 +51,7 @@ impl<T: SessionStream> Session<T> {
|
|||
trc::event!(
|
||||
Smtp(SmtpEvent::VrfyNotFound),
|
||||
SpanId = self.data.session_id,
|
||||
To = address,
|
||||
To = address.as_ref().to_string(),
|
||||
);
|
||||
|
||||
self.write(b"550 5.1.2 Address not found.\r\n").await
|
||||
|
|
@ -77,7 +75,7 @@ impl<T: SessionStream> Session<T> {
|
|||
trc::event!(
|
||||
Smtp(SmtpEvent::VrfyDisabled),
|
||||
SpanId = self.data.session_id,
|
||||
To = address,
|
||||
To = address.as_ref().to_string(),
|
||||
);
|
||||
|
||||
self.write(b"252 2.5.1 VRFY is disabled.\r\n").await
|
||||
|
|
@ -85,7 +83,7 @@ impl<T: SessionStream> Session<T> {
|
|||
}
|
||||
}
|
||||
|
||||
pub async fn handle_expn(&mut self, address: String) -> Result<(), ()> {
|
||||
pub async fn handle_expn(&mut self, address: Cow<'_, str>) -> Result<(), ()> {
|
||||
match self
|
||||
.server
|
||||
.eval_if::<String, _>(
|
||||
|
|
@ -116,7 +114,7 @@ impl<T: SessionStream> Session<T> {
|
|||
trc::event!(
|
||||
Smtp(SmtpEvent::Expn),
|
||||
SpanId = self.data.session_id,
|
||||
To = address,
|
||||
To = address.as_ref().to_string(),
|
||||
Result = values,
|
||||
);
|
||||
|
||||
|
|
@ -126,7 +124,7 @@ impl<T: SessionStream> Session<T> {
|
|||
trc::event!(
|
||||
Smtp(SmtpEvent::ExpnNotFound),
|
||||
SpanId = self.data.session_id,
|
||||
To = address,
|
||||
To = address.as_ref().to_string(),
|
||||
);
|
||||
|
||||
self.write(b"550 5.1.2 Mailing list not found.\r\n").await
|
||||
|
|
@ -150,7 +148,7 @@ impl<T: SessionStream> Session<T> {
|
|||
trc::event!(
|
||||
Smtp(SmtpEvent::ExpnDisabled),
|
||||
SpanId = self.data.session_id,
|
||||
To = address,
|
||||
To = address.as_ref().to_string(),
|
||||
);
|
||||
|
||||
self.write(b"252 2.5.1 EXPN is disabled.\r\n").await
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@ nlp = { path = "../nlp" }
|
|||
store = { path = "../store" }
|
||||
trc = { path = "../trc" }
|
||||
common = { path = "../common" }
|
||||
smtp-proto = { version = "0.1", features = ["rkyv"] }
|
||||
smtp-proto = { version = "0.2", features = ["rkyv"] }
|
||||
mail-parser = { version = "0.11", features = ["full_encoding"] }
|
||||
mail-builder = { version = "0.4" }
|
||||
mail-auth = { version = "0.7.1" }
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ tokio = { version = "1.47", features = ["net", "macros", "signal"] }
|
|||
tokio-rustls = { version = "0.26", default-features = false, features = ["ring", "tls12"] }
|
||||
serde = { version = "1.0", features = ["derive"]}
|
||||
mail-auth = { version = "0.7.1" }
|
||||
smtp-proto = { version = "0.1" }
|
||||
smtp-proto = { version = "0.2" }
|
||||
mail-send = { version = "0.5", default-features = false, features = ["cram-md5", "ring", "tls12"] }
|
||||
ahash = { version = "0.8", features = ["serde"] }
|
||||
chrono = "0.4"
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ spam-filter = { path = "../crates/spam-filter", features = ["test_mode", "enterp
|
|||
migration = { path = "../crates/migration", features = ["test_mode", "enterprise"] }
|
||||
trc = { path = "../crates/trc", features = ["enterprise"] }
|
||||
managesieve = { path = "../crates/managesieve", features = ["test_mode", "enterprise"] }
|
||||
smtp-proto = { version = "0.1" }
|
||||
smtp-proto = { version = "0.2" }
|
||||
mail-send = { version = "0.5", default-features = false, features = ["cram-md5", "ring", "tls12"] }
|
||||
mail-auth = { version = "0.7.1", features = ["test"] }
|
||||
sieve-rs = { version = "0.7", features = ["rkyv"] }
|
||||
|
|
|
|||
|
|
@ -4,8 +4,9 @@
|
|||
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
|
||||
*/
|
||||
|
||||
use std::{fmt::Debug, path::PathBuf, sync::Arc, time::Duration};
|
||||
|
||||
use crate::{
|
||||
AssertConfig, add_test_certs, directory::internal::TestInternalDirectory, store::TempDir,
|
||||
};
|
||||
use base64::{
|
||||
Engine,
|
||||
engine::general_purpose::{self, STANDARD},
|
||||
|
|
@ -36,7 +37,7 @@ use reqwest::header;
|
|||
use serde::{Deserialize, Serialize, de::DeserializeOwned};
|
||||
use services::SpawnServices;
|
||||
use smtp::{SpawnQueueManager, core::SmtpSessionManager};
|
||||
|
||||
use std::{fmt::Debug, path::PathBuf, sync::Arc, time::Duration};
|
||||
use store::{
|
||||
IterateParams, SUBSPACE_PROPERTY, Stores, ValueKey,
|
||||
roaring::RoaringBitmap,
|
||||
|
|
@ -46,10 +47,6 @@ use tokio::sync::watch;
|
|||
use utils::{BlobHash, config::Config};
|
||||
use webhooks::{MockWebhookEndpoint, spawn_mock_webhook_endpoint};
|
||||
|
||||
use crate::{
|
||||
AssertConfig, add_test_certs, directory::internal::TestInternalDirectory, store::TempDir,
|
||||
};
|
||||
|
||||
pub mod auth_acl;
|
||||
pub mod auth_limits;
|
||||
pub mod auth_oauth;
|
||||
|
|
@ -102,7 +99,7 @@ async fn jmap_tests() {
|
|||
thread_merge::test(&mut params).await;
|
||||
mailbox::test(&mut params).await;
|
||||
delivery::test(&mut params).await;
|
||||
auth_acl::test(&mut params).await;
|
||||
auth_acl::test(&mut params).await;*/
|
||||
auth_limits::test(&mut params).await;
|
||||
auth_oauth::test(&mut params).await;
|
||||
event_source::test(&mut params).await;
|
||||
|
|
@ -113,7 +110,7 @@ async fn jmap_tests() {
|
|||
websocket::test(&mut params).await;
|
||||
quota::test(&mut params).await;
|
||||
crypto::test(&mut params).await;
|
||||
blob::test(&mut params).await;*/
|
||||
blob::test(&mut params).await;
|
||||
permissions::test(¶ms).await;
|
||||
purge::test(&mut params).await;
|
||||
enterprise::test(&mut params).await;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue