From 2a7669a0d35b4c843d362bc80ad8186baeee74ac Mon Sep 17 00:00:00 2001 From: Joshua Tauberer Date: Sat, 12 Jul 2014 00:02:32 +0000 Subject: [PATCH] z-push: an Exchange ActiveSync server --- conf/nginx.conf | 14 +++++ setup/web.sh | 11 ++-- setup/zpush.sh | 54 +++++++++++++++++++ tools/exchange-autodiscover.php | 92 +++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 3 deletions(-) create mode 100755 setup/zpush.sh create mode 100755 tools/exchange-autodiscover.php diff --git a/conf/nginx.conf b/conf/nginx.conf index db1a38a..eb9a633 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -53,6 +53,20 @@ server { fastcgi_pass unix:/tmp/php-fastcgi.www-data.sock; } + # Microsoft Exchange autodiscover.xml for email + location /autodiscover/autodiscover.xml { + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME /usr/local/bin/mailinabox-exchange-autodiscover.php; + fastcgi_pass unix:/tmp/php-fastcgi.www-data.sock; + } + + # Z-Push (Microsoft Exchange ActiveSync) + location /Microsoft-Server-ActiveSync { + include /etc/nginx/fastcgi_params; + fastcgi_param SCRIPT_FILENAME /usr/local/lib/z-push/index.php; + fastcgi_pass unix:/tmp/php-fastcgi.www-data.sock; + } + # ADDITIONAL DIRECTIVES HERE } diff --git a/setup/web.sh b/setup/web.sh index 2aad8d0..8366bef 100755 --- a/setup/web.sh +++ b/setup/web.sh @@ -36,9 +36,14 @@ rm -f /etc/init.d/php-fastcgi ln -s $(pwd)/conf/phpfcgi-initscript /etc/init.d/php-fastcgi update-rc.d php-fastcgi defaults -# Put our webfinger server script into a well-known location. -cp tools/webfinger.php /usr/local/bin/mailinabox-webfinger.php -chown www-data.www-data /usr/local/bin/mailinabox-webfinger.php +# Put our webfinger and Exchange autodiscover.xml server scripts +# into a well-known location. +for f in webfinger exchange-autodiscover; do + cp tools/$f.php /usr/local/bin/mailinabox-$f.php + chown www-data.www-data /usr/local/bin/mailinabox-$f.php +done + +# Make some space for users to customize their webfinger responses. mkdir -p $STORAGE_ROOT/webfinger/acct; chown -R $STORAGE_USER $STORAGE_ROOT/webfinger diff --git a/setup/zpush.sh b/setup/zpush.sh new file mode 100755 index 0000000..a7347eb --- /dev/null +++ b/setup/zpush.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# +# Z-Push: The Microsoft Exchange protocol server. +# Mostly for use on iOS which doesn't support IMAP. +# +# Although Ubuntu ships Z-Push (as d-push) it has a dependency on Apache +# so we won't install it that way. +# +# Thanks to http://frontender.ch/publikationen/push-mail-server-using-nginx-and-z-push.html. + +source setup/functions.sh # load our functions +source /etc/mailinabox.conf # load global vars + +# Prereqs. + +apt_install \ + php-soap php5-imap + +php5enmod imap + +# Copy Z-Push into place. + +if [ ! -d /usr/local/lib/z-push ]; then + ZPUSH=z-push-2.1.3-1892 + wget -O /tmp/zpush.tgz http://download.z-push.org/final/2.1/$ZPUSH.tar.gz + tar -C /tmp -zxf /tmp/zpush.tgz + mv /tmp/$ZPUSH /usr/local/lib/z-push + ln -s /usr/local/lib/z-push/z-push-admin.php /usr/sbin/z-push-admin + ln -s /usr/local/lib/z-push/z-push-top.php /usr/sbin/z-push-top + rm /tmp/zpush.tgz; +fi + +# Configure. Tell is to connect to email via IMAP using SSL. Since we connect on +# localhost, the certificate won't match (it may be self-signed and invalid anyway) +# so don't check the cert. +sed -i "s/define('BACKEND_PROVIDER', .*/define('BACKEND_PROVIDER', 'BackendIMAP');/" /usr/local/lib/z-push/config.php +#sed -i "s/define('IMAP_SERVER', .*/define('IMAP_SERVER', '$PRIMARY_HOSTNAME');/" /usr/local/lib/z-push/backend/imap/config.php +sed -i "s/define('IMAP_PORT', .*/define('IMAP_PORT', 993);/" /usr/local/lib/z-push/backend/imap/config.php +sed -i "s/define('IMAP_OPTIONS', .*/define('IMAP_OPTIONS', '\/ssl\/norsh\/novalidate-cert');/" /usr/local/lib/z-push/backend/imap/config.php + + +# Some directories it will use. + +mkdir -p /var/log/z-push +mkdir -p /var/lib/z-push +chmod 750 /var/log/z-push +chmod 750 /var/lib/z-push +chown www-data:www-data /var/log/z-push +chown www-data:www-data /var/lib/z-push + +# Restart service. + +service php-fastcgi restart + diff --git a/tools/exchange-autodiscover.php b/tools/exchange-autodiscover.php new file mode 100755 index 0000000..77b0b96 --- /dev/null +++ b/tools/exchange-autodiscover.php @@ -0,0 +1,92 @@ +(.*?)<\/AcceptableResponseSchema>/', $post_body, $match); + $AcceptableResponseSchema = $match[1]; + + if ($AcceptableResponseSchema == "http://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006") { + // There is no way to convey the user's login name with this? + ?> + + + + + + + MobileSync + https:// + https:// + + + + + +(.*?)<\/EMailAddress>/', $post_body, $match); + $LOGIN = $match[1]; + + header("Content-type: text/xml"); +?> + + + + https:// + + email + settings + + + IMAP + + 993 + on + + + + + SMTP + + 587 + on + + + + + DAV + https:// + on + on + + + + + WEB + https:///mail + on + + + + + + +