source: trunk/library/Zend/Validate/File/Hash.php @ 5146

Revision 5146, 5.3 KB checked in by wmerlotto, 12 years ago (diff)

Ticket #2305 - Enviando alteracoes, desenvolvidas internamente na Prognus. Library: adicionando arquivos.

Line 
1<?php
2/**
3 * Zend Framework
4 *
5 * LICENSE
6 *
7 * This source file is subject to the new BSD license that is bundled
8 * with this package in the file LICENSE.txt.
9 * It is also available through the world-wide-web at this URL:
10 * http://framework.zend.com/license/new-bsd
11 * If you did not receive a copy of the license and are unable to
12 * obtain it through the world-wide-web, please send an email
13 * to license@zend.com so we can send you a copy immediately.
14 *
15 * @category  Zend
16 * @package   Zend_Validate
17 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
18 * @license   http://framework.zend.com/license/new-bsd     New BSD License
19 * @version   $Id: Hash.php 22668 2010-07-25 14:50:46Z thomas $
20 */
21
22/**
23 * @see Zend_Validate_Abstract
24 */
25require_once 'Zend/Validate/Abstract.php';
26
27/**
28 * Validator for the hash of given files
29 *
30 * @category  Zend
31 * @package   Zend_Validate
32 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
33 * @license   http://framework.zend.com/license/new-bsd     New BSD License
34 */
35class Zend_Validate_File_Hash extends Zend_Validate_Abstract
36{
37    /**
38     * @const string Error constants
39     */
40    const DOES_NOT_MATCH = 'fileHashDoesNotMatch';
41    const NOT_DETECTED   = 'fileHashHashNotDetected';
42    const NOT_FOUND      = 'fileHashNotFound';
43
44    /**
45     * @var array Error message templates
46     */
47    protected $_messageTemplates = array(
48        self::DOES_NOT_MATCH => "File '%value%' does not match the given hashes",
49        self::NOT_DETECTED   => "A hash could not be evaluated for the given file",
50        self::NOT_FOUND      => "File '%value%' is not readable or does not exist"
51    );
52
53    /**
54     * Hash of the file
55     *
56     * @var string
57     */
58    protected $_hash;
59
60    /**
61     * Sets validator options
62     *
63     * @param  string|array $options
64     * @return void
65     */
66    public function __construct($options)
67    {
68        if ($options instanceof Zend_Config) {
69            $options = $options->toArray();
70        } elseif (is_scalar($options)) {
71            $options = array('hash1' => $options);
72        } elseif (!is_array($options)) {
73            require_once 'Zend/Validate/Exception.php';
74            throw new Zend_Validate_Exception('Invalid options to validator provided');
75        }
76
77        if (1 < func_num_args()) {
78            $options['algorithm'] = func_get_arg(1);
79        }
80
81        $this->setHash($options);
82    }
83
84    /**
85     * Returns the set hash values as array, the hash as key and the algorithm the value
86     *
87     * @return array
88     */
89    public function getHash()
90    {
91        return $this->_hash;
92    }
93
94    /**
95     * Sets the hash for one or multiple files
96     *
97     * @param  string|array $options
98     * @return Zend_Validate_File_Hash Provides a fluent interface
99     */
100    public function setHash($options)
101    {
102        $this->_hash  = null;
103        $this->addHash($options);
104
105        return $this;
106    }
107
108    /**
109     * Adds the hash for one or multiple files
110     *
111     * @param  string|array $options
112     * @return Zend_Validate_File_Hash Provides a fluent interface
113     */
114    public function addHash($options)
115    {
116        if (is_string($options)) {
117            $options = array($options);
118        } else if (!is_array($options)) {
119            require_once 'Zend/Validate/Exception.php';
120            throw new Zend_Validate_Exception("False parameter given");
121        }
122
123        $known = hash_algos();
124        if (!isset($options['algorithm'])) {
125            $algorithm = 'crc32';
126        } else {
127            $algorithm = $options['algorithm'];
128            unset($options['algorithm']);
129        }
130
131        if (!in_array($algorithm, $known)) {
132            require_once 'Zend/Validate/Exception.php';
133            throw new Zend_Validate_Exception("Unknown algorithm '{$algorithm}'");
134        }
135
136        foreach ($options as $value) {
137            $this->_hash[$value] = $algorithm;
138        }
139
140        return $this;
141    }
142
143    /**
144     * Defined by Zend_Validate_Interface
145     *
146     * Returns true if and only if the given file confirms the set hash
147     *
148     * @param  string $value Filename to check for hash
149     * @param  array  $file  File data from Zend_File_Transfer
150     * @return boolean
151     */
152    public function isValid($value, $file = null)
153    {
154        // Is file readable ?
155        require_once 'Zend/Loader.php';
156        if (!Zend_Loader::isReadable($value)) {
157            return $this->_throw($file, self::NOT_FOUND);
158        }
159
160        $algos  = array_unique(array_values($this->_hash));
161        $hashes = array_unique(array_keys($this->_hash));
162        foreach ($algos as $algorithm) {
163            $filehash = hash_file($algorithm, $value);
164            if ($filehash === false) {
165                return $this->_throw($file, self::NOT_DETECTED);
166            }
167
168            foreach($hashes as $hash) {
169                if ($filehash === $hash) {
170                    return true;
171                }
172            }
173        }
174
175        return $this->_throw($file, self::DOES_NOT_MATCH);
176    }
177
178    /**
179     * Throws an error of the given type
180     *
181     * @param  string $file
182     * @param  string $errorType
183     * @return false
184     */
185    protected function _throw($file, $errorType)
186    {
187        if ($file !== null) {
188            $this->_value = $file['name'];
189        }
190
191        $this->_error($errorType);
192        return false;
193    }
194}
Note: See TracBrowser for help on using the repository browser.