215 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			215 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace Sabre\DAV\FSExt;
 | |
| 
 | |
| use Sabre\DAV;
 | |
| 
 | |
| /**
 | |
|  * Base node-class
 | |
|  *
 | |
|  * The node class implements the method used by both the File and the Directory classes
 | |
|  *
 | |
|  * @copyright Copyright (C) 2007-2015 fruux GmbH (https://fruux.com/).
 | |
|  * @author Evert Pot (http://evertpot.com/)
 | |
|  * @license http://sabre.io/license/ Modified BSD License
 | |
|  */
 | |
| abstract class Node extends DAV\FS\Node implements DAV\IProperties {
 | |
| 
 | |
|     /**
 | |
|      * Updates properties on this node,
 | |
|      *
 | |
|      * @param array $properties
 | |
|      * @see Sabre\DAV\IProperties::updateProperties
 | |
|      * @return bool|array
 | |
|      */
 | |
|     public function updateProperties($properties) {
 | |
| 
 | |
|         $resourceData = $this->getResourceData();
 | |
| 
 | |
|         foreach($properties as $propertyName=>$propertyValue) {
 | |
| 
 | |
|             // If it was null, we need to delete the property
 | |
|             if (is_null($propertyValue)) {
 | |
|                 if (isset($resourceData['properties'][$propertyName])) {
 | |
|                     unset($resourceData['properties'][$propertyName]);
 | |
|                 }
 | |
|             } else {
 | |
|                 $resourceData['properties'][$propertyName] = $propertyValue;
 | |
|             }
 | |
| 
 | |
|         }
 | |
| 
 | |
|         $this->putResourceData($resourceData);
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns a list of properties for this nodes.;
 | |
|      *
 | |
|      * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author
 | |
|      * If the array is empty, all properties should be returned
 | |
|      *
 | |
|      * @param array $properties
 | |
|      * @return array
 | |
|      */
 | |
|     function getProperties($properties) {
 | |
| 
 | |
|         $resourceData = $this->getResourceData();
 | |
| 
 | |
|         // if the array was empty, we need to return everything
 | |
|         if (!$properties) return $resourceData['properties'];
 | |
| 
 | |
|         $props = array();
 | |
|         foreach($properties as $property) {
 | |
|             if (isset($resourceData['properties'][$property])) $props[$property] = $resourceData['properties'][$property];
 | |
|         }
 | |
| 
 | |
|         return $props;
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the path to the resource file
 | |
|      *
 | |
|      * @return string
 | |
|      */
 | |
|     protected function getResourceInfoPath() {
 | |
| 
 | |
|         list($parentDir) = DAV\URLUtil::splitPath($this->path);
 | |
|         return $parentDir . '/.sabredav';
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns all the stored resource information
 | |
|      *
 | |
|      * @return array
 | |
|      */
 | |
|     protected function getResourceData() {
 | |
| 
 | |
|         $path = $this->getResourceInfoPath();
 | |
|         if (!file_exists($path)) return array('properties' => array());
 | |
| 
 | |
|         // opening up the file, and creating a shared lock
 | |
|         $handle = fopen($path,'r');
 | |
|         flock($handle,LOCK_SH);
 | |
|         $data = '';
 | |
| 
 | |
|         // Reading data until the eof
 | |
|         while(!feof($handle)) {
 | |
|             $data.=fread($handle,8192);
 | |
|         }
 | |
| 
 | |
|         // We're all good
 | |
|         fclose($handle);
 | |
| 
 | |
|         // Unserializing and checking if the resource file contains data for this file
 | |
|         $data = unserialize($data);
 | |
|         if (!isset($data[$this->getName()])) {
 | |
|             return array('properties' => array());
 | |
|         }
 | |
| 
 | |
|         $data = $data[$this->getName()];
 | |
|         if (!isset($data['properties'])) $data['properties'] = array();
 | |
|         return $data;
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Updates the resource information
 | |
|      *
 | |
|      * @param array $newData
 | |
|      * @return void
 | |
|      */
 | |
|     protected function putResourceData(array $newData) {
 | |
| 
 | |
|         $path = $this->getResourceInfoPath();
 | |
| 
 | |
|         // opening up the file, and creating a shared lock
 | |
|         $handle = fopen($path,'a+');
 | |
|         flock($handle,LOCK_EX);
 | |
|         $data = '';
 | |
| 
 | |
|         rewind($handle);
 | |
| 
 | |
|         // Reading data until the eof
 | |
|         while(!feof($handle)) {
 | |
|             $data.=fread($handle,8192);
 | |
|         }
 | |
| 
 | |
|         // Unserializing and checking if the resource file contains data for this file
 | |
|         $data = unserialize($data);
 | |
|         $data[$this->getName()] = $newData;
 | |
|         ftruncate($handle,0);
 | |
|         rewind($handle);
 | |
| 
 | |
|         fwrite($handle,serialize($data));
 | |
|         fclose($handle);
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Renames the node
 | |
|      *
 | |
|      * @param string $name The new name
 | |
|      * @return void
 | |
|      */
 | |
|     public function setName($name) {
 | |
| 
 | |
|         list($parentPath, ) = DAV\URLUtil::splitPath($this->path);
 | |
|         list(, $newName) = DAV\URLUtil::splitPath($name);
 | |
|         $newPath = $parentPath . '/' . $newName;
 | |
| 
 | |
|         // We're deleting the existing resourcedata, and recreating it
 | |
|         // for the new path.
 | |
|         $resourceData = $this->getResourceData();
 | |
|         $this->deleteResourceData();
 | |
| 
 | |
|         rename($this->path,$newPath);
 | |
|         $this->path = $newPath;
 | |
|         $this->putResourceData($resourceData);
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @return bool
 | |
|      */
 | |
|     public function deleteResourceData() {
 | |
| 
 | |
|         // When we're deleting this node, we also need to delete any resource information
 | |
|         $path = $this->getResourceInfoPath();
 | |
|         if (!file_exists($path)) return true;
 | |
| 
 | |
|         // opening up the file, and creating a shared lock
 | |
|         $handle = fopen($path,'a+');
 | |
|         flock($handle,LOCK_EX);
 | |
|         $data = '';
 | |
| 
 | |
|         rewind($handle);
 | |
| 
 | |
|         // Reading data until the eof
 | |
|         while(!feof($handle)) {
 | |
|             $data.=fread($handle,8192);
 | |
|         }
 | |
| 
 | |
|         // Unserializing and checking if the resource file contains data for this file
 | |
|         $data = unserialize($data);
 | |
|         if (isset($data[$this->getName()])) unset($data[$this->getName()]);
 | |
|         ftruncate($handle,0);
 | |
|         rewind($handle);
 | |
|         fwrite($handle,serialize($data));
 | |
|         fclose($handle);
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
|     public function delete() {
 | |
| 
 | |
|         return $this->deleteResourceData();
 | |
| 
 | |
|     }
 | |
| 
 | |
| }
 | |
| 
 |