From 3f6eaed0ab3a1ea0a06600561404d5da1df76c04 Mon Sep 17 00:00:00 2001
From: Cristiano Magro <cristiano.magro@vola.it>
Date: Mon, 26 Aug 2019 23:41:55 +0200
Subject: [PATCH] Classe per filtrare il nome file

---
 tests/Vola/UploadFile/FilenameTest.php |   21 ++++++++++
 phpunit.xml                            |    2 
 src/Vola/UploadFile/Filename.php       |   70 +++++++++++++++++++++++++++++++++++
 src/Vola/UploadFile/Autoloader.php     |    1 
 README.md                              |    7 +++
 5 files changed, 100 insertions(+), 1 deletions(-)

diff --git a/README.md b/README.md
index c36a81c..65d439c 100644
--- a/README.md
+++ b/README.md
@@ -5,4 +5,11 @@
 #Esecuzione phpunit test
 ~~~php
 $ phpunit.phar -c phpunit.xml
+~~~
 
+#Configusazione
+Occorre installare le dipendenze con composer.
+
+~~~
+$ composer update
+~~~
\ No newline at end of file
diff --git a/phpunit.xml b/phpunit.xml
index bc47a8c..0f16264 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -1,4 +1,4 @@
-<phpunit bootstrap="src/Vola/UploadFile/autoloader.php"
+<phpunit bootstrap="src/Vola/UploadFile/Autoloader.php"
          stopOnFailure="true">
     <testsuites>
         <testsuite name="FileUpload">
diff --git a/src/Vola/UploadFile/Autoloader.php b/src/Vola/UploadFile/Autoloader.php
index 647864b..d9ef722 100644
--- a/src/Vola/UploadFile/Autoloader.php
+++ b/src/Vola/UploadFile/Autoloader.php
@@ -31,6 +31,7 @@
         'Upload_Exc_FileNotExist' => 'Exc/FileNotExist.php',
         'Upload_MgrFile' => 'MgrFile.php',
         'Upload_FileUp' => 'FileUp.php',
+        'Upload_Filename' => 'Filename.php',
     );
 
     /**
diff --git a/src/Vola/UploadFile/Filename.php b/src/Vola/UploadFile/Filename.php
new file mode 100644
index 0000000..78eff8c
--- /dev/null
+++ b/src/Vola/UploadFile/Filename.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: cristiano
+ * Date: 26/08/19
+ * Time: 23.20
+ */
+
+class Upload_Filename
+{
+
+    protected function __construct()
+    {
+    }
+
+    /**
+     * Ritorno un'istanza dell'oggetto
+     * @return Upload_Filename
+     */
+    public function create()
+    {
+        $instance = new self();
+        return $instance;
+    }
+
+    public function filter($filename, $beautify = true)
+    {
+        // sanitize filename
+        $filename = preg_replace(
+            '~
+        [<>:"/\\|?*]|            # file system reserved https://en.wikipedia.org/wiki/Filename#Reserved_characters_and_words
+        [\x00-\x1F]|             # control characters http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx
+        [\x7F\xA0\xAD]|          # non-printing characters DEL, NO-BREAK SPACE, SOFT HYPHEN
+        [#\[\]@!$&\'()+,;=]|     # URI reserved https://tools.ietf.org/html/rfc3986#section-2.2
+        [{}^\~`]                 # URL unsafe characters https://www.ietf.org/rfc/rfc1738.txt
+        ~x',
+            '-', $filename);
+        // avoids ".", ".." or ".hiddenFiles"
+        $filename = ltrim($filename, '.-');
+        // optional beautification
+        if ($beautify) $filename = $this->beautify_filename($filename);
+        // maximize filename length to 255 bytes http://serverfault.com/a/9548/44086
+        $ext = pathinfo($filename, PATHINFO_EXTENSION);
+        $filename = mb_strcut(pathinfo($filename, PATHINFO_FILENAME), 0, 255 - ($ext ? strlen($ext) + 1 : 0), mb_detect_encoding($filename)) . ($ext ? '.' . $ext : '');
+        return $filename;
+    }
+
+    public function beautify_filename($filename) {
+        // reduce consecutive characters
+        $filename = preg_replace(array(
+            // "file   name.zip" becomes "file-name.zip"
+            '/ +/',
+            // "file___name.zip" becomes "file-name.zip"
+            '/_+/',
+            // "file---name.zip" becomes "file-name.zip"
+            '/-+/'
+        ), '-', $filename);
+        $filename = preg_replace(array(
+            // "file--.--.-.--name.zip" becomes "file.name.zip"
+            '/-*\.-*/',
+            // "file...name..zip" becomes "file.name.zip"
+            '/\.{2,}/'
+        ), '.', $filename);
+        // lowercase for windows/unix interoperability http://support.microsoft.com/kb/100625
+        $filename = mb_strtolower($filename, mb_detect_encoding($filename));
+        // ".file-name.-" becomes "file-name"
+        $filename = trim($filename, '.-');
+        return $filename;
+    }
+}
\ No newline at end of file
diff --git a/tests/Vola/UploadFile/FilenameTest.php b/tests/Vola/UploadFile/FilenameTest.php
new file mode 100644
index 0000000..4020cc6
--- /dev/null
+++ b/tests/Vola/UploadFile/FilenameTest.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: cristiano
+ * Date: 26/08/19
+ * Time: 23.25
+ */
+
+class FilenameTest extends PHPUnit_Framework_TestCase
+{
+
+    public function testFilename()
+    {
+        $nome = '../ciCcio-- a.zip';
+        $atteso = 'ciccio-a.zip';
+
+        $esito = Upload_Filename::create()->filter($nome);
+
+        $this->assertEquals($atteso, $esito);
+    }
+}
\ No newline at end of file

--
Gitblit v1.8.0