From 503e5cada3656a6d9ac519921f4c8bf2614d47bb Mon Sep 17 00:00:00 2001 From: Jakob Sack Date: Fri, 2 Mar 2012 20:25:20 +0100 Subject: [PATCH] Add /dav.php, a single location bundling all *DAV-operations. --- apps/calendar/appinfo/app.php | 5 ++- apps/calendar/lib/hooks.php | 15 ++++++- apps/contacts/appinfo/app.php | 1 + apps/contacts/lib/hooks.php | 12 ++++++ dav.php | 77 +++++++++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 dav.php diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php index 174bc009e4..0968737219 100644 --- a/apps/calendar/appinfo/app.php +++ b/apps/calendar/appinfo/app.php @@ -8,12 +8,13 @@ if(version_compare(PHP_VERSION, '5.3.0', '>=')){ OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/connector_sabre.php'; OC::$CLASSPATH['OC_Search_Provider_Calendar'] = 'apps/calendar/lib/search.php'; OC_HOOK::connect('OC_User', 'post_deleteUser', 'OC_Calendar_Hooks', 'deleteUser'); + OC_Hook::connect('OC_DAV', 'initialize', 'OC_Calendar_Hooks', 'initializeCalDAV'); OC_Util::addScript('calendar','loader'); - OC_App::register( array( + OC_App::register( array( 'order' => 10, 'id' => 'calendar', 'name' => 'Calendar' )); - OC_App::addNavigationEntry( array( + OC_App::addNavigationEntry( array( 'id' => 'calendar_index', 'order' => 10, 'href' => OC_Helper::linkTo( 'calendar', 'index.php' ), diff --git a/apps/calendar/lib/hooks.php b/apps/calendar/lib/hooks.php index 14f96bb5fe..54f1680a36 100644 --- a/apps/calendar/lib/hooks.php +++ b/apps/calendar/lib/hooks.php @@ -17,11 +17,24 @@ class OC_Calendar_Hooks{ */ public static function deleteUser($parameters) { $calendars = OC_Calendar_Calendar::allCalendars($parameters['uid']); - + foreach($calendars as $calendar) { OC_Calendar_Calendar::deleteCalendar($calendar['id']); } return true; } + + /** + * @brief Adds the CardDAV resource to the DAV server + * @param paramters parameters from initialize-Hook + * @return array + */ + public static function initializeCalDAV($parameters){ + // We need a backend, the root node and the caldav plugin + $parameters['backends']['caldav'] = new OC_Connector_Sabre_CalDAV(); + $parameters['nodes'][] = new Sabre_CalDAV_CalendarRootNode($parameters['backends']['principal'], $parameters['backends']['caldav']); + $parameters['plugins'][] = new Sabre_CalDAV_Plugin(); + return true; + } } diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php index 63833dd5cd..85c383c4c3 100644 --- a/apps/contacts/appinfo/app.php +++ b/apps/contacts/appinfo/app.php @@ -8,6 +8,7 @@ OC::$CLASSPATH['OC_Search_Provider_Contacts'] = 'apps/contacts/lib/search.php'; OC_HOOK::connect('OC_User', 'post_deleteUser', 'OC_Contacts_Hooks', 'deleteUser'); OC_HOOK::connect('OC_Calendar', 'getEvents', 'OC_Contacts_Hooks', 'getBirthdayEvents'); OC_HOOK::connect('OC_Calendar', 'getSources', 'OC_Contacts_Hooks', 'getCalenderSources'); +OC_Hook::connect('OC_DAV', 'initialize', 'OC_Contacts_Hooks', 'initializeCardDAV'); OC_App::register( array( 'order' => 10, diff --git a/apps/contacts/lib/hooks.php b/apps/contacts/lib/hooks.php index b858c4a5a4..2fe4afe716 100644 --- a/apps/contacts/lib/hooks.php +++ b/apps/contacts/lib/hooks.php @@ -39,6 +39,18 @@ class OC_Contacts_Hooks{ return true; } + /** + * @brief Adds the CardDAV resource to the DAV server + * @param paramters parameters from initialize-Hook + * @return array + */ + static public function initializeCardDAV($parameters){ + // We need a backend, the root node and the carddav plugin + $parameters['backends']['carddav'] = new OC_Connector_Sabre_CardDAV(); + $parameters['nodes'][] = new Sabre_CardDAV_AddressBookRoot($parameters['backends']['principal'], $parameters['backends']['carddav']); + $parameters['plugins'][] = new Sabre_CardDAV_Plugin(); + return true; + static public function getCalenderSources($parameters) { $base_url = OC_Helper::linkTo('calendar', 'ajax/events.php').'?calendar_id='; foreach(OC_Contacts_Addressbook::all(OC_User::getUser()) as $addressbook) { diff --git a/dav.php b/dav.php new file mode 100644 index 0000000000..78e2711aec --- /dev/null +++ b/dav.php @@ -0,0 +1,77 @@ +. +* +*/ + +require_once('lib/base.php'); + +// Backends we always need (auth, principal and files) +$backends = array( + 'auth' => new OC_Connector_Sabre_Auth(), + 'principal' => new OC_Connector_Sabre_Principal() +); + +// Root nodes +$nodes = array( + new Sabre_CalDAV_Principal_Collection($backends['principal']) +); + +// Plugins +$plugins = array( + new Sabre_DAV_Auth_Plugin($backends['auth'],'ownCloud'), + new Sabre_DAVACL_Plugin(), + new Sabre_DAV_Browser_Plugin(false) // Show something in the Browser, but no upload +); + +// Load the plugins etc we need for usual file sharing +$backends['lock'] = new OC_Connector_Sabre_Locks(); +$plugins[] = new Sabre_DAV_Locks_Plugin($backends['lock']); +// Add a RESTful user directory +// /files/$username/ +if( OC_User::isLoggedIn()){ + $currentuser = OC_User::getUser(); + $files = new Sabre_DAV_SimpleCollection('files'); + foreach( OC_User::getUsers() as $username ){ + if( $username == $currentuser ){ + $public = new OC_Connector_Sabre_Directory('.'); + $files->addChild( new Sabre_DAV_SimpleCollection( $username, $public->getChildren())); + } + else{ + $files->addChild(new Sabre_DAV_SimpleCollection( $username )); + } + } + $nodes[] = $files; +} + +// Get the other plugins and nodes +OC_Hook::emit( 'OC_DAV', 'initialize', array( 'backends' => &$backends, 'nodes' => &$nodes, 'plugins' => &$plugins )); + +// Fire up server +$server = new Sabre_DAV_Server($nodes); +$server->setBaseUri(OC::$WEBROOT.'/dav.php'); + +// Load additional plugins +foreach( $plugins as &$plugin ){ + $server->addPlugin( $plugin ); +} unset( $plugin ); // Always do this after foreach with references! + +// And off we go! +$server->exec();