Archive for November, 2011


Endlich die Bookmarks auf allen Firefox Browser haben, die man benutzt. Das ist seit Firefox 4 möglich.

Bis anhin hat mich immer davon abgehalten, dass meine Daten auf einem fremden Server liegen und ich nicht weiss, was damit passiert (auch wenn sie verschlüsselt sind). Irgendwie bin ich vor wenigen Wochen über die Mozilla Seite „Run your own Sync Server“ gestolpert, dass dieses Problem löst.

Mittlerweile habe ich den Sync Server auf einer Debian Squeeze Box installiert und er funktioniert. Gemacht habe ich das so:

Die nötigen Pakete installieren:

$ apt-get install python-dev mercurial sqlite3 python-virtualenv apache2-mpm-prefork libapache2-mod-wsgi make

Benutzer ffsync erstellen:

$ adduser --group --system --home /usr/local/firefox-sync-server --disabled-password ffsync

Den Apache User zu der Gruppe ffsync hinzufügen:

$ adduser www-data ffsync

Den User wechseln:

$ su - ffsync

Die Source Files herunterladen:

$ hg clone https://hg.mozilla.org/services/server-full

Die Ordner data und tmp erstellen

$ mkdir data tmp

Berechtigungen ändern

$ chmod 770 data tmp

Den Sync Server kompilieren

$ cd server-full

$ make build

Nun müssen noch einige Config Files angepasst werden. Die Pfade zeigen zumeist auf /tmp, was etwas ungeignet ist, um Benutzerdaten zu speichern.

$ vi sync.wsgi
[..]

os.environ[‚PYTHON_EGG_CACHE‘] = ‚/usr/local/firefox-sync-server/tmp/python-eggs‘

[..]

$ vi development.ini

[..]

[handler_syncserver_errors]
class = handlers.RotatingFileHandler
args = (‚/usr/local/firefox-sync-server/tmp/sync-error.log‘,)
[..]

$ vi etc/sync.conf

[..]

[storage]
backend = syncstorage.storage.sql.SQLStorage
sqluri = sqlite:////usr/local/firefox-sync-server/data/usersettings.db
[..]

[auth]
backend = services.auth.sql.SQLAuth
sqluri = sqlite:////usr/local/firefox-sync-server/data/usersettings.db

[..]

fallback_node = http://sync.mytestdomain.com/
[..]

Mit exit verlassen wir die User Shell und sind wieder root. Wir ändern die Login Shell von ffsync auf /bin/false.

$ usermod -s /bin/false ffsync

Das wsgi Modul aktivieren, falls das noch nicht automatisch passiert sein sollte:

$ a2enmod wsgi

Und einen neuen Apache Virtual Host erstellen:

$ vi /etc/apache2/sites-available/firefox-sync

<VirtualHost *:80>
ServerName sync.mytestdomain.com
ServerAdmin webmaster@mytestdomain.com

DocumentRoot /usr/local/firefox-sync-server/server-full

CustomLog ${APACHE_LOG_DIR}/firefox-sync-server_access.log combined
ErrorLog ${APACHE_LOG_DIR}/firefox-sync-server_error.log

<Directory /usr/local/firefox-sync-server/server-full>
Order deny,allow
Allow from all
</Directory>

WSGIProcessGroup ffsync
WSGIDaemonProcess ffsync user=ffsync group=ffsync processes=2 threads=25
WSGIPassAuthorization On
WSGIScriptAlias / /usr/local/firefox-sync-server/server-full/sync.wsgi
</VirtualHost>

Den Virtual Host aktivieren:

$ cd /etc/apache2/sites-enabled

$ ln -s ../sites-available/firefox-sync .

Apache neu starten:

$ apachectl configtest && /etc/init.d/apache restart

Und nun kann man im Firefox über Tools > Sync Now seinen Account einrichten.

Was ich dann noch machen werde, ist den Dienst nur verschlüsselt (HTTPS) anzubieten. Das dürfte keine Hexerei mehr sein.

Dies ist die Fortsetzung des ActiveSync Artikels. Der erste Teil „ActiveSync mit Z-Push und Courier IMAP“ ist hier zu finden.

Damit die Mailbox-Konfiguration auf dem Mobile Phone etwas einfacher wird, gibt es AutoDiscover für ActiveSync. Das Prinzip ist relativ einfach:

Das Mobile Phone sendet einen XMLRequest an http(s)://autodiscover.mytestdomain.com/Autodiscover/Autodiscover.xml.

Der Request sieht so aus:

<?xml version="1.0" encoding="utf-8"?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/mobilesync/requestschema/2006">
<Request>
<EMailAddress>meine.emailadresse@mytestdomain.com</EMailAddress>
<AcceptableResponseSchema>http://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006</AcceptableResponseSchema>
</Request>
</Autodiscover>

Die Response ist wie folgt:

