AnonSec Shell
Server IP : 54.36.91.62  /  Your IP : 216.73.217.112
Web Server : Apache
System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64
User : coopiak ( 151928)
PHP Version : 8.3.23
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/coopiak/www/cj79373/plugins/system/componentsanywhere/src/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/coopiak/www/cj79373/plugins/system/componentsanywhere/src/Replace.php
<?php
/**
 * @package         Components Anywhere
 * @version         4.10.1
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            http://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 */

namespace RegularLabs\Plugin\System\ComponentsAnywhere;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Router\Route as JRoute;
use Joomla\CMS\Uri\Uri as JUri;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\Html as RL_Html;
use RegularLabs\Library\PluginTag as RL_PluginTag;
use RegularLabs\Library\Protect as RL_Protect;
use RegularLabs\Library\RegEx as RL_RegEx;
use RegularLabs\Library\StringHelper as RL_String;

class Replace
{
    static $message       = '';
    static $protect_end   = '<!-- END: CA_PROTECT -->';
    static $protect_start = '<!-- START: CA_PROTECT -->';

    public static function processComponents(&$string, $area = 'article', $context = '', $article = null)
    {
        $params = Params::get();


        // Check if tags are in the text snippet used for the search component
        if (strpos($context, 'com_search.') === 0)
        {
            $limit = explode('.', $context, 2);
            $limit = (int) array_pop($limit);

            $string_check = substr($string, 0, $limit);

            if ( ! RL_String::contains($string_check, Params::getTags(true)))
            {
                return;
            }
        }


        if ( ! RL_String::contains($string, Params::getTags(true)))
        {
            return;
        }

        self::replace($string, $area);
    }

    public static function replaceTags(&$string, $area = 'article', $context = '')
    {
        if ( ! is_string($string) || $string == '')
        {
            return false;
        }

        if ( ! RL_String::contains($string, Params::getTags(true)))
        {
            return false;
        }

        $params = Params::get();

        // allow in component?
        if (RL_Protect::isRestrictedComponent($params->disabled_components ?? [], $area))
        {

            Protect::_($string);

            self::removeAll($string, $area);

            RL_Protect::unprotect($string);

            return true;
        }

        Protect::_($string);

        // COMPONENT
        if (RL_Document::isFeed())
        {
            $string = RL_RegEx::replace('(<item[^>]*>)', '\1<!-- START: CODA_COMPONENT -->', $string);
            $string = str_replace('</item>', '<!-- END: CODA_COMPONENT --></item>', $string);
        }

        if (strpos($string, '<!-- START: CODA_COMPONENT -->') === false)
        {
            Area::tag($string, 'component');
        }

        self::$message = '';

        $components = Area::get($string, 'component');

        foreach ($components as $component)
        {
            if (strpos($string, $component[0]) === false)
            {
                continue;
            }

            self::processComponents($component[1], 'components');
            $string = str_replace($component[0], $component[1], $string);
        }

        // EVERYWHERE
        self::processComponents($string, 'other');

        RL_Protect::unprotect($string);

        return true;
    }

    private static function getDivTags($data)
    {
        [$tag_start, $tag_end] = Params::getTagCharacters(true);

        return RL_PluginTag::getDivTags($data['start_div'], $data['end_div'], $tag_start, $tag_end);
    }

    private static function processComponent($tag, $area = '')
    {
        $params = Params::get();

        $url = ltrim(RL_String::html_entity_decoder(trim($tag->url)), '/');

        $pagination_stuff = ['p', 'page', 'limitstart', 'start', 'filter', 'filter-search'];
        $full_url         = $url;
        foreach ($pagination_stuff as $key)
        {
            if ( ! isset($_GET[$key]))
            {
                continue;
            }

            $full_url .= (strpos($url, '?') === false) ? '?' : '&';
            $full_url .= $key . '=' . $_GET[$key];
        }

        if ($tag->force_itemid)
        {
            $full_url = RL_RegEx::replace(
                '((?:\?|&(?:amp;)?)Itemid)=[0-9]+',
                '\1=' . JFactory::getApplication()->input->get('Itemid'),
                $full_url
            );

            $full_url .= (strpos($full_url, '?') === false) ? '?' : '&';
            $full_url .= 'Itemid=' . JFactory::getApplication()->input->get('Itemid');
        }

        $data = Component::get($full_url, $tag->caching);

        if ( ! $data)
        {
            if ($params->place_comments)
            {
                return Protect::getMessageCommentTag(JText::_('CA_OUTPUT_REMOVED_INVALID'));
            }

            return '';
        }

        $add_styles_scripts = $tag->add_styles_scripts ?? $tag->add_scripts_styles ?? $params->add_scripts_styles;

        if ($add_styles_scripts)
        {
            $add_styles  = $tag->add_styles ?? $params->add_styles;
            $add_scripts = $tag->add_scripts ?? $params->add_scripts;
            $add_meta    = $tag->add_meta ?? $params->add_meta;

            Document::addStylesAndScripts($data, $area, $add_styles, $add_scripts, $add_meta);
        }

        $uri = JUri::getInstance();

        // Remove tmpl and rendercomponent parameters that have possibly been added to urls by the component
        self::removeFromUrls($data->html, '(?:tmpl=' . $params->tmpl . '&(?:amp;)?)?rendercomponent=1');

        if ($params->force_remove_tmpl)
        {
            self::removeFromUrls($data->html, 'tmpl=' . $params->tmpl);
        }

        // Replace the form token with the current correct one
        if ( ! empty($data->token))
        {
            $data->html = str_replace(
                $data->token,
                JFactory::getSession()->getFormToken(),
                $data->html
            );
        }

        // Replace the return values in urls
        $data->html = RL_RegEx::replace(
            '(\?|&(?:amp;)?)return=(?:[a-z0-9=]+)',
            '\1return=' . base64_encode($uri->toString()),
            $data->html
        );

        if ($tag->force_itemid)
        {
            // Replace Itemid
            $data->html = RL_RegEx::replace(
                '(\?|&(?:amp;)?)Itemid=[0-9]+',
                '\1Itemid=' . JFactory::getApplication()->input->get('Itemid'),
                $data->html
            );
        }

        if ( ! $tag->keepurls)
        {
            $path = $uri->getPath();
            $path .= (strpos($path, '?') === false) ? '?' : '&';

            // Replace urls
            $data->html = RL_RegEx::replace(
                '\/' . RL_RegEx::quote([
                    $url,
                    JRoute::_($url),
                    JRoute::_($url, false),
                ]) . '(/?[\?\&\"\'])',
                $path . '\2',
                $data->html
            );

            // Also get non-sef matches
            $url_regex  = str_replace('&', '&(?:amp;)?', str_replace('index.php', '', $url));
            $data->html = RL_RegEx::replace('"[^"]+' . $url_regex . '("|&)', '"' . $path . '\1', $data->html);
        }

        return $data->html;
    }

