Page MenuHomePhorge

No OneTemporary

Size
13 KB
Referenced Files
None
Subscribers
None
diff --git a/README.md b/README.md
index 1749c84..af0bf4c 100644
--- a/README.md
+++ b/README.md
@@ -1,64 +1,72 @@
INTALLATION PROCEDURE
=====================
This package uses [Composer][1] to install and maintain required PHP libraries
as well as the Roundcube framework. The requirements are basically the same as
for Roundcube so please read the INSTALLATION section in the Roundcube
framework's [README][2] file.
1. Install Composer
Execute this in the project root directory:
$ curl -s http://getcomposer.org/installer | php
This will create a file named composer.phar in the project directory.
2. Install Dependencies
$ php composer.phar install
3. Import the Roundcube Framework, Kolab plugins and Chwala
3.1. Either copy or symlink the Roundcube framework package into lib/Roundcube
3.2. Either copy or symlink the roundcubemail-plugins-kolab into lib/plugins
3.3. Either copy or symlink the Chwala lib/ directory into lib/FileAPI
4. Create local config
4.1. The configuration for this service inherits basic options from the Roundcube
config. To make that available, smylink the Roundcube config files
(main.inc.php and db.inc.php) into the local config/ directory.
4.2. Then copy the service-spcific config template:
$ cp config/dav.inc.php.sample config/dav.inc.php
Edit the local config/dav.inc.php file according to your setup and taste.
These settings override the default config options from the Roundcube
configuration.
5. Give write access for the webserver user to the 'logs' and 'temp' folders:
$ chown <www-user> logs
$ chown <www-user> temp
6. Configure your webserver to point to the 'public_html' directory of this
package as document root. This is necessary because Apple's Address Book App
expects the CardDAV server to run at the root of the host [3].
Add following mod_rewrite configuration into virtual host config or .htaccess file:
RewriteEngine On
#RewriteBase /
RewriteRule ^\.well-known/caldav / [R,L]
RewriteRule ^\.well-known/carddav / [R,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php [qsappend,last]
+ SetEnv CALDAV 1
+ SetEnv CARDDAV 1
+ SetEnv WEBDAV 1
+
+Use the SetEnv properties to configure which services shall be provided under
+a certain host. If only WEBDAV is enabled, the shared folders are listed
+directly at root level and not in /files/.
+
[1]: http://getcomposer.org
[2]: https://github.com/roundcube/roundcubemail/blob/master/program/lib/Roundcube/README.md)
[3]: https://code.google.com/p/sabredav/wiki/OSXAddressbook
diff --git a/config/dav.inc.php.sample b/config/dav.inc.php.sample
index 4c43fc3..ebba468 100644
--- a/config/dav.inc.php.sample
+++ b/config/dav.inc.php.sample
@@ -1,44 +1,41 @@
<?php
/*
+-------------------------------------------------------------------------+
| Configuration for the Kolab DAV server |
| |
| Copyright (C) 2013, Kolab Systems AG |
| |
| This program is free software: you can redistribute it and/or modify |
| it under the terms of the GNU Affero General Public License as |
| published by the Free Software Foundation, either version 3 of the |
| License, or (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU Affero General Public License for more details. |
| |
| You should have received a copy of the GNU Affero General Public License|
| along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
+-------------------------------------------------------------------------+
*/
$rcmail_config = array();
// Log DAV requests to <log_dir>/davdebug
$rcmail_config['base_uri'] = null;
-// Log DAV requests to <log_dir>/davdebug
-$rcmail_config['kolab_dav_debug'] = false;
-
// User agent string written to kolab storage MIME messages
$rcmail_config['useragent'] = 'Kolab DAV Server libkolab/' . RCUBE_VERSION;
// Roundcube plugins. Not all are supported here.
$rcmail_config['kolabdav_plugins'] = array('kolab_auth');
// Type of Auth cache. Supported values: 'db', 'apc' and 'memcache'.
// Note: This is only for username canonification map.
$rcmail_config['kolabdav_auth_cache'] = 'apc';
// lifetime of the Auth cache, possible units: s, m, h, d, w
$rcmail_config['kolabdav_auth_cache_ttl'] = '1h';
diff --git a/public_html/index.php b/public_html/index.php
index 8d15657..6584ad8 100644
--- a/public_html/index.php
+++ b/public_html/index.php
@@ -1,166 +1,158 @@
<?php
/**
* iRony, the Kolab WebDAV/CalDAV/CardDAV Server
*
* This is the public API to provide *DAV-based access to the Kolab Groupware backend
*
* @version 0.1.0
* @author Thomas Bruederli <bruederli@kolabsys.com>
*
* Copyright (C) 2013, Kolab Systems AG <contact@kolabsys.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-// define some environment variables used thoughout the app and libraries
+// define some environment variables used throughout the app and libraries
define('KOLAB_DAV_ROOT', realpath('../'));
define('KOLAB_DAV_VERSION', '0.1.0');
define('KOLAB_DAV_START', microtime(true));
define('RCUBE_INSTALL_PATH', KOLAB_DAV_ROOT . '/');
define('RCUBE_CONFIG_DIR', KOLAB_DAV_ROOT . '/config/');
define('RCUBE_PLUGINS_DIR', KOLAB_DAV_ROOT . '/lib/plugins/');
// suppress error notices
ini_set('error_reporting', E_ALL &~ E_NOTICE &~ E_STRICT);
// UTC is easy to work with, and usually recommended for any application.
date_default_timezone_set('UTC');
/**
* Mapping PHP errors to exceptions.
*
* While this is not strictly needed, it makes a lot of sense to do so. If an
* E_NOTICE or anything appears in your code, this allows SabreDAV to intercept
* the issue and send a proper response back to the client (HTTP/1.1 500).
*/
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
//set_error_handler("exception_error_handler");
// use composer's autoloader for both dependencies and local lib
require_once KOLAB_DAV_ROOT . '/vendor/autoload.php';
// load the Roundcube framework
require_once KOLAB_DAV_ROOT . '/lib/Roundcube/bootstrap.php';
// Roundcube framework initialization
$rcube = rcube::get_instance(rcube::INIT_WITH_DB | rcube::INIT_WITH_PLUGINS);
$rcube->config->load_from_file(RCUBE_CONFIG_DIR . 'dav.inc.php');
// Load plugins
$plugins = (array)$rcube->config->get('kolabdav_plugins', array('kolab_auth'));
$required = array('libkolab', 'libcalendaring');
$rcube->plugins->init($rcube);
$rcube->plugins->load_plugins($plugins, $required);
// convenience function, you know it well :-)
function console() { call_user_func_array(array('rcube', 'console'), func_get_args()); }
-// quick & dirty request debugging
-if ($debug = $rcube->config->get('kolab_dav_debug')) {
- $http_headers = $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . ' ' . $_SERVER['SERVER_PROTOCOL'] . "\n";
- foreach (apache_request_headers() as $hdr => $value) {
- $http_headers .= "$hdr: $value\n";
- }
- // read HTTP request body (with our own file handle)
-# $in = fopen('php://input', 'r');
-# $http_body = stream_get_contents($in);
-# fseek($in, 0);
-# fclose($in);
-
- $rcube->write_log('davdebug', $http_headers . "\n" . $http_body . "\n");
- ob_start(); // turn on output buffering
-}
-
-
// Make sure this setting is turned on and reflects the root url of the *DAV server.
$base_uri = $rcube->config->get('base_uri', slashify(substr(dirname($_SERVER['SCRIPT_FILENAME']), strlen($_SERVER['DOCUMENT_ROOT']))));
+// add filename to base URI when called without mod_rewrite (e.g. /dav/index.php/calendar)
+if (strpos($_SERVER['REQUEST_URI'], 'index.php'))
+ $base_uri .= 'index.php/';
// create the various backend instances
$auth_backend = new \Kolab\DAV\Auth\HTTPBasic();
$principal_backend = new \Kolab\DAVACL\PrincipalBackend();
-$carddav_backend = new \Kolab\CardDAV\ContactsBackend();
-$caldav_backend = new \Kolab\CalDAV\CalendarBackend();
-$carddav_backend->setUserAgent($_SERVER['HTTP_USER_AGENT']);
-$caldav_backend->setUserAgent($_SERVER['HTTP_USER_AGENT']);
+$services = array();
+foreach (array('CALDAV','CARDDAV','WEBDAV') as $skey) {
+ if (getenv($skey))
+ $services[$skey] = 1;
+}
+// no config means *all* services
+if (empty($services))
+ $services = array('CALDAV' => 1, 'CARDDAV' => 1, 'WEBDAV' => 1);
// Build the directory tree
// This is an array which contains the 'top-level' directories in the WebDAV server.
-$nodes = array(
- // files
- new \Kolab\DAV\Collection(\Kolab\DAV\Collection::ROOT_DIRECTORY),
- // /principals
- new \Sabre\CalDAV\Principal\Collection($principal_backend),
- // /calendars
- new \Kolab\CalDAV\CalendarRootNode($principal_backend, $caldav_backend),
- // /addressbook
- new \Kolab\CardDAV\AddressBookRoot($principal_backend, $carddav_backend),
-);
+if ($services['CALDAV'] || $services['CARDDAV']) {
+ $nodes = array(
+ new \Sabre\CalDAV\Principal\Collection($principal_backend),
+ );
+
+ if ($services['CALDAV']) {
+ $caldav_backend = new \Kolab\CalDAV\CalendarBackend();
+ $caldav_backend->setUserAgent($_SERVER['HTTP_USER_AGENT']);
+ $nodes[] = new \Kolab\CalDAV\CalendarRootNode($principal_backend, $caldav_backend);
+ }
+ if ($services['CARDDAV']) {
+ $carddav_backend = new \Kolab\CardDAV\ContactsBackend();
+ $carddav_backend->setUserAgent($_SERVER['HTTP_USER_AGENT']);
+ $nodes[] = new \Kolab\CardDAV\AddressBookRoot($principal_backend, $carddav_backend);
+ }
+ if ($services['WEBDAV']) {
+ $nodes[] = new \Kolab\DAV\Collection(\Kolab\DAV\Collection::ROOT_DIRECTORY);
+ }
+}
+// register WebDAV service as root
+else if ($services['WEBDAV']) {
+ $nodes = new \Kolab\DAV\Collection('');
+}
// the object tree needs in turn to be passed to the server class
$server = new \Sabre\DAV\Server($nodes);
$server->setBaseUri($base_uri);
// register some plugins
$server->addPlugin(new \Sabre\DAV\Auth\Plugin($auth_backend, 'KolabDAV'));
$server->addPlugin(new \Sabre\DAVACL\Plugin());
-$server->addPlugin(new \Kolab\CardDAV\Plugin());
-$caldav_plugin = new \Kolab\CalDAV\Plugin();
-$caldav_plugin->setIMipHandler(new \Kolab\CalDAV\IMip());
-$server->addPlugin($caldav_plugin);
+if ($services['CALDAV']) {
+ $caldav_plugin = new \Kolab\CalDAV\Plugin();
+ $caldav_plugin->setIMipHandler(new \Kolab\CalDAV\IMip());
+ $server->addPlugin($caldav_plugin);
+}
-// the lock manager is reponsible for making sure users don't overwrite each others changes.
-// TODO: replace this with a class that manages locks in the Kolab backend
-$locks_backend = new \Sabre\DAV\Locks\Backend\File(KOLAB_DAV_ROOT . '/temp/locks');
-$server->addPlugin(new \Sabre\DAV\Locks\Plugin($locks_backend));
+if ($services['CARDDAV']) {
+ $server->addPlugin(new \Kolab\CardDAV\Plugin());
+}
+
+if ($services['WEBDAV']) {
+ // the lock manager is reponsible for making sure users don't overwrite each others changes.
+ // TODO: replace this with a class that manages locks in the Kolab backend
+ $locks_backend = new \Sabre\DAV\Locks\Backend\File(KOLAB_DAV_ROOT . '/temp/locks');
+ $server->addPlugin(new \Sabre\DAV\Locks\Plugin($locks_backend));
-// intercept some of the garbage files operation systems tend to generate when mounting a WebDAV share
-$server->addPlugin(new \Sabre\DAV\TemporaryFileFilterPlugin(KOLAB_DAV_ROOT . '/temp'));
+ // intercept some of the garbage files operation systems tend to generate when mounting a WebDAV share
+ $server->addPlugin(new \Sabre\DAV\TemporaryFileFilterPlugin(KOLAB_DAV_ROOT . '/temp'));
+}
// HTML UI for browser-based access (recommended only for development)
-$server->addPlugin(new \Sabre\DAV\Browser\Plugin());
+if (getenv('DAVBROWSER')) {
+ $server->addPlugin(new \Sabre\DAV\Browser\Plugin());
+}
// finally, process the request
$server->exec();
-
-// catch server response in debug log
-if ($debug) {
- $rcube->write_log('davdebug', "RESPONSE:\n" . ob_get_contents());
- ob_end_flush();
-
- if (function_exists('memory_get_peak_usage'))
- $mem = memory_get_peak_usage();
- else if (function_exists('memory_get_usage'))
- $mem = memory_get_usage();
-
- $log = $server->httpRequest->getMethod() . ': ' . $server->getRequestUri();
- $log .= ($mem ? sprintf(' [%.1f MB]', $mem/1024/1024) : '');
- if (defined('KOLAB_DAV_START')) {
- rcube::print_timer(KOLAB_DAV_START, $log);
- }
- else {
- rcube::console($log);
- }
-}

File Metadata

Mime Type
text/x-diff
Expires
Wed, Jul 8, 8:31 PM (1 d, 22 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1051950
Default Alt Text
(13 KB)

Event Timeline