CalDAV/CardDav avec Sabre.io

Présentation

Sabre.io est un ensemble d'outils pour gérer les calendriers et contacts (CalDAV, CardDav et WebDav). La principale différence par rapport aux autres solutions est qu'il n'a pas d'interface d'administration. La mise en place est assez simple, mais la gestion est assez austère.

Installation

Paquet

Sous Debian, l'installation des dépendances se fait comme suit :

sudo aptitude install php-sabre-dav-2.1

Groupware PHP

Ensuite il faut installer le fichier PHP correspondant à l'utilisation que l'on souhaite faire : serveur CalDAV, CardDAV, WebDAV ou tout en même temps. L'ensemble des configurations possibles se trouve dans le répertoire /usr/share/doc/php-sabre-dav-2.1/examples :

  • addressbookserver.php
  • calendarserver.php
  • fileserver.php
  • groupwareserver.php

Il faut recopier le fichier souhaité à l'emplacement qui sera accessible par le serveur Web. Par exemple :

cp /usr/share/doc/php-sabre-dav-2.1/examples/groupwareserver.php /var/www/example.org/www/dav/

Configuration

groupwareserver.php

On va configurer le fichier PHP pour correspondre à notre installation (chemin, uri, etc...). Par simplicité on va utiliser la configuration par défaut pour la base de données, c'est-à-dire SQLite.

$baseUri = '/cal'; // correspond à l'URL qui sera configuré au niveau du serveur Web en tenant compte des réécritures d'URL (donc la vraie URL d'accès telle que tapée dans un client)
$pdo = new \PDO('sqlite:data/db.sqlite'); // chemin d'accès à la base de données à partir du fichier PHP

#set_include_path("/usr/share/php/");
require_once 'sabre21/Sabre/autoload.php'; // chemin d'accès aux classes PHP sous Debian

$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend,'SabreDAV')); // configuration du backend d'authentification. Le point important est la dernière chaine de caractère : 'SabreDAV' (le realm)

Serveur Web

Pour Apache, on a besoin de quelque réécritures d'URL :

  • l'alias /dav correspond à la valeur $baseUri
  • on force le HTTPS
  • on masque le nom du fichier groupwareserver.php avec une réériture
  • on redirige les adresses well-known pour l'autoconfiguration
Alias /dav /var/www/example.org/www/dav
<Directory /var/www/example.org/www/dav>
    #SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
    RewriteEngine On
    Options FollowSymLinks

    RewriteCond "%{HTTPS}" ="off"
    RewriteRule "^(.*)" "https://%{SERVER_NAME}/dav/$1" [R,L]

    RewriteRule "^(.*)" "groupwareserver.php/$1" [QSA,END]
</Directory>

Autoconfiguration du client

L'autoconfiguration consiste pour le client à interroger le DNS pour trouver le serveur hébergeant le service CalDAV/CardDav. Ensuite un requête HTTP(S) sur ce serveur avec des adresse well_knonw indiquera l'URL exacte que le client doit utiliser pour se connecter avec le login/mot de pass.

Pour plus de détail, il faut consulter le RFC 6764.

Au niveau du DNS on ajoute 2 entrées de type SRV :

_caldavs._tcp.example.org. 60     IN      SRV     0 1 443 home.example.org.
_carddavs._tcp.example.org. 60    IN      SRV     0 1 443 home.example.org.

Ici ce sont les version HTTPS (donc sur le port 443), on peut également ajouter les versions en clair (_caldav et _carddav) sur le port 80.

Le second pour à configurer est la redirection vers le bon répoertoire sur le serveur Web :

Redirect 307 /.well-known/carddav /cal/principals
Redirect 307 /.well-known/caldav /cal/principals

Base de données

On peut maintenant peupler la base de données avec le minimum requis. Les exemples sont présents dans le répertoire /usr/share/doc/php-sabre-dav-2.1/examples/sql.

