CalDAV/CardDAV-Server mit baikal
Was ist das?
Hier wird gezeigt, wie man seine privaten Adressbücher und Kalender im Mail-Client Thunderbird (ab jetzt TB genannt) mit dem eigenen eisfair-Server synchronisiert. Somit kann man mit mehreren Rechnern auf den selben Datenbestand zugreifen, ohne dabei auf öffentliche Server und die Datenkraken (google & co) angewiesen zu sein. Die Adress- und Kalender-Daten bleiben also privat und im eigenen Haus.
Ich habe dies nur mit dem TB probiert, daher kann ich für andere Mail-Clients keine Aussage treffen. Prinzipiell sollte die Vorgehensweise aber für alle Programme, die CalDAV bzw. CardDAV sprechen, ähnlich sein. Erfolgreich getestet habe ich mit dem jeweils aktuellen TB unter MacOS X Version 10.12.6, Windows XP 32 Bit, Windows 7 home premium 64 Bit, Windows 10 home 64 Bit (Version 1803) und Debian 9 cinnamon 64 Bit.
Im TB werden dafür die Add-ons 'Cardbook' und 'Lightning' benutzt.
Die beiden Add-ons kommunizieren per http mit dem sogenannten Baikal-Server, der die Daten an den MariaDB-Server übergibt oder von ihm anfordert. Der Datenbank-Server läuft hier auf der selben Maschine wie der apache - das lässt sich aber ändern.
Apache
Auf unserem eisfair-Server benötigen wir ein installiertes apache2-Paket - am Besten mit vhosts - denn meist wollen wir nicht nur einen einzigen Dienst per http(s) bereitstellen. Mein eigener Server hat den Namen 'barbrady', der vhost - bei mir die Nummer 4 - heißt sinnvollerweise 'baikal', die lokale Domain lautet bei mir 'southpark.lan' - und nun folgt ein Auszug meiner vhost-Konfiguration: diese muss natürlich immer an die lokalen Gegebenheiten angepasst werden:
APACHE2_VHOST_4_ACTIVE='yes' APACHE2_VHOST_4_IP='*' APACHE2_VHOST_4_PORT='80' APACHE2_VHOST_4_SERVER_NAME='baikal.barbrady.southpark.lan' APACHE2_VHOST_4_SERVER_ALIAS='*.baikal.barbrady.southpark.lan' APACHE2_VHOST_4_SERVER_ADMIN='stefan@southpark.lan' APACHE2_VHOST_4_DOCUMENT_ROOT='/var/www/baikal/htdocs' APACHE2_VHOST_4_SCRIPT_ALIAS='/var/www/baikal/cgi-bin' APACHE2_VHOST_4_SCRIPT_DIR='/var/www/baikal/cgi-bin' APACHE2_VHOST_4_ERROR_LOG='/var/log/www/baikal_error_log' APACHE2_VHOST_4_ACCESS_LOG='/var/log/www/baikal_access_log' APACHE2_VHOST_4_ACCESS_CONTROL_TYPE_ALL='yes' APACHE2_VHOST_4_ACCESS_CONTROL_TYPE_IP='' APACHE2_VHOST_4_ACCESS_CONTROL_TYPE_HOST='' APACHE2_VHOST_4_ACCESS_CONTROL_TYPE_LOCAL='' APACHE2_VHOST_4_ACCESS_CONTROL_IP='' APACHE2_VHOST_4_ACCESS_CONTROL_HOST='' APACHE2_VHOST_4_VIEW_DIRECTORY_CONTENT='no' APACHE2_VHOST_4_ENABLE_SSI='no' APACHE2_VHOST_4_MOD_CACHE='no' APACHE2_VHOST_4_DIR_N='0'
Wenn man nun den neuen vhost - bei mir http://baikal.barbrady.southpark.lan - im Browser aufruft, sollte die Standard-Seite des apachen bzw. vhost angezeigt werden. Bei mir sieht das dann so aus:
Der VirtualHost baikal.barbrady.southpark.lan wurde erfolgreich eingerichtet! HTML-Dateien muessen nach /var/www/baikal/htdocs geladen werden, CGI-Scripts nach /var/www/baikal/cgi-bin. Die Access-Logfile ist /var/log/www/baikal_access_log Die Error-Logfile ist /var/log/www/baikal_error_log ...
Wenn diese nicht oder eine andere Seite oder ein anderer vhost erscheint, bitte den Fehler in der apache-Konfiguration suchen.
PHP5
Falls das eisfair-Paket 'apache2_php5' noch nicht installiert ist, holen wir dies jetzt nach, denn Baikal nutzt php5 (Stand: Juli 2018). Die Konfiguration für php5 findet man danach im eisfair-Setup-Menü unter Service Administration → Apache2 Webserver → Configuration → Modules configuration → PHP5 Administration. Dort sind folgende Einstellungen wichtig, damit der apache später auch auf die Datenbank (kommt noch) zugreifen kann:
PHP5_EXT_MYSQL='yes' PHP5_EXT_MYSQL_SOCKET='/run/mysql/102/mysql.sock' PHP5_EXT_MYSQL_HOST='127.0.0.1' PHP5_EXT_MYSQL_PORT='3306' PHP5_EXT_MSSQL='no' PHP5_EXT_PGSQL='no' PHP5_EXT_INTER='no' PHP5_EXT_SQLITE3='no'
Baikal
Meistens passen user und group der neuen Dateien noch nicht für den apachen, also passen wir diese mit chown -R auf 'wwwrun' und 'nogroup' an. Bei mir liegen die gerade kopierten Baikal-Dateien unter /var/www/baikal/htdocs - bitte den Pfad wieder an die lokalen Gegebenheiten anpassen!
barbrady # cd /var/www/baikal/htdocs barbrady # chown -R wwwrun:nogroup * barbrady # ls -la total 72 drwxr-xr-x 6 wwwrun nogroup 4096 Jul 18 15:58 . drwxr-xr-x 4 root root 4096 Jul 18 15:50 .. -rwxr-xr-x 1 wwwrun nogroup 5063 Aug 19 2016 CHANGELOG.md drwxr-xr-x 4 wwwrun nogroup 4096 Jul 15 19:41 Core -rwxr-xr-x 1 wwwrun nogroup 35135 Feb 4 2016 LICENSE -rwxr-xr-x 1 wwwrun nogroup 731 Feb 20 2016 README.md drwxr-xr-x 3 wwwrun nogroup 4096 Jul 18 16:23 Specific drwxr-xr-x 4 wwwrun nogroup 4096 Jul 15 19:41 html drwxr-xr-x 6 wwwrun nogroup 4096 Jul 15 19:41 vendor barbrady #
Wenn wir nun die Admin-Oberfläche von Baikal - bei mir http://baikal.barbrady.southpark.lan/html/admin/ - im Browser öffnen, kommt vermutlich eine Meldung wegen nicht installiertem PDO, Datenbank-Server, fehlender Datenbank oder keiner möglichen Verbindung zum Datenbank-Server - aber das ist ok.
Datenbank
Wir installieren uns das eisfair-Paket 'mariadb102' und die dafür benötigten Pakete. In der Konfiguration ändern wir nur wenige Parameter:
START_MARIADB102='yes' MARIADB102_NETWORK='yes' MARIADB102_CONNECT_PORT='3306' MARIADB102_DATADIR='/srv/mysql/102'
Beim Speichern und Übernehmen der Erst-Konfiguration kommt die Frage ob man dem Datenbank-user 'root' jetzt ein neues Passwort zuweisen möchte. Das wollen wir. Allerdings soll er dafür nicht pwgen benutzen sondern uns ein Password eingeben lassen. Also antworten wir mit 'n' und geben zweimal das neue Password für den Datenbankuser 'root' ein. Im Beispiel unten stört er sich an meinem wohl unsicheren Password:
... Activate configuration now (y/n) [yes]? * Starting MariaDB/MySQL database server 10.2 ....... [ OK ] Set Password for MariaDB/MySQL user root: (y/n) [yes]? Create password with pwgen (y/n) [yes]? n Now enter the new password: Password:? Bad password: it is based on a (reversed) dictionary word. Retype password:? Set new 'root' password on server 'mariadb102' * Stopping MariaDB/MySQL database server 10.2 .. [ OK ] * Starting MariaDB/MySQL database server 10.2 .. [ OK ] Press ENTER to continue
Bevor man hier weitermacht, sollte man sicherstellen, dass man eine korrekte MariaDB-Konfiguration mit Password-geschütztem root-Zugang hat. Ansonsten leben die Datenbanken in Zukunft gefährlich.
Auch sollte man sich um eine korrekte Einrichtung der Backups kümmern, sonst könnten die Daten schnell futsch sein.
Nun können wir das Setup der eisfair-Oberfläche verlassen und in der shell 'mysql -u root -p' aufrufen. Wir werden nach dem soeben vergebenen Password (für den Datenbankuser 'root') gefragt. Wir erstellen nun eine Datenbank, richten einen Benutzer mit passenden Berechtigungen ein und verlassen mysql wieder:
- wir erstellen eine neue Datenbank mit Namen 'baikal'
- wir lassen uns die bestehenden Datenbanken auflisten
- wir legen einen Datenbankbenutzer 'baikaluser' mit Password 'geheim' an der sich nur von '127.0.0.1' anmelden darf - bitte ein geeignetes Password wählen
- wir erlauben dem Datenbankbenutzer 'baikaluser' die Benutzung der Datenbank 'baikal'
- wir verlassen mysql
Bitte beachten - alle in mysql eingegebene Zeilen müssen mit einem Semikolon = Strich-Punkt = ';' enden!
barbrady # mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 19 Server version: 10.2.15-MariaDB eisfair-1 build Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> create database baikal; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | baikal | | information_schema | | mysql | | performance_schema | +--------------------+ 4 rows in set (0.00 sec) MariaDB [(none)]> create user 'baikaluser'@'127.0.0.1' identified by 'geheim'; Query OK, 0 rows affected (0.01 sec) MariaDB [(none)]> grant all on baikal.* to 'baikaluser'@'127.0.0.1'; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> quit; Bye barbrady #
Damit haben wir unsere Datenbank erfolgreich erstellt.
An dieser Stelle noch Dank an Marcus Roeckrath, der mir gezeigt hat, wie man einem Datenbankbenutzer so wenig Rechte wie möglich gibt!
Baikal erstmalig einrichten
Nun können wir den Baikal-Server erstmalig einrichten: Im Browser rufen wir die Admin-Oberfläche auf unter (bei mir) http://baikal.barbrady.southpark.lan/html/admin/ . Bitte die URL wieder an die lokalen Gegebenheiten anpassen. Es erscheint der 'Baïkal initialization wizard':
- Die 'Server Time zone' stellen wir korrekt ein - 'Europe/Berlin' passt bei mir.
- 'CardDAV' haken wir an.
- 'CalDAV' haken wir an.
- 'WebDAV authentication type' setzen wir auf 'Digest'.
- Dem 'Admin' geben wir zweimal ein Password und notieren es uns.
Wir speichern die Einstellungen - dann erscheint das 'Baïkal Database setup':
- 'Use MySQL' haken wir an.
- Der 'MySQL host' ist '127.0.0.1'.
- Der 'MySQL database name' ist 'baikal'.
- Der 'MySQL username' ist 'baikaluser' - diesen nutzt apache.
- Das 'MySQL password' haben wir vorhin selbst an Stelle von 'geheim' vergeben - bitte eintragen.
Wir speichern die Einstellungen und können Baikal benutzen.
Benutzer, Adressbücher und Kalender in Baikal einrichten
Wir melden uns auf der Admin-Oberfläche von Baikal unter (bei mir) http://baikal.barbrady.southpark.lan/html/admin/ an - der user ist 'admin' und sein Password haben wir uns oben hoffentlich notiert.
Wir landen im sogenannten Dashboard mit einer Übersicht der verfügbaren Services - CardDAV und CalDAV, der Anzahl der angelegten 'Users' mit ihren 'calendars' und 'address books' und der Anzahl der Einträge darin.
Um Verwirrungen zu vermeiden, arbeiten wir beispielhaft mit dem Benutzer 'stefan', seinem Adressbuch 'kontakte' und seinem Kalender 'kalender'. Sein Password sei 'geheim'.
Um einen neuen Benutzer anzulegen, wählen wir oben 'Users and resources'.
Über '+ Add user' legen wir den Benutzer an:
- 'Username' = Benutzername vermutlich Kleinbuchstaben ohne Leerzeichen und Umlaute - 'stefan'
- 'Display name' = wie soll der Name mit Leerzeichen / Umlauten angezeigt werden - 'Stefan'
- 'Email' = 'stefan@southpark.lan'
- 'Password' = 'geheim'
- 'Confirm password' = 'geheim'
Über 'Save changes' speichern wir den neuen Benutzer.
Um für 'stefan' einen Kalender anzulegen, wählen wir in seiner Zeile 'Calendars' und dann '+ Add calendar':
- 'Calendar token ID' = Kalendername in Kleinbuchstaben ohne Leerzeichen und Umlaute - 'kalender'
- 'Display name' = wie soll der Name mit Leerzeichen / Umlauten angezeigt werden - 'Kalender'
- 'Calendar color' = optionale Farbe des Kalenders
- 'Description' = optionale Beschreibung des Kalenders
- 'Todos' = sollen Aufgaben angezeigt werden?
- 'Notes' = sollen Notitzen angezeigt werden?
Über 'Save changes' speichern wir den neuen Kalender.
Um für 'stefan' ein Adressbuch anzulegen, wählen wir in seiner Zeile 'Address Books' und dann '+ Add address book':
- 'Address Book token ID' = Adressbuchname in Kleinbuchstaben ohne Leerzeichen und Umlaute - 'kontakte'
- 'Display name' = wie soll der Name mit Leerzeichen / Umlauten angezeigt werden - 'Kontakte'
- 'Description' = optionale Beschreibung des Adressbuchs
Über 'Save changes' speichern wir das neue Adressbuch.
Dies wiederholen wir ggf. für alle Benutzer und deren Kalender und Adressbücher.
Cardbook & Lightning
Um die Kalender und Adressbücher per CalDAV bzw. CardDAV zu benutzen muss man jeweils eine URL mit Benutzernamen und Password angeben. Bei mir wären das mit obigen Beispieldaten (diese müssen wieder den lokalen Gegebenheiten angepasst werden):
Kalender
- URL = 'http://baikal.barbrady.southpark.lan/html/cal.php/calendars/stefan/kalender/'
- user = 'stefan'
- password = 'geheim'
Adressbuch
- URL = 'http://baikal.barbrady.southpark.lan/html/card.php/addressbooks/stefan/kontakte/'
- user = 'stefan'
- password = 'geheim'
Und dann kam Thunderbird in Version 68.0...
Bei der Umstellung auf TB Version 68.0 mussten viele Add-ons von den jeweiligen Entwicklern angepasst werden - und natürlich hatte ich den Hauptgewinn gezogen, denn Cardbook lief danach nicht mehr mit meinem Baikal-Server…
Anscheinend (laut google) hatten alle Versionen von Cardbook (für TB Versionen ab 68.0) vor Version 42.0 einen Bug - eine Anmeldung am Baikal-Server (auch andere scheinen betroffen gewesen zu sein) schlug grundsätzlich fehl. Seit Cardbook Version 42.0 klappt die Anmeldung nun wieder, man kann die Adressbücher wieder nutzen und die Synchronisierung klappt auch wieder.
Bei einem Neustart vom TB war dann plötzlich das gerade noch benutzte Adressbuch wieder weg - Grummel!
Aber google wusste die Lösung: Das Adressbuch ist nicht einfach weg - nein, der TB zeigt es nur nicht mehr an. Wenn man in den Einstellungen vom TB die Annahme von cookies erlaubt - und (wichtig!!!) auch die Annahme von cookies von Drittanbietern erlaubt, überleben die Adressbücher auch einen Neustart des TB. Die cookies darf er beim Beenden auch gerne löschen - bei mir gab das keinerlei Probleme. Und wenn man diese Einstellung schon vor dem Update auf TB Version 68.0 macht, verschwinden die Adressbücher auch gar nicht erst…
Der Kalender Lightning war von diesen Problemen übrigens bei mir nicht betroffen.
Getestet habe ich unter MacOS Version 10.13.6 und Windows 10 home 64 Bit (Version 1903) mit
- Thunderbird Version 68.1.0
- Cardbook Version 42.0
- Lightning Version 68.1.0
- Baikal Version 0.4.6 auf eisfair-1 (hier wurde von mir nichts geändert)
Die letzte Version von Baikal, die mit php5 läuft...
ist Version 0.5.3 . Beim Update muss man beachten, dass die Inhalte des Verzeichnisses 'Specific' in 'html' NICHT (!!!) überschrieben werden - hier stehen wichtige Einstellungen, die nicht überschrieben werden dürfen.
Meistens passen user und group der neuen Dateien wieder nicht für den apachen, also passen wir diese auch wieder mit chown -R auf 'wwwrun' und 'nogroup' an (siehe oben).
Wenn wir nun die Admin-Oberfläche von Baikal im Browser öffnen, will er das Format der Daten von 0.4.6 auf 0.5.3 wandeln - wir stimmen zu. Danach ist das Update auf Version 0.5.3 erledigt.
Mittlerweile gibt es Baikal in Version 0.6.1 - es wird also doch weiter entwickelt.
Dafür wird aber php7 benötigt.
Für den Umstieg auf php7 deaktivieren wir zur Sicherheit den Datenbank-Server:
/etc/init.d/mariadb102 stop
Jetzt müssen wir im eisfair-Setup-Menü unter Service Administration → Apache2 Webserver → Configuration → Modules configuration → PHP5 Administration das Modul apache2_php5 deaktivieren - sonst klappt der Umstieg auf php7 nicht. Falls dies eine Neu-Installation ist und php5 nicht installiert ist, muss dieser Schritt übersprungen werden:
START_PHP5='no'
Jetzt installieren wir folgende Pakete - falls noch nicht vorhanden:
- apache2_php7
- php7-common
- php7-mysql
Das Modul apache2_php7 muss noch unter Service Administration → Apache2 Webserver → Configuration → Modules configuration → PHP7 Administration aktiviert und konfiguriert werden: bei mir sieht das wie folgt aus:
START_PHP7='yes' PHP7_MAX_EXECUTION_TIME='30' PHP7_DISPLAY_ERRORS='yes' PHP7_LOG_ERROR='yes' PHP7_REGISTER_GLOBALS='no' PHP7_SENDMAIL_PATH='' PHP7_SENDMAIL_APP='' PHP7_DATE_TIMEZONE='Europe/Berlin' PHP7_DEFAULT_CHARSET='de_DE.UTF-8' PHP7_INFO='no' PHP7_MAX_POST_SIZE='8M' PHP7_MAX_UPLOAD_FILESIZE='2M' PHP7_MEMORY_LIMIT='8M' PHP7_UPLOAD_DIR='/tmp' PHP7_EXT_CACHE='no' PHP7_EXT_SOAP='no' PHP7_EXT_LDAP='no' PHP7_EXT_MYSQL='yes' PHP7_EXT_MYSQL_SOCKET='/run/mysql/102/mysql.sock' PHP7_EXT_MYSQL_HOST='127.0.0.1' PHP7_EXT_MYSQL_PORT='3306' PHP7_EXT_MSSQL='no' PHP7_EXT_PGSQL='no' PHP7_EXT_INTER='no' PHP7_EXT_SQLITE3='no'
Nun können wir den Datenbank-Server wieder aktivieren:
/etc/init.d/mariadb102 start
Mit dieser Konfiguration läuft Baikal Version 0.5.3 bei mir mit php7 auf einem eisfair-1 (also 32 Bit).
Jetzt können wir noch alle nicht mehr benötigten Pakete mit php5 im Namen deinstallieren. Falls das Paket apache2_php5 sich wegen angeblich bestehender 'Dependencies' nicht entfernen lässt, hilft hier nur rohe Gewalt (–force) - Danke Holger:
eisman uninstall --force apache2_php5
Baikal Version 0.6.1
Auch das Update auf Baikal Version 0.6.1 ist kein Hexenwerk: man halte sich an die Vorgehensweise beim oben beschriebenen Update von Version 0.4.6 auf Version 0.5.3 und das Update ist erledigt.
Baikal Version 0.7.1
Das Update auf Version 0.7.1 verlief bei mir nicht ganz reibungslos, daher tut man gut daran, !!! VORHER !!! Backups zu erstellen.
Bitte zuerst den Datenbank-Server anhalten - bei mir mit:
/etc/init.d/mariadb103 stop
Sichern sollte man das Datenbank-Verzeichnis - bei mir /srv/mysql/ und das html-Verzeichnis des Apachen - bei mir /var/www/baikal. Diese Verzeichnisse hängen natürlich von den lokalen Gegebenheiten ab.
Nun besorgen wir uns die neueste Version von Baikal (momentan baikal-0.7.1.zip) unter https://sabre.io/baikal/ - dort wird man für den Download nach github weitergeleitet. Die zip-Datei auf dem Server auspacken - und bitte beachten: die Unter-Verzeichnisse Specific und / oder config dürfen nicht überschrieben werden. Bei mir gab es aber gar kein config-Verzeichnis - und er legt es auch nicht selbst an. Sollte das Verzeichnis fehlen, gibts die Meldung, dass das Verzeichnis beschreibbar sein muss. Also notfalls das (leere) config-Verzeichnis aus der zip-Datei mitkopieren, falls es lokal noch nicht vorhanden ist.
Nun müssen wir den neuen Dateien noch die richtigen owner und group „wwwrun“ und „nogroup“ geben - chown -R wwwrun:nogroup ist unser Freund.
Jetzt starten wir den Datenbank-Server wieder - bei mir mit:
/etc/init.d/mariadb103 start
Jetzt sollte man laut Anleitung die Admin-Oberfläche vom Baikal-Server im Browser öffnen - es startet der Baïkal initialization wizard.
Wichtig ist hier, dass wir am Ende zwei Mal das Admin-Password eingeben und mit save changes bestätigen - ohne Password ging es nicht weiter.
Nun kommen wir zum Baïkal Database setup.
Die hier gezeigten Daten sollten wir uns merken - sie sind uns aber nicht neu - diese haben wir selbst so angelegt.
Wir verlassen den Dialog wieder mit save changes.
Ich bekam nun unerwartet folgende Fehlermeldung im Browser - aber vielleicht haben andere User mehr Glück als ich:
=== The constant PROJECT_DB_MYSQL_HOST, containing the MySQL host name, is not set. You should set it in config/baikal.yaml ===
Zum Glück steht da aber, WO GENAU man die fehlenden Daten eintragen soll. Also öffnen wir die Datei config/baikal.yaml im html-Verzeichnis mit einem Text-Editor:
system: configured_version: 0.6.1 timezone: Europe/Berlin card_enabled: true cal_enabled: true dav_auth_type: Digest admin_passwordhash: e0c6844ac728a5416aca54440f3042b435107cecea9483cd4c1a76d9 auth_realm: BaikalDAV base_uri: '' invite_from: '' database: sqlite_file: /var/www/baikal/htdocs/Specific/db/db.sqlite mysql: true mysql_host: '' mysql_dbname: '' mysql_username: '' mysql_password: '' encryption_key: e762930719f68d82c360bba04f32a43b configured_version: ''
Da fehlen also einige Angaben - die wir uns oben merken wollten:
- mysql_host: '127.0.0.1'
- mysql_dbname: 'baikal'
- mysql_username: 'baikaluser'
- mysql_password: 'vollgeheimespassword'
Wir fügen hier also die fehlenden Daten ein - bitte wieder an die lokalen Gegebenheiten anpassen - und speichern die Datei.
Wenn wir nun das Browser-Fenster neu laden (mit F5), erscheint der Baïkal upgrade wizard, den wir mit Start upgrade starten können.
Warum man zwischendurch von Hand die Daten in die baikal.yaml-Datei eintragen muss, erschliesst sich mir auch nicht wirklich, aber wie oben beschrieben, habe ich das Update auf Version 0.7.1 zum Laufen gebracht.
Bei Fragen wendet Euch bitte an die Newsgroup - da werdet Ihr geholfen.
Stefan Puschek
Ende Juli 2018 (erste Fassung)
Mitte September 2019 (Update auf TB ab Version 68.0)
Ende September 2019 (Update auf Baikal Version 0.5.3)
Anfang März 2020 (Umstieg auf php7 und Update auf Baikal Version 0.6.1)
Ende Juli 2020 (Update auf Baikal Version 0.7.1)