SILENT KILLERPanel

Current Path: > > usr > src > litespeed-wp-plugin > 7.1 > > > litespeed-cache > src


Operation   : Linux premium131.web-hosting.com 4.18.0-553.44.1.lve.el8.x86_64 #1 SMP Thu Mar 13 14:29:12 UTC 2025 x86_64
Software     : Apache
Server IP    : 162.0.232.56 | Your IP: 216.73.216.111
Domains      : 1034 Domain(s)
Permission   : [ 0755 ]

Files and Folders in: //usr/src/litespeed-wp-plugin/7.1///litespeed-cache/src

NameTypeSizeLast ModifiedActions
cdn Directory - -
data_structure Directory - -
activation.cls.php File 15262 bytes April 24 2025 21:30:14.
admin-display.cls.php File 36240 bytes April 24 2025 21:30:14.
admin-settings.cls.php File 10266 bytes April 24 2025 21:30:14.
admin.cls.php File 4548 bytes April 24 2025 21:30:14.
api.cls.php File 11342 bytes April 24 2025 21:30:14.
avatar.cls.php File 6215 bytes April 24 2025 21:30:14.
base.cls.php File 31349 bytes April 24 2025 21:30:14.
cdn.cls.php File 13500 bytes April 24 2025 21:30:14.
cloud.cls.php File 53678 bytes April 24 2025 21:30:14.
conf.cls.php File 17803 bytes April 24 2025 21:30:14.
control.cls.php File 22153 bytes April 24 2025 21:30:14.
core.cls.php File 20310 bytes April 24 2025 21:30:14.
crawler-map.cls.php File 15013 bytes April 24 2025 21:30:14.
crawler.cls.php File 41611 bytes April 24 2025 21:30:14.
css.cls.php File 15501 bytes April 24 2025 21:30:14.
data.cls.php File 18036 bytes April 24 2025 21:30:14.
data.upgrade.func.php File 23662 bytes April 24 2025 21:30:14.
db-optm.cls.php File 10059 bytes April 24 2025 21:30:14.
debug2.cls.php File 13398 bytes April 24 2025 21:30:14.
doc.cls.php File 4843 bytes April 24 2025 21:30:14.
error.cls.php File 7056 bytes April 24 2025 21:30:14.
esi.cls.php File 27585 bytes April 24 2025 21:30:14.
file.cls.php File 10716 bytes April 24 2025 21:30:14.
gui.cls.php File 28133 bytes April 24 2025 21:30:14.
health.cls.php File 2962 bytes April 24 2025 21:30:14.
htaccess.cls.php File 24737 bytes April 24 2025 21:30:14.
img-optm.cls.php File 65636 bytes April 24 2025 21:30:14.
import.cls.php File 4250 bytes April 24 2025 21:30:14.
import.preset.cls.php File 5560 bytes April 24 2025 21:30:14.
lang.cls.php File 15247 bytes April 24 2025 21:30:14.
localization.cls.php File 3471 bytes April 24 2025 21:30:14.
media.cls.php File 33489 bytes April 24 2025 21:30:14.
metabox.cls.php File 4306 bytes April 24 2025 21:30:14.
object-cache.cls.php File 16216 bytes April 24 2025 21:30:14.
object.lib.php File 34784 bytes April 24 2025 21:30:14.
optimize.cls.php File 37847 bytes April 24 2025 21:30:14.
optimizer.cls.php File 9621 bytes April 24 2025 21:30:14.
placeholder.cls.php File 14424 bytes April 24 2025 21:30:14.
purge.cls.php File 31220 bytes April 24 2025 21:30:14.
report.cls.php File 6289 bytes April 24 2025 21:30:14.
rest.cls.php File 7629 bytes April 24 2025 21:30:14.
root.cls.php File 13085 bytes April 24 2025 21:30:14.
router.cls.php File 19975 bytes April 24 2025 21:30:14.
str.cls.php File 2429 bytes April 24 2025 21:30:14.
tag.cls.php File 9115 bytes April 24 2025 21:30:14.
task.cls.php File 6065 bytes April 24 2025 21:30:14.
tool.cls.php File 3499 bytes April 24 2025 21:30:14.
ucss.cls.php File 14513 bytes April 24 2025 21:30:14.
utility.cls.php File 21162 bytes April 24 2025 21:30:14.
vary.cls.php File 20572 bytes April 24 2025 21:30:14.
vpi.cls.php File 7364 bytes April 24 2025 21:30:14.

