summaryrefslogtreecommitdiff
path: root/includes/filetransfer
diff options
context:
space:
mode:
authorAngie Byron <webchick@24967.no-reply.drupal.org>2010-12-01 00:13:47 +0000
committerAngie Byron <webchick@24967.no-reply.drupal.org>2010-12-01 00:13:47 +0000
commit66ffb5f7e8562a2f880be3b58dcf1e602cd95d4f (patch)
tree1ab39ea6455e04767db524ff098e2dd4d409593e /includes/filetransfer
parent8fc5911c36c3671aaaa12dc02506873cec658e00 (diff)
downloadbrdo-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.inc30
-rw-r--r--includes/filetransfer/local.inc4
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));
}