rebase from live enviornment
This commit is contained in:
88
wp/plugins/wordfence/lib/wfDirectoryIterator.php
Normal file
88
wp/plugins/wordfence/lib/wfDirectoryIterator.php
Normal file
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
abstract class wfDirectoryIterator {
|
||||
|
||||
abstract public function file($file);
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $directory;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $directory_limit;
|
||||
|
||||
|
||||
private $directories_entered = array();
|
||||
private $directories_processed = array();
|
||||
|
||||
/**
|
||||
* @var callback
|
||||
*/
|
||||
private $callback;
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
private $max_iterations;
|
||||
private $iterations;
|
||||
|
||||
/**
|
||||
* @param string $directory
|
||||
* @param int $max_files_per_directory
|
||||
* @param int $max_iterations
|
||||
*/
|
||||
public function __construct($directory = ABSPATH, $max_files_per_directory = 20000, $max_iterations = 1000000) {
|
||||
$this->directory = $directory;
|
||||
$this->directory_limit = $max_files_per_directory;
|
||||
$this->max_iterations = $max_iterations;
|
||||
}
|
||||
|
||||
public function run() {
|
||||
$this->iterations = 0;
|
||||
$this->scan($this->directory);
|
||||
}
|
||||
|
||||
protected function scan($dir) {
|
||||
$dir = rtrim($dir, DIRECTORY_SEPARATOR);
|
||||
$handle = opendir($dir);
|
||||
$file_count = 0;
|
||||
while ($file = readdir($handle)) {
|
||||
if ($file == '.' || $file == '..') {
|
||||
continue;
|
||||
}
|
||||
$file_path = $dir . '/' . $file;
|
||||
$real_path = realpath($file_path);
|
||||
if (isset($this->directories_processed[$real_path]) || isset($this->directories_entered[$real_path])) { //Already processed or being processed, possibly a recursive symlink
|
||||
continue;
|
||||
}
|
||||
|
||||
else if (is_dir($file_path)) {
|
||||
$this->directories_entered[$real_path] = 1;
|
||||
if ($this->scan($file_path) === false) {
|
||||
closedir($handle);
|
||||
return false;
|
||||
}
|
||||
$this->directories_processed[$real_path] = 1;
|
||||
unset($this->directories_entered[$real_path]);
|
||||
}
|
||||
else {
|
||||
if ($this->file($file_path) === false) {
|
||||
closedir($handle);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (++$file_count >= $this->directory_limit) {
|
||||
break;
|
||||
}
|
||||
if (++$this->iterations >= $this->max_iterations) {
|
||||
closedir($handle);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user