FLASH INFORMATIQUE FI



CalDAV




Predrag VICEIC


Voici finalement le 3ème et le dernier volet de la série d’articles présentant le protocole WebDAV et ses extensions. Dans le premier article (FI 6/08) nous avons vu comment fonctionnait le protocole HTTP, et comment, en y ajoutant quelques extensions judicieuses, nous pouvions utiliser ce dernier pour communiquer avec un serveur de fichiers en ligne - un serveur WebDAV. Dans l’article suivant (FI 7/08) nous avons survolé les extensions au protocole WebDAV. Ces extensions permettent de rechercher les documents (WebDAV Search), autorisent les manipulations des différentes versions de ces documents (DELTAV) et contrôlent les droits d’accès aux dossiers et aux documents (ACL).
Le protocole CalDAV (Calendaring Extensions to WebDAV), le sujet du présent article, utilise les briques de la constellation des schémas de communication WebDAV pour créer de toutes pièces un protocole d’agenda distribué innovant, souple et extrêmement puissant. Dans cet article, j’essaierai de présenter CalDAV de manière la plus simple possible, tout en utilisant les exemples exécutables à l’aide du logiciel de console telnet ou à l’aide du client Web en ligne de commande, curl.

GroupDAV

L’idée d’utiliser WebDAV pour stocker et partager ses agendas en ligne est assez ancienne. Les premières discussions proposant de combiner le WebDAV (RFC2518) avec le format de fichier iCalendar (RFC2445) afin de déposer ses agendas en ligne ont eu lieu déjà depuis 1998. A l’époque, la norme WebDAV était encore en finalisation. Plusieurs entreprises (Apple, Microsoft) et surtout les grands projets de groupware open source (OpenGroupware.org, eGroupWare, Citadel) ont implémenté la possibilité de télécharger et récupérer les calendriers sous forme de fichiers texte. C’est justement la norme iCalendar, finalisée en 1998, qui devrait permettre de transcrire un agenda dans un fichier texte, et ceci de manière standard et uniforme à travers les différentes plates-formes logicielles.
Dans la norme iCalendar les évènements sont exprimés sur la forme suivante :

BEGIN:VCALENDAR
BEGIN:VEVENT
CREATED:20081029T111613Z
UID:KOrganizer-486718033.411
LAST-MODIFIED:20081029T111613Z
SUMMARY:Un évènement de test
DTSTART:20081029T150000Z
DTEND:20081029T190000Z
END:VEVENT
END:VCALENDAR