<?xml version="1.0" encoding="utf-8"?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<Culture>en:en</Culture>
<User>
<DisplayName>meine.emailadresse@mytestdomain.com</DisplayName>
<EMailAddress>meine.emailadresse@mytestdomain.com</EMailAddress>
</User>
<Action>
<Settings>
<Server>
<Type>MobileSync</Type>
<Url>https://mail.mytestdomain.com/Microsoft-Server-ActiveSync</Url>
<Name>https://mail.mytestdomain.com/Microsoft-Server-ActiveSync</Name>
</Server>
</Settings>
</Action>
</Response>
</Autodiscover>

Nun weiss das Mobile Phone, welches der Mailserver ist (und allenfalls auch wie Vorname und Name des Benutzers lautet. Wurde aber von mir nicht implementiert.).

So hab‘ ich’s gemacht:

  • DNS Eintrag für autodiscover.mytestdomain.com erstellen
  • Neuen VirtualHost erstellen (Hinweis: Das SmartPhone probiert zuerst mit https auf autodiscover zuzugreifen, was je nachdem zu einem Zertifikatsfehler führt.
  • Zusätzlich diese Aliase konfigurieren (insgesamt nur zwei Zeilen):


Alias /Autodiscover/Autodiscover.xml "/path/to/document/root/autodiscover/autodiscover.php"
Alias /AutoDiscover/AutoDiscover.xml "/path/to/document/root/autodiscover/autodiscover.php"

  • Das Script autodiscover.php ins DocumentRoot kopieren, nach .php umbenennen und Variablen anpassen. Fertig.

Das Script verfügt über eine Debug Funktion und loggt in den Ordner autodiscover-debug/, der auf der gleichen Ebene wie das Document Root liegt.

Ursprünglich habe ich das Script von hier, aber leider funktionierte dies nicht, worauf ich es nach meinem Gusto umgeschrieben habe.

Immer wieder fragen Kunden nach ActiveSync Unterstützung für ihre Mailbox. Bis anhin musste ich immer sagen: „Das wird leider nicht unterstützt“.

Doch heute Abend bin ich über Z-Push gestolpert und hab‘ das mal ausprobiert. Hier ist eine ganz kurze und rudimentäre Installationsanleitung (und hier ist die Originalanleitung):
1. Tarball in Verzeichnis /var/www/z-push entpacken
2. Die config.php anpassen:

    • Timezone auf Europe/Zurich anpassen
    • $BACKEND_PROVIDER = „BackendIMAP“;
    • Für den Fall, dass der IMAP Daemon auf dem gleichen Server läuft, brauchen wir kein TLS oder SSL:
      • define('IMAP_SERVER', 'localhost');
      • define('IMAP_PORT', 143);
      • define('IMAP_OPTIONS', '/notls/norsh');
    • Ist Courier IMAP auf einem Remote Server, dann ist allenfalls TLS oder SSL angesagt (ungetestet).
      • TLS:
      • define('IMAP_SERVER', 'remote.server.net');
      • define('IMAP_PORT', 143);
      • define('IMAP_OPTIONS', '/norsh/novalidate-cert'); # falls das Zertifikat self-signed oder sonstwie nicht trusted ist
      • SSL:
      • define('IMAP_SERVER', 'remote.server.net');
      • define('IMAP_PORT', 993);
      • define('IMAP_OPTIONS', '/notls/norsh/novalidate-cert'); # falls das Zertifikat self-signed oder sonstwie nicht trusted ist
  • Die Datei backend/ics.php nach backend/unused/ics.php verschieben (wird nicht benötigt. Directory unused muss vorher erstellt werden).
  • Die Apache Config wie folgt ergänzen:
    <Directory /var/www/z-push>
    php_flag magic_quotes_gpc off
    php_flag register_globals off
    php_flag magic_quotes_runtime off
    php_flag short_open_tag on
    </Directory>
    Alias /Microsoft-Server-ActiveSync /var/www/z-push/index.php
  • Apache neu starten/reloaden und ausprobieren.

Einige Tipps habe ich übrigens von diesem Artikel.

Mir persönlich passt nicht so, dass das state Directory und das Debug-Logfile debug.txt innerhalb des Apache Document Roots liegen. Deshalb verschiebe ich das nach ausserhalb.

In der config.php gibt es zusätzlich folgende Änderung:

  • define('STATE_DIR', '/var/lib/zpush-state');

Natürlich muss das Directory auch noch erstellt werden:

  • mkdir /var/lib/zpush-state && chown www-data:www-data /var/lib/zpush-state

Damit das Debug Logfile nach /var/log/zpush/debug.log schreibt, braucht es folgende Änderung in der Datei debug.php:

In der Funktion debugLog folgende Zeile ändern:

  • @$fp = fopen('/var/log/zpush/debug.log', "a");

und das Directory inklusive File erstellen:

  • mkdir /var/log/zpush/ && touch /var/log/zpush/debug.log && chown -R www-data:www-data /var/log/zpush

Damit das Logfile nicht irgendwann die Platte füllt, sollte man sich überlegen logrotate entsprechend zu konfigurieren.

Nun kann man endlich das iPhone für ActiveSync konfigurieren. Autodiscover ist momentan noch nicht verfügbar. Das werde ich in einem nächsten Schritt aktivieren.

***UPDATE*** Wie man Autodiscover einrichtet wird im Nachfolgeartikel „ActiveSync Autodiscover“ gezeigt.