1
0
Fork 0
MySQLDumper/library/Msd/Validate/File/Accessible.php

247 Zeilen
7,3 KiB
PHP

2011-06-10 21:55:32 +00:00
<?php
/**
* This file is part of MySQLDumper released under the GNU/GPL 2 license
* http://www.mysqldumper.net
*
* @package MySQLDumper
* @subpackage Ini
* @version SVN: $Rev$
* @author $Author$
*/
require_once 'Zend/Validate/Abstract.php';
/**
* Class to check the accessibility for files and directories.
*
* @package MySQLDumper
* @subpackage Validate
*/
class Msd_Validate_File_Accessible extends Zend_Validate_Abstract
{
/**
* @const string Error constant, file/directory doesn't exists.
*/
const NOT_EXISTS = 'accessNotExists';
/**
* @const string Error constant, file/directory isn't readable.
*/
const NOT_READABLE = 'accessNotReadable';
/**
* @const string Error constant, file/directory isn't writable.
*/
const NOT_WRITABLE = 'accessNotWritable';
/**
* @const string Error constant, file/directory isn't executable.
*/
const NOT_EXECUTABLE = 'accessNotExecutable';
/**
* @const string Error constant, file/directory isn't a directory.
*/
const NOT_A_DIRECTORY = 'accessNotADirectory';
/**
* @const string Error constant, file/directory isn't file.
*/
const NOT_A_FILE = 'accessNotAFile';
/**
* @const string Error constant, file/directory isn't link.
*/
const NOT_A_LINK = 'accessNotALink';
/**
* @const string Error constant, file/directory wasn't uploaded.
*/
const NOT_UPLOADED = 'accessNotUploaded';
/**
* @var array Error message templates
*/
protected $_messageTemplates = array();
/**
* @var array Options that determine which access types must checked.
*
* 'pathPrefix' - Will be prepended to the filename in checking method.
* 'accessTypes' - Access variants, that will be checked.
*/
protected $_options = array(
'pathPrefix' => '',
'accessTypes' => array(
'read' => false,
'write' => false,
'execute' => false,
'dir' => false,
'file' => false,
'uploaded' => false,
),
);
/**
* Class constructor. creates and initializes an instance of this validator.
*
* @param array $options Access checking options.
* 'pathPrefix' must be a string.
* 'accessTypes' could be an array, string or an
* instance of Zend_config
* @see self::$options
* @return void
*/
public function __construct($options = null)
{
///get error messages from selected language
$lang = Msd_Language::getInstance()->getTranslator();
$this->_messageTemplates = array(
self::NOT_EXISTS => $lang->_('L_ZEND_ID_ACCESS_NOT_EXISTS'),
self::NOT_READABLE => $lang->_('L_ZEND_ID_ACCESS_NOT_READABLE'),
self::NOT_WRITABLE => $lang->_('L_ZEND_ID_ACCESS_NOT_WRITABLE'),
self::NOT_EXECUTABLE => $lang->_('L_ZEND_ID_ACCESS_NOT_EXECUTABLE'),
self::NOT_A_FILE => $lang->_('L_ZEND_ID_ACCESS_NOT_A_FILE'),
self::NOT_A_DIRECTORY =>
$lang->_('L_ZEND_ID_ACCESS_NOT_A_DIRECTORY'),
self::NOT_A_LINK => $lang->_('L_ZEND_ID_ACCESS_NOT_A_LINK'),
self::NOT_UPLOADED => $lang->_('L_ZEND_ID_ACCESS_NOT_UPLOADED'),
);
if ($options !== null) {
$this->setOptions($options);
}
}
/**
* Sets the options for validation.
*
* @throws Msd_Validate_Exception
* @param array $options Options for the validation
* @see self::$options
* @return void
*/
public function setOptions($options)
{
if (!is_array($options)) {
include_once 'Msd/Validate/Exception.php';
throw new Msd_Validate_Exception(
'Options must be an array, string or instance '
. 'of Zend_Config!'
);
}
if (isset($options['accessTypes'])) {
$accessTypes = array();
if (is_array($options['accessTypes'])) {
$accessTypes = $options['accessTypes'];
} else if (is_string($options['accessTypes'])) {
$accessTypes = explode(',', $options['accessTypes']);
} else if ($options['accessTypes'] instanceof Zend_Config) {
$accessTypes = $options['accessTypes']->toArray();
} else {
include_once 'Msd/Validate/Exception.php';
throw new Msd_Validate_Exception(
'Access types must be an array, string or instance '
. 'of Zend_Config!'
);
}
foreach ($accessTypes as $accessType) {
if (isset($this->_options['accessTypes'][$accessType])) {
$this->_options['accessTypes'][$accessType] = true;
}
}
}
if (isset($options['pathPrefix'])) {
$this->_options['pathPrefix'] = $options['pathPrefix'];
}
}
/**
* Returns the current options array.
*
* @return array
*/
public function getOptions()
{
return $this->_options;
}
/**
* Defiend by Zend_Validate_Interface
*
* Checks the accessibility of a file.
*
* @param string $fileName Name of the file to be checked.
* @return bool
*/
public function isValid($fileName)
{
clearstatcache(true, $fileName);
$this->_setValue($fileName);
$fileName = $this->_options['pathPrefix'] . $fileName;
$isValid = true;
$accessTypes = $this->_options['accessTypes'];
if (!file_exists($fileName)) {
$this->_error(self::NOT_EXISTS);
$isValid = false;
}
if ($accessTypes['read']) {
if (!is_readable($fileName)) {
$this->_throw($fileName, self::NOT_READABLE);
$isValid = false;
}
}
if ($accessTypes['write']) {
if (!is_writable($fileName)) {
$this->_throw($fileName, self::NOT_WRITABLE);
$isValid = false;
}
}
if ($accessTypes['execute']) {
if (!is_executable($fileName)) {
$this->_throw($fileName, self::NOT_EXECUTABLE);
$isValid = false;
}
}
if ($accessTypes['dir']) {
if (!is_dir($fileName)) {
$this->_throw($fileName, self::NOT_A_DIRECTORY);
$isValid = false;
}
}
if ($accessTypes['file']) {
if (!is_file($fileName)) {
$this->_throw($fileName, self::NOT_A_FILE);
$isValid = false;
}
}
if ($accessTypes['uploaded']) {
if (!is_uploaded_file($fileName)) {
$this->_throw($fileName, self::NOT_UPLOADED);
$isValid = false;
}
}
return $isValid;
}
/**
* Throws an error of the given type
*
* @param string $fileName checked file which caused an error
* @param string $errorType Type of error
* @return false
*/
protected function _throw($fileName, $errorType)
{
if ($fileName !== null) {
$this->_setValue($fileName);
}
$this->_error($errorType);
return false;
}
}