Ci-dessus, vous avez l’expression d’un évènement avec le titre Un évènement de test qui commence le 29 octobre à 15h (temps universel) et qui finit à 19h. Comme vous vous en doutez sûrement, la norme définit beaucoup d’autres champs, mais ceux-ci ne sont pas obligatoires. Plusieurs des évènements accolés peuvent ainsi être écrits dans un fichier, qui aura alors l’extension .ics. Je ferai souvent référence aux fichiers ICS tout au long de cet article.
Revenons au partage d’agenda via WebDAV. L’idée est, à premier abord, très simple : un agenda est un fichier, dans lequel sont écrits les évènements et les tâches. Ce fichier en format ICS est ensuite déposé sur un serveur WebDAV. Lors d’ajout d’un nouvel évènement dans l’agenda, l’application agenda lit le fichier sur le serveur (HTTP GET), lui rajoute le texte correspondant à l’évènement, et finalement sauvegarde le fichier modifié (HTTP PUT). Si nous voulons partager notre agenda avec d’autres personnes, il suffit de partager le fichier ICS sur le serveur WebDAV en utilisant les droits d’accès définis par la norme WebDAV ACL. Pour éviter les modifications concurrentes, il nous faut verrouiller le fichier avant son ouverture et ensuite le déverrouiller après l’écriture de la modification (LOCK - UNLOCK). Nous pouvons faire de même avec un fichier contenant les tâches, ou même avec un fichier contenant les contacts (dans le format vCard).
Le protocole présenté ci-dessus existe sous une forme plus ou moins normalisée et se nomme GroupDAV. Il est décrit comme une version pragmatique (down-to-the-earth) du protocole CalDAV. Une fois passées les premières impressions, on se rend vite compte que cette manière de faire est en fait trop simple. Sans rentrer dans les détails du calendaring en ligne, qui mériteraient un article à part, j’essaierais de montrer quelques problèmes essentiels entachant la proposition initiale.
Tout d’abord, nous avons le problème de la taille toujours croissante des agendas. Le fichier iCalendar déposé sur le serveur croît sans cesse, car les évènements passés ont une valeur historique que nous ne voulons pas perdre. De manière générale, nous ne supprimons pas les évènements du passé. Tout ajout d’un nouvel évènement nous oblige de charger, parcourir et ensuite sauvegarder les fichiers de plus en plus volumineux.
Ensuite, nous avons le problème des droits d’accès. Souvent, quand on utilise un agenda en ligne, nous désirons permettre à nos collègues ou amis de consulter notre emploi du temps. L’emploi du temps n’est rien d’autre qu’une version caviardée de notre agenda. On y voit les plages occupées sans voir le contenu de ces plages. Il est évident que les droits d’accès s’appliquant aux fichiers ou dossiers (lecture, écriture, etc.) ne suffisent pas pour définir un accès du type lecture des plages occupées uniquement. Il est également impossible de définir un droit du type écriture des invitations aux rendez-vous uniquement, et encore moins écriture des invitations en mon nom.
En relativisant, nous voyons bien que tous ces droits correspondent aux besoins découlant de la partie gestion de rendez-vous, une fonctionnalité avancée d’un système d’agenda partagé. Si on renonce à cette gestion de rendez-vous, nous pourrions également renoncer à toutes les complications nécessaires à sa mise en oeuvre.
Il existe une analogie comparant le duo GroupDAV/CalDAV au duo POP/IMAP. Pour l’un c’est le client qui fait tout le travail, pour l’autre c’est le serveur qui ventile les informations et permet les fonctionnalités avancées. Je ne sais que penser de cette analogie, je vous la livre à défaut de trouver mieux.
La dernière remarque que j’aimerais faire sur le protocole GroupDAV est que les problèmes esquissés ci-dessus ne sont pas vraiment restés sans solutions. Malheureusement, ces solutions sont différentes pour chaque implémentation et il n’y a aucun effort coordonné pour faire communiquer les différents serveurs. CalDAV est une norme reconnue par l’IETF (groupe international participant à l’élaboration de standards pour Internet) et possède tout le poids nécessaire pour s’imposer dans le monde des agendas distribués. L’organisation responsable de la définition du standard CalDAV s’appelle Calconnect, Calendaring and Scheduling Consortium et est composé de membres prestigieux tels que Apple, Google, IBM, Yahoo ou encore Oracle.

CalDAV

En quoi CalDAV est-il donc fondamentalement mieux (ou plus compliqué) que GroupDAV ? Principalement, sur le serveur, un calendrier correspond à un dossier et un évènement à un fichier. Ceci résout le problème des fichiers qui grandissent avec le temps. Cette modification permet également d’autoriser ou non l’accès par évènement et non uniquement par calendrier. Finalement, cette façon de faire permet au client de récupérer qu’une plage donnée d’évènements et raccourcir ainsi les transferts réseau :

REPORT

Requête

curl -u pviceic -X REPORT https://calendars.epfl.ch/user/104091/tests -d "
<C:calendar-query xmlns:D='DAV:' xmlns:C='urn:ietf:params:xml:ns:caldav'>
<D:prop>
   <C:calendar-data />
</D:prop>
<C:filter>
   <C:comp-filter name='VCALENDAR'>
       <C:comp-filter name='VEVENT'>
           <C:time-range start='20081103T000000Z' end='20081109T000000Z'/>
       </C:comp-filter>
   </C:comp-filter>
</C:filter>
</C:calendar-query>
"

Réponse

