From: Marc L. <ma...@ma...> - 2010-12-14 20:04:04
|
Hi! I have a use case where I would like to use this feature. http://dev.tiki.org/Translation+memory#WebDAV Some feedback on feature: 1- WebDAV feature is now dependent on File galleries being activated. This now should be Wiki or File Gallery. Or this should be split into 2 features. Or something :-) 2- If you have any extra info/documentation, please add here: http://doc.tiki.org/WebDAV+access+to+Wiki+Pages 3- I hope there could be a button "open in WebDAV" in each wiki page 4- With BitKinex, I can "open" the page in MS Word (maintaining wiki syntax), great! But as you will see below, I can't edit & save. Resolving host name "demo.tiki.org" ... Connecting ( demo.tiki.org => ip: 72.34.60.179, port: 80 ) Connected (72.34.60.179:80) <<< PROPFIND /trunk/tiki-webdav-wiki.php/ HTTP/1.1 <<< Host: demo.tiki.org <<< User-Agent: BitKinex/3.2.3 <<< Accept: */* <<< Pragma: no-cache <<< Cache-Control: no-cache <<< Depth: 1 <<< Content-Length: 220 <<< Content-Type: text/xml >>> HTTP/1.1 401 Unauthorized >>> Date: Thu, 09 Dec 2010 21:49:43 GMT >>> Server: Apache >>> X-Powered-By: PHP/5.2.9 >>> Expires: Thu, 19 Nov 1981 08:52:00 GMT >>> Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 >>> Pragma: no-cache >>> WWW-Authenticate: Basic realm="Tiki WebDAV access" >>> Set-Cookie: PHPSESSID=7f6a86e5a5286e27629b5da0b6188870; path=/trunk/ >>> Set-Cookie: tab_last_query=%2Ftrunk%2Ftiki-webdav-wiki.phpa%3A0%3A%7B%7D >>> Set-Cookie: tab=1 >>> Set-Cookie: runs_before_js_detect=2; expires=Fri, 09-Dec-2011 21:49:44 GMT >>> Content-Length: 22 >>> Connection: close >>> Content-Type: text/plain; charset="utf-8" Connection closed Resolving host name "demo.tiki.org" ... Connecting ( demo.tiki.org => ip: 72.34.60.179, port: 80 ) Connected (72.34.60.179:80) <<< PROPFIND /trunk/tiki-webdav-wiki.php/ HTTP/1.1 <<< Host: demo.tiki.org <<< User-Agent: BitKinex/3.2.3 <<< Accept: */* <<< Pragma: no-cache <<< Cache-Control: no-cache <<< Cookie: runs_before_js_detect=2; PHPSESSID=7f6a86e5a5286e27629b5da0b6188870 <<< Depth: 1 <<< Content-Length: 220 <<< Content-Type: text/xml <<< Authorization: Basic YWRtaW46MTIzNDU= >>> HTTP/1.1 207 Multi-Status >>> Date: Thu, 09 Dec 2010 21:49:44 GMT >>> Server: Apache >>> X-Powered-By: PHP/5.2.9 >>> Expires: Thu, 19 Nov 1981 08:52:00 GMT >>> Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 >>> Pragma: no-cache >>> Set-Cookie: tab_last_query=%2Ftrunk%2Ftiki-webdav-wiki.phpa%3A0%3A%7B%7D >>> Set-Cookie: tab=1 >>> Set-Cookie: runs_before_js_detect=1; expires=Fri, 09-Dec-2011 21:49:44 GMT >>> Connection: close >>> Transfer-Encoding: chunked >>> Content-Type: text/xml; charset="utf-8" FIN received Connection closed Resolving host name "demo.tiki.org" ... Connecting ( demo.tiki.org => ip: 72.34.60.179, port: 80 ) Connected (72.34.60.179:80) <<< PROPFIND /trunk/tiki-webdav-wiki.php/ HTTP/1.1 <<< Host: demo.tiki.org <<< User-Agent: BitKinex/3.2.3 <<< Accept: */* <<< Pragma: no-cache <<< Cache-Control: no-cache <<< Cookie: runs_before_js_detect=1; PHPSESSID=7f6a86e5a5286e27629b5da0b6188870 <<< Depth: 1 <<< Content-Length: 220 <<< Content-Type: text/xml <<< Authorization: Basic YWRtaW46MTIzNDU= >>> HTTP/1.1 207 Multi-Status >>> Date: Thu, 09 Dec 2010 21:50:00 GMT >>> Server: Apache >>> X-Powered-By: PHP/5.2.9 >>> Expires: Thu, 19 Nov 1981 08:52:00 GMT >>> Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 >>> Pragma: no-cache >>> Set-Cookie: tab_last_query=%2Ftrunk%2Ftiki-webdav-wiki.phpa%3A0%3A%7B%7D >>> Set-Cookie: tab=1 >>> Set-Cookie: runs_before_js_detect=0; expires=Fri, 09-Dec-2011 21:50:00 GMT >>> Connection: close >>> Transfer-Encoding: chunked >>> Content-Type: text/xml; charset="utf-8" FIN received Connection closed Resolving host name "demo.tiki.org" ... Connecting ( demo.tiki.org => ip: 72.34.60.179, port: 80 ) Connected (72.34.60.179:80) <<< GET /trunk/tiki-webdav-wiki.php/A1%20A2%20A3 HTTP/1.1 <<< Host: demo.tiki.org <<< User-Agent: BitKinex/3.2.3 <<< Accept: */* <<< Pragma: no-cache <<< Cache-Control: no-cache <<< Cookie: runs_before_js_detect=0; PHPSESSID=7f6a86e5a5286e27629b5da0b6188870 <<< Translate: f <<< Authorization: Basic YWRtaW46MTIzNDU= >>> HTTP/1.1 200 OK >>> Date: Thu, 09 Dec 2010 21:50:01 GMT >>> Server: Apache >>> X-Powered-By: PHP/5.2.9 >>> Expires: Thu, 19 Nov 1981 08:52:00 GMT >>> Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 >>> Pragma: no-cache >>> ETag: "31343caea3a082d3e25149600d4ca5a5-1371154873" >>> Set-Cookie: tab_last_query=%2Ftrunk%2Ftiki-webdav-wiki.phpa%3A0%3A%7B%7D >>> Set-Cookie: tab=1 >>> Connection: close >>> Transfer-Encoding: chunked >>> Content-Type: application/octet-stream; charset="utf-8" Connection closed But, when I try to "edit" Resolving host name "demo.tiki.org" ... Connecting ( demo.tiki.org => ip: 72.34.60.179, port: 80 ) Connected (72.34.60.179:80) <<< GET /trunk/ HTTP/1.1 <<< Host: demo.tiki.org <<< User-Agent: BitKinex/3.2.3 <<< Accept: */* <<< Pragma: no-cache <<< Cache-Control: no-cache <<< Cookie: PHPSESSID=5f187ab64bef06395b38f891f0d8a440 <<< Authorization: Basic YWRtaW46MTIzNDU= >>> HTTP/1.1 302 Moved Temporarily >>> Date: Thu, 09 Dec 2010 21:47:58 GMT >>> Server: Apache >>> X-Powered-By: PHP/5.2.9 >>> Expires: Thu, 19 Nov 1981 08:52:00 GMT >>> Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 >>> Pragma: no-cache >>> Set-Cookie: tab_last_query=%2Ftrunk%2Findex.phpa%3A0%3A%7B%7D >>> Set-Cookie: tab=1 >>> Set-Cookie: runs_before_js_detect=2; expires=Fri, 09-Dec-2011 21:47:58 GMT >>> location: HomePage >>> Content-Length: 0 >>> Connection: close >>> Content-Type: text/html Connection closed And it just goes into a loop.... Thanks! M ;-) On Wed, Dec 8, 2010 at 4:19 AM, <kil...@us...> wrote: > Revision: 31292 > http://tikiwiki.svn.sourceforge.net/tikiwiki/?rev=31292&view=rev > Author: killianebel > Date: 2010-12-08 09:19:25 +0000 (Wed, 08 Dec 2010) > > Log Message: > ----------- > [MOD] Wiki pages can now be created, edited and deleted from a webdav client (like cadaver) > > Modified Paths: > -------------- > trunk/lib/TikiWebdav/autoload.php > > Added Paths: > ----------- > trunk/lib/TikiWebdav/Auth/Wiki.php > trunk/lib/TikiWebdav/Backend/Wiki.php > trunk/lib/TikiWebdav/PathFactories/Wiki.php > trunk/templates/tiki-webdav-wiki.tpl > trunk/tiki-webdav-wiki.php > > Added: trunk/lib/TikiWebdav/Auth/Wiki.php > =================================================================== > --- trunk/lib/TikiWebdav/Auth/Wiki.php (rev 0) > +++ trunk/lib/TikiWebdav/Auth/Wiki.php 2010-12-08 09:19:25 UTC (rev 31292) > @@ -0,0 +1,40 @@ > +<?php > +// (c) Copyright 2002-2010 by authors of the Tiki Wiki/CMS/Groupware Project > +// > +// All Rights Reserved. See copyright.txt for details and a complete list of authors. > +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. > +// $Id: Default.php 25720 2010-02-25 19:45:26Z changi67 $ > + > +class TikiWebdav_Auth_Wiki extends TikiWebdav_Auth_Default > +{ > + public function authorize( $user, $path, $access = self::ACCESS_READ ) > + { > + global $tikilib; > + print_debug("authorize " . $user . " " . $path . " " . $access . "\n"); > + > + if ($path === '/') { > + return true; > + } > + > + $page = substr($path, 1); > + > + $groups = $tikilib->get_user_groups( $user ); > + $perms = Perms::getInstance(); > + $perms->setGroups( $groups ); > + $perms = $tikilib->page_exists($page) ? Perms::get( array( 'type' => 'wiki page', 'object' => substr($path, 1) ) ) : Perms::get(); > + > + return ( $access === self::ACCESS_READ && $perms->view ) || ( $access === self::ACCESS_WRITE && $perms->edit ); > + } > + > + public function assignLock( $user, $lockToken ) > + { > + } > + > + public function ownsLock( $user, $lockToken ) > + { > + } > + > + public function releaseLock( $user, $lockToken ) > + { > + } > +} > > Added: trunk/lib/TikiWebdav/Backend/Wiki.php > =================================================================== > --- trunk/lib/TikiWebdav/Backend/Wiki.php (rev 0) > +++ trunk/lib/TikiWebdav/Backend/Wiki.php 2010-12-08 09:19:25 UTC (rev 31292) > @@ -0,0 +1,550 @@ > +<?php > +// (c) Copyright 2002-2010 by authors of the Tiki Wiki/CMS/Groupware Project > +// > +// All Rights Reserved. See copyright.txt for details and a complete list of authors. > +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. > +// $Id: File.php 25720 2010-02-25 19:45:26Z changi67 $ > + > +class TikiWebdav_Backends_Wiki extends ezcWebdavSimpleBackend > +{ > + protected $options; > + protected $root; > + protected $lockLevel = 0; > + > + protected $handledLiveProperties = array( > + 'getcontentlength', > + 'getlastmodified', > + 'creationdate', > + 'displayname', > + 'getetag', > + 'getcontenttype', > + 'resourcetype', > + ); > + > + protected $propertyStorage = null; > + > + public function getRoot() > + { > + return $this->root; > + } > + > + public function __construct() > + { > + global $prefs; > + > + // avoid not having a deadlock when trying to acquire WebDav lock > + print_debug("Lock Directory: ".$prefs['fgal_use_dir']."\n" . "\n" ); > + if ( !empty($prefs['fgal_use_dir']) && file_exists($prefs['fgal_use_dir'] ) ) { > + $this->root = realpath( $prefs['fgal_use_dir'] ); > + } else { > + $this->root = realpath( 'temp/' ); > + } > + $this->options = new ezcWebdavFileBackendOptions( array ( > + 'lockFileName' => $this->root.'/.webdav_lock', > + 'waitForLock' => 200000, > + 'propertyStoragePath' => $this->root, > + 'noLock' => false ) > + ); > + $this->propertyStorage = new ezcWebdavBasicPropertyStorage(); > + } > + > + public function __get( $name ) > + { > + print_debug("get " .$name . "\n"); > + > + switch ( $name ) { > + case 'options': > + return $this->$name; > + > + default: > + throw new ezcBasePropertyNotFoundException( $name ); > + } > + } > + > + public function __set( $name, $value ) > + { > + print_debug("set " .$name . " " . $value . "\n"); > + > + switch ( $name ) { > + case 'options': > + if ( ! $value instanceof ezcWebdavMemoryBackendOptions ) ///FIXME > + { > + throw new ezcBaseValueException( $name, $value, 'ezcWebdavMemoryBackendOptions' ); ///FIXME > + } > + > + $this->$name = $value; > + break; > + > + default: > + throw new ezcBasePropertyNotFoundException( $name ); > + } > + } > + > + protected function acquireLock( $readOnly = false ) > + { > + return true; > + } > + > + protected function freeLock() > + { > + return true; > + } > + > + protected function getMimeType( $path, $filename = '' ) > + { > + print_debug("getMimeType " . $path . " " . $filename . "\n"); > + return 'application/octet-stream'; > + } > + > + protected function createCollection( $path ) > + { > + global $user, $tikilib; > + > + print_debug("createCollection " . $path . "\n"); > + > + return false; > + } > + > + protected function createResource( $path, $content = null ) > + { > + global $user, $tikilib, $prefs; > + > + print_debug("createResource " . $path . "\n"); > + > + if ( $this->isCollection($path) ) { > + return null; > + } > + > + return $tikilib->create_page($this->get_page_name_from_virtual_path($path), 0, $content, $tikilib->now, "Created from WebDAV", $user, $tikilib->get_ip_address()); > + } > + > + protected function setResourceContents( $path, $content ) > + { > + global $user, $tikilib, $prefs; > + > + print_debug("setResourceContents " . $path . "\n"); > + > + if ( $this->isCollection($path) ) { > + return null; > + } > + > + return $tikilib->update_page($this->get_page_name_from_virtual_path($path), $content, "Edited from WebDAV", $user, $tikilib->get_ip_address()); > + } > + > + protected function getResourceContents( $path ) > + { > + global $tikilib, $prefs; > + > + print_debug("getResourceContents " .$path . "\n"); > + > + if ( $this->isCollection($path) ) { > + return null; > + } > + > + $info = $tikilib->get_page_info($this->get_page_name_from_virtual_path($path)); > + > + return $info['data']; > + } > + > + protected function getPropertyStorage( $path ) > + { > + print_debug("getPropertyStorage " .$path . "\n"); > + > + if ( @file_exists($storagePath = $this->options->propertyStoragePath.'/properties-'.md5($path)) ) { > + $xml = ezcWebdavServer::getInstance()->xmlTool->createDom( @file_get_contents($storagePath) ); > + } else { > + $xml = ezcWebdavServer::getInstance()->xmlTool->createDom(); > + } > + $handler = new ezcWebdavPropertyHandler( > + new ezcWebdavXmlTool() > + ); > + try { > + $handler->extractProperties($xml->getElementsByTagNameNS('DAV:','*'),$this->propertyStorage); > + } > + catch ( Exception $e ) { > + } > + > + return $this->propertyStorage; > + } > + > + protected function storeProperties( $path, ezcWebdavBasicPropertyStorage $storage ) > + { > + print_debug("storeProperties " .$path . "\n"); > + > + $storagePath = $this->options->propertyStoragePath.'/properties-'.md5($path); > + > + // Create handler structure to read properties > + $handler = new ezcWebdavPropertyHandler( > + $xml = new ezcWebdavXmlTool() > + ); > + > + // Create new dom document with property storage for one namespace > + $doc = new DOMDocument( '1.0' ); > + > + $properties = $doc->createElement( 'properties' ); > + $doc->appendChild( $properties ); > + > + // Store and store properties > + foreach ($this->handledLiveProperties as $propName) { > + $storage->detach($propName); > + } > + $handler->serializeProperties( > + $storage, > + $properties > + ); > + > + print_debug("storeProperties method end\n"); > + > + return $doc->save( $storagePath ); > + } > + > + public function setProperty( $path, ezcWebdavProperty $property ) > + { > + print_debug("setProperty " .$path . "\n"); > + > + if ( ( $property->namespace === 'DAV:' ) && > + in_array( $property->name, $this->handledLiveProperties, true ) && > + ( $property->name !== 'getcontenttype' ) && > + ( $property->name !== 'lockdiscovery' ) ) { > + return false; > + } > + > + // Get namespace property storage > + $storage = $this->getPropertyStorage( $path ); > + > + // Attach property to store > + $storage->attach( $property ); > + > + // Store document back > + $this->storeProperties( $path, $storage ); > + > + return true; > + } > + > + public function removeProperty( $path, ezcWebdavProperty $property ) > + { > + print_debug("removeProperty " .$path . "\n"); > + > + if ( $property instanceof ezcWebdavLiveProperty ) { > + return false; > + } > + > + // Get namespace property storage > + $storage = $this->getPropertyStorage( $path ); > + > + // Attach property to store > + $storage->detach( $property->name, $property->namespace ); > + > + // Store document back > + $this->storeProperties( $path, $storage ); > + > + return true; > + } > + > + public function resetProperties( $path, ezcWebdavPropertyStorage $storage ) > + { > + print_debug("resetProperties " .$path . "\n"); > + > + $this->storeProperties( $path, $storage ); > + return true; > + } > + > + public function getProperty( $path, $propertyName, $namespace = 'DAV:' ) > + { > + global $tikilib, $prefs; > + > + print_debug("getProperty " .$path . " " . $propertyName . " " . $namespace . "\n"); > + > + if ( !$this->nodeExists($path) ) { > + return false; > + } > + > + $isCollection = $this->isCollection($path); > + $tikiInfo = null; > + > + if ( !$isCollection ) { > + $tikiInfo = $tikilib->get_page_info($this->get_page_name_from_virtual_path($path)); > + } > + > + $storage = $this->getPropertyStorage( $path ); > + > + $properties = $storage->getAllProperties(); > + // Handle dead propreties > + if ( $namespace !== 'DAV:' ) { > + return $properties[$namespace][$propertyName]; > + } > + > + // Handle live properties > + switch ( $propertyName ) { > + case 'getcontentlength': > + $property = new ezcWebdavGetContentLengthProperty( > + $isCollection ? > + ezcWebdavGetContentLengthProperty::COLLECTION : > + $tikiInfo['page_size'] > + ); > + return $property; > + > + case 'getlastmodified': > + $property = new ezcWebdavGetLastModifiedProperty( new ezcWebdavDateTime( > + '@' . (int)$tikiInfo['lastModif'] > + ) ); > + return $property; > + > + case 'creationdate': > + $property = new ezcWebdavCreationDateProperty( new ezcWebdavDateTime( > + '@' . (int)$tikiInfo['created'] > + ) ); > + return $property; > + > + case 'displayname': > + $property = new ezcWebdavDisplayNameProperty( > + $tikiInfo['pageName'] > + ); > + return $property; > + > + case 'getcontenttype': > + $property = new ezcWebdavGetContentTypeProperty( > + $isCollection ? > + 'httpd/unix-directory' : > + 'application/octet-stream' > + ); > + return $property; > + > + case 'getetag': > + $md5 = md5($path); > + $property = new ezcWebdavGetEtagProperty( > + '"' . $md5 . '-' . crc32($md5) . '"' > + ); > + return $property; > + > + case 'resourcetype': > + $property = new ezcWebdavResourceTypeProperty( > + $isCollection ? > + ezcWebdavResourceTypeProperty::TYPE_COLLECTION : > + ezcWebdavResourceTypeProperty::TYPE_RESOURCE > + ); > + > + return $property; > + > + case 'supportedlock': > + if ( !isset($properties[$namespace][$propertyName]) ) { > + $property = new ezcWebdavLockDiscoveryProperty(); > + } else { > + $property = $properties[$namespace][$propertyName]; > + } > + > + return $property; > + > + case 'lockdiscovery': > + if ( !isset($properties[$namespace][$propertyName]) ) { > + $property = new ezcWebdavLockDiscoveryProperty(); > + } else { > + $property = $properties[$namespace][$propertyName]; > + } > + > + return $property; > + > + default: > + // Handle all other live properties like dead properties > + $properties = $storage->getAllProperties(); > + return $properties[$namespace][$propertyName]; > + } > + } > + > + protected function getETag( $path ) { > + print_debug("getETag " .$path . "\n"); > + > + if ( $etag = $this->getProperty( $path, 'getetag' ) ) { > + return $this->getProperty( $path, 'getetag' )->etag; > + } else { > + return md5($path); > + } > + } > + > + public function getAllProperties( $path ) > + { > + print_debug("getAllProperties " .$path . "\n"); > + > + $storage = $this->getPropertyStorage( $path ); > + > + // Add all live properties to stored properties > + foreach ( $this->handledLiveProperties as $property ) { > + $storage->attach( $this->getProperty( $path, $property ) ); > + } > + > + return $storage; > + } > + > + public function copyRecursive( $source, $destination, $depth = ezcWebdavRequest::DEPTH_INFINITY ) > + { > + return false; > + } > + > + protected function performCopy( $fromPath, $toPath, $depth = ezcWebdavRequest::DEPTH_INFINITY ) > + { > + return false; > + } > + > + protected function performDelete( $path ) > + { > + global $tikilib; > + > + $isCollection = $this->isCollection($path); > + $tikiInfo = null; > + > + if ( !$isCollection ) { > + return $tikilib->remove_all_versions($this->get_page_name_from_virtual_path($path), "Remove from WebDav"); > + } > + > + return false; > + } > + > + protected function nodeExists( $path ) > + { > + global $tikilib; > + > + print_debug("nodeExists " .$path . "\n"); > + > + if ( empty($path) || $path[0] != '/' ) { > + return false; > + } > + > + if ( $path == '/' ) { > + return true; > + } > + > + return $tikilib->page_exists($this->get_page_name_from_virtual_path($path)); > + } > + > + protected function isCollection( $path ) > + { > + print_debug("isCollection " .$path . " -> " . ( $path === '/' ) . "\n"); > + > + if ( $path === '/' ) { > + return true; > + } > + > + return false; > + } > + > + protected function getCollectionMembers( $path ) > + { > + global $tikilib; > + > + print_debug("getCollectionMembers " .$path . "\n"); > + > + $contents = array(); > + $errors = array(); > + > + if ( $path !== '/' ) { > + return $contents; > + } > + > + $pages = $tikilib->list_pages(); > + $filtered = Perms::filter( array( 'type' => 'wiki page' ), 'object', $pages['data'], array( 'object' => 'pageName' ), 'view' ); > + > + foreach ($filtered as $page) { > + $contents[] = new ezcWebdavResource( $path . $page['pageName'] ); > + } > + > + return $contents; > + } > + > + public function get( ezcWebdavGetRequest $request ) > + { > + print_debug("-- HTTP method: GET --\n"); > + $return = parent::get( $request ); > + > + print_debug("get -> ". $return . "\n"); > + > + return $return; > + } > + > + public function head( ezcWebdavHeadRequest $request ) > + { > + print_debug("-- HTTP method: HEAD --\n"); > + $return = parent::head( $request ); > + > + print_debug("head \n"); > + > + return $return; > + } > + > + public function propFind( ezcWebdavPropFindRequest $request ) > + { > + print_debug("-- HTTP method: PROPFIND --\n"); > + $return = parent::propFind( $request ); > + > + print_debug("propFind \n"); > + > + return $return; > + } > + > + public function propPatch( ezcWebdavPropPatchRequest $request ) > + { > + print_debug("-- HTTP method: PROPPATCH --\n"); > + $this->acquireLock(); > + $return = parent::propPatch( $request ); > + $this->freeLock(); > + > + print_debug("propPatch \n"); > + > + return $return; > + } > + > + public function put( ezcWebdavPutRequest $request ) > + { > + print_debug("-- HTTP method: PUT --\n"); > + $this->acquireLock(); > + $return = parent::put( $request ); > + $this->freeLock(); > + > + print_debug("put \n"); > + > + return $return; > + } > + > + public function delete( ezcWebdavDeleteRequest $request ) > + { > + print_debug("-- HTTP method: DELETE --".print_r($request,true)."\n"); > + $this->acquireLock(); > + $return = parent::delete( $request ); > + $this->freeLock(); > + > + print_debug("delete \n"); > + > + return $return; > + } > + > + public function copy( ezcWebdavCopyRequest $request ) > + { > + print_debug("-- HTTP method: COPY --\n"); > + $this->acquireLock(); > + $return = parent::copy( $request ); > + $this->freeLock(); > + > + print_debug("copy \n"); > + > + return $return; > + } > + > + public function move( ezcWebdavMoveRequest $request ) > + { > + return false; > + } > + > + public function makeCollection( ezcWebdavMakeCollectionRequest $request ) > + { > + print_debug("-- HTTP method: MAKECOL --\n"); > + $this->acquireLock(); > + $return = parent::makeCollection( $request ); > + $this->freeLock(); > + > + return $return; > + } > + > + private function get_page_name_from_virtual_path( $path ) > + { > + return substr($path, 1); > + } > +} > > Added: trunk/lib/TikiWebdav/PathFactories/Wiki.php > =================================================================== > --- trunk/lib/TikiWebdav/PathFactories/Wiki.php (rev 0) > +++ trunk/lib/TikiWebdav/PathFactories/Wiki.php 2010-12-08 09:19:25 UTC (rev 31292) > @@ -0,0 +1,43 @@ > +<?php > +// (c) Copyright 2002-2010 by authors of the Tiki Wiki/CMS/Groupware Project > +// > +// All Rights Reserved. See copyright.txt for details and a complete list of authors. > +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. > +// $Id: File.php 25720 2010-02-25 19:45:26Z changi67 $ > + > +class TikiWebdav_PathFactories_Wiki implements ezcWebdavPathFactory > +{ > + protected $baseUri = ''; > + protected $baseUriLength = 0; > + protected $collectionPathes = array(); > + > + public function __construct() > + { > + global $base_url; > + if ( ( $pos = strpos($base_url, 'tiki-webdav-wiki.php/') ) !== false ) { > + $this->baseUri = substr($base_url, 0, strpos($base_url, 'tiki-webdav-wiki.php') + 20); > + } else { > + $this->baseUri = $base_url . 'tiki-webdav-wiki.php'; > + } > + $this->baseUriLength = strlen($this->baseUri); > + } > + > + public function parseUriToPath( $uri ) > + { > + $requestPath = rawurldecode(substr( trim( $uri ), $this->baseUriLength )) ; > + > + if ( empty($requestPath) ) { > + $requestPath = '/'; > + } > + elseif ( substr( $requestPath, -1, 1 ) === '/' ) { > + $this->collectionPathes[substr( $requestPath, 0, -1 )] = true; > + } > + > + return $requestPath; > + } > + > + public function generateUriFromPath( $path ) > + { > + return $this->baseUri . implode( '/', array_map( 'rawurlencode', explode( '/', $path ) ) ); > + } > +} > > Modified: trunk/lib/TikiWebdav/autoload.php > =================================================================== > --- trunk/lib/TikiWebdav/autoload.php 2010-12-08 08:55:50 UTC (rev 31291) > +++ trunk/lib/TikiWebdav/autoload.php 2010-12-08 09:19:25 UTC (rev 31292) > @@ -12,7 +12,9 @@ > * > * @param string $className > */ > -function __autoload( $className ) > +function webdav_autoload( $className ) > { > ezcBase::autoload( $className ); > } > + > +spl_autoload_register('webdav_autoload'); > \ No newline at end of file > > Added: trunk/templates/tiki-webdav-wiki.tpl > =================================================================== > --- trunk/templates/tiki-webdav-wiki.tpl (rev 0) > +++ trunk/templates/tiki-webdav-wiki.tpl 2010-12-08 09:19:25 UTC (rev 31292) > @@ -0,0 +1,4 @@ > +<style> > +{literal}a {behavior: url(#default#AnchorClick);}{/literal} > +</style> > +<a href="{$base_url}tiki-webdav-wiki.php/" folder="{$base_url}tiki-webdav-wiki.php/">{tr}Open Tiki WebDAV (Wiki pages) as WebFolder{/tr}</a> > > Added: trunk/tiki-webdav-wiki.php > =================================================================== > --- trunk/tiki-webdav-wiki.php (rev 0) > +++ trunk/tiki-webdav-wiki.php 2010-12-08 09:19:25 UTC (rev 31292) > @@ -0,0 +1,79 @@ > +<?php > +// (c) Copyright 2002-2010 by authors of the Tiki Wiki/CMS/Groupware Project > +// > +// All Rights Reserved. See copyright.txt for details and a complete list of authors. > +// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details. > +// $Id: tiki-webdav.php 27025 2010-05-09 13:23:41Z sept_7 $ > + > + > +// If Apache is calling PHP in CGI mode, authentication HTTP Headers are not set. > +// In this case, you have to add the following lines inside your Apache VirtualHost config : > +// RewriteEngine on > +// RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] > +// > +// The two lines below are used to set PHP_AUTH_USER and PHP_AUTH_PW from HTTP_AUTHORIZATION to allow Basic Authentication in Tiki WebDAV > + > +if ( !empty($_SERVER['HTTP_AUTHORIZATION']) && !isset($_SERVER['PHP_AUTH_USER']) ) { > + list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':' , base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6))); > +} > + > +require_once 'tiki-setup.php'; > + > +$debug = false; > +$debug_file= '/tmp/tiki4log'; > + > +function print_debug($string) { > + global $debug, $debug_file; > + > + if ( $debug !== false) { > + if (empty($debug_file)) { > + $debug_file = "/tmp/tiki.log"; > + } > + @file_put_contents($debug_file, $string, FILE_APPEND ); > + } > +} > + > +function error_handler($errno, $errmsg, $filename, $linenum, $vars) { > + print_debug("\n=== ERROR ===\n"); > + print_debug("$filename\n$linenum\n$errmsg\n"); > + print_debug("\n=== BACTRACE ===\n"); > + print_debug(print_r(debug_backtrace(false),true)); > + print_debug("\n=== BACTRACE END ===\n"); > + print_debug("\n=== ERROR END ===\n"); > +} > + > +if ($debug === true) { > + $old_error_handler = set_error_handler("error_handler"); > +} > + > +$access->check_feature('feature_webdav'); > + > +print_debug("\n=== _SERVER() ===\n".print_r($_SERVER,true)."\n"); > +// Check if we come here with a browser > +if ( $_SERVER['REQUEST_METHOD'] === 'GET' && $_SERVER['REQUEST_URI'] === $_SERVER['SCRIPT_NAME'] ) { > + $smarty->assign('mid','tiki-webdav-wiki.tpl'); > + $smarty->display("tiki.tpl"); > +} else { > + require_once 'lib/TikiWebdav/autoload.php'; > + require_once 'lib/TikiWebdav/Server.php'; > + require_once 'lib/TikiWebdav/Backend/Wiki.php'; > + require_once 'lib/TikiWebdav/PathFactories/Wiki.php'; > + require_once 'lib/TikiWebdav/Auth/Default.php'; > + require_once 'lib/TikiWebdav/Auth/Wiki.php'; > + > + $server = TikiWebdav_Server::getInstance(); > + $server->options->realm = tra('Tiki WebDAV access'); > + $pathFactory = new TikiWebdav_PathFactories_Wiki(); > + $backend = new TikiWebdav_Backends_Wiki(); > + > + print_debug("\n TOKENFile=". $backend->getRoot().'/.webdav-token.php'."\n"); > + $server->auth = new TikiWebdav_Auth_Wiki( $backend->getRoot().'/.webdav-token.php' ); > + > + foreach ( $server->configurations as $conf ) { > + $conf->pathFactory = $pathFactory; > + } > + > + print_debug("\n=== handle() ===\n"); > + $server->handle( $backend ); > + print_debug("\n=== end handle() ===\n"); > +} > > > This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. > > ------------------------------------------------------------------------------ > What happens now with your Lotus Notes apps - do you make another costly > upgrade, or settle for being marooned without product support? Time to move > off Lotus Notes and onto the cloud with Force.com, apps are easier to build, > use, and manage than apps on traditional platforms. Sign up for the Lotus > Notes Migration Kit to learn more. http://p.sf.net/sfu/salesforce-d2d > _______________________________________________ > Tikiwiki-cvs mailing list > Tik...@li... > https://lists.sourceforge.net/lists/listinfo/tikiwiki-cvs > -- Marc Laporte http://MarcLaporte.com http://Tiki.org/MarcLaporte http://AvanTech.net |