blob: 787767bcd47c269bd960ff1c655fab6ed40dcc28 [file] [log] [blame]
<?php
/**
* File containing the ezcWebdavLockTransport class.
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @package Webdav
* @version //autogentag//
* @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*
* @access private
*/
/**
* Transport layer extension class of the lock plugin.
*
* This class contains methods that extend the transport layer of the Webdav
* component, by providing methods that parse requests and process responses.
*
* @package Webdav
* @version //autogen//
*
* @access private
*/
class ezcWebdavLockTransport
{
/**
* Map for request parsers.
*
* Maps request method names as provided by $_SERVER to methods of this
* class.
*
* @var array(string=>string)
*/
protected static $parsingMap = array(
'LOCK' => 'parseLockRequest',
'UNLOCK' => 'parseUnlockRequest',
);
/**
* Map for response handling.
*
* Maps response classes to a method that handles objects of this class.
*
* @var array(string=>string)
*/
protected static $processingMap = array(
'ezcWebdavLockResponse' => 'processLockResponse',
'ezcWebdavUnlockResponse' => 'processUnlockResponse',
);
/**
* Property handler.
*
* @var ezcWebdavLockPropertyHandler
*/
protected $propertyHandler;
/**
* Header handler.
*
* @var ezcWebdavLockHeaderHandler
*/
protected $headerHandler;
/**
* Creates a new lock transport.
*
* @param ezcWebdavLockHeaderHandler $headerHandler
* @param ezcWebdavLockPropertyHandler $propertyHandler
*/
public function __construct( $headerHandler, $propertyHandler )
{
$this->propertyHandler = $propertyHandler;
$this->headerHandler = $headerHandler;
}
/**
* Callback for the hook ezcWebdavTransport::parseUnknownRequest().
*
* Reacts on the LOCK and UNLOCK request methods.
*
* @param string $method
* @param string $path
* @param string $body
* @return ezcWebdavRequest
*/
public function parseRequest( $method, $path, $body )
{
if ( isset( self::$parsingMap[$method] ) )
{
$req = call_user_func(
array( $this, self::$parsingMap[$method] ),
$path,
$body
);
$req->validateHeaders();
return $req;
}
return null;
}
/**
* Handles responses of the LOCK plugin.
*
* @param ezcWebdavResponse $response
* @return ezcWebdavDisplayInformation
*/
public function processResponse( ezcWebdavResponse $response )
{
if( isset( self::$processingMap[( $responseClass = get_class( $response ) )] ) )
{
$method = self::$processingMap[$responseClass];
return $this->$method( $response );
}
return null;
}
/**
* Parses the LOCK request and returns a request object.
*
* This method is responsible for parsing the LOCK request. It retrieves
* the current request URI in $path and the request body as $body. The
* return value, if no exception is thrown, is a valid {@link
* ezcWebdavLockRequest} object.
*
* This method may be overwritten to adjust it to special client behaviour.
*
* @param string $path
* @param string $body
* @return ezcWebdavLockRequest
*/
protected function parseLockRequest( $path, $body )
{
$request = new ezcWebdavLockRequest( $path );
$request->setHeaders(
ezcWebdavServer::getInstance()->headerHandler->parseHeaders(
array( 'Depth' )
)
);
if ( trim( $body ) === '' )
{
return $request;
}
try
{
$dom = ezcWebdavServer::getInstance()->xmlTool->createDom( $body );
}
catch ( ezcWebdavInvalidXmlException $e )
{
throw new ezcWebdavInvalidRequestBodyException(
'LOCK',
$e->getMessage()
);
}
if ( $dom->documentElement->localName !== 'lockinfo' )
{
throw new ezcWebdavInvalidRequestBodyException(
'LOCK',
"Expected XML element <lockinfo />, received <{$dom->documentElement->localName} />."
);
}
$lockTypeElements = $dom->documentElement->getElementsByTagnameNS(
ezcWebdavXmlTool::XML_DEFAULT_NAMESPACE,
'locktype'
);
$lockScopeElements = $dom->documentElement->getElementsByTagnameNS(
ezcWebdavXmlTool::XML_DEFAULT_NAMESPACE,
'lockscope'
);
$ownerElements = $dom->documentElement->getElementsByTagnameNS(
ezcWebdavXmlTool::XML_DEFAULT_NAMESPACE,
'owner'
);
if ( $lockTypeElements->length === 0 )
{
throw new ezcWebdavInvalidRequestBodyException(
'LOCK',
"Expected XML element <locktype /> as child of <lockinfo /> in namespace DAV: which was not found."
);
}
if ( $lockScopeElements->length === 0 )
{
throw new ezcWebdavInvalidRequestBodyException(
'LOCK',
"Expected XML element <lockscope /> as child of <lockinfo /> in namespace DAV: which was not found."
);
}
// @todo is the following not restrictive enough?
$request->lockInfo = new ezcWebdavRequestLockInfoContent(
( $lockScopeElements->item( 0 )->firstChild->localName === 'exclusive'
? ezcWebdavLockRequest::SCOPE_EXCLUSIVE
: ezcWebdavLockRequest::SCOPE_SHARED ),
( $lockTypeElements->item( 0 )->firstChild->localName === 'read'
? ezcWebdavLockRequest::TYPE_READ
: ezcWebdavLockRequest::TYPE_WRITE ),
( $ownerElements->length > 0
? new ezcWebdavPotentialUriContent(
$ownerElements->item( 0 )->textContent,
( $ownerElements->item( 0 )->hasChildNodes() && $ownerElements->item( 0 )->firstChild->localName === 'href' )
)
: new ezcWebdavPotentialUriContent() )
);
$request->setHeader( 'Timeout', $this->headerHandler->parseTimeoutHeader() );
return $request;
}
/**
* Parses the UNLOCK request and returns a request object.
*
* This method is responsible for parsing the UNLOCK request. It retrieves
* the current request URI in $path and the request body as $body. The
* return value, if no exception is thrown, is a valid {@link
* ezcWebdavUnlockRequest} object.
*
* This method may be overwritten to adjust it to special client behaviour.
*
* @param string $path
* @param string $body
* @return ezcWebdavUnlockRequest
*/
protected function parseUnlockRequest( $path, $body )
{
$request = new ezcWebdavUnlockRequest( $path );
$request->setHeaders(
ezcWebdavServer::getInstance()->headerHandler->parseHeaders()
);
$request->setHeader(
'Lock-Token',
$this->headerHandler->parseLockTokenHeader()
);
return $request;
}
/**
* Processes a lock response into a korresponding display information struct.
*
* The struct ist the processed by {@link
* ezcWebdavTransport::flattenResponse()} and send by {@link
* ezcWebdavTransport::sendResponse()}.
*
* @param ezcWebdavLockResponse $response
* @return ezcWebdavXmlDisplayInformation
*/
protected function processLockResponse( ezcWebdavLockResponse $response )
{
$xmlTool = ezcWebdavServer::getInstance()->xmlTool;
$dom = $xmlTool->createDom();
$propElement = $dom->appendChild(
$xmlTool->createDomElement( $dom, 'prop' )
);
$this->propertyHandler->serializeLiveProperty(
$response->lockDiscovery,
$propElement,
$xmlTool
);
return new ezcWebdavXmlDisplayInformation(
$response,
$dom
);
}
/**
* Processes a unlock response into a korresponding display information struct.
*
* The struct ist the processed by {@link
* ezcWebdavTransport::flattenResponse()} and send by {@link
* ezcWebdavTransport::sendResponse()}.
*
* @param ezcWebdavUnlockResponse $response
* @return ezcWebdavEmptyDisplayInformation
*/
protected function processUnlockResponse( ezcWebdavUnlockResponse $response )
{
return new ezcWebdavEmptyDisplayInformation( $response );
}
}
?>