<href>http://calendars.epfl.ch/user/104091/tests/CAL-00326099-1c46a284-011d-538d6875-00ca.ics</href>
   <propstat>
     <prop>
           <ns1:calendar-data>
               BEGIN:VCALENDAR
               PRODID:BedeWork V3.0
               VERSION:2.0
               [..]
               BEGIN:VEVENT
               [..]
               DTSTART;TZID=Europe/Paris:20081104T160000
               DTEND;TZID=Europe/Paris:20081104T170000
               DTSTAMP:20081031T153735Z
               LAST-MODIFIED:20081031T153735Z
               [..]
               SUMMARY:test 1
               UID:CAL-00326099-1c46a284-011d-538d6875-00camycal@epfl.ch
               END:VEVENT
               END:VCALENDAR
           </ns1:calendar-data>
     </prop>
   [..]
 </response>
[..]

Vous vous rappelez peut-être de la méthode REPORT. Nous l’avions utilisée lors des requêtes de gestion de versions de documents (DELTAV). Ici, cette méthode nous sert pour extraire les évènements de la semaine du 3 au 9 novembre. Avec la ligne contenant nous demandons le contenu des évènements. Si nous avions écrit à la place, le serveur nous aurait retourné la propriété ETag de l’évènement :

[..]
 <response>
   <href>http://calendars.epfl.ch/user/104091/tests/CAL-00326099-1c46a284-011d-538d6875-00ca.ics</href>
  [..]
       <getetag>"http://calendars.epfl.ch/schema20081031T153735Z"</getetag>
     [..]
   <href>http://calendars.epfl.ch/user/104091/tests/CAL-0032609a-1c46a854-011d-61434e25-0113.ics</href>
   [..]
       <getetag>"http://calendars.epfl.ch/schema20081103T073120Z"</getetag>
     [..]
 </response>
[..]

Pour rappel, ETag est un champs hérité de HTTP 1.1. C’est une propriété dont la syntaxe n’est pas normalisée mais qui est mise à jour par le serveur à chaque modification de la ressource. Ainsi, le client peut savoir si la ressource a changé depuis la dernière interrogation. Ici, le client peut l’utiliser pour synchroniser la copie locale des évènements seulement si ceux-ci ont changé sur le serveur, ou localement.
Cette manière de faire, en manipulant les fichiers et les dossiers en lieu et place des évènements et des agendas, peut paraître extrêmement inefficace et laborieuse à premier abord. Les accès disque ont depuis toujours été le principal goulot d’étranglement dans les systèmes informatiques et utiliser ces derniers pour manipuler les plages de temps est (au mieux) inefficace. C’est justement là que l’abstraction joue son rôle. CalDAV est un PROTOCOLE. Il ne dit rien sur comment les choses sont sauvegardées sur le serveur. Les évènements sont uniquement vus comme des fichiers et les agendas sont vus comme des dossiers. En réalité, pour la grande majorité des implémentations, toutes ces données sont stockées dans une base de données, ce qui accélère les requêtes de recherche et de modification. Les fichiers ICS sont construits à la demande et envoyés au client. À la réception, ils sont décodés et éclatés dans les nombreuses tables de la BDD.
Ceci étant dit, certaines implémentions du protocole CalDAV utilisent bel et bien les fichiers sur le disque, par exemple Darwin de Apple, ce qui rend leur déploiement à large échelle plutôt anecdotique.

Curl

Vous aviez surement remarqué que j’utilise la commande curl pour effectuer les exemples et non, comme dans les articles précédents, la commande telnet. Je vous rassure, ma volonté n’est pas de tricher. Curl, qui est un petit client HTTP en ligne de commande me permet de m’abstraire de toute la partie authentification et cryptage de données lors des communications avec le serveur. Ce qui est envoyé sur la ligne est bien le contenu texte des exemples, enrobé de cryptage SSL. En effet, le serveur n’autorise pas l’accès en clair. De plus, j’espère donner des idées aux utilisateurs du service my.epfl de notre école en leur montrant les exemples simples d’interfaçage de leurs applications avec le système d’agenda my.epfl. A l’aide de la commande curl, il devient facile de rentrer les tâches dans les agendas my.epfl ou de les récupérer pour un traitement ultérieur.
Comment fait-on alors pour envoyer un évènement sur le serveur ?

