openrat-webdav

git clone http://git.code.weiherhei.de/openrat-webdav.git
Log | Files | Refs | README

dav.php (3593B)


      1 <?php
      2 
      3 /**
      4  * WebDAV für OpenRat Content Management System<br>
      5  *
      6  * Das virtuelle Ordnersystem dieses CMS kann ueber das WebDAV-Protokoll
      7  * dargestellt werden.
      8  *
      9  * Diese Klasse nimmt die Anfragen von WebDAV-Clients entgegen, zerlegt die
     10  * Anfrage und erzeugt eine Antwort, die im HTTP-Body zurueck uebertragen
     11  * wird.
     12  * <br>
     13  * WebDAV ist spezifiziert in der RFC 2518.<br>
     14  * Siehe <code>http://www.ietf.org/rfc/rfc2518.txt</code><br>
     15  *
     16  * Implementiert wird DAV-Level 1 (d.h. ohne LOCK).
     17  *
     18  * Der Zugang über WebDAV beinhaltet einige Nachteile:
     19  * - Login ist nur mit Name/Kennwort möglich (kein OpenId)
     20  * - Nur die Standard-Datenbank kann verwendet werden
     21  * - Der Client muss Cookies unterstützen
     22  *
     23  * @author Jan Dankert
     24  * @package openrat.actions
     25  */
     26 
     27 
     28 
     29 if (!defined('E_STRICT'))
     30 	define('E_STRICT', 2048);
     31 
     32 define('TIME_20000101',946681200); // default time for objects without time information.
     33 
     34 
     35 require('./config.php');
     36 require('./cms/Client.class.php');
     37 require('./cms/CMS.class.php');
     38 
     39 require('./dav/exception/NotFoundException.php');
     40 require('./dav/exception/CMSForbiddenError.php');
     41 require('./dav/exception/CMSServerError.php');
     42 require('./dav/Logger.class.php');
     43 require('./dav/URIParser.class.php');
     44 require('./dav/DAV.class.php');
     45 
     46 Logger::trace( 'DAV config:'."\n".print_r($config,true));
     47 
     48 // PHP-Fehler ins Log schreiben, damit die Ausgabe nicht zerstoert wird.
     49 if (version_compare(PHP_VERSION, '5.0.0', '>'))
     50     set_error_handler('webdavErrorHandler',E_ERROR | E_WARNING);
     51 else
     52     set_error_handler('webdavErrorHandler');
     53 
     54 
     55 try {
     56 
     57 
     58     $httpMethod = strtoupper($_SERVER['REQUEST_METHOD']);
     59 
     60     $davMethodFile = './dav/method/'.$httpMethod.'.class.php';
     61 
     62     if   ( ! file_exists($davMethodFile ) )
     63     {
     64         Logger::warn('Unknown HTTP method '.$httpMethod);
     65         $this->httpStatus('405 Method Not Allowed' );
     66     }
     67 
     68     require( $davMethodFile );
     69 
     70     $davClass = new ReflectionClass('DAV_'.$httpMethod );
     71     $davAction = $davClass->newInstance();
     72     $davAction->execute();
     73 }
     74 catch( \dav\exception\CMSForbiddenError $e )
     75 {
     76     error_log('WEBDAV ERROR: '.$e->getMessage()."\n".$e->getTraceAsString() );
     77 
     78     // Wir teilen dem Client mit, dass auf dem Server was schief gelaufen ist.
     79     header('HTTP/1.1 403 Forbidden');
     80     echo 'WebDAV-Request failed'."\n".$e->getTraceAsString();
     81 }
     82 catch( \dav\exception\CMSServerError $e )
     83 {
     84     error_log('WEBDAV ERROR: '.$e->getMessage()."\n".$e->getTraceAsString() );
     85 
     86     // Wir teilen dem Client mit, dass auf dem Server was schief gelaufen ist.
     87     header('HTTP/1.1 503 CMS Server Error');
     88     echo 'WebDAV-Request failed'."\n".$e->getTraceAsString();
     89 }
     90 catch( Exception $e )
     91 {
     92     error_log('WEBDAV ERROR: '.$e->getMessage()."\n".$e->getTraceAsString() );
     93 
     94     // Wir teilen dem Client mit, dass auf dem Server was schief gelaufen ist.
     95     header('HTTP/1.1 503 Internal DAV Error');
     96     echo 'WebDAV-Request failed'."\n".$e->getTraceAsString();
     97 }
     98 
     99 /**
    100  * Fehler-Handler fuer WEBDAV.<br>
    101  * Bei einem Laufzeitfehler ist eine Ausgabe des Fehlers auf der Standardausgabe sinnlos,
    102  * da der WebDAV-Client dies nicht lesen oder erkennen kann.
    103  * Daher wird der Fehler-Handler umgebogen, so dass nur ein Logeintrag sowie ein
    104  * Server-Fehler erzeugt wird.
    105  */
    106 function webdavErrorHandler($errno, $errstr, $errfile, $errline)
    107 {
    108 	error_log('WEBDAV ERROR: '.$errno.'/'.$errstr.'/file:'.$errfile.'/line:'.$errline);
    109 
    110 
    111     header('HTTP/1.1 503 Internal WebDAV Server Error');
    112 
    113     // Wir teilen dem Client mit, dass auf dem Server was schief gelaufen ist.
    114 	echo 'DAV-Request failed with "'.$errstr.'"';
    115 	exit;
    116 }