Reading File: //usr/src/litespeed-wp-plugin/7.1///litespeed-cache/src/cdn.cls.php

<?php

/**
 * The CDN class.
 *
 * @since      	1.2.3
 * @since  		1.5 Moved into /inc
 * @package    	LiteSpeed
 * @subpackage 	LiteSpeed/inc
 * @author     	LiteSpeed Technologies <info@litespeedtech.com>
 */

namespace LiteSpeed;

defined('WPINC') || exit();

class CDN extends Root
{
	const BYPASS = 'LITESPEED_BYPASS_CDN';

	private $content;

	private $_cfg_cdn;
	private $_cfg_url_ori;
	private $_cfg_ori_dir;
	private $_cfg_cdn_mapping = array();
	private $_cfg_cdn_exclude;

	private $cdn_mapping_hosts = array();

	/**
	 * Init
	 *
	 * @since  1.2.3
	 */
	public function init()
	{
		Debug2::debug2('[CDN] init');

		if (defined(self::BYPASS)) {
			Debug2::debug2('CDN bypass');
			return;
		}

		if (!Router::can_cdn()) {
			if (!defined(self::BYPASS)) {
				define(self::BYPASS, true);
			}
			return;
		}

		$this->_cfg_cdn = $this->conf(Base::O_CDN);
		if (!$this->_cfg_cdn) {
			if (!defined(self::BYPASS)) {
				define(self::BYPASS, true);
			}
			return;
		}

		$this->_cfg_url_ori = $this->conf(Base::O_CDN_ORI);
		// Parse cdn mapping data to array( 'filetype' => 'url' )
		$mapping_to_check = array(Base::CDN_MAPPING_INC_IMG, Base::CDN_MAPPING_INC_CSS, Base::CDN_MAPPING_INC_JS);
		foreach ($this->conf(Base::O_CDN_MAPPING) as $v) {
			if (!$v[Base::CDN_MAPPING_URL]) {
				continue;
			}
			$this_url = $v[Base::CDN_MAPPING_URL];
			$this_host = parse_url($this_url, PHP_URL_HOST);
			// Check img/css/js
			foreach ($mapping_to_check as $to_check) {
				if ($v[$to_check]) {
					Debug2::debug2('[CDN] mapping ' . $to_check . ' -> ' . $this_url);

					// If filetype to url is one to many, make url be an array
					$this->_append_cdn_mapping($to_check, $this_url);

					if (!in_array($this_host, $this->cdn_mapping_hosts)) {
						$this->cdn_mapping_hosts[] = $this_host;
					}
				}
			}
			// Check file types
			if ($v[Base::CDN_MAPPING_FILETYPE]) {
				foreach ($v[Base::CDN_MAPPING_FILETYPE] as $v2) {
					$this->_cfg_cdn_mapping[Base::CDN_MAPPING_FILETYPE] = true;

					// If filetype to url is one to many, make url be an array
					$this->_append_cdn_mapping($v2, $this_url);

					if (!in_array($this_host, $this->cdn_mapping_hosts)) {
						$this->cdn_mapping_hosts[] = $this_host;
					}
				}
				Debug2::debug2('[CDN] mapping ' . implode(',', $v[Base::CDN_MAPPING_FILETYPE]) . ' -> ' . $this_url);
			}
		}

		if (!$this->_cfg_url_ori || !$this->_cfg_cdn_mapping) {
			if (!defined(self::BYPASS)) {
				define(self::BYPASS, true);
			}
			return;
		}

		$this->_cfg_ori_dir = $this->conf(Base::O_CDN_ORI_DIR);
		// In case user customized upload path
		if (defined('UPLOADS')) {
			$this->_cfg_ori_dir[] = UPLOADS;
		}

		// Check if need preg_replace
		$this->_cfg_url_ori = Utility::wildcard2regex($this->_cfg_url_ori);

		$this->_cfg_cdn_exclude = $this->conf(Base::O_CDN_EXC);

		if (!empty($this->_cfg_cdn_mapping[Base::CDN_MAPPING_INC_IMG])) {
			// Hook to srcset
			if (function_exists('wp_calculate_image_srcset')) {
				add_filter('wp_calculate_image_srcset', array($this, 'srcset'), 999);
			}
			// Hook to mime icon
			add_filter('wp_get_attachment_image_src', array($this, 'attach_img_src'), 999);
			add_filter('wp_get_attachment_url', array($this, 'url_img'), 999);
		}

		if (!empty($this->_cfg_cdn_mapping[Base::CDN_MAPPING_INC_CSS])) {
			add_filter('style_loader_src', array($this, 'url_css'), 999);
		}

		if (!empty($this->_cfg_cdn_mapping[Base::CDN_MAPPING_INC_JS])) {
			add_filter('script_loader_src', array($this, 'url_js'), 999);
		}

		add_filter('litespeed_buffer_finalize', array($this, 'finalize'), 30);
	}