PUT

curl -u [..] -X PUT https://calendars.epfl.ch/user/104091/tests/test.ics --data-binary \
"BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:KOrganizer-486718033.4179
SUMMARY:test PUT ICS
DTSTART:20081103T130000Z
DTEND:20081103T140000Z
END:VEVENT
END:VCALENDAR
"

Voilà, le tour est joué ! Avec la commande ci-dessus, nous avons créé un évènement avec le titre test PUT ICS commençant à 13h le 3 novembre et finissant à 14h. Si on veut déplacer l’évènement, il suffit d’exécuter :

curl -u [..] -X PUT https://calendars.epfl.ch/user/104091/tests/test.ics --data-binary \
"BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VEVENT
UID:KOrganizer-486718033.4179
SUMMARY:test PUT ICS bis
DTSTART:20081103T153000Z
DTEND:20081103T163000Z
END:VEVENT
END:VCALENDAR
"

Vous remarquerez que le nom de fichier (test.ics) est resté le même, mais ça n’a pas vraiment d’importance. Ce qui compte c’est le champ UID (Unique IDentifier), c’est avec ce champ là que le serveur comprend qu’on veut écraser un évènement avec la nouvelle version. Si nous avions changé le nom de fichier en par exemple test2.ics et gardé le UID identique, le serveur aurait refusé la requête en retournant une erreur 409 Conflict. En effet, il est impossible d’avoir deux événements avec le même identifiant.
Si on veut supprimer l’évènement, rien de plus simple :

curl -u [..] -X DELETE https://calendars.epfl.ch/user/104091/tests/test.ics

Calendriers

Requête

curl -u [..] -X PROPFIND https://calendars.epfl.ch/user/104091/ \
-H "Depth:1" -d "
<D:propfind xmlns:D='DAV:'><D:allprop/></D:propfind>"

Il est aisé de deviner le sens de la requête ci-dessus. Nous l’avions vu dans le premièr article lorsque nous avions montré comment afficher le contenu d’un dossier :

Réponse

[..]
 <response>
   <href>http://calendars.epfl.ch/user/104091/</href>
   [..]
     <displayname>104091</displayname>
     <resourcetype><collection/></resourcetype>
     [..]
 </response>
 <response>
   <href>http://calendars.epfl.ch/user/104091/private/</href>
   <displayname>private</displayname>
   <resourcetype><collection/><ns1:calendar/></resourcetype>
   [..]
   <href>http://calendars.epfl.ch/user/104091/travail/</href>
   <displayname>travail</displayname>
   <resourcetype><collection/><ns1:calendar/></resourcetype>
   [..]
   <href>http://calendars.epfl.ch/user/104091/calendrier-de-test/</href>
   <displayname>calendrier-de-test</displayname>
   <resourcetype><collection/><ns1:calendar/></resourcetype>
   [..]
 </response>
[..]

Eh oui, afin de voir tous les calendriers m’appartenant, il suffit d’énumérer le contenu de mon dossier racine. Ce dossier contient les dossiers qui représentent les calendriers créés par moi sur le serveur calendars.epfl.ch. Comme vous vous en doutiez, si je veux créer un autre calendrier, je n’ai qu’à créer une nouvelle collection :

curl -u [..] -X MKCOL https://calendars.epfl.ch/user/104091/testsbis

En fait non. C’est là que la norme CalDAV diverge du WebDAV pur. Un calendrier n’est pas une collection comme les autres, mais une calendar collection. Ainsi, un calendrier ne peut contenir d’autres collections, mais uniquement les éléments terminaux, c’est-à-dire les fichiers, donc les évènements. De cette façon, nous excluons les aberrations conceptuelles telles que la notion de calendrier de calendriers. Ceci étant dit nous pouvons imbriquer autant de collections qu’on veut pour autant que cet ensemble finit par les calendriers contenant des évènements :

curl -u [..] -X MKCALENDAR https://calendars.epfl.ch/user/104091/testsbis

