blob: 1e1d77d524e84e9fc2efb76618d147ef3af5da45 [file] [log] [blame]
<?php
/**
* File containing the ezcWebdavLockAdministrator 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
*/
/**
* Administration class for the lock plugin.
*
* An instance of this class might be used to administrate the Webdav lock
* plugin. It receives the {@link ezcWebdavBackend} to work on in the
* constructor. You should have the {@link ezcWebdavServer} already configured
* when you use an instance of this class, since it uses settings from {@link
* ezcWebdavLockPluginOptions}. In case the lock plugin is not configured in
* the server, a new (default) instance of it will be added before any
* administrative action and will be removed again afterwards. In addition, any
* authentication/authorization mechanism configured in the server will be
* de-activated before any administrative operation and is brought back into
* place afterward.
*
* @package Webdav
* @version //autogen//
*/
class ezcWebdavLockAdministrator
{
/**
* The server instance.
*
* @var ezcWebdavServer
*/
private $server;
/**
* The webdav backend.
*
* @var ezcWebdavBackend
*/
private $backend;
/**
* Backup of the server authentication.
*
* @var ezcWebdavServerAuthenticator
*/
private $serverAuth;
/**
* If the server had the lock plugin defined before it was prepared.
*
* @var bool
*/
private $serverHadLockPlugin;
/**
* Creates a new lock purger.
*
* $backend must be the back end used in the Webdav environment. Note, that
* you should have the {@link ezcWebdavServer} configured, before you use
* the administrator class. Some actions will check for the lock plugin and
* use the options set for it. In case the lock plugin is not registered in
* the server, it will be registered before an action takes place and
* unregistered afterwards.
*
* @param ezcWebdavBackend $backend
*/
public function __construct( ezcWebdavBackend $backend )
{
$this->server = ezcWebdavServer::getInstance();
$this->backend = $backend;
}
/**
* Purges all outdated locks under $path.
*
* This method analyses all locks under $path and purges the locks which
* have not been accessed for the timeout configured in the lock property.
*
* @param string $path
* @return void
*
* @throws ezcWebdavLockPurgerException
* in case an error occurs during the lock purge process. Error
* might occur if the user identified by $adminCredentials does not
* have the appropriate permissions to write resources or if the
* backend is inconsistent.
*/
public function purgeLocks( $path = '/' )
{
$this->prepareEnvironment();
try
{
$purger = new ezcWebdavLockPurger( $this->backend );
$purger->purgeLocks( $path );
}
catch ( ezcWebdavException $e )
{
$this->restoreEnvironment();
throw $e;
}
$this->restoreEnvironment();
}
/**
* Prepares the server for administrative operations.
*
* Removes any configured auth mechanism in the server and stores it for
* later restoring. Registers the lock plugin, if it is not registered,
* yet. Locks the backend.
*/
private function prepareEnvironment()
{
if ( $this->server->auth !== null )
{
$this->serverAuth = $this->server->auth;
$this->server->auth = null;
}
$lockConf = null;
if ( !$this->server->pluginRegistry->hasPlugin(
ezcWebdavLockPlugin::PLUGIN_NAMESPACE
)
)
{
$lockConf = new ezcWebdavLockPluginConfiguration();
$this->server->pluginRegistry->registerPlugin(
$lockConf
);
$this->serverHadLockPlugin = false;
}
else
{
$lockConf = $this->server->pluginRegistry->getPluginConfig(
ezcWebdavLockPlugin::PLUGIN_NAMESPACE
);
$this->serverHadLockPlugin = true;
}
$this->backend->lock(
$lockConf->options->backendLockWaitTime,
$lockConf->options->backendLockTimeout
);
}
/**
* Restores the original server settings.
*
* Restores the original server auth (if it was set) and removes the lock
* plugin again, if it was not set before. Unlocks the backend.
*/
private function restoreEnvironment()
{
$this->backend->unlock();
if ( $this->serverAuth !== null )
{
$this->server->auth = $this->serverAuth;
}
if ( !$this->serverHadLockPlugin )
{
$this->server->pluginRegistry->unregisterPlugin(
new ezcWebdavLockPluginConfiguration()
);
}
$this->serverAuth = null;
$this->serverHadLockPlugin = null;
}
}
?>