diff options
author | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-12-01 00:13:47 +0000 |
---|---|---|
committer | Angie Byron <webchick@24967.no-reply.drupal.org> | 2010-12-01 00:13:47 +0000 |
commit | 66ffb5f7e8562a2f880be3b58dcf1e602cd95d4f (patch) | |
tree | 1ab39ea6455e04767db524ff098e2dd4d409593e /includes/filetransfer | |
parent | 8fc5911c36c3671aaaa12dc02506873cec658e00 (diff) | |
download | brdo-66ffb5f7e8562a2f880be3b58dcf1e602cd95d4f.tar.gz brdo-66ffb5f7e8562a2f880be3b58dcf1e602cd95d4f.tar.bz2 |
#935036 by bfroehle, dww, int: Exclude '.' and '..' when recursing through directories in update module.
Diffstat (limited to 'includes/filetransfer')
-rw-r--r-- | includes/filetransfer/filetransfer.inc | 30 | ||||
-rw-r--r-- | includes/filetransfer/local.inc | 4 |
2 files changed, 31 insertions, 3 deletions
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)); } |