File dav.php

Last commit: Wed Nov 6 23:20:27 2019 +0100	Jan Dankert	Refactoring: Forward CMS errors to the DAV client.
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 }
Download dav.php
History Wed, 6 Nov 2019 23:20:27 +0100 Jan Dankert Refactoring: Forward CMS errors to the DAV client. Wed, 6 Nov 2019 23:14:55 +0100 Jan Dankert Refactoring: Externalize config reader Tue, 5 Nov 2019 00:03:44 +0100 Jan Dankert Fix: WebDAV was renamed to DAV. Mon, 4 Nov 2019 23:56:38 +0100 Jan Dankert Refactoring: Renaming WebDAV to DAV base class. Mon, 4 Nov 2019 23:54:13 +0100 Jan Dankert Refactoring: Splitting DAV methods into single files. Mon, 4 Nov 2019 23:03:10 +0100 Jan Dankert Refactoring: Cleaned up the folder structure. Thu, 31 Oct 2019 02:13:16 +0100 Jan Dankert Fix: Directories are now browseable. Wed, 30 Oct 2019 00:36:46 +0100 Jan Dankert Refactoring: URIParser has now its own class; Fix: Read root folder of projects. Mon, 15 Apr 2019 23:02:33 +0200 Jan Dankert moved from repository openrat-cms into this fresh new repository.