ktwebdavserver.inc.php.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 1,579 行 · 第 1/5 页
SVN-BASE
1,579 行
$method = strtolower($_SERVER['REQUEST_METHOD']); $wrapper = 'http_'.$method; $this->currentMethod = $method; // activate HEAD emulation by GET if no HEAD method found if ($method == 'head' && !method_exists($this, 'head')) { // rfc2068 Sec: 10.2.1 //HEAD the entity-header fields corresponding to the requested resource // are sent in the response without any message-body $method = 'get'; } $this->ktwebdavLog("Entering $method request", 'info', true); if (method_exists($this, $wrapper) && ($method == 'options' || method_exists($this, $method))) { $this->$wrapper(); // call method by name } else { // method not found/implemented if ($_SERVER['REQUEST_METHOD'] == 'LOCK') { $this->http_status('412 Precondition failed'); } else { $this->http_status('405 Method not allowed'); header('Allow: '.join(', ', $this->_allow())); // tell client what's allowed } } $this->ktwebdavLog("Exiting $method request", 'info', true); } /** * check authentication if check is implemented * * @param void * @return bool true if authentication succeded or not necessary */ function _check_auth() { $this->ktwebdavLog('Entering _check_auth...', 'info', true); if (method_exists($this, 'checkAuth')) { // PEAR style method name return $this->checkAuth(@$_SERVER['AUTH_TYPE'], @$_SERVER['PHP_AUTH_USER'], @$_SERVER['PHP_AUTH_PW']); } else if (method_exists($this, 'check_auth')) { // old (pre 1.0) method name return $this->check_auth(@$_SERVER['AUTH_TYPE'], @$_SERVER['PHP_AUTH_USER'], @$_SERVER['PHP_AUTH_PW']); } else { // no method found -> no authentication required return true; } } /** * Authenticate user * * @access private * @param string HTTP Authentication type (Basic, Digest, ...) * @param string Username * @param string Password * @return bool true on successful authentication */ function checkAuth($sType, $sUser, $sPass) { $this->ktwebdavLog('Entering checkAuth params are: ', 'info', true); $this->ktwebdavLog('sType: ' . $sType, 'info', true); $this->ktwebdavLog('sUser: ' . $sUser, 'info', true); $this->ktwebdavLog('sPass: ' . $sPass, 'info', true); // Authenticate user require_once(KT_LIB_DIR . '/authentication/authenticationutil.inc.php'); if ( empty($sUser) ) { $this->ktwebdavLog('sUser is empty, returning false.', 'info', true); return false; } if ( empty($sPass) ) { $this->ktwebdavLog('sPass is empty, returning false.', 'info', true); return false; } $sUser = iconv('ISO-8859-1', 'UTF-8', $sUser); $sPass = iconv('ISO-8859-1', 'UTF-8', $sPass); $oUser =& User::getByUsername($sUser); if (PEAR::isError($oUser) || ($oUser === false)) { $this->ktwebdavLog('User not found: ' . $sUser . '.', 'error'); $this->lastMsg = 'User not found: ' . $sUser . '.'; return false; } $authenticated = KTAuthenticationUtil::checkPassword($oUser, $sPass); if ($authenticated === false) { $this->ktwebdavLog('Password incorrect for ' . $sUser . '.', 'error'); $this->lastMsg = 'Password incorrect for ' . $sUser . '.'; return false; } if (PEAR::isError($authenticated)) { $this->ktwebdavLog('Password incorrect for ' . $sUser . '.', 'error'); $this->lastMsg = 'Password incorrect for ' . $sUser . '.'; return false; } $oUser->setLastLogin(date('Y-m-d H:i:s')); $oUser->update(); $this->ktwebdavLog('Session ID is: '.$sessionID, 'info', true); $this->ktwebdavLog('UserID is: ' . $oUser->getId(), 'info', true ); $this->_setUserID($oUser->getId()); $_SESSION['userID'] = $this->_getUserID(); $this->ktwebdavLog('SESSION UserID is: ' . $_SESSION['userID'], 'info', true ); $this->ktwebdavLog("Authentication Success.", 'info', true); return true; } /** * PROPFIND method handler * * @param array options * @param array return array for file properties * @return bool true on success */ function PROPFIND(&$options, &$files) { $this->ktwebdavLog("Entering PROPFIND. options are " . print_r($options, true), 'info', true); global $default; $fspath = $default->documentRoot . "/" . $this->rootFolder . $options["path"]; $this->ktwebdavLog("fspath is " . $fspath, 'info', true); $path = $options["path"]; // Fix for the Mac Goliath Client // Mac adds DS_Store files when folders are added and ._filename files when files are added // The PUT function doesn't add these files to the dms but PROPFIND still looks for the .DS_Store file, // and returns an error if not found. We emulate its existence by returning a positive result. if($this->dav_client == 'MG'){ // Remove filename from path $aPath = explode('/', $path); $fileName = $aPath[count($aPath)-1]; if(strtolower($fileName) == '.ds_store'){ $this->ktwebdavLog("Using a Mac client. Filename is .DS_Store so we emulate a positive result.", 'info', true); // ignore return true; } if($fileName[0] == '.' && $fileName[1] == '_'){ $this->ktwebdavLog("Using a Mac client. Filename is ._Filename so we emulate a positive result.", 'info', true); // ignore return true; } } list($iFolderID, $iDocumentID) = $this->_folderOrDocument($path); $this->ktwebdavLog("Folder/Doc is " . print_r(array($iFolderID, $iDocumentID), true), 'info', true); // Folder does not exist if($iFolderID == '') return false; if (is_null($iDocumentID)) { return $this->_PROPFINDFolder($options, $files, $iFolderID); } return $this->_PROPFINDDocument($options, $files, $iDocumentID); } /** * PROPFIND helper for Folders * * @param array options * @param array Return array for file props * @param int Folder ID * @return bool true on success */ function _PROPFINDFolder(&$options, &$files, $iFolderID) { global $default; $this->ktwebdavLog("Entering PROPFINDFolder. options are " . print_r($options, true), 'info', true); $folder_path = $options["path"]; if (substr($folder_path, -1) != "/") { $folder_path .= "/"; } $options["path"] = $folder_path; $files["files"] = array(); $files["files"][] = $this->_fileinfoForFolderID($iFolderID, $folder_path); $oPerm =& KTPermission::getByName('ktcore.permissions.read'); $oUser =& User::get($this->userID); if (!empty($options["depth"])) { $aChildren = Folder::getList(array('parent_id = ?', $iFolderID)); // FIXME: Truncation Time Workaround //foreach (array_slice($aChildren, 0, 50) as $oChildFolder) { foreach ($aChildren as $oChildFolder) { // Check if the user has permissions to view this folder $oFolderDetailsPerm =& KTPermission::getByName('ktcore.permissions.folder_details'); if(KTPermissionUtil::userHasPermissionOnItem($oUser, $oFolderDetailsPerm, $oChildFolder)) { $this->ktwebdavLog("Folder Details permissions GRANTED for user ". $_SESSION["userID"] ." on folder " . $oChildFolder->getName(), 'info', true); $files["files"][] = $this->_fileinfoForFolder($oChildFolder, $folder_path . $oChildFolder->getName()); } else { $this->ktwebdavLog("Folder Details permissions DENIED for ". $_SESSION["userID"] ." on folder " . $oChildFolder->getName(), 'info', true); } } $aDocumentChildren = Document::getList(array('folder_id = ? AND status_id = 1', $iFolderID)); // FIXME: Truncation Time Workaround //foreach (array_slice($aDocumentChildren, 0, 50) as $oChildDocument) { foreach ($aDocumentChildren as $oChildDocument) { // Check if the user has permissions to view this document if (KTPermissionUtil::userHasPermissionOnItem($oUser, $oPerm, $oChildDocument)) { $this->ktwebdavLog("Read permissions GRANTED for ". $_SESSION["userID"] ." on document " . $oChildDocument->getName(), 'info', true); $files["files"][] = $this->_fileinfoForDocument($oChildDocument, $folder_path . $oChildDocument->getFileName()); } else $this->ktwebdavLog("Read permissions DENIED for ". $_SESSION["userID"] ." on document " . $oChildDocument->getName(), 'info', true); } } return true; } /** * PROPFIND helper for Documents * * @param array options * @param array Return array for file props * @param int Document ID * @return bool true on success */ function _PROPFINDDocument(&$options, &$files, $iDocumentID) { global $default; $this->ktwebdavLog("Entering PROPFINDDocument. files are " . print_r($files, true), 'info', true); $res = $this->_fileinfoForDocumentID($iDocumentID, $options["path"]); $this->ktwebdavLog("_fileinfoForDocumentID result is " . print_r($res, true), 'info', true); if ($res === false) { return false; } $files["files"] = array(); $files["files"][] = $res; return true; } /** * PROPFIND helper for Document Info * * @param Document Document Object * @param string Path * @return array Doc info array */ function _fileinfoForDocument(&$oDocument, $path) { global $default; $this->ktwebdavLog("Entering _fileinfoForDocument. Document is " . print_r($oDocument, true), 'info', true); $fspath = $default->documentRoot . "/" . $this->rootFolder . $path; $this->ktwebdavLog("fspath is " . $fspath, 'info', true); // create result array // Modified - 25/10/07 - spaces prevent files displaying in finder if($this->dav_client == 'MC'){ $path = str_replace('%2F', '/', urlencode($path)); } $path = str_replace('&', '%26', $path); $info = array(); $info["path"] = $path; $info["props"] = array(); // no special beautified displayname here ... $info["props"][] = $this->mkprop("displayname", $oDocument->getName()); // creation and modification time $info["props"][] = $this->mkprop("creationdate", strtotime($oDocument->getCreatedDateTime())); $info["props"][] = $this->mkprop("getlastmodified", strtotime($oDocument->getVersionCreated())); // plain file (WebDAV resource) $info["props"][] = $this->mkprop("resourcetype", ''); // FIXME: Direct database access $sQuery = array("SELECT mimetypes FROM $default->mimetypes_table WHERE id = ?", array($oDocument->getMimeTypeID())); $res = DBUtil::getOneResultKey($sQuery, 'mimetypes'); $info["props"][] = $this->mkprop("getcontenttype", $res); $info["props"][] = $this->mkprop("getcontentlength", $oDocument->getFileSize()); // explorer wants these? $info["props"][] = $this->mkprop("name", ''); $info["props"][] = $this->mkprop("parentname", ''); $info["props"][] = $this->mkprop("href", ''); $info["props"][] = $this->mkprop("ishidden", ''); $info["props"][] = $this->mkprop("iscollection", ''); $info["props"][] = $this->mkprop("isreadonly", ''); $info["props"][] = $this->mkprop("contentclass", ''); $info["props"][] = $this->mkprop("getcontentlanguage", ''); $info["props"][] = $this->mkprop("lastaccessed", ''); $info["props"][] = $this->mkprop("isstructureddocument", ''); $info["props"][] = $this->mkprop("defaultdocument", ''); $info["props"][] = $this->mkprop("isroot", ''); return $info; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?