Your IP : 216.73.216.182


Current Path : /var/www/html/components/com_osmembership/helper/
Upload File :
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);
	}
}