| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- <?php
- declare(strict_types=1);
- namespace Sabre\DAV\PropertyStorage;
- use Sabre\DAV\INode;
- use Sabre\DAV\PropFind;
- use Sabre\DAV\PropPatch;
- use Sabre\DAV\Server;
- use Sabre\DAV\ServerPlugin;
- /**
- * PropertyStorage Plugin.
- *
- * Adding this plugin to your server allows clients to store any arbitrary
- * WebDAV property.
- *
- * See:
- * http://sabre.io/dav/property-storage/
- *
- * for more information.
- *
- * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
- * @author Evert Pot (http://evertpot.com/)
- * @license http://sabre.io/license/ Modified BSD License
- */
- class Plugin extends ServerPlugin
- {
- /**
- * If you only want this plugin to store properties for a limited set of
- * paths, you can use a pathFilter to do this.
- *
- * The pathFilter should be a callable. The callable retrieves a path as
- * its argument, and should return true or false whether it allows
- * properties to be stored.
- *
- * @var callable
- */
- public $pathFilter;
- /**
- * @var Backend\BackendInterface
- */
- public $backend;
- /**
- * Creates the plugin.
- */
- public function __construct(Backend\BackendInterface $backend)
- {
- $this->backend = $backend;
- }
- /**
- * This initializes the plugin.
- *
- * This function is called by Sabre\DAV\Server, after
- * addPlugin is called.
- *
- * This method should set up the required event subscriptions.
- */
- public function initialize(Server $server)
- {
- $server->on('propFind', [$this, 'propFind'], 130);
- $server->on('propPatch', [$this, 'propPatch'], 300);
- $server->on('afterMove', [$this, 'afterMove']);
- $server->on('afterUnbind', [$this, 'afterUnbind']);
- }
- /**
- * Called during PROPFIND operations.
- *
- * If there's any requested properties that don't have a value yet, this
- * plugin will look in the property storage backend to find them.
- */
- public function propFind(PropFind $propFind, INode $node)
- {
- $path = $propFind->getPath();
- $pathFilter = $this->pathFilter;
- if ($pathFilter && !$pathFilter($path)) {
- return;
- }
- $this->backend->propFind($propFind->getPath(), $propFind);
- }
- /**
- * Called during PROPPATCH operations.
- *
- * If there's any updated properties that haven't been stored, the
- * propertystorage backend can handle it.
- *
- * @param string $path
- */
- public function propPatch($path, PropPatch $propPatch)
- {
- $pathFilter = $this->pathFilter;
- if ($pathFilter && !$pathFilter($path)) {
- return;
- }
- $this->backend->propPatch($path, $propPatch);
- }
- /**
- * Called after a node is deleted.
- *
- * This allows the backend to clean up any properties still in the
- * database.
- *
- * @param string $path
- */
- public function afterUnbind($path)
- {
- $pathFilter = $this->pathFilter;
- if ($pathFilter && !$pathFilter($path)) {
- return;
- }
- $this->backend->delete($path);
- }
- /**
- * Called after a node is moved.
- *
- * This allows the backend to move all the associated properties.
- *
- * @param string $source
- * @param string $destination
- */
- public function afterMove($source, $destination)
- {
- $pathFilter = $this->pathFilter;
- if ($pathFilter && !$pathFilter($source)) {
- return;
- }
- // If the destination is filtered, afterUnbind will handle cleaning up
- // the properties.
- if ($pathFilter && !$pathFilter($destination)) {
- return;
- }
- $this->backend->move($source, $destination);
- }
- /**
- * Returns a plugin name.
- *
- * Using this name other plugins will be able to access other plugins
- * using \Sabre\DAV\Server::getPlugin
- *
- * @return string
- */
- public function getPluginName()
- {
- return 'property-storage';
- }
- /**
- * Returns a bunch of meta-data about the plugin.
- *
- * Providing this information is optional, and is mainly displayed by the
- * Browser plugin.
- *
- * The description key in the returned array may contain html and will not
- * be sanitized.
- *
- * @return array
- */
- public function getPluginInfo()
- {
- return [
- 'name' => $this->getPluginName(),
- 'description' => 'This plugin allows any arbitrary WebDAV property to be set on any resource.',
- 'link' => 'http://sabre.io/dav/property-storage/',
- ];
- }
- }
|