This commit is contained in:
mdecimus 2025-06-25 16:04:20 +02:00
parent 4ce2dc5858
commit 2fcdc186c7
4 changed files with 35 additions and 8 deletions

View file

@ -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.

View file

@ -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.

View file

@ -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 {

View file

@ -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!())?;