From 154c601157c581f06dc0651fc91d4b57683483d4 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 12 Jul 2012 08:20:33 +0000 Subject: [PATCH] * Filemanager: support for ownCloud WebDAV clients which keep a local directory in sync with server (by default users home-dir with local ownCloud dir, thought other dirs can be configured as well) --- files/webdav.php | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ status.php | 35 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 files/webdav.php create mode 100644 status.php diff --git a/files/webdav.php b/files/webdav.php new file mode 100644 index 0000000000..a55021b234 --- /dev/null +++ b/files/webdav.php @@ -0,0 +1,95 @@ + + * @copyright (c) 2006-12 by Ralf Becker + * @version $Id$ + */ + +$starttime = microtime(true); + +/** + * check if the given user has access + * + * Create a session or if the user has no account return authenticate header and 401 Unauthorized + * + * @param array &$account + * @return int session-id + */ +function check_access(&$account) +{ + if (isset($_GET['auth'])) + { + list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']) = explode(':',base64_decode($_GET['auth']),2); + } + return egw_digest_auth::autocreate_session_callback($account); +} + +$GLOBALS['egw_info'] = array( + 'flags' => array( + 'disable_Template_class' => True, + 'noheader' => True, + 'currentapp' => preg_match('|/webdav.php/apps/([A-Za-z0-9_-]+)/|', $_SERVER['REQUEST_URI'], $matches) ? $matches[1] : 'filemanager', + 'autocreate_session_callback' => 'check_access', + 'no_exception_handler' => 'basic_auth', // we use a basic auth exception handler (sends exception message as basic auth realm) + 'auth_realm' => 'EGroupware WebDAV server', // cant use vfs_webdav_server::REALM as autoloading and include path not yet setup! + ) +); +require_once('../phpgwapi/inc/class.egw_digest_auth.inc.php'); + +// if you move this file somewhere else, you need to adapt the path to the header! +try +{ + include(dirname(__DIR__).'/header.inc.php'); +} +catch (egw_exception_no_permission_app $e) +{ + if (isset($GLOBALS['egw_info']['user']['apps']['filemanager'])) + { + $GLOBALS['egw_info']['currentapp'] = 'filemanager'; + } + elseif (isset($GLOBALS['egw_info']['user']['apps']['sitemgr-link'])) + { + $GLOBALS['egw_info']['currentapp'] = 'sitemgr-link'; + } + else + { + throw $e; + } +} +//$headertime = microtime(true); + +// automatically mount ownCloud default /clientsync as /home/$user, so ownCloud dir contains users home-dir +if (strpos($_SERVER['REQUEST_URI'],'/webdav.php/clientsync') !== false && + ($fstab=egw_vfs::mount()) && !isset($fstab['/clientsync'])) +{ + $is_root_backup = egw_vfs::$is_root; + egw_vfs::$is_root = true; + $ok = egw_vfs::mount($url='vfs://default/home/$user',$clientsync='/clientsync'); + egw_vfs::$is_root = $is_root_backup; + error_log("mounting ownCloud default '$clientsync' as '$url' ".($ok ? 'successful' : 'failed!')); +} + +// webdav is stateless: we dont need to keep the session open, it only blocks other calls to same basic-auth session +$GLOBALS['egw']->session->commit_session(); + +$webdav_server = new vfs_webdav_server(); +$user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); +if (strstr($user_agent, 'microsoft-webdav') !== false || + strstr($user_agent, 'neon') !== false || + strstr($user_agent, 'bitkinex') !== false) +{ + // Windows 7 et.al. special treatment + $webdav_server->cnrnd = true; +} +$webdav_server->ServeRequest(); +//error_log(sprintf('WebDAV %s request: status "%s", took %5.3f s'.($headertime?' (header include took %5.3f s)':''),$_SERVER['REQUEST_METHOD'].' '.$_SERVER['PATH_INFO'],$webdav_server->_http_status,microtime(true)-$starttime,$headertime-$starttime)); diff --git a/status.php b/status.php new file mode 100644 index 0000000000..7dbecc3d66 --- /dev/null +++ b/status.php @@ -0,0 +1,35 @@ + + * @copyright (c) 2006-12 by Ralf Becker + * @version $Id$ + */ +// forward for not existing or empty header to setup +if(!file_exists('header.inc.php') || !filesize('header.inc.php')) +{ + Header('Location: setup/index.php'); + exit; +} +$GLOBALS['egw_info'] = array( + 'flags' => array( + 'currentapp' => 'login', + 'noheader' => True, + ) +); +include 'header.inc.php'; + +echo json_encode(array( + 'installed' => 'true', + 'version' => '4.80.1', + 'versionstring' => 'EGroupware '.$GLOBALS['egw_info']['server']['versions']['phpgwapi'], + 'edition' => '', +));