diff --git a/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php b/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php index b2be33ad88ec1..406019b56554d 100644 --- a/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php +++ b/src/Symfony/Component/ClassLoader/ClassCollectionLoader.php @@ -10,6 +10,7 @@ */ namespace Symfony\Component\ClassLoader; +use Symfony\Component\Filesystem\Filesystem; /** * ClassCollectionLoader. @@ -229,7 +230,8 @@ private static function compressCode($code) */ private static function writeCacheFile($file, $content) { - $tmpFile = tempnam(dirname($file), basename($file)); + $tmpFile = Filesystem::tempnam2(dirname($file), basename($file)); + if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) { @chmod($file, 0666 & ~umask()); diff --git a/src/Symfony/Component/ClassLoader/composer.json b/src/Symfony/Component/ClassLoader/composer.json index 84ce6a0a633a7..6594457be4c3a 100644 --- a/src/Symfony/Component/ClassLoader/composer.json +++ b/src/Symfony/Component/ClassLoader/composer.json @@ -20,7 +20,8 @@ "php": ">=5.3.3" }, "require-dev": { - "symfony/finder": "~2.0" + "symfony/finder": "~2.0", + "symfony/filesystem": "~2.4" }, "autoload": { "psr-0": { "Symfony\\Component\\ClassLoader\\": "" } diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php index f9a1c2a2eb0dc..d2ec841a94270 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php @@ -21,6 +21,7 @@ use Symfony\Component\DependencyInjection\SimpleXMLElement; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Exception\RuntimeException; +use Symfony\Component\Filesystem\Filesystem; /** * XmlFileLoader loads XML files service definitions. @@ -309,7 +310,7 @@ public function validateSchema(\DOMDocument $dom) foreach ($schemaLocations as $namespace => $location) { $parts = explode('/', $location); if (0 === stripos($location, 'phar://')) { - $tmpfile = tempnam(sys_get_temp_dir(), 'sf2'); + $tmpfile = Filesystem::tempnam2(sys_get_temp_dir(), 'sf2'); if ($tmpfile) { copy($location, $tmpfile); $tmpfiles[] = $tmpfile; diff --git a/src/Symfony/Component/DependencyInjection/composer.json b/src/Symfony/Component/DependencyInjection/composer.json index 2190101fa2c9f..73caaecff48b2 100644 --- a/src/Symfony/Component/DependencyInjection/composer.json +++ b/src/Symfony/Component/DependencyInjection/composer.json @@ -16,7 +16,8 @@ } ], "require": { - "php": ">=5.3.3" + "php": ">=5.3.3", + "symfony/filesystem": "~2.4" }, "require-dev": { "symfony/yaml": "~2.0", diff --git a/src/Symfony/Component/Filesystem/Filesystem.php b/src/Symfony/Component/Filesystem/Filesystem.php index 3b1c9bde65a92..adaa577934e46 100644 --- a/src/Symfony/Component/Filesystem/Filesystem.php +++ b/src/Symfony/Component/Filesystem/Filesystem.php @@ -448,7 +448,7 @@ public function dumpFile($filename, $content, $mode = 0666) throw new IOException(sprintf('Unable to write to the "%s" directory.', $dir), 0, null, $dir); } - $tmpFile = tempnam($dir, basename($filename)); + $tmpFile = self::tempnam2($dir, basename($filename)); if (false === @file_put_contents($tmpFile, $content)) { throw new IOException(sprintf('Failed to write file "%s".', $filename), 0, null, $filename); @@ -471,4 +471,37 @@ private function toIterator($files) return $files; } + + /** adapted from: http://www.deltascripts.com/board/viewtopic.php?id=7843 */ + public static function tempnam2($dir, $prefix, $postfix='') + { + if (!getenv('DISABLE_FUNCTIONS')) { + return tempnam($dir, $prefix); + } + + if ($dir[strlen($dir) - 1] == '/') { + $trailing_slash = ""; + } else { + $trailing_slash = "/"; + } + + /* The PHP function is_dir returns true on files that have no extension. + The file type function will tell you correctly what the file is */ + if (!is_dir(realpath($dir)) || filetype(realpath($dir)) != "dir") { + // The specified dir is not actually a dir + return false; + } + if (!is_writable($dir)) { + // The directory will not let us create a file there + return false; + } + + do { + $seed = substr(md5(microtime().posix_getpid()), 0, 8); + $filename = $dir.$trailing_slash.$prefix.$seed.$postfix; + } while (file_exists($filename)); + touch($filename); + + return $filename; + } } diff --git a/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php b/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php index 948b3ffd141c1..5efa1959c681c 100644 --- a/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php +++ b/src/Symfony/Component/HttpKernel/CacheWarmer/CacheWarmer.php @@ -10,6 +10,7 @@ */ namespace Symfony\Component\HttpKernel\CacheWarmer; +use Symfony\Component\Filesystem\Filesystem; /** * Abstract cache warmer that knows how to write a file to the cache. @@ -20,7 +21,7 @@ abstract class CacheWarmer implements CacheWarmerInterface { protected function writeCacheFile($file, $content) { - $tmpFile = tempnam(dirname($file), basename($file)); + $tmpFile = Filesystem::tempnam2(dirname($file), basename($file)); if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $file)) { @chmod($file, 0666 & ~umask()); diff --git a/src/Symfony/Component/HttpKernel/HttpCache/Store.php b/src/Symfony/Component/HttpKernel/HttpCache/Store.php index 1d55ab4118f2a..0a2c50d8e5e19 100644 --- a/src/Symfony/Component/HttpKernel/HttpCache/Store.php +++ b/src/Symfony/Component/HttpKernel/HttpCache/Store.php @@ -14,6 +14,7 @@ namespace Symfony\Component\HttpKernel\HttpCache; +use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -343,7 +344,7 @@ private function save($key, $data) return false; } - $tmpFile = tempnam(dirname($path), basename($path)); + $tmpFile = Filesystem::tempnam2(dirname($path), basename($path)); if (false === $fp = @fopen($tmpFile, 'wb')) { return false; } diff --git a/src/Symfony/Component/HttpKernel/composer.json b/src/Symfony/Component/HttpKernel/composer.json index 3854dd389d1de..c0ef0eade0af3 100644 --- a/src/Symfony/Component/HttpKernel/composer.json +++ b/src/Symfony/Component/HttpKernel/composer.json @@ -32,7 +32,8 @@ "symfony/process": "~2.0", "symfony/routing": "~2.2", "symfony/stopwatch": "~2.2", - "symfony/templating": "~2.2" + "symfony/templating": "~2.2", + "symfony/filesystem": "~2.4" }, "suggest": { "symfony/browser-kit": "", diff --git a/src/Symfony/Component/Translation/Loader/XliffFileLoader.php b/src/Symfony/Component/Translation/Loader/XliffFileLoader.php index 0cafc043ac904..2ab8a76ca0414 100644 --- a/src/Symfony/Component/Translation/Loader/XliffFileLoader.php +++ b/src/Symfony/Component/Translation/Loader/XliffFileLoader.php @@ -11,6 +11,7 @@ namespace Symfony\Component\Translation\Loader; +use Symfony\Component\Filesystem\Filesystem; use Symfony\Component\Translation\MessageCatalogue; use Symfony\Component\Translation\Exception\InvalidResourceException; use Symfony\Component\Translation\Exception\NotFoundResourceException; @@ -111,7 +112,7 @@ private function parseFile($file) $location = str_replace('\\', '/', __DIR__).'/schema/dic/xliff-core/xml.xsd'; $parts = explode('/', $location); if (0 === stripos($location, 'phar://')) { - $tmpfile = tempnam(sys_get_temp_dir(), 'sf2'); + $tmpfile = Filesystem::tempnam2(sys_get_temp_dir(), 'sf2'); if ($tmpfile) { copy($location, $tmpfile); $parts = explode('/', str_replace('\\', '/', $tmpfile)); diff --git a/src/Symfony/Component/Translation/composer.json b/src/Symfony/Component/Translation/composer.json index 37fef30451385..eb4af845f410f 100644 --- a/src/Symfony/Component/Translation/composer.json +++ b/src/Symfony/Component/Translation/composer.json @@ -20,7 +20,8 @@ }, "require-dev": { "symfony/config": "~2.0", - "symfony/yaml": "~2.2" + "symfony/yaml": "~2.2", + "symfony/filesystem": "~2.4" }, "suggest": { "symfony/config": "",