MacOS X Server 10.5 / iCal Server
Généralités
Soit un serveur Open Directory 10.5 (OD), un deuxième serveur CalDAV en 10.5. Configurer les deux serveurs afin que CalDAV server d'agenda avec identification et authentification de l'Open Directory.
Le serveur iCal de MacOS X Server 10.5 est basé sur les standards suivants :
- http pour la communication entre le client iCal et le serveur
- WebDAV pour la lecture et l'écriture des fichiers de calendrier sur le serveur
- CalDAV, une extension de WebDAV spécifique aux calendriers utilisé pour la recherche de plages disponibles libres et les invitations en utilisant le protocole iTIP.
- iCalendar le format textuel des calendriers (XML)
- iTIP protocole de gestion des invitations et des réponses.
Côté client
Afin de partager des calendriers, la première étape consiste à se connecter à un annuaire
- Ouvrir Utilitaire d'annuaire (Directory Utility)
- Cliquer sur le + en bas de la zone centrale de la fenêtre. Si c'est grisé, cliquer sur le cadenas en dessous pour dévérouiller l'utilitaire (il faut être administrateur pour cela).
- Ajouter le nom du répertoire Open Directory : «nom du serveur d'authentification». Cliquer sur OK.
- Le nom du répertoire doit apparaitre avec l'indication "Ce serveur réponds normalement"
- Par défaut, ce serveur est utilisé pour l'authentification et les contacts, dans le cas présent, nous n'avons pas besoin de l'authentification.
- Cliquer sur le bouton Afficher les réglages avancés (en bas à gauche) puis sur l'icone Règles de recherche (Search Policy)
- Cliquer sur l'onglet Authentification, sélectionner la ligne /LDAPv3/nomserveurOD et cliquer sur le - en bas de la zone afin de supprimer le domaine de répertoire.
- Cliquer sur le bouton Appliquer et fermer l'Utilitaire d'annuaire.
Utlitaire Répertoire
- Si la partie nom prénom n'apparait pas dans lors de la recherche d'une personne,
-
Aucun serveur Open Directory configuré
Sur un poste client, dans iCal, au moment de créer un compte, si vous obtenez le message "Aucun serveur Open Directory configuré. Configurez un ou plusieurs serveur Open Directory à l'aide d'Utilitaure d'annuaire ou utilisez une URL de compte explicite.", c'est que vous n'etes pas connecté à un annuaire. (en anglais : No Open Directory servers configured. Confugure one or more Open Directory servers using Directory Utility or use an explicite Accound URL.)
A tester "utilisez une URL de compte explicite" sans connexion Open Directory.
Le nom d'utilisateur «nom_utilisateur» est introuvable
Sur un poste client, dans iCal, au moment de créer un compte, si vous obtenez le message "Le nom d'utilisateur «nom_utilisateur» est introuvable. Aucun nom d'utilisateur correspond n'a été trouvé dans le service d'annuaire. Vérifiez le nom d'utilisateur que vous avez saisi." C'est que le nom ne correspond à personne dans le serveur d'authentification. (en anglais "The username 'user_name' was not found. No Matching username was found on the directory service. Double check your username.")
Le nom d'utilisateur «nom_utilisateur» ne possède aucun nom principal configuré
Le nom d'utilisateur «nom_utilisateur» ne possède aucun nom principal configuré. Confirmez auprès de votre administrateur réseau que votre compte a au moins un nom principal CalDAV configuré. Cela peut être une erreur de mot de passe.
(en anglais: The username 'user_name' has no configured principals. Confirm with your network administrator that your account has at least on CalDAV principal configured.)
Les données du compte sont introuvables
- Sur un poste client, dans iCal, au moment de créer un compte, si vous obtenez le message "Les données du compte sont introuvables. La requête sur NOM_serveur à échoué au bout de 30 secondes." : Le port TCP 8443 n'est pas ouvert sur le serveur d'agenda.
(en anglais: Account information not found. Request to nom_server failed after trying for 30 seconds.)
- Sur un poste client, dans iCal, au moment de créer un compte, si vous obtenez le message "Les données du compte sont introuvables. L'accès à https://nom_serveur:8443:principals/users/Nom_Utilisateur/ n'est pas autorisé."
(en anglais: Account information not found. Access to https://nom_serveur:8443:principals/users/Nom_Utilisateur/ is not permitted.)
- Sur un poste client, dans iCal, au moment de créer un compte, si vous obtenez le message "Les données du compte sont introuvables. Une errue inattendue s'est produite lors de la définition du nom sécurisé (code -9813). Le nom du server Nom_du_serveur est peut-être incorrect."
(en anglais Account information not found. Unexpected secure name resolution error (code -9813). The server name Nom_du_serveur may be incorrect.
Côté serveur : [DAVRequest _readStreamEvent]: SecTrustEvaluate failed. Failing with error: Error Domain=NSStreamSocketSSLErrorDomain Code=-9813 "Operation could not be completed. (NSStreamSocketSSLErrorDomain error -9813.)"
Côté serveur il y une erreur : [AMP,client] Could not find the principal resource for user id: Nom_Utilisateur
et avant pour chaque utilisateur :
[-] [caldav-8009] [OpenDirectoryService] Directory (incorrectly) returned a record with no ServicesLocator attribute: Nom_utilisateur
cd /Library/CalendarServer/Documents/
mkdir -p principals/users/ical1
mkdir -p principals/__uids__
mkdir -p calendars/users/ical1
chown -R _calendar:_calendar *
chmod -R o-rx *
Lorsque les deux serveurs sont sur le meme ordinateur, tout fonctionne parfaitement sans meme à avoir à mettre https://nom_serveur:8443:
Dans ce cas, lors de la création du premier utilisateur ici ical2, les répertoire principals, calendar sont automatiquement créés ainsi que le __uids__ ..
Documents/
Documents/calendars/
Documents/calendars/users/
Documents/calendars/users/._ical2
Documents/calendars/users/ical2/
Documents/calendars/users/ical2/._calendar
Documents/calendars/users/ical2/calendar/
Documents/calendars/users/ical2/calendar/.db.sqlite
Documents/calendars/users/ical2/._inbox
Documents/calendars/users/ical2/inbox/
Documents/principals/
Documents/principals/.db.calendaruserproxy
Documents/principals/__uids__/
Documents/principals/__uids__/._D56DE1AE-2B7C-4469-9F90-B3FC391C497C
Documents/principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/
Documents/principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/calendar-proxy-read/
Documents/principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/calendar-proxy-write/
Documents/principals/__uids__/._D56DE1AE-2B7C-4469-9F90-B3FC391C497C#calendar-proxy-read
Documents/principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C#calendar-proxy-read/
Documents/principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C#calendar-proxy-read/calendar-proxy-read/
Documents/principals/__uids__/._D56DE1AE-2B7C-4469-9F90-B3FC391C497C#calendar-proxy-write
Documents/principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C#calendar-proxy-write/
Documents/principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C#calendar-proxy-write/calendar-proxy-write/
access.log
Log opened - server start: [Thu Apr 10 16:26:12 2008].
132.227.104.12 - - [10/Apr/2008:16:29:45 +0200] "PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1" 401 141 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [5.4 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:29:46 +0200] "PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1" 207 1937 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [116.0 ms]
132.227.104.12 - - [10/Apr/2008:16:29:46 +0200] "PROPFIND /calendars/users/ical2/inbox/ HTTP/1.1" 401 141 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [3.1 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:29:46 +0200] "PROPFIND /calendars/users/ical2/inbox/ HTTP/1.1" 207 342 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [35.2 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:29:46 +0200] "PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1" 207 1937 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [16.4 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:29:46 +0200] "PROPFIND /calendars/users/ical2/ HTTP/1.1" 207 3512 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [38.0 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:29:46 +0200] "PROPFIND /calendars/users/ical2/calendar/ HTTP/1.1" 207 780 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [28.6 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:29:47 +0200] "PROPFIND /calendars/users/ical2/calendar/ HTTP/1.1" 207 449 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [39.8 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:29:47 +0200] "PROPFIND /calendars/users/ical2/inbox/ HTTP/1.1" 207 497 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [28.5 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:29:47 +0200] "PROPFIND /calendars/users/ical2/inbox/ HTTP/1.1" 207 452 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [29.1 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:30:43 +0200] "PROPPATCH /calendars/users/ical2/inbox/ HTTP/1.1" 207 388 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [53.1 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:30:43 +0200] "PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1" 207 1188 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [23.6 ms]
132.227.104.12 - ical2 [10/Apr/2008:16:30:43 +0200] "PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1" 207 321 "-" "DAVKit/2.0 (10.5.2; wrbt) iCal 3.0.2" [11.4 ms]
error.log
2008-04-10 16:29:45+0200 [-] [caldav-8009] [AMP,client] Unauthenticated users not enabled with the 'calendar' SACL
2008-04-10 16:29:45+0200 [-] [caldav-8009] [AMP,client] Provisioning file: <DirectoryPrincipalProvisioningResource: /Library/CalendarServer/Documents/principals>
2008-04-10 16:29:45+0200 [-] [caldav-8009] [AMP,client] Provisioning file: <DirectoryPrincipalUIDProvisioningResource: /Library/CalendarServer/Documents/principals/__uids__>
2008-04-10 16:29:45+0200 [-] [caldav-8009] [AMP,client] "Directory service <SudoDirectoryService '/Search': FilePath('/etc/caldavd/sudoers.plist')> has no GUID; generating service GUID from realm name."
2008-04-10 16:29:45+0200 [-] [caldav-8009] [AMP,client] Provisioning file: (users) ical2
2008-04-10 16:29:45+0200 [-] [caldav-8009] [AMP,client] PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: <CalendarHomeTypeProvisioningFile: /Library/CalendarServer/Documents/calendars/users>
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: <CalendarHomeFile: /Library/CalendarServer/Documents/calendars/users/ical2>
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Initializing database /Library/CalendarServer/Documents/calendars/users/ical2/calendar/.db.sqlite
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: <ScheduleInboxFile (calendar inbox collection): /Library/CalendarServer/Documents/calendars/users/ical2/inbox>
2008-04-10 16:29:46+0200 [-] [caldav-8009] [AMP,client] Unauthenticated users not enabled with the 'calendar' SACL
2008-04-10 16:29:46+0200 [-] [caldav-8009] [AMP,client] PROPFIND /calendars/users/ical2/inbox/ HTTP/1.1
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: (users) ical2 [calendar-proxy-read]
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: (users) ical2
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: (users) ical2 [calendar-proxy-read]
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Initializing database /Library/CalendarServer/Documents/principals/.db.calendaruserproxy
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: (users) ical2 [calendar-proxy-write]
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: (users) ical2
2008-04-10 16:29:46+0200 [-] [caldav-8009] [-] Provisioning file: (users) ical2 [calendar-proxy-write]
2008-04-10 16:29:46+0200 [-] [caldav-8009] [AMP,client] PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1
2008-04-10 16:29:46+0200 [-] [caldav-8009] [AMP,client] PROPFIND /calendars/users/ical2/ HTTP/1.1
2008-04-10 16:29:46+0200 [-] [caldav-8009] [AMP,client] PROPFIND /calendars/users/ical2/calendar/ HTTP/1.1
2008-04-10 16:29:47+0200 [-] [caldav-8009] [AMP,client] PROPFIND /calendars/users/ical2/calendar/ HTTP/1.1
2008-04-10 16:29:47+0200 [-] [caldav-8009] [AMP,client] PROPFIND /calendars/users/ical2/inbox/ HTTP/1.1
2008-04-10 16:29:47+0200 [-] [caldav-8009] [AMP,client] PROPFIND /calendars/users/ical2/inbox/ HTTP/1.1
2008-04-10 16:30:43+0200 [-] [caldav-8010] [-] AMP connection established (HOST:UNIXSocket(None) PEER:UNIXSocket('/var/run/caldavd-pydir.sock'))
2008-04-10 16:30:43+0200 [-] [caldav-8009] [AMP,client] PROPPATCH /calendars/users/ical2/inbox/ HTTP/1.1
2008-04-10 16:30:43+0200 [-] [caldav-8010] [AMP,client] "Directory service <SudoDirectoryService '/Search': FilePath('/etc/caldavd/sudoers.plist')> has no GUID; generating service GUID from realm name."
2008-04-10 16:30:43+0200 [-] [caldav-8010] [AMP,client] PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1
2008-04-10 16:30:43+0200 [-] [caldav-8009] [AMP,client] PROPFIND /principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/ HTTP/1.1
ls -al@ Documents/principals/__uids__/D56DE1AE-2B7C-4469-9F90-B3FC391C497C/calendar-proxy-read/
total 0
drwxr-x--- 2 _calendar _calendar 68 Apr 10 16:29 .
drwxr-x---@ 4 _calendar _calendar 136 Apr 10 16:29 ..
WebDAV:{http:%2F%2Ftwistedmatrix.com%2Fxml_namespace%2Fdav%2Fprivate%2F}record-type 123
cd calendars/users/
mv ical2 ical1
cd principals/__uids__/
mv D56DE1AE-2B7C-4469-9F90-B3FC391C497C 01A16B4C-3AF6-4E8A-A02C-EFD1BA05C2F6
mv D56DE1AE-2B7C-4469-9F90-B3FC391C497C#calendar-proxy-read 01A16B4C-3AF6-4E8A-A02C-EFD1BA05C2F6#calendar-proxy-read
mv D56DE1AE-2B7C-4469-9F90-B3FC391C497C#calendar-proxy-write 01A16B4C-3AF6-4E8A-A02C-EFD1BA05C2F6#calendar-proxy-write
cal1
dsAttrTypeNative:apple-serviceslocator : E552D587-450C-42D9-9C11-94FB53CB0991:3F61A360-86F2-4376-BB5B-EC85B94F8271:calendar
Côté serveur d'authentification
Associer un utilisateur avec un serveur d'agenda
Dans Workgroup Manager créer un utilisateur, dans l'onglet Advanced, cocher la case Enable calendaring et choisir le serveur d'agenda calDAV. Si il n'y a pas de serveur dans la liste, il faut faire le lien depuis le serveur CalDAV.
Dans l'Utilitaire Répertoire, au lieu de voir le nom et le prénom de la personne, on voit le login
C'est que le compte Open Directory a été créé sur une ancienne version du serveur, le champs LastName de la personne est "99" (très ancienne erreur de ServerAdmin). Pour corriger, sur Server Admin, aller dans l'onglet Info de la personne.
Plus exactement, lorsque l'on crée une fiche avec le Gestionnaire de groupe de travail (Workgroup Manager), on remplit le champ Name et WM va automatiquement remplir divers les champs en découpant Name en supposant que la premier mot est le prénom et que le dernier mot est le nom de famille. Si ce n'est pas correct (par exemple si vous avez mis comme moi le nom en premier), il faut cliquer sur l'onglet Info et remplir les rubriques.
Listes des rubriques du gestionnaire de groupe de travail (WM) et correspondance LDAP.
| Rubrique WM |
rubrique LDAP |
Commentaire |
| Name (onglet Basic) |
RealName |
|
| User ID |
uniqueID |
|
| Short Names |
RecordName et uid |
RecordName contient aussi le nom complet. Il est utilisé aussi pour les alias de mail |
| Name (onglet Info) Prénom puis Nom |
givenName et sn |
Il y a deux champs, le premier Prénom et le deuxième Nom de famille |
| Address (Street) |
|
|
| Address (City) |
|
|
| Address (State / Province) |
|
|
| Address (Zip) |
|
|
| Address (Country) |
|
|
| Phone |
|
|
| Email |
mail |
à vérifier |
| Chat |
apple-imhandle |
exemple JABBER:login@{FQDN} |
| Homepage |
|
|
| Weblog |
|
|
| calendaring |
apple-serviceslocator |
GeneratedUID du serveur d'agenda:adresse-Hexa:calendar |
Côté serveur d'agenda
Les données des agendas sont stockées par défault dans le répertoire /Library/CalendarServer/Documents dont le propriétaire et le groupe sont _calendar ou calendar (c'est le même) (uid et gid 93). La connexion SSL se fait sur le port 8443.
Le répertoire où sont stockés les calendriers contient :
/Library/CalendarServer/Documents
# ls -al@
drwxr-x---@ 2 _calendar _calendar 68 Oct 4 2007 .
WebDAV:{DAV:}acl 136
drwxrwxr-x 3 root admin 102 Oct 4 2007 ..
puis
| Localisation |
Contenu |
Commentaire |
| principles/<users | groups > |
Dossiers des tous les utilisateurs autorisés à utiliser les calendriers et qui se sont connectés |
|
| principles/<resources | locations> |
Dossiers de toutes les ressources ou salles avec des calendriers |
|
| principles/sudoers |
Dossiers de tous les administrateurs de calendriers |
pas vu |
| principals/__uids__ |
Dossiers de tous les utilisateurs, groupes, ressources ou salles qui utilisent un directory-record comme nom d'identification |
|
| principles/<users | groups>/<username> |
Ressource http qui représente le calendriers de la personne ou du groupe |
|
principles/<users | groups>/<username>/calendar-proxy-read
principles/<users | groups>/<username>/calendar-proxy-write |
Identifie le 'principal' utilisé pour fournir les droits de délégation pour les autres. |
|
| calendars/<users | groups> |
Dossiers de chaque utilisateur ou groupe qui a créé au moins un calendrier, un événement ou un 'todo'. |
|
| calendars/<resources | locations> |
Dossiers de cahque ressource ou salle qui a accepté au moins un calendrier, un événement ou un 'todo'. |
|
| calendars/<users | groups | resources | locations>/<name>/calendar |
Contains iCalendar (.ics) files of each event in the principles calendar. |
|
| calendars/<users | groups | resources | locations>/<name>/inbox |
Contains iTIP file invitations to other users pending events. |
|
| calendars/<users | groups | resources | locations>/<name>/outbox |
Contains iTip file invitations waiting to be distributed to invitees. |
|
| calendars/<users | groups | resources | locations>/<name>/dropbox |
Contains files attached to events, either from a users self-created event or from participant events. |
|
Les process suivants sont en attente.
root a lancé :
Python /usr/share/caldavd/bin/twistd -n caldav Python /usr/share/caldavd/bin/pydir.py /tmp/pydKHe7
agenda est propriétaire de 8 process de type :
Python /usr/share/caldavd/bin/twistd -u calendar -g calendar -n caldav -f /etc/caldavd/caldavd.plist -o ProcessType=Slave -o BindAddresses=127.0.0.1 -o PIDFile=None -o ErrorLogFile=None -o MultiProcess/ProcessCount=8 -o BindHTTPPorts=8009 -o BindSSLPorts=8444
Python /usr/share/caldavd/bin/twistd -u calendar -g calendar -n caldav -f /etc/caldavd/caldavd.plist -o ProcessType=Slave -o BindAddresses=127.0.0.1 -o PIDFile=None -o ErrorLogFile=None -o MultiProcess/ProcessCount=8 -o BindHTTPPorts=8010 -o BindSSLPorts=8445
Le fichier /etc/caldavd/sudoers.plist contient par défault
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>users</key>
<array>
<dict>
<key>password</key>
<string>mot-de-passe-codé</string>
<key>username</key>
<string>wikiserver</string>
</dict>
</array>
</dict>
</plist>
Pas de lien entre les serveurs CalDAV et OD.
Dans Workgroup Manager de l'Open Directory, No Calendar Host Selected
Sur le serveur OD, la liste des serveurs de calendriers est vide dans Enable calendaring (onglet Advanced) en sélectionnant un utilisateur.
Sur une machine qui fonctionne :
- GeneratedUID (apple-generateduid du cn=computer contient l'ordinateur serveur d'agenda).
- Il y a un ordinateur avec {FQDN}$ ainsi qu'un ordinateur nommé LKDC:SHA....$
guid 500 : com.apple.monitor_calendar
Sur le serveur CalDAV, No Virtual host found for iCal service
Au moment de l'activation du service iCal, message : No Virtual host found for iCal service
Solution : Sur le serveur CalDAV, ouvrir l'utilitaire d'annuaire (Diretory Utility),
- Cliquer sur le bouton Afficher les réglages avancés (en bas à gauche) puis sur l'icone Services
- Sélectionner LDAPv3 (doucle clic ou sur l'icône crayon en bas)
- Sélectionner la ligne du serveur OD et cliquer sur le bouton Modifier... en bas de page
- Dans l'onglet Connexion, cliquer sur le bouton Relier... (Bind...)
- Indiquer l'identifiant de l'ordinateur (CalDAV par exemple), l'administrateur de l'annuaire OD et son mot de passe.
- Cliquer sur OK
Mars/avril 2008. Page élaborée en collaboration avec Jean-Baptiste Voron.
|