예제 #1
0
 /**
  * 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;
 }
예제 #2
0
 /**
  * Callback for the hook ezcWebdavServer::receivedRequest().
  *
  * Parameters are:
  * - ezcWebdavRequest request
  *
  * Needs to react directly on:
  * - ezcWebdavLockRequest
  * - ezcWebdavUnlockRequest
  *
  * Needs to check if lock violations occur on:
  * - ezcWebdavCopyRequest
  * - ezcWebdavMoveRequest
  * - ezcWebdavMakeCollectionRequest
  * - ezcWebdavPropPatchRequest
  * - ezcWebdavPutRequest
  * 
  * @param ezcWebdavPluginParameters $params 
  * @return ezcWebdavResponse|null
  */
 public function receivedRequest(ezcWebdavPluginParameters $params)
 {
     $request = $params['request'];
     $requestClass = get_class($request);
     if (isset(ezcWebdavLockPlugin::$requestHandlingMap[$requestClass])) {
         // Set headers parsed by the lock plugin only.
         $request->setHeader('If', $this->headerHandler->parseIfHeader($request));
         $request->setHeader('Timeout', $this->headerHandler->parseTimeoutHeader($request));
         $request->setHeader('Lock-Token', $this->headerHandler->parseLockTokenHeader($request));
         $request->validateHeaders();
         $handlerClass = ezcWebdavLockPlugin::$requestHandlingMap[$requestClass];
         $this->handler = new $handlerClass(new ezcWebdavLockTools($this->options));
         if ($this->handler->needsBackendLock) {
             ezcWebdavServer::getInstance()->backend->lock($this->options->backendLockWaitTime, $this->options->backendLockTimeout);
         }
         $res = null;
         try {
             $res = $this->handler->receivedRequest($request);
         } catch (Exception $e) {
             if ($this->handler->needsBackendLock) {
                 ezcWebdavServer::getInstance()->backend->unlock();
             }
             throw $e;
         }
         return $res;
     }
     // return null
 }
예제 #3
0
 /**
  * testParseTimeoutHeader 
  * 
  * @param mixed $content 
  * @param mixed $result 
  * @return void
  *
  * @dataProvider provideTimeoutHeaderData
  */
 public function testParseTimeoutHeader($content, $result)
 {
     $_SERVER['HTTP_TIMEOUT'] = $content;
     $handler = new ezcWebdavLockHeaderHandler();
     $this->assertEquals($result, $handler->parseTimeoutHeader());
 }