caldav leaves the platform
calendar and contacts are a plugin now — plugins/caldav, its own repository like every other one. a fresh machine runs five processes instead of seven and gets a calendar by installing one plugin, which is the whole point: the platform stops carrying a python calendar server for people who may not want one. what left: the radicale sidecar, four routers, the panel apps, the dav_app_passwords table, the two screens, the two dock tiles, the permission registry entry, the settings section, and radicale from every package list. three platform things had to change first, each committed on its own:6b5c87daa plugin can be more than one screen;e0df28ffa first-party plugin can claim a reserved root path. this commit adds the third, `personal` on a plugin permission — a member granted READ must still mint and revoke their own app password, because that password is how their own phone reaches their own calendar. those rows are theirs and nobody else's. two fixes the work surfaced rather than caused. the dock pinned mountPrefix, so a multi-screen plugin pinned a tile pointing at /caldav — a route no plugin serves. and the OPTIONS carve-out was a literal list of four DAV paths; it asks the claim registry now, so it follows whoever owns the route. /calendar stays in DEFAULT_DOCK_PATHS. it is installed by default and a fresh dock that silently dropped it would read as a downgrade. docs:check earned its keep twice here: it caught spotlight still offering /settings/integrations/dav-app-passwords after the section was deleted, and the permission count going 22 -> 21. neither is greppable and both were already wrong when it ran. verified against alpha, which is still on the pre-extraction code: /.well-known/ caldav 301s, /dav/ answers 401 with the same WWW-Authenticate realm byte for byte, /api/caldav/passwords 401s, and OPTIONS reaches the DAV router rather than being answered as a CORS preflight. installed here end to end — schema applied, sidecar started, two tiles with their own artwork behind one permission. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Officer-Session: 656f5c85-e49a-4f1f-b9f3-042a04b4d043
This commit is contained in:
@@ -46,6 +46,19 @@ export type PluginPermission = {
|
||||
* broken feature where a withheld permission should be.
|
||||
*/
|
||||
readOnlyWrites?: string[];
|
||||
/**
|
||||
* Sub-paths, relative to the plugin's mount prefix, that a READ grant may still mutate because they
|
||||
* hold only the CALLER'S OWN data.
|
||||
*
|
||||
* Caldav is the case that needed it: a member granted read on the calendar must still be able to mint
|
||||
* and revoke their own DAV app password, because that password is how their phone reaches their own
|
||||
* calendar. Every one of those routes is scoped to the caller's user id in the plugin's own queries —
|
||||
* `personal` is the platform agreeing that a write there is not a write to anything shared.
|
||||
*
|
||||
* Distinct from `readOnlyWrites`, which is for requests that LOOK like writes and are not. These are
|
||||
* real writes, to rows nobody else can see.
|
||||
*/
|
||||
personal?: string[];
|
||||
/**
|
||||
* Sub-paths, relative to the plugin's mount prefix, that ONLY the owner may reach — at any granted
|
||||
* level, by any method.
|
||||
@@ -530,6 +543,15 @@ export type DiscoveredScreen = {
|
||||
label: string;
|
||||
/** Lucide icon NAME for this screen's tile, falling back to the plugin's. */
|
||||
icon?: string;
|
||||
/**
|
||||
* `assets/<segment>.png` — this screen's own artwork, when it ships some.
|
||||
*
|
||||
* A single-screen plugin has one tile and `assets/icon.png` is it. Two screens sharing that one image
|
||||
* would be two identical tiles side by side, saying nothing about which is which — so a screen may
|
||||
* bring its own, found by name for the same reason the icon is: presence is the declaration, and
|
||||
* `publishAssets` already copies the whole assets directory.
|
||||
*/
|
||||
art: string | null;
|
||||
panels: string;
|
||||
layout: string;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user