Files
medicalalert-web-reloaded/wp/wp-content/plugins/imagify/inc/classes/class-imagify-files-iterator.php
Tony Volpe 4eb982d7a8 Merged in feature/from-pantheon (pull request #16)
code from pantheon

* code from pantheon
2024-01-10 17:03:02 +00:00

118 lines
2.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
defined( 'ABSPATH' ) || die( 'Cheatin uh?' );
/**
* Class allowing to filter DirectoryIterator, to return only files that Imagify can optimize and folders.
* It also allows to remove forbidden folders.
*
* @since 1.7
* @author Grégory Viguier
*/
class Imagify_Files_Iterator extends FilterIterator {
/**
* Class version.
*
* @var string
* @since 1.7
* @author Grégory Viguier
*/
const VERSION = '1.0.2';
/**
* Tell if the iterator will return both folders and images, or only images.
*
* @var bool
* @since 1.7
*/
protected $include_folders;
/**
* Filesystem object.
*
* @var object Imagify_Filesystem
* @since 1.7.1
* @access protected
* @author Grégory Viguier
*/
protected $filesystem;
/**
* Check whether the current element of the iterator is acceptable.
*
* @since 1.7
* @access public
* @author Grégory Viguier
*
* @param object $iterator The iterator that is being filtered.
* @param bool $include_folders True to return both folders and images. False to return only images.
*/
public function __construct( $iterator, $include_folders = true ) {
parent::__construct( $iterator );
$this->include_folders = (bool) $include_folders;
$this->filesystem = Imagify_Filesystem::get_instance();
}
/**
* Check whether the current element of the iterator is acceptable.
*
* @since 1.7
* @access public
* @author Grégory Viguier
*
* @return bool Returns whether the current element of the iterator is acceptable through this filter.
*/
public function accept(): bool {
static $extensions, $has_extension_method;
$file_path = $this->current()->getPathname();
// Prevent triggering an open_basedir restriction error.
$file_name = $this->filesystem->file_name( $file_path );
if ( '.' === $file_name || '..' === $file_name ) {
return false;
}
// Forbidden file/folder paths and names.
$is_dir = $this->isDir();
if ( $is_dir ) {
$file_path = trailingslashit( $file_path );
}
if ( Imagify_Files_Scan::is_path_forbidden( $file_path ) ) {
return false;
}
// OK for folders.
if ( $this->include_folders && $is_dir ) {
return true;
}
// Only files.
if ( ! $this->current()->isFile() ) {
return false;
}
// Only files with the required extension.
if ( ! isset( $extensions ) ) {
$extensions = array_keys( imagify_get_mime_types() );
$extensions = implode( '|', $extensions );
}
if ( ! isset( $has_extension_method ) ) {
// This method was introduced in php 5.3.6.
$has_extension_method = method_exists( $this->current(), 'getExtension' );
}
if ( $has_extension_method ) {
$file_extension = strtolower( $this->current()->getExtension() );
} else {
$file_extension = strtolower( $this->filesystem->path_info( $file_path, 'extension' ) );
}
return preg_match( '@^' . $extensions . '$@', $file_extension );
}
}