Le realm configuré dans le fichier groupwareserver.php (par défaut SabreDAV) sera utilisé pour créer les mots de passe.

Il faut charger les fichiers suivants via l'interpreteur sqlite :

  • sqlite.addressbooks.sql
  • sqlite.calendars.sql
  • sqlite.locks.sql
  • sqlite.propertystorage.sql
  • sqlite.principals.sql (supprimer les INSERT)
  • sqlite.users.sql (supprimer les INSERT)

La génération du hash des mots de passe se fait avec le nom d'utilisateur, le realm et le mot de passe :

php -r "echo md5('foo:SabreDAV:bar');"
5790c3784a79a018d1186528df520e11

Avec 'foo' le nom d'utilisateur, 'SabreDAV' le realm et 'bar' le mot de passe.

Pour l'ajout d'un utilisateur 'foo', on utilisera les commandes suivantes :

-- création de l'utilisateur
insert into principals(id,uri,email,displayname) values((select max(id)+1 from principals), 'principals/foo', 'foo@guim.info', 'Foo');
insert into principals(id,uri) values((select max(id)+1 from principals), 'principals/foo/calendar-proxy-read');
insert into principals(id,uri) values((select max(id)+1 from principals), 'principals/foo/calendar-proxy-write');

-- configuration de l'authentification
insert into users(id,username,digesta1) values((select max(id)+1 from users), 'foo', '5790c3784a79a018d1186528df520e11');

-- ajout d'un calendrier, on peut utiliser l'interface Web
insert into calendars(id,principaluri,displayname,uri,synctoken,calendarcolor,components,transparent) values((select max(id)+1 from calendars), 'principals/foo', 'Perso', 'default', 0, '#00FF00', 'VEVENT,VTODO', 0);

-- ajout d'une liste de contacts, on peut utiliser l'interface Web
insert into addressbooks(id,principaluri,displayname,uri,synctoken) values((select max(id)+1 from addressbooks), 'principals/foo', 'Perso', 'perso', 0);

Clients

En fonction des clients les informations à fournir peuvent être légèrement différentes. Les points importants à connaitre sont :

  • le nom de domaine et le nom d'utilisateur : cela peut être déduis à partir de l'email qui sert à créer le compte (ex : foo@example.org)
  • l'URL du fichier groupware.php : en l'occurence avec la redirection Apache, on aura une URL du genre https://www.example.org/dav/
  • le principal du compte : 'principals/foo'

Autoconfiguration

Si l'autoconfiguration fonctionne, il suffit de fournir une adresse email (le nom de domaine est important) et un mot de pase :

  • utilisateur : moi@example.org
  • mot de passe : ----

Thunderbird

A compléter

Android

Il faut installer l'application DAVDroid disponible sur le magasin F-Droid. Lors de l'ajout du compte, il faut choisir "Connexion avec une URL et un nom d'utilisateur"

L'URL sera https://www.example.org/dav/princpals/foo. Le nom sera foo.

Web

Il existe des interfaces Web pour gérer les calendriers/contacts. InfCloud est un client PHP CardDAV/CalDAV et gère les notes.

La configuration se fait dans le fichier config.js :

var globalNetworkCheckSettings={
    href: 'https://www.example.org/dav/principals/',
    timeOut: 90000,
    lockTimeOut: 10000,
    checkContentType: true,
    settingsAccount: true,
    delegation: true,
    additionalResources: [],
    hrefLabel: null,
    forceReadOnly: null,
    ignoreAlarms: false,
    backgroundCalendars: []
}
var globalUseJqueryAuth=true;
var globalInterfaceLanguage='fr_FR';
var globalInterfaceCustomLanguages=['fr_FR', 'en_US'];
var globalTimeZone='Europe/Paris';

La configuration d'Apache pour gérer InfCloud est la suivante :

Alias /agenda /var/www/example.org/agenda/infcloud
<Directory /var/www/example.org/agenda/infcloud>
Options FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
</Directory>