mirror of
https://github.com/stalwartlabs/mail-server.git
synced 2025-10-09 03:55:45 +08:00
v0.12.5
This commit is contained in:
parent
4ce2dc5858
commit
2fcdc186c7
4 changed files with 35 additions and 8 deletions
23
CHANGELOG.md
23
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/).
|
All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
|
||||||
|
|
||||||
|
## [0.12.5] - 2025-06-25
|
||||||
|
|
||||||
|
If you are upgrading from v0.11.x, this version includes **breaking changes** to the database layout and requires a migration. 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
|
||||||
|
- Calendar Scheduling Extensions to CalDAV - RFC6368 (#1514)
|
||||||
|
- Calendar E-Mail Notifications (#1514)
|
||||||
|
- Limited i18n support for calendaring events.
|
||||||
|
- Assisted CalDAV/CardDAV shared resource discovery (#1691).
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
- JMAP: Allow unauthenticated access to JMAP session object.
|
||||||
|
|
||||||
|
## Fixed
|
||||||
|
- WebDAV: Return NOTFOUND error instead of MULTISTATUS on empty PROPFIND responses (#1657).
|
||||||
|
- WebDAV: Update account name when refreshing DAV caches (#1694).
|
||||||
|
- JMAP: Do not include email address in identity names (#1688).
|
||||||
|
- IMAP: Normalize `INBOX` name when creating/renaming folders (#1636).
|
||||||
|
- LDAP: Request `secret-changed` attribute in LDAP queries (#1409).
|
||||||
|
- Branding: Unable to change logos (#1652).
|
||||||
|
- Antispam: Skip `card-is-ham` override when sender does not pass DMARC (#1648).
|
||||||
|
- FoundationDB: Renew old/expired FDB read transactions after the `1007` error code is received rather than estimating expiration time.
|
||||||
|
|
||||||
## [0.12.4] - 2025-06-03
|
## [0.12.4] - 2025-06-03
|
||||||
|
|
||||||
If you are upgrading from v0.11.x, this version includes **breaking changes** to the database layout and requires a migration. 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.
|
If you are upgrading from v0.11.x, this version includes **breaking changes** to the database layout and requires a migration. 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.
|
||||||
|
|
|
@ -53,9 +53,10 @@ Key features:
|
||||||
* Distributed virtual queues with delayed delivery, priority delivery, quotas, routing rules and throttling support.
|
* Distributed virtual queues with delayed delivery, priority delivery, quotas, routing rules and throttling support.
|
||||||
* Envelope rewriting and message modification.
|
* Envelope rewriting and message modification.
|
||||||
- **Collaboration** server:
|
- **Collaboration** server:
|
||||||
- Calendar and scheduling with [CalDAV](https://datatracker.ietf.org/doc/html/rfc4791).
|
- Calendaring with [CalDAV](https://datatracker.ietf.org/doc/html/rfc4791), [CalDAV Scheduling](https://datatracker.ietf.org/doc/html/rfc6638) and e-mail alarms support.
|
||||||
- Contact management with [CardDAV](https://datatracker.ietf.org/doc/html/rfc6352).
|
- Contact management with [CardDAV](https://datatracker.ietf.org/doc/html/rfc6352) support.
|
||||||
- File storage and sharing with [WebDAV](https://datatracker.ietf.org/doc/html/rfc4918).
|
- File storage with [WebDAV](https://datatracker.ietf.org/doc/html/rfc4918) support.
|
||||||
|
- Sharing with [WebDAV ACL](https://datatracker.ietf.org/doc/html/rfc3744) support for fine-grained access control.
|
||||||
- **Spam** and **Phishing** built-in filter:
|
- **Spam** and **Phishing** built-in filter:
|
||||||
- Comprehensive set of filtering **rules** on par with popular solutions.
|
- Comprehensive set of filtering **rules** on par with popular solutions.
|
||||||
- LLM-driven spam filtering and message analysis.
|
- LLM-driven spam filtering and message analysis.
|
||||||
|
|
|
@ -348,7 +348,6 @@ impl PropFindRequestHandler for Server {
|
||||||
collection_container = parent_collection;
|
collection_container = parent_collection;
|
||||||
collection_children = collection_container.child_collection().unwrap();
|
collection_children = collection_container.child_collection().unwrap();
|
||||||
sync_collection = SyncCollection::from(collection_container);
|
sync_collection = SyncCollection::from(collection_container);
|
||||||
response.set_namespace(collection_container.namespace());
|
|
||||||
|
|
||||||
multiget(
|
multiget(
|
||||||
self,
|
self,
|
||||||
|
@ -371,7 +370,7 @@ impl PropFindRequestHandler for Server {
|
||||||
collection_container = parent_collection;
|
collection_container = parent_collection;
|
||||||
collection_children = collection_container.child_collection().unwrap();
|
collection_children = collection_container.child_collection().unwrap();
|
||||||
sync_collection = SyncCollection::from(collection_container);
|
sync_collection = SyncCollection::from(collection_container);
|
||||||
response.set_namespace(collection_container.namespace());
|
|
||||||
items
|
items
|
||||||
}
|
}
|
||||||
DavQueryResource::Discovery {
|
DavQueryResource::Discovery {
|
||||||
|
@ -381,7 +380,6 @@ impl PropFindRequestHandler for Server {
|
||||||
collection_container = parent_collection;
|
collection_container = parent_collection;
|
||||||
collection_children = collection_container.child_collection().unwrap();
|
collection_children = collection_container.child_collection().unwrap();
|
||||||
sync_collection = SyncCollection::from(collection_container);
|
sync_collection = SyncCollection::from(collection_container);
|
||||||
response.set_namespace(collection_container.namespace());
|
|
||||||
|
|
||||||
// Add container info
|
// Add container info
|
||||||
if !query.depth_no_root {
|
if !query.depth_no_root {
|
||||||
|
@ -407,6 +405,7 @@ impl PropFindRequestHandler for Server {
|
||||||
}
|
}
|
||||||
DavQueryResource::None => unreachable!(),
|
DavQueryResource::None => unreachable!(),
|
||||||
};
|
};
|
||||||
|
response.set_namespace(collection_container.namespace());
|
||||||
|
|
||||||
let mut skip_not_found = query.expand;
|
let mut skip_not_found = query.expand;
|
||||||
let properties = match &query.propfind {
|
let properties = match &query.propfind {
|
||||||
|
|
|
@ -376,12 +376,16 @@ impl DestroyArchive<Archive<&ArchivedCalendarEvent>> {
|
||||||
batch.delete_document(document_id);
|
batch.delete_document(document_id);
|
||||||
|
|
||||||
// Remove next alarm if it exists
|
// Remove next alarm if it exists
|
||||||
if let Some(next_alarm) = event.inner.data.next_alarm(now() as i64, Tz::Floating) {
|
let now = now() as i64;
|
||||||
|
if let Some(next_alarm) = event.inner.data.next_alarm(now, Tz::Floating) {
|
||||||
next_alarm.delete_task(batch);
|
next_alarm.delete_task(batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Scheduling
|
// Scheduling
|
||||||
if send_itip && event.inner.schedule_tag.is_some() {
|
if send_itip
|
||||||
|
&& event.inner.schedule_tag.is_some()
|
||||||
|
&& event.inner.data.event_range_end() > now
|
||||||
|
{
|
||||||
let event = event
|
let event = event
|
||||||
.deserialize::<CalendarEvent>()
|
.deserialize::<CalendarEvent>()
|
||||||
.caused_by(trc::location!())?;
|
.caused_by(trc::location!())?;
|
||||||
|
|
Loading…
Add table
Reference in a new issue