Bladeren bron

ZF-10006: Zend_Captcha_Image::_gc() removes only captcha files identified by their suffix

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22589 44c647ce-9c0f-0410-b52a-842ac1e357ba
mikaelkael 15 jaren geleden
bovenliggende
commit
b0c58a89f9
2 gewijzigde bestanden met toevoegingen van 26 en 1 verwijderingen
  1. 5 1
      library/Zend/Captcha/Image.php
  2. 21 0
      tests/Zend/Captcha/ImageTest.php

+ 5 - 1
library/Zend/Captcha/Image.php

@@ -577,10 +577,14 @@ class Zend_Captcha_Image extends Zend_Captcha_Word
             // safety guard
             return;
         }
+        $suffixLength = strlen($this->_suffix);
         foreach (new DirectoryIterator($imgdir) as $file) {
             if (!$file->isDot() && !$file->isDir()) {
                 if ($file->getMTime() < $expire) {
-                    unlink($file->getPathname());
+                    // only deletes files ending with $this->_suffix
+                    if (substr($file->getFilename(), -($suffixLength)) == $this->_suffix) {
+                        unlink($file->getPathname());
+                    }
                 }
             }
         }

+ 21 - 0
tests/Zend/Captcha/ImageTest.php

@@ -219,6 +219,27 @@ class Zend_Captcha_ImageTest extends PHPUnit_Framework_TestCase
         $this->assertFalse(file_exists($filename), "File $filename was found even after GC");
     }
 
+    /**
+     * @group ZF-10006
+     */
+    public function testCaptchaImageCleanupOnlyCaptchaFilesIdentifiedByTheirSuffix()
+    {
+        $this->element->render($this->getView());
+        $filename = $this->testDir."/".$this->captcha->getId().".png";
+        $this->assertTrue(file_exists($filename));
+        //Create other cache file
+        $otherFile = $this->testDir . "/zf10006.cache";
+        file_put_contents($otherFile, '');
+        $this->assertTrue(file_exists($otherFile));
+        $this->captcha->setExpiration(1);
+        $this->captcha->setGcFreq(1);
+        sleep(2);
+        $this->captcha->generate();
+        clearstatcache();
+        $this->assertFalse(file_exists($filename), "File $filename was found even after GC");
+        $this->assertTrue(file_exists($otherFile), "File $otherFile was not found after GC");
+    }
+
     public function testGenerateReturnsId()
     {
         $id = $this->captcha->generate();