	/**
	 * Associate all filetypes with url
	 *
	 * @since  2.0
	 * @access private
	 */
	private function _append_cdn_mapping($filetype, $url)
	{
		// If filetype to url is one to many, make url be an array
		if (empty($this->_cfg_cdn_mapping[$filetype])) {
			$this->_cfg_cdn_mapping[$filetype] = $url;
		} elseif (is_array($this->_cfg_cdn_mapping[$filetype])) {
			// Append url to filetype
			$this->_cfg_cdn_mapping[$filetype][] = $url;
		} else {
			// Convert _cfg_cdn_mapping from string to array
			$this->_cfg_cdn_mapping[$filetype] = array($this->_cfg_cdn_mapping[$filetype], $url);
		}
	}

	/**
	 * If include css/js in CDN
	 *
	 * @since  1.6.2.1
	 * @return bool true if included in CDN
	 */
	public function inc_type($type)
	{
		if ($type == 'css' && !empty($this->_cfg_cdn_mapping[Base::CDN_MAPPING_INC_CSS])) {
			return true;
		}

		if ($type == 'js' && !empty($this->_cfg_cdn_mapping[Base::CDN_MAPPING_INC_JS])) {
			return true;
		}

		return false;
	}

	/**
	 * Run CDN process
	 * NOTE: As this is after cache finalized, can NOT set any cache control anymore
	 *
	 * @since  1.2.3
	 * @access public
	 * @return  string The content that is after optimization
	 */
	public function finalize($content)
	{
		$this->content = $content;

		$this->_finalize();
		return $this->content;
	}

	/**
	 * Replace CDN url
	 *
	 * @since  1.2.3
	 * @access private
	 */
	private function _finalize()
	{
		if (defined(self::BYPASS)) {
			return;
		}

		Debug2::debug('CDN _finalize');

		// Start replacing img src
		if (!empty($this->_cfg_cdn_mapping[Base::CDN_MAPPING_INC_IMG])) {
			$this->_replace_img();
			$this->_replace_inline_css();
		}

		if (!empty($this->_cfg_cdn_mapping[Base::CDN_MAPPING_FILETYPE])) {
			$this->_replace_file_types();
		}
	}

	/**
	 * Parse all file types
	 *
	 * @since  1.2.3
	 * @access private
	 */
	private function _replace_file_types()
	{
		$ele_to_check = $this->conf(Base::O_CDN_ATTR);

		foreach ($ele_to_check as $v) {
			if (!$v || strpos($v, '.') === false) {
				Debug2::debug2('[CDN] replace setting bypassed: no . attribute ' . $v);
				continue;
			}

			Debug2::debug2('[CDN] replace attribute ' . $v);

			$v = explode('.', $v);
			$attr = preg_quote($v[1], '#');
			if ($v[0]) {
				$pattern = '#<' . preg_quote($v[0], '#') . '([^>]+)' . $attr . '=([\'"])(.+)\g{2}#iU';
			} else {
				$pattern = '# ' . $attr . '=([\'"])(.+)\g{1}#iU';
			}

			preg_match_all($pattern, $this->content, $matches);

			if (empty($matches[$v[0] ? 3 : 2])) {
				continue;
			}

			foreach ($matches[$v[0] ? 3 : 2] as $k2 => $url) {
				// Debug2::debug2( '[CDN] check ' . $url );
				$postfix = '.' . pathinfo((string) parse_url($url, PHP_URL_PATH), PATHINFO_EXTENSION);
				if (!array_key_exists($postfix, $this->_cfg_cdn_mapping)) {
					// Debug2::debug2( '[CDN] non-existed postfix ' . $postfix );
					continue;
				}

				Debug2::debug2('[CDN] matched file_type ' . $postfix . ' : ' . $url);

				if (!($url2 = $this->rewrite($url, Base::CDN_MAPPING_FILETYPE, $postfix))) {
					continue;
				}

				$attr = str_replace($url, $url2, $matches[0][$k2]);
				$this->content = str_replace($matches[0][$k2], $attr, $this->content);
			}
		}
	}

