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 + -
显示快捷键?