Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge branch 'develop'

  • Loading branch information...
commit e2bea54f98eb4fc09b5b296565eb7e54ae43642b 2 parents 8db4ce6 + e4a4fb6
@codeguy authored
View
4 src/Upload/Storage/FileSystem.php
@@ -58,12 +58,16 @@ class FileSystem extends \Upload\Storage\Base
* @param string $directory Relative or absolute path to upload directory
* @param bool $overwrite Should this overwrite existing files?
* @throws \InvalidArgumentException If directory does not exist
+ * @throws \InvalidArgumentException If directory is not writable
*/
public function __construct($directory, $overwrite = false)
{
if (!is_dir($directory)) {
throw new \InvalidArgumentException('Directory does not exist');
}
+ if (!is_writable($directory)) {
+ throw new \InvalidArgumentException('Directory is not writable');
+ }
$this->directory = rtrim($directory, '/') . DIRECTORY_SEPARATOR;
$this->overwrite = $overwrite;
}
View
95 src/Upload/Validation/Extension.php
@@ -0,0 +1,95 @@
+<?php
+/**
+ * Upload
+ *
+ * @author Josh Lockhart <info@joshlockhart.com>
+ * @copyright 2012 Josh Lockhart
+ * @link http://www.joshlockhart.com
+ * @version 1.0.0
+ *
+ * MIT LICENSE
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+namespace Upload\Validation;
+
+/**
+ * Validate File Extension
+ *
+ * This class validates an uploads file extension. It takes file extension with out dot
+ * or array of extensions. For example: 'png' or array('jpg', 'png', 'gif').
+ *
+ * WARING! Validation only by file extension not very secure.
+ *
+ * @author Alex Kucherenko <kucherenko.email@gmail.com>
+ * @package Upload
+ */
+class Extension extends \Upload\Validation\Base
+{
+ /**
+ * Array of cceptable file extensions without leading dots
+ * @var array
+ */
+ protected $allowedExtensions;
+
+ /**
+ * Error message
+ * @var string
+ */
+ protected $message = 'Invalid file extension. Must be one of: %s';
+
+ /**
+ * Constructor
+ *
+ * @param string|array $allowedExtensions Allowed file extensions
+ * @example new \Upload\Validation\Extension(array('png','jpg','gif'))
+ * @example new \Upload\Validation\Extension('png')
+ */
+ public function __construct($allowedExtensions)
+ {
+ if (is_string($allowedExtensions)) {
+ $allowedExtensions = array($allowedExtensions);
+ }
+
+ array_filter($allowedExtensions, function ($val) {
+ return strtolower($val);
+ });
+
+ $this->allowedExtensions = $allowedExtensions;
+ }
+
+ /**
+ * Validate
+ * @param \Upload\File $file
+ * @return bool
+ */
+ public function validate(\Upload\File $file)
+ {
+ $fileExtension = strtolower($file->getExtension());
+ $isValid = true;
+
+ if (!in_array($fileExtension, $this->allowedExtensions)) {
+ $this->setMessage(sprintf($this->message, implode(', ', $this->allowedExtensions)));
+ $isValid = false;
+ }
+
+ return $isValid;
+ }
+}
View
43 tests/Validation/ExtensionTest.php
@@ -0,0 +1,43 @@
+<?php
+class ExtensionTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * Setup (each test)
+ */
+ public function setUp()
+ {
+ // Path to test assets
+ $this->assetsDirectory = dirname(__DIR__) . '/assets';
+
+ // Create stubbed storage instance
+ $this->storage = $this->getMock(
+ '\Upload\Storage\FileSystem',
+ array('upload'),
+ array($this->assetsDirectory)
+ );
+ $this->storage->expects($this->any())
+ ->method('upload')
+ ->will($this->returnValue(true));
+
+ // Reset $_FILES superglobal
+ $_FILES['foo'] = array(
+ 'name' => 'foo.txt',
+ 'tmp_name' => $this->assetsDirectory . '/foo.txt',
+ 'error' => 0
+ );
+ }
+
+ public function testValidExtension()
+ {
+ $file = new \Upload\File('foo', $this->storage);
+ $validation = new \Upload\Validation\Extension('txt');
+ $this->assertTrue($validation->validate($file));
+ }
+
+ public function testInvalidExtension()
+ {
+ $file = new \Upload\File('foo', $this->storage);
+ $validation = new \Upload\Validation\Extension('csv');
+ $this->assertFalse($validation->validate($file));
+ }
+}
Please sign in to comment.
Something went wrong with that request. Please try again.