CalDAV (synchronisation du calendrier)
bext peut servir de serveur CalDAV (RFC 4791), permettant la synchronisation du calendrier avec n'importe quel client conforme aux normes : Apple Calendar, Thunderbird, GNOME Calendar, DAVx5 et autres.
Activation de CalDAV#
[caldav]
enabled = true
storage = "memory" # "memory" | "pg"
# For PostgreSQL storage
# storage = "pg"
# pg_url = "postgresql://user:pass@localhost/bext_dav"
Compilez avec l'indicateur de fonctionnalité caldav :
bext build --features caldav
Fondation WebDAV#
CalDAV est construit sur WebDAV. bext implémente les méthodes HTTP requises :
| Méthode | But |
|---|---|
PROPFIND |
Lisez les propriétés des calendriers et des événements. |
PROPPATCH |
Modifier les propriétés du calendrier. |
REPORT |
Exécutez des requêtes (plage de temps, multiget, synchronisation). |
MKCALENDAR |
Créez une nouvelle collection de calendriers. |
PUT |
Créez ou mettez à jour un événement de calendrier. |
GET |
Récupérer un seul événement (.ics). |
DELETE |
Supprimez un événement ou un calendrier. |
Structure des URL#
Les collections de calendriers suivent une hiérarchie prévisible :
/calendars/{user}/ # User's calendar home
/calendars/{user}/{calendar}/ # A specific calendar
/calendars/{user}/{calendar}/{uid}.ics # A single event
Exemple:
/calendars/alice/work/
/calendars/alice/work/meeting-2026-04.ics
/calendars/alice/personal/
Format iCalendrier#
Les événements sont stockés sous forme de fichiers iCalendar (RFC 5545) .ics. bext les analyse et les valide sur PUT :
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//bext//CalDAV//EN
BEGIN:VEVENT
UID:meeting-2026-04@example.com
DTSTART:20260415T090000Z
DTEND:20260415T100000Z
SUMMARY:Team Standup
END:VEVENT
END:VCALENDAR
Types de composants pris en charge :
| Composant | Description |
|---|---|
VEVENT |
Événements du calendrier. |
VTODO |
Tâches/éléments à faire. |
VJOURNAL |
Entrées de journal/notes. |
Rapports CalDAV#
Les clients interrogent les calendriers à l'aide de requêtes REPORT avec des corps XML. bext prend en charge trois types de rapports :
requête de calendrier#
Filtrer les événements par propriété ou par plage horaire :
<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav">
<d:prop xmlns:d="DAV:">
<d:getetag/>
<c:calendar-data/>
</d:prop>
<c:filter>
<c:comp-filter name="VCALENDAR">
<c:comp-filter name="VEVENT">
<c:time-range start="20260401T000000Z"
end="20260430T235959Z"/>
</c:comp-filter>
</c:comp-filter>
</c:filter>
</c:calendar-query>
calendrier-multiget#
Récupérez des événements spécifiques par URL en une seule requête :
<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav">
<d:prop xmlns:d="DAV:">
<d:getetag/>
<c:calendar-data/>
</d:prop>
<d:href>/calendars/alice/work/meeting-2026-04.ics</d:href>
<d:href>/calendars/alice/work/review-2026-04.ics</d:href>
</c:calendar-multiget>
collection de synchronisation#
Synchronisation incrémentielle efficace (RFC 6578). Le client envoie un jeton de synchronisation de la synchronisation précédente et bext renvoie uniquement les modifications apportées depuis :
<d:sync-collection xmlns:d="DAV:">
<d:sync-token>data:,12345</d:sync-token>
<d:prop>
<d:getetag/>
</d:prop>
</d:sync-collection>
bext répond avec des ressources nouvelles/modifiées/supprimées et un nouveau jeton de synchronisation. Cela évite une nouvelle récupération complète à chaque cycle de synchronisation.
Découverte#
Les clients découvrent CalDAV à l'aide de la redirection .well-known (RFC 6764) :
GET /.well-known/caldav
→ 301 /calendars/
bext enregistre automatiquement cette redirection lorsque CalDAV est activé. Les applications clientes n'ont besoin que du nom d'hôte du serveur pour trouver l'accueil du calendrier.
Backends de stockage#
| Back-end | Description |
|---|---|
memory |
Magasin en mémoire. Rapide, perdu au redémarrage. |
pg |
PostgreSQL via @bext/infra-pg. Persistant. |
Le backend PostgreSQL partage son schéma avec CardDAV (contacts), les deux fonctionnalités utilisent donc la même base de données.
Authentification#
Les points de terminaison CalDAV nécessitent une authentification. bext utilise le même middleware d'authentification que les routes HTTP : JWT, clés API ou OAuth :
[[routes]]
path = "/calendars/*"
auth = "required"
Le {user} dans le chemin de l'URL est comparé à l'identité authentifiée. Les utilisateurs ne peuvent accéder qu'à leurs propres calendriers, à moins d'y avoir accès via le partage.
Référence de configuration#
[caldav]
enabled = true
storage = "memory"
max_event_size_bytes = 65536
max_events_per_calendar = 50000
| Champ | Défaut | Description |
|---|---|---|
storage |
memory |
Back-end de stockage. |
max_event_size_bytes |
65536 | Taille maximale d'un seul téléchargement.ics. |
max_events_per_calendar |
50000 | Limite de sécurité par calendrier. |
Indicateur de fonctionnalité#
CalDAV nécessite l'indicateur de fonctionnalité caldav :
bext build --features caldav
Le backend de stockage memory perd toutes les données du calendrier au redémarrage. Utiliser
storage = "pg" pour tout déploiement où la persistance des données est importante. Le backend PostgreSQL partage son schéma avec CardDAV, donc les deux fonctionnalités utilisent le même pg_url.
Les applications clientes n'ont besoin que du nom d'hôte du serveur : la redirection .well-known/caldav gère automatiquement la découverte. Diriger les clients vers
/calendars/ contourne directement cela et peut interrompre la configuration automatique dans certaines applications (Apple Calendar, DAVx5).
En rapport#
- CardDAV (synchronisation des contacts) — protocole compagnon qui partage la même pile et le même stockage WebDAV
- Capacité d'authentification — middleware d'authentification appliqué aux routes
/calendars/* - Capacité de stockage — stockage d'objets et de valeurs-clés ; Le backend PostgreSQL pour CalDAV est distinct
- Construire des drapeaux — indicateurs de fonctionnalités au moment de la compilation, notamment
caldav - Référence de configuration — référence complète du champ
bext.config.toml
Links#
- RFC 4791 — CalDAV : Extensions de calendrier à WebDAV — la spécification du protocole CalDAV
- RFC 5545 — iCalendar — le format iCalendar utilisé pour les fichiers d'événements
.ics