Et voilà nous avons créé un calendrier dans lequel nous pouvons maintenant rajouter les évènements à l’aide de la commande PUT, mais évidemment aussi déplacer les évènements depuis les autres calendriers :

curl -u pviceic -X MOVE https://calendars.epfl.ch/user/104091/tests/test.ics \
-H "Destination: https://calendars.epfl.ch/user/104091/testsbis/test.ics"

Pour être honnête, l’exemple précédent ne fonctionnera pas à cause d’un bug dans l’implémentation de la commande MOVE sur les serveurs calendars. La prochaine mise à jour corrigera ce défaut, l’exemple reste néanmoins valide.
Il reste évidemment encore beaucoup de choses à dire sur le protocole CalDAV. Je n’ai par exemple pas du tout décrit les droits d’accès spécifiques nécessaires à la gestion des calendriers en ligne. Je n’ai pas non plus parlé des protocoles de prise de rendez-vous, actuellement en élaboration par Calconnect (CalDAV Scheduling, le RFC est actuellement en draft 5). CalDAV est un protocole depuis longtemps en germination et ce n’est que récemment qu’il a été redécouvert par les grands du monde informatique. Apple, Google, Oracle ou IBM ont rajouté les interfaces CalDAV à leurs groupwares. Le grand absent de cette uniformisation reste (comme souvent) Microsoft et je ne peux que déplorer le manque de connectique CalDAV de Outlook.
La raison de cette omission est simple : le groupware, ou plus spécifiquement les agendas en ligne, restent le dernier bastion inébranlable de Microsoft en entreprise. Avec l’entrée, certes timide, des autres acteurs (Apple, Google) dans ce marché prometteur, la bataille il n’y a pas si longtemps considérée comme perdue d’avance risque d’atteindre les proportions épiques. Au final, nous, les utilisateurs, profiterons des suites de ce conflit, car dans l’informatique, comme nulle part ailleurs, la concurrence profite à tous.

Conclusion

Voilà la fin de ce dernier article consacre à WebDAV. Mon objectif en écrivant cette suite d’articles était bien précis. D’une part, je voulais écrire un texte en français expliquant, aussi précisément que possible, les concepts derrière ces protocoles. D’autre part, je voulais donner des idées aux responsables informatiques de notre école afin qu’ils puissent utiliser l’infrastructure mise en place par le projet my.epfl dans leurs applications. Les serveurs documents.epfl.ch et calendars.epfl.ch sont des briques de base du projet my.epfl. Nous, au KIS, faisons des petites maisons avec depuis 3 ans déjà. Désormais, vous aussi vous avez le manuel de construction, n’hésitez pas à vous en servir, nous restons, comme toujours, à votre disposition !

Références



Cherchez ...

- dans tous les Flash informatique
(entre 1986 et 2001: seulement sur les titres et auteurs)
- par mot-clé

Avertissement

Cette page est un article d'une publication de l'EPFL.
Le contenu et certains liens ne sont peut-être plus d'actualité.

Responsabilité

Les articles n'engagent que leurs auteurs, sauf ceux qui concernent de façon évidente des prestations officielles (sous la responsabilité du DIT ou d'autres entités). Toute reproduction, même partielle, n'est autorisée qu'avec l'accord de la rédaction et des auteurs.


Archives sur clé USB

Le Flash informatique ne paraîtra plus. Le dernier numéro est daté de décembre 2013.

Taguage des articles

Depuis 2010, pour aider le lecteur, les articles sont taggués:
  •   tout public
    que vous soyiez utilisateur occasionnel du PC familial, ou bien simplement propriétaire d'un iPhone, lisez l'article marqué tout public, vous y apprendrez plein de choses qui vous permettront de mieux appréhender ces technologies qui envahissent votre quotidien
  •   public averti
    l'article parle de concepts techniques, mais à la portée de toute personne intéressée par les dessous des nouvelles technologies
  •   expert
    le sujet abordé n'intéresse que peu de lecteurs, mais ceux-là seront ravis d'approfondir un thème, d'en savoir plus sur un nouveau langage.