108 lines
2.1 KiB
PHP
108 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace A7;
|
|
|
|
/**
|
|
* Recursively loads all php files in all subdirectories of the given path
|
|
*
|
|
* @param $directory
|
|
*
|
|
* @throws \Exception
|
|
*/
|
|
function autoload( $directory ) {
|
|
|
|
// Ensure this path exists
|
|
if ( ! is_dir( $directory ) ) {
|
|
return;
|
|
}
|
|
|
|
// Get a listing of the current directory
|
|
$scanned_dir = scandir( $directory );
|
|
|
|
// Ignore these items from scandir
|
|
$ignore = [
|
|
'.',
|
|
'..'
|
|
];
|
|
|
|
// Remove the ignored items
|
|
$scanned_dir = array_diff( $scanned_dir, $ignore );
|
|
|
|
if ( empty( $scanned_dir ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( count( $scanned_dir ) > 250 ) {
|
|
throw new \Exception( 'Too many files attempted to load via autoload' );
|
|
}
|
|
|
|
foreach ( $scanned_dir as $item ) {
|
|
|
|
$filename = $directory . '/' . $item;
|
|
$real_path = realpath( $filename );
|
|
|
|
if ( false === $real_path ) {
|
|
continue;
|
|
}
|
|
|
|
$filetype = filetype( $real_path );
|
|
|
|
if ( empty( $filetype ) ) {
|
|
continue;
|
|
}
|
|
|
|
// If it's a directory then recursively load it
|
|
if ( 'dir' === $filetype ) {
|
|
|
|
autoload( $real_path );
|
|
} // If it's a file, let's try to load it
|
|
else if ( 'file' === $filetype ) {
|
|
|
|
if ( true !== is_readable( $real_path ) ) {
|
|
continue;
|
|
}
|
|
|
|
// Don't allow files that have been uploaded
|
|
if ( is_uploaded_file( $real_path ) ) {
|
|
continue;
|
|
}
|
|
|
|
// Only for files that really exist
|
|
if ( true !== file_exists( $real_path ) ) {
|
|
continue;
|
|
}
|
|
|
|
$pathinfo = pathinfo( $real_path );
|
|
|
|
// An empty filename wouldn't be a good idea
|
|
if ( empty( $pathinfo['filename'] ) ) {
|
|
continue;
|
|
}
|
|
|
|
// Sorry, need an extension
|
|
if ( empty( $pathinfo['extension'] ) ) {
|
|
continue;
|
|
}
|
|
|
|
// Actually, we want just a PHP extension!
|
|
if ( 'php' !== $pathinfo['extension'] ) {
|
|
continue;
|
|
}
|
|
|
|
$filesize = filesize( $real_path );
|
|
|
|
// Don't include negative sized files
|
|
if ( $filesize < 0 ) {
|
|
throw new \Exception( 'File size is negative, not autoloading' );
|
|
}
|
|
|
|
// Don't include files that are greater than 300kb
|
|
if ( $filesize > 300000 ) {
|
|
throw new \Exception( 'File size is greater than 300kb, not autoloading' );
|
|
}
|
|
|
|
require_once( $real_path );
|
|
}
|
|
}
|
|
}
|