PageRenderTime 93ms CodeModel.GetById 70ms app.highlight 5ms RepoModel.GetById 15ms app.codeStats 1ms

/library/Zend/Validate/File/Md5.php

http://rewardvn.googlecode.com/
PHP | 183 lines | 76 code | 17 blank | 90 comment | 7 complexity | 777900907c4968c80679765138c924e9 MD5 | raw file
  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: Md5.php 22697 2010-07-26 21:14:47Z alexander $
 20 */
 21
 22/**
 23 * @see Zend_Validate_File_Hash
 24 */
 25require_once 'Zend/Validate/File/Hash.php';
 26
 27/**
 28 * Validator for the md5 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_Md5 extends Zend_Validate_File_Hash
 36{
 37    /**
 38     * @const string Error constants
 39     */
 40    const DOES_NOT_MATCH = 'fileMd5DoesNotMatch';
 41    const NOT_DETECTED   = 'fileMd5NotDetected';
 42    const NOT_FOUND      = 'fileMd5NotFound';
 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 md5 hashes",
 49        self::NOT_DETECTED   => "A md5 hash could not be evaluated for the given file",
 50        self::NOT_FOUND      => "File '%value%' could not be found",
 51    );
 52
 53    /**
 54     * Hash of the file
 55     *
 56     * @var string
 57     */
 58    protected $_hash;
 59
 60    /**
 61     * Sets validator options
 62     *
 63     * $hash is the hash we accept for the file $file
 64     *
 65     * @param  string|array $options
 66     * @return void
 67     */
 68    public function __construct($options)
 69    {
 70        if ($options instanceof Zend_Config) {
 71            $options = $options->toArray();
 72        } elseif (is_scalar($options)) {
 73            $options = array('hash1' => $options);
 74        } elseif (!is_array($options)) {
 75            require_once 'Zend/Validate/Exception.php';
 76            throw new Zend_Validate_Exception('Invalid options to validator provided');
 77        }
 78
 79        $this->setMd5($options);
 80    }
 81
 82    /**
 83     * Returns all set md5 hashes
 84     *
 85     * @return array
 86     */
 87    public function getMd5()
 88    {
 89        return $this->getHash();
 90    }
 91
 92    /**
 93     * Sets the md5 hash for one or multiple files
 94     *
 95     * @param  string|array $options
 96     * @param  string       $algorithm (Deprecated) Algorithm to use, fixed to md5
 97     * @return Zend_Validate_File_Hash Provides a fluent interface
 98     */
 99    public function setHash($options)
100    {
101        if (!is_array($options)) {
102            $options = (array) $options;
103        }
104
105        $options['algorithm'] = 'md5';
106        parent::setHash($options);
107        return $this;
108    }
109
110    /**
111     * Sets the md5 hash for one or multiple files
112     *
113     * @param  string|array $options
114     * @return Zend_Validate_File_Hash Provides a fluent interface
115     */
116    public function setMd5($options)
117    {
118        $this->setHash($options);
119        return $this;
120    }
121
122    /**
123     * Adds the md5 hash for one or multiple files
124     *
125     * @param  string|array $options
126     * @param  string       $algorithm (Deprecated) Algorithm to use, fixed to md5
127     * @return Zend_Validate_File_Hash Provides a fluent interface
128     */
129    public function addHash($options)
130    {
131        if (!is_array($options)) {
132            $options = (array) $options;
133        }
134
135        $options['algorithm'] = 'md5';
136        parent::addHash($options);
137        return $this;
138    }
139
140    /**
141     * Adds the md5 hash for one or multiple files
142     *
143     * @param  string|array $options
144     * @return Zend_Validate_File_Hash Provides a fluent interface
145     */
146    public function addMd5($options)
147    {
148        $this->addHash($options);
149        return $this;
150    }
151
152    /**
153     * Defined by Zend_Validate_Interface
154     *
155     * Returns true if and only if the given file confirms the set hash
156     *
157     * @param  string $value Filename to check for hash
158     * @param  array  $file  File data from Zend_File_Transfer
159     * @return boolean
160     */
161    public function isValid($value, $file = null)
162    {
163        // Is file readable ?
164        require_once 'Zend/Loader.php';
165        if (!Zend_Loader::isReadable($value)) {
166            return $this->_throw($file, self::NOT_FOUND);
167        }
168
169        $hashes = array_unique(array_keys($this->_hash));
170        $filehash = hash_file('md5', $value);
171        if ($filehash === false) {
172            return $this->_throw($file, self::NOT_DETECTED);
173        }
174
175        foreach($hashes as $hash) {
176            if ($filehash === $hash) {
177                return true;
178            }
179        }
180
181        return $this->_throw($file, self::DOES_NOT_MATCH);
182    }
183}