{"record":{"id":"c43552417cc36c19","repo":"nextcloud/server","slug":"not-implemented","errorCode":null,"errorMessage":"not implemented","messagePattern":"not implemented","errorType":"exception","errorClass":"Forbidden","httpStatus":403,"severity":"error","filePath":"apps/dav/lib/CalDAV/Trashbin/TrashbinHome.php","lineNumber":129,"sourceCode":"\n\t#[\\Override]\n\tpublic function getName(): string {\n\t\treturn self::NAME;\n\t}\n\n\t#[\\Override]\n\tpublic function setName($name) {\n\t\tthrow new Forbidden('Permission denied to rename the trashbin');\n\t}\n\n\t#[\\Override]\n\tpublic function getLastModified(): int {\n\t\treturn 0;\n\t}\n\n\t#[\\Override]\n\tpublic function propPatch(PropPatch $propPatch): void {\n\t\tthrow new Forbidden('not implemented');\n\t}\n\n\t#[\\Override]\n\tpublic function getProperties($properties): array {\n\t\treturn [\n\t\t\t'{DAV:}resourcetype' => new ResourceType([\n\t\t\t\t'{DAV:}collection',\n\t\t\t\tsprintf('{%s}trash-bin', \\OCA\\DAV\\DAV\\Sharing\\Plugin::NS_NEXTCLOUD),\n\t\t\t]),\n\t\t];\n\t}\n}\n","sourceCodeStart":111,"sourceCodeEnd":142,"githubUrl":"https://github.com/nextcloud/server/blob/ecdeb153ffdf227235c9a7e2d13dbe0f9c817bc3/apps/dav/lib/CalDAV/Trashbin/TrashbinHome.php#L111-L142","documentation":"TrashbinHome::propPatch() throws Forbidden('not implemented'): the trashbin exposes only a fixed resourcetype (a DAV collection plus {http://nextcloud.org/ns}trash-bin) and accepts no property writes. Any PROPPATCH on the trashbin URL - for example setting {DAV:}displayname - fails with HTTP 403.","triggerScenarios":"PROPPATCH on /remote.php/dav/calendars/<user>/trashbin setting displayname, color, or sync metadata; clients that stamp displayname on every collection immediately after discovery.","commonSituations":"Calendar clients that 'tidy' all discovered collections by writing displayname/color; provisioning code applying a uniform property template to every node.","solutions":["Skip PROPPATCH for the trashbin collection; it has no writable properties","Apply displayname/color changes only to real calendars under the calendar home","In bulk property-update loops, filter out the trashbin URL instead of parsing the 403 afterwards"],"exampleFix":"// before\nPROPPATCH /remote.php/dav/calendars/alice/trashbin\n  set {DAV:}displayname = 'Trash'\n-> 403 not implemented\n\n// after\nPROPPATCH /remote.php/dav/calendars/alice/personal/\n  set {DAV:}displayname = 'Personal'\n-> 207 Multi-Status","handlingStrategy":"validation","validationCode":"if (str_ends_with(rtrim($propPatchUri, '/'), '/trashbin')) {\n    return; // trashbin has no writable properties: skip the PROPPATCH entirely\n}","typeGuard":null,"tryCatchPattern":"try {\n    $client->propPatch($uri, $props);\n} catch (\\Sabre\\HTTP\\ClientHttpException $e) {\n    if ($e->getResponse()->getStatus() === 403 && str_ends_with(rtrim($uri, '/'), '/trashbin')) {\n        return; // 'not implemented' by design\n    }\n    throw $e;\n}","preventionTips":["Send PROPPATCH only to real calendars under the calendar home","Remember the trashbin exposes only its fixed resourcetype property","Build bulk property-update loops that skip read-only system collections"],"tags":["caldav","dav","trashbin","http-403","proppatch"],"backgroundTag":"dav-403-forbidden","analyzedSha":"ecdeb153ffdf227235c9a7e2d13dbe0f9c817bc3","analyzedAt":"2026-08-17T01:36:13.386Z","schemaVersion":2},"datasetVersion":"2026-08-17T04:17:16.089Z"}