ktwebdavserver.inc.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 1,579 行 · 第 1/5 页

SVN-BASE
1,579
字号
<?php/** * $Id$ * * KnowledgeTree Community Edition * Document Management Made Simple * Copyright (C) 2008 KnowledgeTree Inc. * Portions copyright The Jam Warehouse Software (Pty) Limited *  * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more * details. *  * You should have received a copy of the GNU General Public License * along with this program.  If not, see <http://www.gnu.org/licenses/>. *  * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,  * California 94120-7775, or email info@knowledgetree.com. *  * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. *  * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the  * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original  * copyright notice. * Contributor( s): ______________________________________ * */require_once 'HTTP/WebDAV/Server.php'; // thirdparty PEARrequire_once 'Config.php';             // thirdparty PEARrequire_once 'Log.php';                // thirdparty PEAR$userAgentValue = $_SERVER['HTTP_USER_AGENT'];if (stristr($userAgentValue, "Microsoft Data Access Internet Publishing Provider DAV")) {    // Fix for Novell Netdrive    chdir(realpath(dirname(__FILE__)));    require_once '../../config/dmsDefaults.php'; // This is our plug into KT.}else{    require_once '../config/dmsDefaults.php'; // This is our plug into KT.}DEFINE('STATUS_WEBDAV', 5);  // Status code to handle 0 byte PUT    FIXME: Do we still need this!/** * KnowledgeTree access using WebDAV protocol * * @access public */class KTWebDAVServer extends HTTP_WebDAV_Server{    /**     * String to be used in "X-Dav-Powered-By" header     *     * @var string     */    var $dav_powered_by = 'KTWebDAV (1.0.0)';    /**     * Realm string to be used in authentication     *     * @var string     */    var $http_auth_realm = 'KTWebDAV Server';    /**     * Path to KT install root     *     * @var string     */    var $ktdmsPath = '';    /**     * Debug Info Toggle     *     * @var string     */    var $debugInfo = 'off';    /**     * Safe Mode Toggle     *     * @var string     */    var $safeMode = 'on';    /**     * Configuration Array     *     * @var array     */    var $config = array();    /**     * Settings Section Configuration Array     *     * @var array     */    var $settings = array();    /**     * Current User ID     *     * @var int     */    var $userID;    /**     * Current Method     *     * @var string     */    var $currentMethod;    /**     * Last Created Folder ID     *     * @var string     */    var $lastFolderID;    /**     * DAV Client     *     * @var String     */    var $dav_client;    /**     * Root Folder Name     *     * @var String     */    var $rootFolder = 'Root Folder';    /**     * Last Message     *     * @var String     */    var $lastMsg = '';    /**     * Constructor     *     * @param void     * @return void     */    function KTWebDAVServer() {        // CGI compatible auth setup        $altinfo = KTUtil::arrayGet( $_SERVER, 'kt_auth', KTUtil::arrayGet( $_SERVER, 'REDIRECT_kt_auth'));        if ( !empty( $altinfo) && !isset( $_SERVER['PHP_AUTH_USER'])) {            $val = $altinfo;            $pieces = explode( ' ', $val);   // bad.            if ( $pieces[0] == 'Basic') {                $chunk = $pieces[1];                $decoded = base64_decode( $chunk);                $credential_info = explode( ':', $decoded);                if ( count( $credential_info) == 2) {                    $_SERVER['PHP_AUTH_USER'] = $credential_info[0];                    $_SERVER['PHP_AUTH_PW'] = $credential_info[1];                    $_SERVER["AUTH_TYPE"] = 'Basic';                }            }        }        // Let the base class do it's thing        parent::HTTP_WebDAV_Server();        // Load KTWebDAV config        if (!$this->initConfig()) {            $this->ktwebdavLog('Could not load configuration.', 'error');            exit(0);        }        if ($this->debugInfo == 'on') {            $this->ktwebdavLog('=====================');            $this->ktwebdavLog('  Debug Info is : ' . $this->debugInfo);            $this->ktwebdavLog('    SafeMode is : ' . $this->safeMode);            $this->ktwebdavLog(' Root Folder is : ' . $this->rootFolder);            $this->ktwebdavLog('=====================');        }    }    /**     * Load KTWebDAV configuration from conf file     *     * @param void     * @return bool	true on success     */    function initConfig() {        global $default;        $oConfig =& KTConfig::getSingleton();        // Assign Content        $this->debugInfo = $oConfig->get('KTWebDAVSettings/debug', 'off');        $this->safeMode = $oConfig->get('KTWebDAVSettings/safemode', 'on');        $this->rootFolder = $oConfig->get('KTWebDAVSettings/rootfolder', 'Root Folder');        $this->kt_version = $default->systemVersion;        return true;    }    /**     * Log to the KTWebDAV logfile     *     * @todo Add other log levels for warning, profile, etc     * @param string    log message     * @param bool    debug only?     * @return bool	true on success     */    function ktwebdavLog($entry, $type = 'info', $debug_only = false) {        if ($debug_only && $this->debugInfo != 'on') return false;        $ident = 'KTWEBDAV';        $conf = array('mode' => 0644, 'timeFormat' => '%X %x');        $logger = &Log::singleton('file', '../var/log/ktwebdav-' . date('Y-m-d') . '.txt', $ident, $conf);        if ($type == 'error') $logger->log($entry, PEAR_LOG_ERR);        else $logger->log($entry, PEAR_LOG_INFO);        return true;    }    /**     * Get the current UserID     *     * @access private     * @param  void     * @return int userID     */    function _getUserID() {        return $this->userID;    }    /**     * Set the current UserID     *     * @access private     * @param  void     * @return int UserID     */    function _setUserID($iUserID) {        return $this->userID = $iUserID;    }    /**     * Serve a webdav request     *     * @access public     * @param  void     * @return void     */    function ServeRequest()	{        global $default;        if ($this->debugInfo == 'on') {            $this->ktwebdavLog('_SERVER is ' . print_r($_SERVER, true), 'info', true);        }        // Get the client info        $this->checkSafeMode();        // identify ourselves        $this->ktwebdavLog('WebDAV Server : ' . $this->dav_powered_by . ' [KT:'.$default->systemVersion."]", 'info', true);        header('X-Dav-Powered-By: '.$this->dav_powered_by . ' [KT:'.$default->systemVersion.']');        // check authentication        if (!$this->_check_auth()) {            $this->ktwebdavLog('401 Unauthorized - Authorisation failed.' .$this->lastMsg, 'info', true);            $this->ktwebdavLog('----------------------------------------', 'info', true);            $this->http_status('401 Unauthorized - Authorisation failed. ' .$this->lastMsg);            // RFC2518 says we must use Digest instead of Basic            // but Microsoft Clients do not support Digest            // and we don't support NTLM and Kerberos            // so we are stuck with Basic here            header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"');            return;        }        // check        if(! $this->_check_if_header_conditions()) {            $this->http_status('412 Precondition failed');            return;        }        // set path        $request_uri = $this->_urldecode(!empty($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/');        $this->path = str_replace($_SERVER['SCRIPT_NAME'], '', $request_uri);        if(ini_get('magic_quotes_gpc')) {            $this->path = stripslashes($this->path);        }        $this->ktwebdavLog('PATH_INFO is ' . $_SERVER['PATH_INFO'], 'info', true);        $this->ktwebdavLog('REQUEST_URI is ' . $_SERVER['REQUEST_URI'], 'info', true);        $this->ktwebdavLog('SCRIPT_NAME is ' . $_SERVER['SCRIPT_NAME'], 'info', true);        $this->ktwebdavLog('PHP_SELF is ' . $_SERVER['PHP_SELF'], 'info', true);        $this->ktwebdavLog('path set to ' . $this->path, 'info', true);        // detect requested method names

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?