    private static function processMatch(&$string, &$data, $area = 'article')
    {
        $params = Params::get();

        if ( ! empty(self::$message))
        {
            $html = '';

            if ($params->place_comments)
            {
                $html = Protect::getMessageCommentTag(self::$message);
            }

            $string = str_replace($data[0], $html, $string);

            return true;
        }

        $id = trim($data['id']);

        // Handle multiple attribute syntaxes
        $id = str_replace(
            ['|cache', '|forceitemid', '|keepurl', '|keepurlss'],
            ['|caching', '|force_itemid', '|keepurls', '|keepurls'],
            $id
        );

        $known_boolean_keys = [
            'caching', 'force_itemid', 'keepurls',
        ];

        $tag = RL_PluginTag::getAttributesFromString($id, 'url', $known_boolean_keys);

        if ( ! empty($tag->params))
        {
            foreach ($tag->params as $param)
            {
                $tag->{$param} = 1;
            }
        }
        unset($tag->params);

        $tag->force_itemid ??= $params->force_itemid;
        $tag->keepurls     ??= $params->keepurls;
        $tag->caching      ??= $params->caching;

        $html = self::processComponent($tag, $area);

        [$start_div, $end_div] = self::getDivTags($data);

        $tags = RL_Html::cleanSurroundingTags([
            'start_div_pre'  => $start_div['pre'],
            'start_div_post' => $start_div['post'],
            'pre'            => $data['pre'],
            'post'           => $data['post'],
            'end_div_pre'    => $end_div['pre'],
            'end_div_post'   => $end_div['post'],
        ]);

        $html = $tags['start_div_pre'] . $start_div['tag'] . $tags['start_div_post']
            . $tags['pre'] . $html . $tags['post']
            . $tags['end_div_pre'] . $end_div['tag'] . $tags['end_div_post'];

        if ($params->place_comments)
        {
            $html = Protect::wrapInCommentTags($html);
        }

        $string = str_replace($data[0], $html, $string);
        unset($data);

        return true;
    }

    private static function removeAll(&$string, $area = 'article')
    {
        self::$message = JText::_('CA_OUTPUT_REMOVED_NOT_ENABLED');
        self::processComponents($string, $area);
    }

    private static function removeFromUrls(&$html, $search = '')
    {
        // Replace the <search term>&<something else> cases
        $html = RL_RegEx::replace('(\?|&(?:amp;)?)' . $search . '&(?:amp;)?', '\1', $html);
        // Replace the <search term> cases
        $html = RL_RegEx::replace('(?:\?|&(?:amp;)?)' . $search, '', $html);
    }

    private static function replace(&$string, $area = 'article')
    {
        [$start_tags, $end_tags] = Params::getTags();

        [$pre_string, $string, $post_string] = RL_Html::getContentContainingSearches(
            $string,
            $start_tags,
            $end_tags
        );

        if ($string == '' || ! RL_String::contains($string, Params::getTags(true)))
        {
            $string = $pre_string . $string . $post_string;

            return;
        }

        $regex = Params::getRegex();

        $matches  = [];
        $protects = [];

        RL_RegEx::matchAll($regex, $string, $matches);

        if (empty($matches))
        {
            $string = $pre_string . $string . $post_string;

            return;
        }

        foreach ($matches as $match)
        {
            if (strpos($string, $match[0]) === false)
            {
                continue;
            }

            if (self::processMatch($string, $match, $area))
            {
                continue;
            }

            $protected  = self::$protect_start . base64_encode($match[0]) . self::$protect_end;
            $string     = str_replace($match[0], $protected, $string);
            $protects[] = [$match[0], $protected];
        }

        unset($matches);

        foreach ($protects as $protect)
        {
            if (strpos($string, $protect[1]) === false)
            {
                continue;
            }

            $string = str_replace($protect[1], $protect[0], $string);
        }

        $string = $pre_string . $string . $post_string;
    }
}

Anon7 - 2022
AnonSec Team