Server : Apache/2.4.18 (Ubuntu) System : Linux canvaswebdesign 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64 User : oppastar ( 1041) PHP Version : 7.0.33-0ubuntu0.16.04.15 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority, Directory : /var/www/andreassugianto.com/public_html/plugins/system/admintools/admintools/ |
Upload File : |
<?php /* * Administrator Tools * Copyright (C) 2010-2013 Nicholas K. Dionysopoulos / AkeebaBackup.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ defined('_JEXEC') or die(); JLoader::import('joomla.application.plugin'); if (!function_exists('fnmatch')) { function fnmatch($pattern, $string) { return @preg_match( '/^' . strtr(addcslashes($pattern, '/\\.+^$(){}=!<>|'), array('*' => '.*', '?' => '.?')) . '$/i', $string ); } } class plgSystemAdmintoolsCore extends JPlugin { /* When set to true, the cache files will be regenerated every time */ const DEBUG = false; /** @var string Combine feature's cache directory */ private $combineCache = null; /** @var object JavaScript merge parameters */ private $JSparams = null; /** @var array An array holding the JS files to replace in the output*/ private $jsFiles = array(); /** @var object CSS merge parameters */ private $CSSparams = array(); /** @var array An array holding the CSS files to replace in the output*/ private $cssFiles = array(); /** @var AdminToolsModelStorage The component parameters store */ private $cparams = null; /** @var string The absolute base URL of the site */ private $baseURL = null; static public $myself = null; public static function &fetchMyself() { return self::$myself; } public function __construct(& $subject, $config = array()) { JLoader::import('joomla.html.parameter'); JLoader::import('joomla.plugin.helper'); JLoader::import('joomla.application.component.helper'); $plugin = JPluginHelper::getPlugin('system', 'admintools'); $defaultConfig = (array)($plugin); $config = array_merge($defaultConfig, $config); // Use the parent constructor to create the plugin object parent::__construct($subject, $config); // Load the components parameters JLoader::import('joomla.application.component.model'); require_once JPATH_ROOT.'/administrator/components/com_admintools/models/storage.php'; if(interface_exists('JModel')) { $this->cparams = JModelLegacy::getInstance('Storage','AdmintoolsModel'); } else { $this->cparams = JModel::getInstance('Storage','AdmintoolsModel'); } // Get the combine feature's cache directory $combinecache = $this->cparams->getValue('combinecache', null); if(empty($combinecache)) { $combinecache = JPATH_CACHE; } else { JLoader::import('joomla.filesystem.folder'); if(!JFolder::exists($combinecache)) { $combinecache = JPATH_ROOT.'/'.ltrim($combinecache,'/'.DIRECTORY_SEPARATOR); } if(!JFolder::exists($combinecache)) { $combinecache = JPATH_CACHE; } } $this->combineCache = $combinecache; // Do we have to deliver a file? $hash = JRequest::getCmd('fetchcombinedfile',null); if(!empty($hash)) { $this->deliverFile($hash); } self::$myself = $this; } public function onAfterInitialise() { $app = JFactory::getApplication(); if(in_array($app->getName(),array('administrator','admin'))) { // Back-end stuff } else { // Front-end stuff } } public function onBeforeRender() { $app = JFactory::getApplication(); $app->registerEvent('onAfterRender', 'AdminToolsLateBoundAfterRender'); } public function onAfterRenderLatebound() { $app = JFactory::getApplication(); if(in_array($app->getName(),array('administrator','admin'))) return; // Link Migration - rewrite links pointing to the old domain name of the site if($this->cparams->getValue('linkmigration',0) == 1) { $this->linkMigration(); } // HTTPSizer - convert all links to HTTPS if($this->cparams->getValue('httpsizer',0) == 1) { $this->httpsizer(); } // CSS and JS combination $this->onCssJsCombine(); } public function onCssJsCombine() { $app = JFactory::getApplication(); if(in_array($app->getName(),array('administrator','admin'))) return; // Get the site's base URI $base = JURI::base(); if( $app->getName() == 'administrator' ) { $base = rtrim($base,'/'); $base_pieces = @explode('/',$base); array_pop($base_pieces); $base = @implode('/', $base_pieces).'/'; } $this->baseURL = $base; // Javascript Combine - Combines JavaScript files on the page to one, big file. if( ($this->cparams->getValue('jscombine',0) == 1) && (JFactory::getDocument()->getType() == 'html') ) { // Initialise parameters $this->JSparams = new JObject(); // Fetch the files to skip when combining $skip = $this->cparams->getValue('jsskip', ''); if(empty($skip)) { $skip = array(); } else { $skip = str_replace("\r", "", $skip); $skip = explode("\n", $skip); } $this->JSparams->set('skip', $skip); // Set the delivery method for combined files $delivery = $this->cparams->getValue('jsdelivery', 'plugin'); if(!in_array($delivery, array('plugin','direct'))) $delivery = 'plugin'; $this->JSparams->set('delivery', $delivery); // Get the cache folder to use $this->JSparams->set('cache', $this->combineCache); // Finally, get the signature... $signature = md5(serialize($this->JSparams)); $this->JSparams->set('signature', $signature); // ...and combine Javascript $this->jscombine(); } // CSS Combine - Combines CSS files on the page to one, big file. if( ($this->cparams->getValue('csscombine',0) == 1) && (JFactory::getDocument()->getType() == 'html') ) { // Initialise parameters $this->CSSparams = new JObject(); if(!class_exists('aCssToken')) { require_once 'cssmin.php'; } // Fetch the files to skip when combining $skip = $this->cparams->getValue('cssskip', ''); if(empty($skip)) { $skip = array(); } else { $skip = str_replace("\r", "", $skip); $skip = explode("\n", $skip); } $this->CSSparams->set('skip', $skip); // Set the delivery method for combined files $delivery = $this->cparams->getValue('cssdelivery', 'plugin'); if(!in_array($delivery, array('plugin','direct'))) $delivery = 'plugin'; $this->CSSparams->set('delivery', $delivery); // Get the cache folder to use $this->CSSparams->set('cache', $this->combineCache); // Finally, get the signature... $signature = md5(serialize($this->CSSparams)); $this->CSSparams->set('signature', $signature); // ...and combine Javascript $this->csscombine(); } } /** * Provides link migration services. All absolute links pointing to any of the old domain names * are being rewritten to point to the current domain name. This runs a full page replacement * using Regular Expressions, so even menus with absolute URLs will be migrated! */ private function linkMigration() { $buffer = JResponse::getBody(); $pattern = '/(href|src)=\"([^"]*)\"/i'; $number_of_matches = preg_match_all($pattern, $buffer, $matches, PREG_OFFSET_CAPTURE); if($number_of_matches > 0) { $substitutions = $matches[2]; $last_position = 0; $temp = ''; // Loop all URLs foreach($substitutions as &$entry) { // Copy unchanged part, if it exists if($entry[1] > 0) $temp .= substr($buffer, $last_position, $entry[1]-$last_position); // Add the new URL $temp .= $this->replaceDomain($entry[0]); // Calculate next starting offset $last_position = $entry[1] + strlen($entry[0]); } // Do we have any remaining part of the string we have to copy? if($last_position < strlen($buffer)) $temp .= substr($buffer, $last_position); // Replace content with the processed one unset($buffer); JResponse::setBody($temp); unset($temp); } } /** * Replaces a URL's domain name (if it is in the substitution list) with the * current site's domain name * @param $url string The URL to process * @return string The processed URL */ private function replaceDomain($url) { static $old_domains; static $mydomain; if(empty($old_domains)) { $temp = explode("\n", $this->cparams->getValue('migratelist','')); if(!empty($temp)) { foreach($temp as $entry) { if(substr($entry,-1) == '/') $entry = substr($entry,0,-1); if(substr($entry,0,7) == 'http://') $entry = substr($entry,7); if(substr($entry,0,8) == 'https://') $entry = substr($entry,8); $old_domains[] = $entry; } } } if(empty($mydomain)) { $mydomain = JURI::base(false); if(substr($mydomain,-1) == '/') $mydomain = substr($mydomain,0,-1); if(substr($mydomain,0,7) == 'http://') $mydomain = substr($mydomain,7); if(substr($mydomain,0,8) == 'https://') $mydomain = substr($mydomain,8); } if(!empty($old_domains)) foreach($old_domains as $domain) { if (substr($url, 0, strlen($domain)) == $domain) { return $mydomain.substr($url, strlen($domain)); } elseif (substr($url, 0, strlen($domain)+7) == 'http://'.$domain) { return 'http://'.$mydomain.substr($url, strlen($domain)+7); } elseif (substr($url, 0, strlen($domain)+8) == 'https://'.$domain) { return 'https://'.$mydomain.substr($url, strlen($domain)+8); } } return $url; } /** * Converts all HTTP URLs to HTTPS URLs when the site is accessed over SSL */ private function httpsizer() { // Make sure we're accessed over SSL (HTTPS) $uri = JURI::getInstance(); $protocol = $uri->toString(array('scheme')); if($protocol != 'https://') return; $buffer = JResponse::getBody(); $buffer = str_replace('http://','https://',$buffer); JResponse::setBody($buffer); } private function jscombine() { // Get the HTML content from the JResponse class $body = JResponse::getBody(); // Load Joomla! classes JLoader::import('joomla.filesystem.file'); // Parse JavaScript separators $this->jsFiles = array(); $scriptRegex="/<script [^>]+(\/>|><\/script>)/i"; $jsRegex="/([^\"\'=]+\.(js)(\?[^\"\']*){0,1})[\"\']/i"; preg_match_all($scriptRegex, $body, $matches); $scripts=@implode('',$matches[0]); preg_match_all($jsRegex,$scripts,$matches); foreach( $matches[1] as $url ) { $file = $url; // Clone the string, as it gets modified $replace = true; if($this->isInternal($file)) { // Separate any URL query $qmPos = strpos($file,'?'); if( $qmPos !== false ) { // Strip the query $query = substr($file, $qmPos+1); $file = substr($file, 0, $qmPos); } else { $query = ''; } // Do not add dynamicaly generated files (.php) if( substr( strtolower($file), -4 ) == '.php' ) { $replace = false; }; // Do not add any file in the skip list $skips = $this->JSparams->get('skip',''); if(!empty($skips)) foreach($skips as $skip) { $skip = trim($skip,'/'); if(fnmatch($skip, $file)) { $replace = false; break; }; } // Make sure the file exists if( !JFile::exists(JPATH_ROOT.DIRECTORY_SEPARATOR.$file) ) { $replace = false; } // Make sure the file is readable if( !@is_readable(JPATH_ROOT.DIRECTORY_SEPARATOR.$file) ) { $replace = false; } // Try to get the date and file size $date = @filectime($file); $size = @filesize($file); if((int)$size == 0) $size = PHP_INT_MAX; // Calculate a unique file hash $hash = md5($file.$query.$date.$size); $this->jsFiles[] = (object)array( 'url' => $url, 'file' => $file, 'hash' => $hash, 'replace' => $replace, 'size' => $size, 'internal' => true, ); } else { $this->jsFiles[] = (object)array( 'url' => $url, 'file' => null, 'hash' => null, 'replace' => $replace, 'size' => 0, 'internal' => false, ); } } // Create unique hash of all JS files if(count($this->jsFiles)) { $hashable = ''; foreach($this->jsFiles as $js) { if(!$js->internal) continue; if(!$js->replace) continue; $hashable .= $js->hash; } $jsHash = md5($hashable.$this->JSparams->get('signature','')); } // Does the cache file exist? if(!JFile::exists($this->combineCache.DIRECTORY_SEPARATOR.'js-'.$jsHash.'.js') || self::DEBUG) { // Nope. Let's create the file. $hashable = ''; $jsContent = ""; foreach($this->jsFiles as $file) { if(!$file->internal) continue; if(!$file->replace) continue; $myContent = JFile::read(JPATH_ROOT.DIRECTORY_SEPARATOR.$file->file, false, $file->size); if($myContent === false) { $file->replace = false; continue; } $basename = basename($file->file); $jsContent .= "\n\n/* COMBINED FILE {$file->url} */\n\n"; $jsContent .= $myContent."\n"; } // Write the cache file JFile::write($this->combineCache.DIRECTORY_SEPARATOR.'js-'.$jsHash.'.js', $jsContent); } // Replace the JS files $body=preg_replace_callback($scriptRegex,array($this,'replaceJS'),$body); if($this->JSparams->get('delivery','') == 'plugin') { $newURL = $this->baseURL.'index.php?fetchcombinedfile=js-'.$jsHash; } else { $myCache = str_replace(DIRECTORY_SEPARATOR, '/', @realpath($this->combineCache)); $myRoot = str_replace(DIRECTORY_SEPARATOR, '/', @realpath(JPATH_ROOT)); $rootLen = strlen($myRoot); if(substr($myCache, 0, $rootLen) == $myRoot) { $myCache = trim(substr($myCache, $rootLen),'/'); } $newURL = rtrim($this->baseURL,'/').'/'.$myCache.'/js-'.$jsHash.'.js'; } $newHeadCode = '</title>'; foreach($this->jsFiles as $js) { if(!$js->internal || !$js->replace) { $newHeadCode .= "\n<script type=\"text/javascript\" src=\"{$js->url}\"></script>"; } } $newHeadCode .="\n".'<script type="text/javascript" src="'.$newURL.'"></script>'."\n"; //only match once $body = preg_replace('/<\/title>/i',$newHeadCode , $body,1); JResponse::setBody($body); } private function csscombine() { // Get the HTML content from the JResponse class $body = JResponse::getBody(); // Load Joomla! classes JLoader::import('joomla.filesystem.file'); // Parse JavaScript separators $this->cssFiles = array(); $conditionRegex="/<\!--\[if.*?\[endif\]-->/is"; $linksRegex="|<link[^>]+[/]?>((.*)</[^>]+>)?|U"; $cssRegex="/([^\"\'=]+\.(css)(\?[^\"\']*){0,1})[\"\']/i"; // Banned files from being minified $cssBanList = array(); // Parse conditional CSS files preg_match_all($conditionRegex,$body,$conditonMatches); if(!empty($conditonMatches)){ preg_match_all($linksRegex,@implode('',$conditonMatches[0]),$conditionCss); if(!empty($conditionCss[0])){ preg_match_all($cssRegex,@implode('',$conditionCss[0]),$conditionCssFiles); if(!empty($conditionCssFiles[1])){ foreach($conditionCssFiles[1] as $conditionalCss){ $url = trim($conditionalCss); $isInternal = $this->isInternal($url); if($isInternal) { $cssBanList[]=$url; } } } } } // Only parse the CSS files for "all" and "screen" media (or those which // do not define a media selector, implying "all") preg_match_all($linksRegex, $body, $matches); $links=$matches[0]; $allCSSLinks = array(); $mediaRegex="|media[\s]*=\"([a-z,\s]*)\"|U"; foreach($links as $linkCode) { // Make sure it's a CSS file preg_match_all($cssRegex,$linkCode,$matches); if(empty($matches[0])) continue; // Get URL $url = array_pop($matches[1]); // Get media preg_match_all($mediaRegex,$linkCode,$matches); if(!empty($matches[1])) { $allMediaString = array_pop($matches[1]); $media = explode(',', $allMediaString); $skip = true; foreach($media as $medium) { $medium = trim($medium); if(in_array($medium, array( 'screen','all' ))) $skip = false; } } else { $allMediaString = 'all'; $skip = false; } if($skip) continue; // Add to array $allCSSLinks[$url] = $allMediaString; } foreach( $allCSSLinks as $url => $allMediaString ) { $file = $url; // Clone the string, as it gets modified $replace = true; if($this->isInternal($file)) { // Separate any URL query $qmPos = strpos($file,'?'); if( $qmPos !== false ) { // Strip the query $query = substr($file, $qmPos+1); $file = substr($file, 0, $qmPos); } else { $query = ''; } // Do not add dynamicaly generated files (.php) if( substr( strtolower($file), -4 ) == '.php' ) { $replace = false; }; // Do not add any file in the skip list $skips = $this->CSSparams->get('skip',''); if(!empty($skips)) foreach($skips as $skip) { $skip = trim($skip,'/'); if(fnmatch($skip, $file)) { $replace = false; break; }; } // Make sure the file exists if( !JFile::exists(JPATH_ROOT.DIRECTORY_SEPARATOR.$file) ) { $replace = false; } // Make sure the file is readable if( !@is_readable(JPATH_ROOT.DIRECTORY_SEPARATOR.$file) ) { $replace = false; } // Try to get the date and file size $date = @filectime($file); $size = @filesize($file); if((int)$size == 0) $size = PHP_INT_MAX; // Calculate a unique file hash $hash = md5($file.$query.$date.$size); // Some files must not be replaced if( in_array($file, $cssBanList) ) { $replace = false; $skip = true; } else { $skip = false; } $this->cssFiles[] = (object)array( 'url' => $url, 'file' => $file, 'hash' => $hash, 'replace' => $replace, 'size' => $size, 'skip' => $skip, 'internal' => true, 'media' => $allMediaString, ); } else { if( in_array($url, $cssBanList) ) { $replace = false; $skip = true; } else { $skip = false; } $this->cssFiles[] = (object)array( 'url' => $url, 'file' => null, 'hash' => null, 'replace' => $replace, 'size' => 0, 'skip' => $skip, 'internal' => false, 'media' => $allMediaString, ); } } // Create unique hash of all JS files if(count($this->cssFiles)) { $hashable = ''; foreach($this->cssFiles as $css) { if($css->skip) continue; if(!$css->internal) continue; if(!$css->replace) continue; $hashable .= $css->hash; } $cssHash = md5($hashable.$this->CSSparams->get('signature','')); } // Does the cache file exist? if(!JFile::exists($this->combineCache.DIRECTORY_SEPARATOR.'css-'.$cssHash.'.css') || self::DEBUG) { // Nope. Let's create the file. $hashable = ''; $cssContent = ""; foreach($this->cssFiles as $file) { if($file->skip) continue; if(!$file->internal) continue; if(!$file->replace) continue; $myContent = JFile::read(JPATH_ROOT.DIRECTORY_SEPARATOR.$file->file, false, $file->size); if($myContent === false) { $file->replace = false; continue; } $basePath = $this->baseURL . trim(dirname($file->file),'/\\') ; if(DIRECTORY_SEPARATOR == '\\') $basePath = str_replace (DIRECTORY_SEPARATOR, '/', $basePath); $this->cssBaseURL = $basePath; $myContent = preg_replace_callback("/url\s*\((.*)\)/siU", array($this,"decode_url"), $myContent); $cssContent .= "\n\n/* COMBINED FILE: {$file->url} */\n\n"; $cmFilters = array ( "ImportImports" => array("BasePath" => dirname($file->file)), "RemoveComments" => true, "RemoveEmptyRulesets" => true, "RemoveEmptyAtBlocks" => true, "ConvertLevel3AtKeyframes" => array("RemoveSource" => false), "ConvertLevel3Properties" => true, "Variables" => true, "RemoveLastDelarationSemiColon" => true ); $cmPlugins = array ( "Variables" => true, "ConvertFontWeight" => true, "ConvertHslColors" => true, "ConvertRgbColors" => true, "ConvertNamedColors" => true, "CompressColorValues" => true, "CompressUnitValues" => true, "CompressExpressionValues" => true ); $cssContent .= CssMin::minify($myContent, $cmFilters, $cmPlugins)."\n"; //$cssContent .= $myContent . "\n\n"; $basename = basename($file->file); } // Write the cache file JFile::write($this->combineCache.DIRECTORY_SEPARATOR.'css-'.$cssHash.'.css', $cssContent); } // Replace the CSS files $body=preg_replace_callback($linksRegex,array($this,'replaceCSS'),$body); if($this->CSSparams->get('delivery','') == 'plugin') { $newURL = $this->baseURL.'index.php?fetchcombinedfile=css-'.$cssHash; } else { $myCache = str_replace(DIRECTORY_SEPARATOR, '/', @realpath($this->combineCache)); $myRoot = str_replace(DIRECTORY_SEPARATOR, '/', @realpath(JPATH_ROOT)); $rootLen = strlen($myRoot); if(substr($myCache, 0, $rootLen) == $myRoot) { $myCache = trim(substr($myCache, $rootLen),'/'); } $newURL = rtrim($this->baseURL,'/').'/'.$myCache.'/css-'.$cssHash.'.css'; } $newHeadCode = '</title>'; foreach($this->cssFiles as $css) { if( (!$css->internal || !$css->replace) && !$css->skip) { //$newHeadCode .= "\n<link rel=\"stylesheet\" type=\"text/css\" href=\"{$css->url}\" media=\"{$css->media}\" />"; } } $newHeadCode .="\n".'<link rel="stylesheet" type="text/css" href="'.$newURL.'" />'."\n"; //only match once $body = preg_replace('/<\/title>/i',$newHeadCode , $body,1); JResponse::setBody($body); } /** * Delivers a cached JS/CSS combined file */ private function deliverFile($hash) { // Load Joomla! libraries JLoader::import('joomla.filesystem.file'); JLoader::import('joomla.utilities.date'); // Kill caching @ob_end_clean(); // Check that it's a js- or css- file, or throw a Forbidden message $pass = true; if(substr($hash,0,3) == 'js-') { $ext = '.js'; } elseif(substr($hash,0,4) == 'css-') { $ext = '.css'; } else { $ext = '.php'; $pass = false; } // Is the file there? if($pass) $pass = $pass && JFile::exists($this->combineCache.DIRECTORY_SEPARATOR.$hash.$ext); // Can we read the file? if($pass) { $content = JFile::read($this->combineCache.DIRECTORY_SEPARATOR.$hash.$ext); if($content === false) { // Can't read the file, no go. $pass = false; } } // If there is something wrong, throw a Forbidden header if(!$pass) { if(!headers_sent()) header('HTTP/1.0 403 Forbidden'); jexit(403); } // Guess the appropriate content type $contentType = (substr($hash,0,3) == 'js-') ? 'text/javascript' : 'text/css'; $suffix = (substr($hash,0,3) == 'js-') ? 'js' : 'css'; // Calculate the expiration date JLoader::import('joomla.utilities.date'); $date = new JDate(); $filedate = @filemtime($this->combineCache.DIRECTORY_SEPARATOR.$hash.$ext); $jfiledate = new JDate($filedate); $modified = $jfiledate->toRFC822(); $filedate += 31536000; // Add one year $gmt = new DateTimeZone('GMT'); if (version_compare(JVERSION, '3.1.0', 'ge')) { $date = new JDate($filedate, $gmt); } else { $date = new JDate($filedate, 0); } $expires = $date->toRFC822(); // Calculate data length $length = strlen($content); // Check if the browser tries to validate against an ETag if(function_exists('getallheaders')) { $headers = @getallheaders(); foreach($headers as $key => $value) { if(strtolower($key) == 'if-none-match') { if(strstr($value, $hash)) { if(!headers_sent()) { @header('HTTP/1.1 304 Not Modified'); } } } } } // Send our headers if(!headers_sent()) { @header("ETag: \"{$hash}\""); @header("Expires: $expires"); @header("Last-Modified: $modified"); @header("Content-type: $contentType"); @header("Content-Disposition: inline; filename=\"$hash.$ext\";"); } // Do we have to compress? $app = JFactory::getApplication(); $compress = $app->getCfg('gzip',0); if($compress) { // Get the client supported encoding $encoding = false; if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) { if (false !== strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) { $encoding = 'gzip'; } if (false !== strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'x-gzip')) { $encoding = 'x-gzip'; } } } if($compress && !ini_get('zlib.output_compression') && ini_get('output_handler')!='ob_gzhandler' && !headers_sent() && extension_loaded('zlib') && (connection_status() === 0) && $encoding) { $level = 4; //ideal level $gzdata = @gzencode($content, $level); @header("Content-Encoding: $encoding"); @header("Content-Length: ".strlen($gzdata)); echo $gzdata; } else { @header("Content-Length: $length"); echo $content; } jexit(); } /** * Figures out if a URL is internal (comes from this site) or if it is an * external URL, while figuring out the file it refers to as well. * @param string $url Input: the URL; Output: the file for this URL * @return bool */ private function isInternal(&$url) { if( (strtolower(substr($url,0,7)) == 'http://') || (strtolower(substr($url,0,8)) == 'https://') ) { // Strip the protocol from the URL if((strtolower(substr($url,0,7)) == 'http://')) { $url = substr($url,7); } else { $url = substr($url, 8); } // Strip the protocol from our own site's URL if((strtolower(substr($this->baseURL,0,7)) == 'http://')) { $base = substr($this->baseURL,7); } else { $base = substr($this->baseURL, 8); } // Does the domain match? if(strtolower(substr($url,0,strlen($base))) == strtolower($base) ) { // Yes, trim the url $url = ltrim(substr($url,strlen($base)),'/\\'); return true; } else { // Nope, it's an external URL return false; } } else { // No protocol, ergo we are a relative internal URL $app = JFactory::getApplication(); if( (substr($url,0,1) != '/') && ($app->getName() == 'admin') ) { // Relative URL to the administrator directory $url = 'administrator/'.$url; } $url = ltrim($url,'/\\'); return true; } } /** * Callback method to remove the JavaScript <script> tags * @param array $matches * @return string */ public function replaceJS($matches) { $jsRegex="/src=[\"\']([^\"\']+)[\"\']/i"; preg_match_all($jsRegex, $matches[0], $m); if(isset($m[1])&&count($m[1])){ // Get the URL of the script $url=$m[1][0]; // Sanitize it $filename = $url; $junk = $this->isInternal($filename); $qmPos = strpos($filename,'?'); if( $qmPos !== false ) { // Strip the query $query = substr($filename, $qmPos+1); $file = substr($filename, 0, $qmPos); } else { $query = ''; } // Check if it marked as "do not replace" if(count($this->jsFiles)) { $found = false; foreach($this->jsFiles as $file) { if(($file->url == $url)) $found = true; if(($file->file == $filename)) $found = true; if(($file->file == 'administrator'.DIRECTORY_SEPARATOR.$filename)) $found = true; if($found) { $file->REPLACED = 'REPLACED'; return ' '; } } if(!$found) return $matches[0]; } else { return $matches[0]; } // If we are still here, the script must be removed, so we'll just // replace it with an empty string! return ' '; } else { return $matches[0]; } } /** * Callback method to remove the CSS <link> tags * @param array $matches * @return string */ public function replaceCSS($matches) { $cssRegex="/([^\"\'=]+\.(css)(\?[^\"\']*){0,1})[\"\']/i"; preg_match_all($cssRegex, $matches[0], $m); if(isset($m[1])&&count($m[1])){ // Get the URL of the script $url=$m[1][0]; // Sanitize it $filename = $url; $junk = $this->isInternal($filename); $qmPos = strpos($filename,'?'); if( $qmPos !== false ) { // Strip the query $query = substr($filename, $qmPos+1); $file = substr($filename, 0, $qmPos); } else { $query = ''; } // Check if it marked as "do not replace" if(count($this->cssFiles)) { $found = false; foreach($this->cssFiles as $file) { if(($file->url == $url)) $found = true; if(($file->file == $filename)) $found = true; if(($file->file == 'administrator'.DIRECTORY_SEPARATOR.$filename)) $found = true; /** if($found) { $file->REPLACED = 'REPLACED'; return ' '; } /**/ /**/ if( $found && (!$file->replace || $file->skip) ) { $found = false; return $matches[0]; } if($found) { $file->REPLACED = 'REPLACED'; return ' '; } /**/ } if(!$found) return $matches[0]; } else { return $matches[0]; } // If we are still here, the script must be removed, so we'll just // replace it with an empty string! return ' '; } else { return $matches[0]; } } public function decode_url($match) { $baseurl = $this->cssBaseURL; if(!empty($baseurl)) { // Slash the protocol if( substr($baseurl,0,7) == 'http://' ) $baseurl = substr($baseurl,7); if( substr($baseurl,0,8) == 'https://' ) $baseurl = substr($baseurl,8); $parts = explode('/',$baseurl); if(count($parts) >= 2) array_shift($parts); $baseurl = '/'.@implode('/', $parts); } $myURL = trim($match[1],'"\''); if( !(substr($myURL,0,7) == 'http://') && !(substr($myURL,0,8) == 'https://') && !(substr($myURL,0,1) == '/') ) { $myURL = rtrim($this->baseURL.$baseurl,'/') .'/'. $myURL; } return "url(\"$myURL\")"; } } function AdminToolsLateBoundAfterRender() { $subject = array(); $plugin = plgSystemAdmintoolsCore::fetchMyself(); $plugin->onAfterRenderLatebound(); }