nextcloud/server · warning · Sabre\DAV\Exception\Forbidden
Deleting an entry is not implemented
Error message
Deleting an entry is not implemented
What it means
DELETE on an app-provided calendar collection always throws Forbidden (HTTP 403): OCP\Calendar\ICalendar has no deletion API, so AppCalendar::delete() cannot be implemented. Removing such a calendar means acting in the source app (uninstall it, disable the provider, or revoke access).
Source
Thrown at apps/dav/lib/CalDAV/AppCalendar/AppCalendar.php:104
throw new Forbidden('Setting ACL is not supported on this node');
}
#[\Override]
public function getSupportedPrivilegeSet(): ?array {
// Use the default one
return null;
}
#[\Override]
public function getLastModified(): ?int {
// unknown
return null;
}
#[\Override]
public function delete(): void {
// No method for deleting a calendar in OCP\Calendar\ICalendar
throw new Forbidden('Deleting an entry is not implemented');
}
#[\Override]
public function createFile($name, $data = null) {
if ($this->calendar instanceof ICreateFromString) {
if (is_resource($data)) {
$data = stream_get_contents($data) ?: null;
}
$this->calendar->createFromString($name, is_null($data) ? '' : $data);
return null;
} else {
throw new Forbidden('Creating a new entry is not allowed');
}
}
#[\Override]
public function getProperties($properties) {
return [View on GitHub (pinned to ecdeb153ff)
Solutions
- Remove or stop the calendar in the providing app's settings instead of via CalDAV
- Clients: when a calendar DELETE returns 403, mark the calendar as non-deletable instead of retrying
- App providers: offer deletion in the app UI so users have a supported path
Defensive patterns
Strategy: fallback
Validate before calling
if ($calendarNode instanceof \OCA\DAV\CalDAV\AppCalendar\AppCalendar) {
// no CalDAV delete for app calendars - act in the app instead
return false;
} Type guard
function isDeletableCalendar(Sabre\DAV\INode $node): bool {
return !($node instanceof \OCA\DAV\CalDAV\AppCalendar\AppCalendar);
} Try / catch
try {
$node->delete();
} catch (Sabre\DAV\Exception\Forbidden $e) {
// app-owned calendar: direct the user to the providing app
} Prevention
- Hide or lock app-backed calendar collections from delete actions in clients
- Check the calendar source (app vs. Nextcloud calendar backend) before offering delete
- Handle 403 on calendar DELETE as permanent, not retryable
When it happens
Trigger: A CalDAV client sending DELETE to the collection URI of an app-registered calendar, e.g. DELETE /remote.php/dav/calendars/user/appid-calendarname/
Common situations: Users trying to remove app-backed calendars (task providers, embedded/feed calendars) from Apple Calendar, Thunderbird or DAVx5 instead of inside the Nextcloud app that provides them.
Related errors
- Setting ACL is not supported on this node
- Creating a new entry is not allowed
- Node not found
- Setting ACL is not supported on this node
- This calendar-object is read-only
AI-assisted analysis of nextcloud/server@ecdeb153ff (2026-08-17).
Data as JSON: /api/errors/4092976772f04596.
Report an issue: GitHub.