diff --git a/CHANGELOG.md b/CHANGELOG.md index 1908a3d1..9edf2e9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,29 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [0.13.2] - 2025-07-27 + +If you are upgrading from v0.11.x or v0.12.x, this version includes **breaking changes** to the message queue and MTA configuration. Please read the [UPGRADING.md](https://github.com/stalwartlabs/stalwart/blob/main/UPGRADING.md) file for more information on how to upgrade from previous versions. + +## Added +- ACME: DeSEC cloud DNS provider support (contributed by @Tyr3al). +- CalDAV Scheduling: Catalan language support (contributed by @jolupa) (#1873). +- MTA: Allow to send e-mails as group, while member of that group (#485). +- OIDC: Allow local access tokens to be used with third-party OIDC backends (#1311 stalwartlabs/webadmin#52). + +## Changed +- IMAP: Return `OK` when moving/copying non-existent messages (#670). +- IMAP: Copy flags when copying/moving messages between accounts. + +## Fixed +- MTA: Do not convert e-mail local parts to lowercase (#1916). +- Sieve: `fileinto` should override spam filter (#1917). +- JMAP: Incorrect `accountId` used in email set and import methods (#1777). +- WebDAV: Always return `MULTISTATUS` when calendar-query yields no results. +- LDAP: Only set account name if not returned in LDAP query (#1471). +- Enterprise: Invalidate logo cache when changes are made (#1856). +- Enterprise: Fix tenant quota update API. + ## [0.13.1] - 2025-07-16 If you are upgrading from v0.11.x or v0.12.x, this version includes **breaking changes** to the message queue and MTA configuration. Please read the [UPGRADING.md](https://github.com/stalwartlabs/stalwart/blob/main/UPGRADING.md) file for more information on how to upgrade from previous versions. diff --git a/Cargo.lock b/Cargo.lock index eb9439f4..9a42d8c7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1263,7 +1263,7 @@ dependencies = [ [[package]] name = "common" -version = "0.13.1" +version = "0.13.2" dependencies = [ "aes-gcm-siv", "ahash", @@ -1733,7 +1733,7 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "dav" -version = "0.13.1" +version = "0.13.2" dependencies = [ "calcard", "chrono", @@ -1755,7 +1755,7 @@ dependencies = [ [[package]] name = "dav-proto" -version = "0.13.1" +version = "0.13.2" dependencies = [ "calcard", "chrono", @@ -1948,7 +1948,7 @@ dependencies = [ [[package]] name = "directory" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "argon2", @@ -2051,9 +2051,9 @@ dependencies = [ [[package]] name = "dns-update" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12c278a5523000f9ccab46e4ef779a4354129f762884b36fb1b1b5ed58830d20" +checksum = "41dbb7b41e755c6d9f9a62d3861e84fd33860b796d93aea6cfc8ef1068f4bff6" dependencies = [ "hickory-client", "reqwest 0.12.15", @@ -2226,7 +2226,7 @@ dependencies = [ [[package]] name = "email" -version = "0.13.1" +version = "0.13.2" dependencies = [ "aes", "aes-gcm", @@ -2356,7 +2356,7 @@ dependencies = [ [[package]] name = "event_macro" -version = "0.13.1" +version = "0.13.2" dependencies = [ "proc-macro2", "quote", @@ -2842,7 +2842,7 @@ dependencies = [ [[package]] name = "groupware" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "calcard", @@ -3142,7 +3142,7 @@ dependencies = [ [[package]] name = "http" -version = "0.13.1" +version = "0.13.2" dependencies = [ "async-stream", "base64 0.22.1", @@ -3252,7 +3252,7 @@ dependencies = [ [[package]] name = "http_proto" -version = "0.13.1" +version = "0.13.2" dependencies = [ "common", "compact_str", @@ -3554,7 +3554,7 @@ checksum = "09e54e57b4c48b40f7aec75635392b12b3421fa26fe8b4332e63138ed278459c" [[package]] name = "imap" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "common", @@ -3581,7 +3581,7 @@ dependencies = [ [[package]] name = "imap_proto" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "chrono", @@ -3827,7 +3827,7 @@ dependencies = [ [[package]] name = "jmap" -version = "0.13.1" +version = "0.13.2" dependencies = [ "aes-gcm", "aes-gcm-siv", @@ -3898,7 +3898,7 @@ dependencies = [ [[package]] name = "jmap_proto" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "compact_str", @@ -4372,7 +4372,7 @@ dependencies = [ [[package]] name = "managesieve" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "common", @@ -4474,7 +4474,7 @@ checksum = "c797b9d6bb23aab2fc369c65f871be49214f5c759af65bde26ffaaa2b646b492" [[package]] name = "migration" -version = "0.13.1" +version = "0.13.2" dependencies = [ "base64 0.22.1", "bincode 1.3.3", @@ -4712,7 +4712,7 @@ dependencies = [ [[package]] name = "nlp" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "bincode 1.3.3", @@ -5440,7 +5440,7 @@ dependencies = [ [[package]] name = "pop3" -version = "0.13.1" +version = "0.13.2" dependencies = [ "common", "directory", @@ -5607,7 +5607,7 @@ dependencies = [ [[package]] name = "proc_macros" -version = "0.13.1" +version = "0.13.2" dependencies = [ "proc-macro2", "quote", @@ -7271,7 +7271,7 @@ dependencies = [ [[package]] name = "services" -version = "0.13.1" +version = "0.13.2" dependencies = [ "aes-gcm", "aes-gcm-siv", @@ -7483,7 +7483,7 @@ checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] name = "smtp" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "blake3", @@ -7574,7 +7574,7 @@ dependencies = [ [[package]] name = "spam-filter" -version = "0.13.1" +version = "0.13.2" dependencies = [ "common", "compact_str", @@ -7638,14 +7638,14 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "stalwart" -version = "0.13.1" +version = "0.13.2" dependencies = [ "common", "dav", "directory", "email", "groupware", - "http 0.13.1", + "http 0.13.2", "imap", "jemallocator", "jmap", @@ -7664,7 +7664,7 @@ dependencies = [ [[package]] name = "stalwart-cli" -version = "0.13.1" +version = "0.13.2" dependencies = [ "clap", "console", @@ -7695,7 +7695,7 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "store" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "arc-swap", @@ -7904,7 +7904,7 @@ dependencies = [ [[package]] name = "tests" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "async-trait", @@ -7925,7 +7925,7 @@ dependencies = [ "form_urlencoded", "futures", "groupware", - "http 0.13.1", + "http 0.13.2", "http-body-util", "http_proto", "hyper 1.6.0", @@ -8451,7 +8451,7 @@ dependencies = [ [[package]] name = "trc" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "base64 0.22.1", @@ -8757,7 +8757,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "utils" -version = "0.13.1" +version = "0.13.2" dependencies = [ "ahash", "base64 0.22.1", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 2de12084..41e19e84 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -5,7 +5,7 @@ authors = ["Stalwart Labs LLC "] license = "AGPL-3.0-only OR LicenseRef-SEL" repository = "https://github.com/stalwartlabs/cli" homepage = "https://github.com/stalwartlabs/cli" -version = "0.13.1" +version = "0.13.2" edition = "2024" readme = "README.md" resolver = "2" diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index 47216838..0aef201c 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "common" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" build = "build.rs" @@ -19,7 +19,7 @@ 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"] } -dns-update = { version = "0.1.3" } +dns-update = { version = "0.1.4" } calcard = { version = "0.1.3", features = ["rkyv"] } ahash = { version = "0.8.2", features = ["serde"] } parking_lot = "0.12.1" diff --git a/crates/common/src/config/server/tls.rs b/crates/common/src/config/server/tls.rs index ff796560..9bf10f35 100644 --- a/crates/common/src/config/server/tls.rs +++ b/crates/common/src/config/server/tls.rs @@ -272,6 +272,26 @@ fn build_dns_updater(config: &mut Config, acme_id: &str) -> Option { }) .ok() } + "desec" => { + let timeout = config + .property_or_default(("acme", acme_id, "timeout"), "30s") + .unwrap_or_else(|| Duration::from_secs(30)); + + DnsUpdater::new_desec( + config + .value_require(("acme", acme_id, "secret"))? + .trim() + .to_string(), + timeout.into(), + ) + .map_err(|err| { + config.new_build_error( + ("acme", acme_id, "provider"), + format!("Failed to create Desec DNS updater: {err}"), + ) + }) + .ok() + } _ => { config.new_parse_error(("acme", acme_id, "provider"), "Unsupported provider"); None diff --git a/crates/dav-proto/Cargo.toml b/crates/dav-proto/Cargo.toml index 353705d6..41b8d498 100644 --- a/crates/dav-proto/Cargo.toml +++ b/crates/dav-proto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dav-proto" -version = "0.13.1" +version = "0.13.2" edition = "2021" [dependencies] diff --git a/crates/dav/Cargo.toml b/crates/dav/Cargo.toml index b96a257b..5b4e43ea 100644 --- a/crates/dav/Cargo.toml +++ b/crates/dav/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dav" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/directory/Cargo.toml b/crates/directory/Cargo.toml index 20fa50a8..5abd8eb6 100644 --- a/crates/directory/Cargo.toml +++ b/crates/directory/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "directory" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/directory/src/backend/internal/manage.rs b/crates/directory/src/backend/internal/manage.rs index b5dfb2e2..0b3569a0 100644 --- a/crates/directory/src/backend/internal/manage.rs +++ b/crates/directory/src/backend/internal/manage.rs @@ -9,9 +9,9 @@ use super::{ SpecialSecrets, lookup::DirectoryStore, }; use crate::{ - MemberOf, Permission, PermissionGrant, Permissions, Principal, PrincipalData, PrincipalQuota, - QueryBy, QueryParams, ROLE_ADMIN, ROLE_TENANT_ADMIN, ROLE_USER, Type, backend::RcptType, - core::principal::build_search_index, + FALLBACK_ADMIN_ID, MemberOf, Permission, PermissionGrant, Permissions, Principal, + PrincipalData, PrincipalQuota, QueryBy, QueryParams, ROLE_ADMIN, ROLE_TENANT_ADMIN, ROLE_USER, + Type, backend::RcptType, core::principal::build_search_index, }; use ahash::{AHashMap, AHashSet}; use compact_str::CompactString; @@ -182,6 +182,12 @@ impl ManageDirectory for Store { .assign_document_ids(u32::MAX, Collection::Principal, 1) .await .caused_by(trc::location!())?; + if principal_id_ == FALLBACK_ADMIN_ID { + return Err(trc::StoreEvent::UnexpectedError + .into_err() + .details("ID assignment failed") + .caused_by(trc::location!())); + } principal_id = Some(principal_id_); principal_id_ }; @@ -536,6 +542,12 @@ impl ManageDirectory for Store { .assign_document_ids(u32::MAX, Collection::Principal, 1) .await .caused_by(trc::location!())?; + if principal_id == FALLBACK_ADMIN_ID { + return Err(trc::StoreEvent::UnexpectedError + .into_err() + .details("ID assignment failed") + .caused_by(trc::location!())); + } principal_create.id = principal_id; let mut batch = BatchBuilder::new(); let pinfo_name = PrincipalInfo::new(principal_id, principal_create.typ, tenant_id); diff --git a/crates/email/Cargo.toml b/crates/email/Cargo.toml index 47a74705..74aa47d7 100644 --- a/crates/email/Cargo.toml +++ b/crates/email/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "email" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/groupware/Cargo.toml b/crates/groupware/Cargo.toml index 6731d0c9..7734674e 100644 --- a/crates/groupware/Cargo.toml +++ b/crates/groupware/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "groupware" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/http-proto/Cargo.toml b/crates/http-proto/Cargo.toml index 8971e486..771d9d87 100644 --- a/crates/http-proto/Cargo.toml +++ b/crates/http-proto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "http_proto" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/http/Cargo.toml b/crates/http/Cargo.toml index cc5827e2..8aaa465e 100644 --- a/crates/http/Cargo.toml +++ b/crates/http/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "http" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/imap-proto/Cargo.toml b/crates/imap-proto/Cargo.toml index 408e1809..3076e744 100644 --- a/crates/imap-proto/Cargo.toml +++ b/crates/imap-proto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "imap_proto" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/imap/Cargo.toml b/crates/imap/Cargo.toml index d5815092..c7161f2b 100644 --- a/crates/imap/Cargo.toml +++ b/crates/imap/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "imap" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/jmap-proto/Cargo.toml b/crates/jmap-proto/Cargo.toml index fd9cdde1..8fa08d18 100644 --- a/crates/jmap-proto/Cargo.toml +++ b/crates/jmap-proto/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jmap_proto" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/jmap/Cargo.toml b/crates/jmap/Cargo.toml index b04eb601..9460baec 100644 --- a/crates/jmap/Cargo.toml +++ b/crates/jmap/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "jmap" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/main/Cargo.toml b/crates/main/Cargo.toml index aaba1a49..3012fd18 100644 --- a/crates/main/Cargo.toml +++ b/crates/main/Cargo.toml @@ -7,7 +7,7 @@ homepage = "https://stalw.art" keywords = ["imap", "jmap", "smtp", "email", "mail", "webdav", "server"] categories = ["email"] license = "AGPL-3.0-only OR LicenseRef-SEL" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/managesieve/Cargo.toml b/crates/managesieve/Cargo.toml index ba6c7853..52d2537e 100644 --- a/crates/managesieve/Cargo.toml +++ b/crates/managesieve/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "managesieve" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/migration/Cargo.toml b/crates/migration/Cargo.toml index 799fd39c..1487e484 100644 --- a/crates/migration/Cargo.toml +++ b/crates/migration/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "migration" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/nlp/Cargo.toml b/crates/nlp/Cargo.toml index 42c7623a..8ccdc056 100644 --- a/crates/nlp/Cargo.toml +++ b/crates/nlp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "nlp" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/pop3/Cargo.toml b/crates/pop3/Cargo.toml index 6b610f12..176a1fc2 100644 --- a/crates/pop3/Cargo.toml +++ b/crates/pop3/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pop3" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/services/Cargo.toml b/crates/services/Cargo.toml index c33dc7cd..c24e6658 100644 --- a/crates/services/Cargo.toml +++ b/crates/services/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "services" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/smtp/Cargo.toml b/crates/smtp/Cargo.toml index 1ff1b03b..8caa6736 100644 --- a/crates/smtp/Cargo.toml +++ b/crates/smtp/Cargo.toml @@ -7,7 +7,7 @@ homepage = "https://stalw.art/smtp" keywords = ["smtp", "email", "mail", "server"] categories = ["email"] license = "AGPL-3.0-only OR LicenseRef-SEL" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/spam-filter/Cargo.toml b/crates/spam-filter/Cargo.toml index 320f5826..34c83249 100644 --- a/crates/spam-filter/Cargo.toml +++ b/crates/spam-filter/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "spam-filter" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/store/Cargo.toml b/crates/store/Cargo.toml index 156d2f8b..fb63c3f9 100644 --- a/crates/store/Cargo.toml +++ b/crates/store/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "store" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/trc/Cargo.toml b/crates/trc/Cargo.toml index 283c9def..da85ed46 100644 --- a/crates/trc/Cargo.toml +++ b/crates/trc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trc" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/trc/event-macro/Cargo.toml b/crates/trc/event-macro/Cargo.toml index c2212a45..85b87583 100644 --- a/crates/trc/event-macro/Cargo.toml +++ b/crates/trc/event-macro/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "event_macro" -version = "0.13.1" +version = "0.13.2" edition = "2024" [lib] diff --git a/crates/utils/Cargo.toml b/crates/utils/Cargo.toml index b99c535e..0879cb41 100644 --- a/crates/utils/Cargo.toml +++ b/crates/utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "utils" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2" diff --git a/crates/utils/proc-macros/Cargo.toml b/crates/utils/proc-macros/Cargo.toml index feb1842a..833f37cb 100644 --- a/crates/utils/proc-macros/Cargo.toml +++ b/crates/utils/proc-macros/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "proc_macros" -version = "0.13.1" +version = "0.13.2" edition = "2024" [lib] diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 45094713..b4d7715f 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tests" -version = "0.13.1" +version = "0.13.2" edition = "2024" resolver = "2"