| Current Path : /var/www/html/components/com_osmembership/helper/ |
| Current File : /var/www/html/components/com_osmembership/helper/image.php |
<?php
/**
* @package Joomla
* @subpackage Membership Pro
* @author Tuan Pham Ngoc
* @copyright Copyright (C) 2012 - 2026 Ossolution Team
* @license GNU/GPL, see LICENSE.php
*/
defined('_JEXEC') or die;
class OSMembershipHelperImage
{
/**
* All supported image types
*
* @var array
*/
protected array $imageTypes;
/**
* Constructor
*
*/
public function __construct()
{
$this->imageTypes = [
IMAGETYPE_GIF => [
'mime' => image_type_to_mime_type(IMAGETYPE_GIF), // image/gif
'extensions' => ['gif'],
],
IMAGETYPE_JPEG => [
'mime' => image_type_to_mime_type(IMAGETYPE_JPEG), // image/jpeg
'extensions' => ['jpg', 'jpeg'],
],
IMAGETYPE_JPEG2000 => [
'mime' => image_type_to_mime_type(IMAGETYPE_JPEG2000), // image/jp2
'extensions' => ['jp2'],
],
IMAGETYPE_PNG => [
'mime' => image_type_to_mime_type(IMAGETYPE_PNG), // image/png
'extensions' => ['png'],
],
IMAGETYPE_PSD => [
'mime' => image_type_to_mime_type(IMAGETYPE_PSD), // image/psd
'extensions' => ['psd'],
],
IMAGETYPE_BMP => [
'mime' => image_type_to_mime_type(IMAGETYPE_BMP), // image/bmp
'extensions' => ['bmp'],
],
IMAGETYPE_WBMP => [
'mime' => image_type_to_mime_type(IMAGETYPE_WBMP), // image/vnd.wap.wbmp
'extensions' => ['wbmp'],
],
IMAGETYPE_XBM => [
'mime' => image_type_to_mime_type(IMAGETYPE_XBM), // image/xbm
'extensions' => ['xbm'],
],
IMAGETYPE_TIFF_II => [
'mime' => image_type_to_mime_type(IMAGETYPE_TIFF_II), // image/tiff
'extensions' => ['tif', 'tiff'],
],
IMAGETYPE_TIFF_MM => [
'mime' => image_type_to_mime_type(IMAGETYPE_TIFF_MM), // image/tiff
'extensions' => ['tif', 'tiff'],
],
IMAGETYPE_IFF => [
'mime' => image_type_to_mime_type(IMAGETYPE_IFF), // image/iff
'extensions' => ['iff'],
],
IMAGETYPE_JB2 => [
'mime' => image_type_to_mime_type(IMAGETYPE_JB2), // image/jb2 (may vary)
'extensions' => ['jb2'],
],
IMAGETYPE_JPC => [
'mime' => image_type_to_mime_type(IMAGETYPE_JPC), // image/jp2
'extensions' => ['jpc'],
],
IMAGETYPE_JP2 => [
'mime' => image_type_to_mime_type(IMAGETYPE_JP2), // image/jp2
'extensions' => ['jp2'],
],
IMAGETYPE_JPX => [
'mime' => image_type_to_mime_type(IMAGETYPE_JPX), // image/jpx
'extensions' => ['jpx', 'jpf'],
],
IMAGETYPE_ICO => [
'mime' => image_type_to_mime_type(IMAGETYPE_ICO), // image/vnd.microsoft.icon
'extensions' => ['ico'],
],
IMAGETYPE_WEBP => [
'mime' => image_type_to_mime_type(IMAGETYPE_WEBP), // image/webp
'extensions' => ['webp'],
],
];
if (version_compare(PHP_VERSION, '8.1.0', '>='))
{
$this->imageTypes[IMAGETYPE_AVIF] = [
'mime' => image_type_to_mime_type(IMAGETYPE_AVIF), // image/avif
'extensions' => ['avif'],
];
}
if (version_compare(PHP_VERSION, '8.5.0', '>='))
{
$this->imageTypes[IMAGETYPE_HEIF] = [
'mime' => image_type_to_mime_type(IMAGETYPE_HEIF),
'extensions' => ['heif', 'heic'],
];
}
}
/**
* Get all image types constants
*
* @return array
*/
public function getAllImageTypeConstants(): array
{
return array_keys($this->imageTypes);
}
/**
* Return all valid image mime types
*
* @return array
*/
public function getAllImageMimeTypes(): array
{
$mimeTypes = [];
foreach ($this->imageTypes as $imageType)
{
$mimeTypes[] = $imageType['mime'];
}
return $mimeTypes;
}
/**
* Get all valid image file extensions
*
* @return array
*/
public function getAllImageFileExtensions()
{
$extensions = [];
foreach ($this->imageTypes as $imageType)
{
$extensions = array_merge($extensions, $imageType['extensions']);
}
return array_unique($extensions);
}
/**
* Method to validate an image
*
* @param string $imageFilePath
* @param array|false $validImageFileExtensions
* @param array $validImageTypes
* @param array $validImageMimeTypes
*
* @return bool
*/
public function isValidImage(
string $imageFilePath,
$validImageFileExtensions = [],
array $validImageTypes = [],
array $validImageMimeTypes = []
): bool {
if (!file_exists($imageFilePath))
{
return false;
}
// Validate file extensions
if ($validImageFileExtensions !== false)
{
if (!$validImageFileExtensions)
{
$validImageFileExtensions = $this->getAllImageFileExtensions();
}
else
{
$validImageFileExtensions = array_map('strtolower', $validImageFileExtensions);
}
$fileExt = strtolower(OSMembershipHelper::getFileExt($imageFilePath));
if (!in_array($fileExt, $validImageFileExtensions))
{
return false;
}
}
// Validate image
$imageInfo = getimagesize($imageFilePath);
if ($imageInfo === false)
{
return false;
}
// Validate image type returned by getimagesize() function
if (!$validImageTypes)
{
$validImageTypes = $this->getAllImageTypeConstants();
}
if (!in_array($imageInfo[2], $validImageTypes))
{
return false;
}
if (class_exists(finfo::class))
{
// Validate mime type string returned by finfo
if (!$validImageMimeTypes)
{
$validImageMimeTypes = $this->getAllImageMimeTypes();
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($imageFilePath);
if (!in_array($mimeType, $validImageMimeTypes))
{
return false;
}
}
return true;
}
/**
* Validate if $file is a valid uploaded image
*
* @param array $file
*
* @return bool
*/
public function isValidUploadedImage($file)
{
if (!isset($file['tmp_name']))
{
return false;
}
$fileExt = strtolower(OSMembershipHelper::getFileExt($file['name']));
if (!in_array($fileExt, $this->getAllImageFileExtensions()))
{
return false;
}
return $this->isValidImage($file['tmp_name'], false);
}
}