/**
* Searches the directory paths for a given file.
*
* @param mixed $paths An path string or array of path strings to search in
* @param string $file The file name to look for.
*
* @return mixed The full path and file name for the target file, or boolean false if the file is not found in any of the paths.
*
* @since 1.7.0
*/
public static function find($paths, $file)
{
// Force to array
if (!\is_array($paths) && !$paths instanceof \Iterator) {
settype($paths, 'array');
}
// Start looping through the path set
foreach ($paths as $path) {
// Get the path to the file
$fullname = $path . '/' . $file;
// Is the path based on a stream?
if (strpos($path, '://') === false) {
// Not a stream, so do a realpath() to avoid directory
// traversal attempts on the local file system.
// Needed for substr() later
$path = realpath($path);
$fullname = realpath($fullname);
}
/*
* The substr() check added to make sure that the realpath()
* results in a directory registered so that
* non-registered directories are not accessible via directory
* traversal attempts.
*/
if (file_exists($fullname) && substr($fullname, 0, \strlen($path)) === $path) {
return $fullname;
}
}
// Could not find the file in the set of paths
return false;
}