246 Zeilen
		
	
	
	
		
			7,3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			246 Zeilen
		
	
	
	
		
			7,3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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;
 | |
|     }
 | |
| 
 | |
| }
 |