	/**
	 * Parse all images
	 *
	 * @since  1.2.3
	 * @access private
	 */
	private function _replace_img()
	{
		preg_match_all('#<img([^>]+?)src=([\'"\\\]*)([^\'"\s\\\>]+)([\'"\\\]*)([^>]*)>#i', $this->content, $matches);
		foreach ($matches[3] as $k => $url) {
			// Check if is a DATA-URI
			if (strpos($url, 'data:image') !== false) {
				continue;
			}

			if (!($url2 = $this->rewrite($url, Base::CDN_MAPPING_INC_IMG))) {
				continue;
			}

			$html_snippet = sprintf('<img %1$s src=%2$s %3$s>', $matches[1][$k], $matches[2][$k] . $url2 . $matches[4][$k], $matches[5][$k]);
			$this->content = str_replace($matches[0][$k], $html_snippet, $this->content);
		}
	}

	/**
	 * Parse and replace all inline styles containing url()
	 *
	 * @since  1.2.3
	 * @access private
	 */
	private function _replace_inline_css()
	{
		Debug2::debug2('[CDN] _replace_inline_css', $this->_cfg_cdn_mapping);

		/**
		 * Excludes `\` from URL matching
		 * @see  #959152 - WordPress LSCache CDN Mapping causing malformed URLS
		 * @see  #685485
		 * @since 3.0
		 */
		preg_match_all('/url\((?![\'"]?data)[\'"]?(.+?)[\'"]?\)/i', $this->content, $matches);
		foreach ($matches[1] as $k => $url) {
			$url = str_replace(array(' ', '\t', '\n', '\r', '\0', '\x0B', '"', "'", '&quot;', '&#039;'), '', $url);

			// Parse file postfix
			$parsed_url = parse_url($url, PHP_URL_PATH);
			if (!$parsed_url) {
				continue;
			}

			$postfix = '.' . pathinfo($parsed_url, PATHINFO_EXTENSION);
			if (array_key_exists($postfix, $this->_cfg_cdn_mapping)) {
				Debug2::debug2('[CDN] matched file_type ' . $postfix . ' : ' . $url);
				if (!($url2 = $this->rewrite($url, Base::CDN_MAPPING_FILETYPE, $postfix))) {
					continue;
				}
			} elseif (in_array($postfix, array('jpg', 'jpeg', 'png', 'gif', 'svg', 'webp', 'avif'))) {
				if (!($url2 = $this->rewrite($url, Base::CDN_MAPPING_INC_IMG))) {
					continue;
				}
			} else {
				continue;
			}

			$attr = str_replace($matches[1][$k], $url2, $matches[0][$k]);
			$this->content = str_replace($matches[0][$k], $attr, $this->content);
		}

		Debug2::debug2('[CDN] _replace_inline_css done');
	}

	/**
	 * Hook to wp_get_attachment_image_src
	 *
	 * @since  1.2.3
	 * @since  1.7 Removed static from function
	 * @access public
	 * @param  array $img The URL of the attachment image src, the width, the height
	 * @return array
	 */
	public function attach_img_src($img)
	{
		if ($img && ($url = $this->rewrite($img[0], Base::CDN_MAPPING_INC_IMG))) {
			$img[0] = $url;
		}
		return $img;
	}

	/**
	 * Try to rewrite one URL with CDN
	 *
	 * @since  1.7
	 * @access public
	 */
	public function url_img($url)
	{
		if ($url && ($url2 = $this->rewrite($url, Base::CDN_MAPPING_INC_IMG))) {
			$url = $url2;
		}
		return $url;
	}

	/**
	 * Try to rewrite one URL with CDN
	 *
	 * @since  1.7
	 * @access public
	 */
	public function url_css($url)
	{
		if ($url && ($url2 = $this->rewrite($url, Base::CDN_MAPPING_INC_CSS))) {
			$url = $url2;
		}
		return $url;
	}

	/**
	 * Try to rewrite one URL with CDN
	 *
	 * @since  1.7
	 * @access public
	 */
	public function url_js($url)
	{
		if ($url && ($url2 = $this->rewrite($url, Base::CDN_MAPPING_INC_JS))) {
			$url = $url2;
		}
		return $url;
	}

