From 66ffb5f7e8562a2f880be3b58dcf1e602cd95d4f Mon Sep 17 00:00:00 2001 From: Angie Byron Date: Wed, 1 Dec 2010 00:13:47 +0000 Subject: #935036 by bfroehle, dww, int: Exclude '.' and '..' when recursing through directories in update module. --- includes/filetransfer/filetransfer.inc | 30 +++++++++++++++++++++++++++++- includes/filetransfer/local.inc | 4 ++-- 2 files changed, 31 insertions(+), 3 deletions(-) (limited to 'includes/filetransfer') diff --git a/includes/filetransfer/filetransfer.inc b/includes/filetransfer/filetransfer.inc index 1afaa9e0f..a917ff7cd 100644 --- a/includes/filetransfer/filetransfer.inc +++ b/includes/filetransfer/filetransfer.inc @@ -208,7 +208,7 @@ abstract class FileTransfer { $destination = $destination . '/' . basename($source); } $this->createDirectory($destination); - foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) { + foreach (new RecursiveIteratorIterator(new SkipDotsRecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) { $relative_path = substr($filename, strlen($source)); if ($file->isDir()) { $this->createDirectory($destination . $relative_path); @@ -345,3 +345,31 @@ interface FileTransferChmodInterface { */ function chmodJailed($path, $mode, $recursive); } + +/** + * Provides an interface for iterating recursively over filesystem directories. + * + * Manually skips '.' and '..' directories, since no existing method is + * available in PHP 5.2. + * + * @todo Depreciate in favor of RecursiveDirectoryIterator::SKIP_DOTS once PHP + * 5.3 or later is required. + */ +class SkipDotsRecursiveDirectoryIterator extends RecursiveDirectoryIterator { + /** + * Constructs a SkipDotsRecursiveDirectoryIterator + * + * @param $path + * The path of the directory to be iterated over. + */ + function __construct($path) { + parent::__construct($path); + } + + function next() { + parent::next(); + while ($this->isDot()) { + parent::next(); + } + } +} diff --git a/includes/filetransfer/local.inc b/includes/filetransfer/local.inc index 8cad200b1..d5744c191 100644 --- a/includes/filetransfer/local.inc +++ b/includes/filetransfer/local.inc @@ -31,7 +31,7 @@ class FileTransferLocal extends FileTransfer implements FileTransferChmodInterfa // Programmer error assertion, not something we expect users to see. throw new FileTransferException('removeDirectoryJailed() called with a path (%directory) that is not a directory.', NULL, array('%directory' => $directory)); } - foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST) as $filename => $file) { + foreach (new RecursiveIteratorIterator(new SkipDotsRecursiveDirectoryIterator($directory), RecursiveIteratorIterator::CHILD_FIRST) as $filename => $file) { if ($file->isDir()) { if (@!drupal_rmdir($filename)) { throw new FileTransferException('Cannot remove directory %directory.', NULL, array('%directory' => $filename)); @@ -64,7 +64,7 @@ class FileTransferLocal extends FileTransfer implements FileTransferChmodInterfa public function chmodJailed($path, $mode, $recursive) { if ($recursive && is_dir($path)) { - foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) { + foreach (new RecursiveIteratorIterator(new SkipDotsRecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST) as $filename => $file) { if (@!chmod($filename, $mode)) { throw new FileTransferException('Cannot chmod %path.', NULL, array('%path' => $filename)); } -- cgit v1.2.3