Issue Description
Creating a CalendarEvent through CalendarEvent/set with participants, but without an explicit organizerCalendarAddress, succeeds without Stalwart assigning an organizer address.
When sendSchedulingMessages: true is supplied, the create also succeeds, but no scheduling message is sent to the attendee.
This appears contrary to JMAP Calendars draft-26. When creating an event with participants, the server is required to set organizerCalendarAddress if the client did not supply one. After a successful create with sendSchedulingMessages: true, the server is also required to send the appropriate iTIP scheduling messages.
This reproduces even when the client supplies an explicit accepted owner participant corresponding to the creating account.
Source inspection suggests the failure occurs in crates/jmap/src/calendar_event/set.rs.
The create path converts the submitted JSCalendar event to iCalendar without first assigning an organizer. It then calls itip_create().
itip_create() calls itip_snapshot(), which returns ItipError::NoSchedulingInfo when the generated iCalendar object has no ORGANIZER.
CalendarEvent/set only converts errors for which ItipError::is_jmap_error() is true into a SetError. NoSchedulingInfo is not classified as such, so the scheduling failure appears to be ignored and the event is successfully stored without any scheduling messages being queued.
Expected Behavior
For a CalendarEvent/set create containing participants but no organizerCalendarAddress, Stalwart should assign an appropriate organizer address.
Draft-26 requires:
When creating an event with participants, or adding participants to an event that previously did not have participants, the server MUST set the “organizerCalendarAddress” property of the event if not present.
With sendSchedulingMessages: true, Stalwart should also send the appropriate iTIP scheduling message after successful creation.
For an origin event creation, this should be a REQUEST to the event participants other than any participant corresponding to the calendar owner.
Actual Behavior
CalendarEvent/set reports the event as successfully created.
The stored event contains:
- an accepted owner participant corresponding to the creating account;
- a separate attendee with
participationStatus: "needs-action"; isOrigin: true.
However, organizerCalendarAddress remains absent/null.
No scheduling result appears on the attendee account:
- no same-UID
CalendarEventis created; - no new
CalendarEventNotificationis created.
The same organizer-assignment failure also reproduces if the client does not supply an owner participant.
Source inspection indicates that the missing organizer causes the generated iCalendar object to have no ORGANIZER. itip_create() consequently returns ItipError::NoSchedulingInfo, which is not surfaced as a SetError and is instead silently ignored.
Reproduction Steps
-
Have two local accounts, for example:
-
Create a future event in
[email protected]usingCalendarEvent/set. -
Include an explicit owner participant and a separate attendee, for example:
"participants": {
"owner": {
"@type": "Participant",
"calendarAddress": "mailto:[email protected]",
"roles": {
"owner": true,
"attendee": true
},
"participationStatus": "accepted",
"expectReply": false
},
"attendee1": {
"@type": "Participant",
"calendarAddress": "mailto:[email protected]",
"roles": {
"attendee": true
},
"participationStatus": "needs-action",
"expectReply": true
}
}
-
Do not supply
organizerCalendarAddress. -
Set:
"sendSchedulingMessages": true
-
Observe that
CalendarEvent/setreports the event as successfully created. -
Fetch the created event with
CalendarEvent/get. -
Observe that:
- the owner participant is present;
- the attendee is present;
isOriginistrue;organizerCalendarAddressis still absent/null.
-
Query
[email protected]for:- a
CalendarEventwith the same UID; - new
CalendarEventNotificationobjects.
- a
-
Observe that neither a scheduled event nor a scheduling notification was created.
Relevant Log Output
No relevant error is returned from the successful CalendarEvent/set request.
Source inspection indicates that the internal scheduling attempt returns ItipError::NoSchedulingInfo because the generated iCalendar object has no ORGANIZER. This error is not treated as a JMAP SetError and the create therefore succeeds without scheduling.
Stalwart Version
v0.16.x
Installation Method
Docker
Database Backend
RocksDB
Blob Storage
RocksDB
Search Engine
Internal
Directory Backend
Internal
I have reviewed the documentation and FAQ and confirm that my issue is NOT addressed there.
on
I have searched this support forum (open and closed topics) and confirm this is not a duplicate.
on
I understand that topics in this category are triaged by a bot first but a human reply will follow up. If I’d prefer a human-only reply, I’ll add the no-ai tag to my topic.
on