	/**
	 * Hook to replace WP responsive images
	 *
	 * @since  1.2.3
	 * @since  1.7 Removed static from function
	 * @access public
	 * @param  array $srcs
	 * @return array
	 */
	public function srcset($srcs)
	{
		if ($srcs) {
			foreach ($srcs as $w => $data) {
				if (!($url = $this->rewrite($data['url'], Base::CDN_MAPPING_INC_IMG))) {
					continue;
				}
				$srcs[$w]['url'] = $url;
			}
		}
		return $srcs;
	}

	/**
	 * Replace URL to CDN URL
	 *
	 * @since  1.2.3
	 * @access public
	 * @param  string $url
	 * @return string        Replaced URL
	 */
	public function rewrite($url, $mapping_kind, $postfix = false)
	{
		Debug2::debug2('[CDN] rewrite ' . $url);
		$url_parsed = parse_url($url);

		if (empty($url_parsed['path'])) {
			Debug2::debug2('[CDN] -rewrite bypassed: no path');
			return false;
		}

		// Only images under wp-cotnent/wp-includes can be replaced
		$is_internal_folder = Utility::str_hit_array($url_parsed['path'], $this->_cfg_ori_dir);
		if (!$is_internal_folder) {
			Debug2::debug2('[CDN] -rewrite failed: path not match: ' . LSCWP_CONTENT_FOLDER);
			return false;
		}

		// Check if is external url
		if (!empty($url_parsed['host'])) {
			if (!Utility::internal($url_parsed['host']) && !$this->_is_ori_url($url)) {
				Debug2::debug2('[CDN] -rewrite failed: host not internal');
				return false;
			}
		}

		$exclude = Utility::str_hit_array($url, $this->_cfg_cdn_exclude);
		if ($exclude) {
			Debug2::debug2('[CDN] -abort excludes ' . $exclude);
			return false;
		}

		// Fill full url before replacement
		if (empty($url_parsed['host'])) {
			$url = Utility::uri2url($url);
			Debug2::debug2('[CDN] -fill before rewritten: ' . $url);

			$url_parsed = parse_url($url);
		}

		$scheme = !empty($url_parsed['scheme']) ? $url_parsed['scheme'] . ':' : '';
		if ($scheme) {
			// Debug2::debug2( '[CDN] -scheme from url: ' . $scheme );
		}

		// Find the mapping url to be replaced to
		if (empty($this->_cfg_cdn_mapping[$mapping_kind])) {
			return false;
		}
		if ($mapping_kind !== Base::CDN_MAPPING_FILETYPE) {
			$final_url = $this->_cfg_cdn_mapping[$mapping_kind];
		} else {
			// select from file type
			$final_url = $this->_cfg_cdn_mapping[$postfix];
		}

		// If filetype to url is one to many, need to random one
		if (is_array($final_url)) {
			$final_url = $final_url[array_rand($final_url)];
		}

		// Now lets replace CDN url
		foreach ($this->_cfg_url_ori as $v) {
			if (strpos($v, '*') !== false) {
				$url = preg_replace('#' . $scheme . $v . '#iU', $final_url, $url);
			} else {
				$url = str_replace($scheme . $v, $final_url, $url);
			}
		}
		Debug2::debug2('[CDN] -rewritten: ' . $url);

		return $url;
	}

	/**
	 * Check if is original URL of CDN or not
	 *
	 * @since  2.1
	 * @access private
	 */
	private function _is_ori_url($url)
	{
		$url_parsed = parse_url($url);

		$scheme = !empty($url_parsed['scheme']) ? $url_parsed['scheme'] . ':' : '';

		foreach ($this->_cfg_url_ori as $v) {
			$needle = $scheme . $v;
			if (strpos($v, '*') !== false) {
				if (preg_match('#' . $needle . '#iU', $url)) {
					return true;
				}
			} else {
				if (strpos($url, $needle) === 0) {
					return true;
				}
			}
		}

		return false;
	}

	/**
	 * Check if the host is the CDN internal host
	 *
	 * @since  1.2.3
	 *
	 */
	public static function internal($host)
	{
		if (defined(self::BYPASS)) {
			return false;
		}

		$instance = self::cls();

		return in_array($host, $instance->cdn_mapping_hosts); // todo: can add $this->_is_ori_url() check in future
	}
}

SILENT KILLER Tool