Files
server/usr/share/psa-horde/ingo/lib/Transport/Vfs.php
2026-01-07 20:52:11 +01:00

134 lines
4.2 KiB
PHP

<?php
/**
* Copyright 2003-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file LICENSE for license information (ASL). If you
* did not receive this file, see http://www.horde.org/licenses/apache.
*
* @author Brent J. Nordquist <bjn@horde.org>
* @author Jan Schneider <jan@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/apache ASL
* @package Ingo
*/
/**
* Ingo_Transport_Vfs implements an Ingo transport driver using Horde VFS.
*
* @author Brent J. Nordquist <bjn@horde.org>
* @author Jan Schneider <jan@horde.org>
* @category Horde
* @license http://www.horde.org/licenses/apache ASL
* @package Ingo
*/
class Ingo_Transport_Vfs extends Ingo_Transport_Base
{
/**
* Constructs a new VFS-based storage driver.
*
* @param array $params A hash containing driver parameters.
*/
public function __construct(array $params = array())
{
$default_params = array(
'hostspec' => 'localhost',
'port' => 21,
'filename' => '.ingo_filter',
'vfstype' => 'ftp',
'vfs_path' => '',
'vfs_forward_path' => '',
);
$this->_supportShares = true;
parent::__construct(array_merge($default_params, $params));
}
/**
* Sets a script running on the backend.
*
* @param array $script The filter script information. Passed elements:
* - 'name': (string) the script name.
* - 'recipes': (array) the filter recipe objects.
* - 'script': (string) the filter script.
*
* @throws Ingo_Exception
*/
public function setScriptActive($script)
{
$this->_connect();
try {
if (!empty($script['script'])) {
$this->_vfs->writeData($this->_params['vfs_path'], $script['name'], $script['script'], true);
} elseif ($this->_vfs->exists($this->_params['vfs_path'], $script['name'])) {
$this->_vfs->deleteFile($this->_params['vfs_path'], $script['name']);
}
} catch (Horde_Vfs_Exception $e) {
throw new Ingo_Exception($e);
}
if (isset($this->_params['file_perms'])) {
try {
if (!empty($script['script'])) {
$this->_vfs->changePermissions($this->_params['vfs_path'], $script['name'], $this->_params['file_perms']);
}
} catch (Horde_Vfs_Exception $e) {
throw new Ingo_Exception($e);
}
}
}
/**
* Returns the content of the currently active script.
*
* @return array The complete ruleset of the specified user.
* @throws Ingo_Exception
* @throws Horde_Exception_NotFound
*/
public function getScript()
{
$this->_connect();
try {
if (!$this->_vfs->exists($this->_params['vfs_path'], $this->_params['filename'])) {
throw new Horde_Exception_NotFound();
}
return array(
'name' => $this->_params['filename'],
'script' => $this->_vfs->read($this->_params['vfs_path'], $this->_params['filename'])
);
} catch (Horde_Vfs_Exception $e) {
throw new Ingo_Exception($e);
}
}
/**
* Connect to the VFS server.
*
* @throws Ingo_Exception
*/
protected function _connect()
{
/* Do variable substitution. */
if (!empty($this->_params['vfs_path'])) {
$this->_params['vfs_path'] = str_replace(
array('%u', '%d', '%U'),
array(Ingo::getUser(), Ingo::getDomain(), $this->_params['username']),
$this->_params['vfs_path']);
}
if (!empty($this->_vfs)) {
return;
}
try {
$this->_vfs = $GLOBALS['injector']
->getInstance('Horde_Core_Factory_Vfs')
->create('ingo', array('type' => $this->_params['vfstype'],
'params' => $this->_params));
} catch (Horde_Exception $e) {
throw new Ingo_Exception($e);
}
}
}