diff --git a/files/webdav.php b/files/webdav.php new file mode 100644 index 0000000000..9e4a674c3a --- /dev/null +++ b/files/webdav.php @@ -0,0 +1,98 @@ + + * @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); + +// temporary mount ownCloud default /clientsync as /home/$user, if not explicitly mounted +// so ownCloud dir contains users home-dir by default +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', null, false); + 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/phpgwapi/inc/class.egw_vfs.inc.php b/phpgwapi/inc/class.egw_vfs.inc.php index db82a925f8..20060cd029 100644 --- a/phpgwapi/inc/class.egw_vfs.inc.php +++ b/phpgwapi/inc/class.egw_vfs.inc.php @@ -300,9 +300,10 @@ class egw_vfs extends vfs_stream_wrapper * @param string $path=null path to mount the filesystem in the vfs, eg. / * @param boolean $check_url=null check if url is an existing directory, before mounting it * default null only checks if url does not contain a $ as used in $user or $pass + * @param boolean $persitent_mount=true create a persitent mount, or only a temprary for current request * @return array|boolean array with fstab, if called without parameter or true on successful mount */ - static function mount($url=null,$path=null,$check_url=null) + static function mount($url=null,$path=null,$check_url=null,$persitent_mount=true) { if (is_null($check_url)) $check_url = strpos($url,'$') === false; @@ -341,12 +342,15 @@ class egw_vfs extends vfs_stream_wrapper uksort(self::$fstab,create_function('$a,$b','return strlen($a)-strlen($b);')); - config::save_value('vfs_fstab',self::$fstab,'phpgwapi'); - $GLOBALS['egw_info']['server']['vfs_fstab'] = self::$fstab; - // invalidate session cache - if (method_exists($GLOBALS['egw'],'invalidate_session_cache')) // egw object in setup is limited + if ($persitent_mount) { - $GLOBALS['egw']->invalidate_session_cache(); + config::save_value('vfs_fstab',self::$fstab,'phpgwapi'); + $GLOBALS['egw_info']['server']['vfs_fstab'] = self::$fstab; + // invalidate session cache + if (method_exists($GLOBALS['egw'],'invalidate_session_cache')) // egw object in setup is limited + { + $GLOBALS['egw']->invalidate_session_cache(); + } } if (self::LOG_LEVEL > 1) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') returns true (successful new mount).'); return true; 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' => '', +));