Новости Joomla

‼️ 👩‍💻 Обновление безопасности для Tassos Framework!

‼️ 👩‍💻 Обновление безопасности для Tassos Framework!

7 января 2026 года греческому разработчику Тассосу Мариносу сообщили об уязвимости в системном плагине Tassos Framework, который входит в состав его расширений для Joomla.

⚠️ Проблема затрагивает следующие расширения:
- Convert Forms - конструктор форм обратной связи для Joomla
- EngageBox - конструктор всплывающих окон для Joomla
- Google Structured Data - пакет плагинов микроразметки для Joomla
- Advanced Custom Fields - пакет плагинов пользовательских полей (видео-сервисы, карты и иже с ними)
- Smile Pack - пакет расширений
- MailChimp Auto-Subscribe

Незамедлительно была проведена полная внутренняя проверка кода, внедрены дополнительные меры проверки и повышения безопасности, а также выпущены исправленные версии всех затронутых расширений. Проблема полностью решена.

👉 Суть уязвимости.
Уязвимость заключалась в том, как плагин Tassos Framework обрабатывал определенные AJAX-запросы через com_ajaxточку входа Joomla. При определенных условиях внутренняя функциональность фреймворка могла быть вызвана без надлежащих ограничений.

В худшем случае это могло позволить неавторизованному злоумышленнику читать файлы, доступные веб-серверу. Это также могло позволить удалять файлы с сервера при выполнении определенных условий.

При определенных обстоятельствах запросы к базе данных могли быть изменены для извлечения данных из базы данных Joomla. В совокупности эти возможности потенциально могли быть использованы для повышения уровня доступа и выполнения несанкционированного кода.

В настоящее время нет никаких доказательств того, что эта уязвимость была использована в реальных условиях.

Немедленно обновите расширения до безопасных версий (Joomla 4/5/6 | Joomla 3):
- Convert Forms - v5.1.1 / v.4.1.1
- EngageBox - v.7.1.1 / v,6,3,9
- Google Structured Data - v.6.1.1 / v.5.6.9
- Advanced Custom Fields - v.3.1.1 / v.2.8.10
- Smile Pack - v.2.1.1 / v.1.2.4.
- MailChimp Auto-Subscribe - v.5.1.1+ / v.5.0.4

Все указанные версии включают в себя релиз безопасности плагина Tassos Framework System Plugin v6.0.62.

Если у вас установлено несколько расширений Tassos, достаточно обновить только одно, чтобы применить патч. Однако всегда рекомендуется обновлять все расширения.

@joomlafeed

👩‍💻 Joomla включена в программу Google Summer of Code 2026.

👩‍💻 Joomla включена в программу Google Summer of Code 2026.

Google Summer of Code (GSoC) - программа компании Google, которая позволяет участникам программы под руководством опытных наставников писать код для организаций, занимающейся открытым исходным кодом. Joomla принимает участие в этой программе не в первый раз и в 2026 году снова включена в список GSoC. Для программы утверждается список "идей", воплотить которые должны участники под руководством наставников.

Проекты Joomla в рамках программы GSoC 2026.

Проект I: Ajax-бэкенд.
- Действия в административной панели без необходимости обновлять страницу.
- Автоматическое сохранение содержимого во время редактирования.
- Расширенный фильтр - поиск и фильтрация по пользовательским полям.

Проект II: Автоматизация рабочих процессов (workflow + task scheduler).
Joomla имеет функцию процессов и планировщика задач. Теперь эти две функции следует объединить, чтобы пользователь мог настраивать назначенные рабочие процессы таким образом, чтобы переходы выполнялись автоматически, с возможностью точного определения времени. Должна быть возможность создавать циклы или прямые запланированные рабочие процессы. Предполагается, что интерфейс должен учитывать хороший пользовательский опыт, удобство использования и современные стандарты доступности. Ожидается, что будет добавлен интерфейс для управления процессами и их расписанием на страницах категорий и материалов. Так же ожидается, что сторонние компоненты также смогут воспользоваться этим функционалом.

Проект III: Мультикатегории.
В настоящее время Joomla! не позволяет назначать один элемент нескольким категориям. Хотя система тегов часто используется в качестве замены, существует острая потребность в нативной поддержке нескольких категорий, чтобы привести Joomla! в соответствие с другими современными системами управления контентом.

Проект IV: Обучение с подкреплением на основе отзывов переводчиков.
Joomla собирается использовать автоматический перевод документации. В каждом языке есть свои специфические слова, характерные для Joomla. Предполагается обучать языковые модели, используя обратную связь от переводчиков, чтобы постоянно улучшать качество переводов и учитывать специфические языковые особенности Joomla.

Принять участие GSoC 2026
Подробнее о проектах Joomla GSoC 2026
Чат GSoC в Mattermost (международное сообщество Joomla)

Вышли релизы Joomla 6.0.3 и Joomla 5.4.3

Релиз Joomla 6.0.3 и Joomla 5.4.3

Проект Joomla рад сообщить о выпуске Joomla 6.0.3 и Joomla 5.4.3. Это релиз исправлений ошибок и улучшений для серии Joomla 6.0 и Joomla 5.4.

0 Пользователей и 1 Гость просматривают эту тему.
  • 10 Ответов
  • 981 Просмотров
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
При создании компонента создается база данных. Надо достать данные из неё и, пока что, абы как вывести на странице в админке.

Код
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" method="upgrade">
<!-- атрибут 'version' для тега расширения больше не используется -->
 
    <name>School Tech</name>
    <!-- Следующие элементы являются необязательными и не содержат ограничений на форматирование -->
    <creationDate></creationDate>
    <!-- Фиктивный автор, не стесняйтесь заменять его в любом месте, где вы его видите -->
    <author>Mu Compani</author>
    <authorUrl></authorUrl>
    <copyright></copyright>
    <license>0.0.1</license>
    <!-- Строка 'version' записывается в таблицу компонентов -->
    <version>0.0.8</version>
    <!-- Описание является необязательным и по умолчанию используется имя сомпонента -->
    <description>
        Контент для сайта
    </description>
 
    <namespace path="src/">MuCompani\Component\SchoolTech</namespace>

<files folder="site/">
<folder>language</folder>
<folder>src</folder>
<folder>tmpl</folder>
</files>

<languages>
<language tag="en-GB">site/language/en-GB/en-GB.com_schooltech.ini</language>
<language tag="ru-RU">site/language/ru-RU/ru-RU.com_schooltech.ini</language>
</languages>
           
    <administration>
        <!-- Ссылка, которая появится в меню админки Joomla "Components" -->
        <menu>SchoolTech</menu>
<submenu>
<menu link="option=com_schooltech&amp;view=trainingprograms">COM_SCHOOLTECH_TRAINING_PROGRAMS</menu>
</submenu>

        <!-- Список файлов и папок для копирования.
             Обратите внимание на атрибут "folder".
             Это имя папки в пакете компонентов для копирования в CMS Joomla 4. -->
        <files folder="admin/">
<folder>language</folder>
            <folder>services</folder>
<folder>sql</folder>
            <folder>src</folder>
            <folder>tmpl</folder>
        </files>

<languages>
            <language tag="en-GB">admin/language/en-GB/en-GB.com_schooltech.ini</language>
            <language tag="en-GB">admin/language/en-GB/en-GB.com_schooltech.sys.ini</language>
<language tag="ru-RU">admin/language/ru-RU/ru-RU.com_schooltech.ini</language>
            <language tag="ru-RU">admin/language/ru-RU/ru-RU.com_schooltech.sys.ini</language>
        </languages>
    </administration>

<install>
        <sql>
            <file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file>
        </sql>
    </install>
    <uninstall>
        <sql>
            <file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file>
        </sql>
    </uninstall>
<update>
        <schemas>
            <schemapath type="mysql">sql/mysql</schemapath>
        </schemas>
    </update>
 
</extension>

sql/install.mysql.utf8.sql

Код
CREATE TABLE `#__schooltech_training_programs` ( 
    `id` SERIAL NOT NULL,
    `name` VARCHAR(200) NOT NULL,
    `published` BOOLEAN NOT NULL DEFAULT FALSE,
`description` MEDIUMTEXT,
`education_time` INT,
`document` MEDIUMTEXT,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

INSERT INTO `#__schooltech_training_programs` (`name`) VALUES
    ('TEST1'),
    ('TEST2');

src/View/Trainingprograms/HtmlView.php
Код
namespace MuCompani\Component\SchoolTech\Administrator\View\Trainingprograms;

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Helper\ContentHelper;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\View\GenericDataException;
use Joomla\CMS\MVC\View\HtmlView as BaseHtmlView;
use Joomla\CMS\Toolbar\Toolbar;
use Joomla\CMS\Toolbar\ToolbarHelper;
/**
 * @package     Joomla.Administrator
 * @subpackage  com_helloworld
 *
 * [member=126442]copyright[/member]   Copyright (C) 2021 John Smith. All rights reserved.
 * @license     GNU General Public License version 3; see LICENSE
 */

/**
 * Основной вид в админке "SchoolTech"
 */
class HtmlView extends BaseHtmlView {

//Массив значений для вывода учебных программ
protected $items;
    /**
     * Отображение основного вида "SchoolTech"
     *
     * @param   string  $tpl  Имя файла шаблона для анализа; автоматический поиск путей к шаблону.
     * @return  void
     */
    function display($tpl = null) {

$this->items= $this->get('Items');//Объекты для отображения
var_dump($this->items);

        parent::display($tpl);
    }


}

src/Model/TrainingprogramsModel.php
Код
namespace MuCompani\Component\SchoolTech\Administrator\Model;

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\CMS\Table\Table;
use Joomla\Database\ParameterType;
use Joomla\Utilities\ArrayHelper;

class ContactsModel extends ListModel
{
protected function getListQuery(){

//Создаем новый query объект
$db = $this->getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();

//Выберем необходимые поля из таблицы
$query->select(
$db->quoteName(
explode(
', ',
$this->getState(
'list.select',
'a.id, a.name, a.alias'
)
)
)
);

$query->from($db->quoteName('#__schooltech_training_programs', 'a'));
return $query;
}
}

tmpl/trainingprograms/default.php
Код
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;

HTMLHelper::_('behavior.multiselect');

$user      = Factory::getUser();//Информация о текущем пользователе
$userId    = $user->get('id');



// Нет прямого доступа к этому файлу
defined('_JEXEC') or die('Всем кыш! =D');
?>
<h2>Здесь будут программы обучения</h2>

Выдает null. Что ещё надо сделать, чтобы компонент получил доступ к этим записям в БД ?
*

NewUsers

  • Живу я здесь
  • 2310
  • 216 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
У Вас нет столбца alias
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Переделал

sql/install.mysql.utf8.sql
Код
CREATE TABLE `#__schooltech_training_programs` ( 
    `id` SERIAL NOT NULL,
    `name` VARCHAR(200) NOT NULL,
    `published` BOOLEAN NOT NULL DEFAULT FALSE,
`alias` MEDIUMTEXT,
`description` MEDIUMTEXT,
`education_time` INT,
`document` MEDIUMTEXT,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

src/Model/TrainingprogramsModel.php
Код
<?php
namespace MuCompani\Component\SchoolTech\Administrator\Model;

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\CMS\Table\Table;
use Joomla\Database\ParameterType;
use Joomla\Utilities\ArrayHelper;

class ContactsModel extends ListModel
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array(
'id', 'a.id',
'name', 'a.name',
'alias', 'a.alias',
);

if (Associations::isEnabled())
{
$config['filter_fields'][] = 'association';
}
}

parent::__construct($config);
}
   
protected function populateState($ordering = 'a.name', $direction = 'asc')
{
$app = Factory::getApplication();

$forcedLanguage = $app->input->get('forcedLanguage', '', 'cmd');

// Adjust the context to support modal layouts.
if ($layout = $app->input->get('layout'))
{
$this->context .= '.' . $layout;
}

// Adjust the context to support forced languages.
if ($forcedLanguage)
{
$this->context .= '.' . $forcedLanguage;
}

// List state information.
parent::populateState($ordering, $direction);

// Force a language.
if (!empty($forcedLanguage))
{
$this->setState('filter.language', $forcedLanguage);
}
}

protected function getStoreId($id = '')
{
// Compile the store id.
$id .= ':' . $this->getState('filter.search');
$id .= ':' . $this->getState('filter.published');
$id .= ':' . serialize($this->getState('filter.category_id'));
$id .= ':' . $this->getState('filter.access');
$id .= ':' . $this->getState('filter.language');
$id .= ':' . serialize($this->getState('filter.tag'));
$id .= ':' . $this->getState('filter.level');

return parent::getStoreId($id);
}

protected function getListQuery()
{
//Создаем новый query объект
$db = $this->getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();

//Выберем необходимые поля из таблицы
$query->select(
$db->quoteName(
explode(
', ',
$this->getState(
'list.select',
'a.id, a.name, a.alias'
)
)
)
);

$query->from($db->quoteName('#__schooltech_training_programs', 'a'));


return $query;
}
}
?>

Все равно null. Может, с контроллерами проблема ?

src/Controller/TrainingprogramsController.php
Код
namespace MuCompani\Component\SchoolTech\Administrator\Controller;

\defined('_JEXEC') or die;

use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\AdminController;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\Input\Input;
use Joomla\Utilities\ArrayHelper;

public function featured()
{
// Check for request forgeries
$this->checkToken();

$ids    = $this->input->get('cid', array(), 'array');
$values = array('featured' => 1, 'unfeatured' => 0);
$task   = $this->getTask();
$value  = ArrayHelper::getValue($values, $task, 0, 'int');

// Get the model.
/** @var \Joomla\Component\Contact\Administrator\Model\ContactModel $model */
$model  = $this->getModel();
}


public function getModel($name = 'SchoolTech', $prefix = 'Administrator', $config = array('ignore_request' => true))
{
return parent::getModel($name, $prefix, $config);
}

Или я какой-то важный файл пропустил ? Знает кто, откуда $this->items= $this->get('Items'); берется ?
« Последнее редактирование: 14.02.2022, 08:49:33 от leha111 »
*

NewUsers

  • Живу я здесь
  • 2310
  • 216 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Знает кто, откуда $this->items= $this->get('Items'); берется ?
вот от сюда https://github.com/joomla/joomla-cms/blob/4.1-dev/libraries/src/MVC/View/AbstractView.php#L131

Все равно null. Может, с контроллерами проблема ?
Проверьте существование модели в файле представления (tmpl/trainingprograms/default.php)
Код: php
$model = $this->getModel();
echo get_class($model). '<br>';
2 вариант! В файле (src/Model/TrainingprogramsModel.php)
выведите SQL запрос в выполните его напрямую в phpMyAdmin

Код: php
echo $query . '<hr>';
return $query;
Занимаюсь создание расширений для Joomla 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Цитировать
Проверьте существование модели в файле представления (tmpl/trainingprograms/default.php)
Код: php
Код
$model = $this->getModel();
echo get_class($model). '<br>';

Проблема в том. что в компоненте com_contact, с которым я сверяюсь,

Код
$this->items         = $this->get('Items');
var_dump($this->get('Items'));

в /src/View/Contacts/HtmlView.php без этого нормально работает (по крайнее мерее, я там такого представления не нащел). И суть не в том, чтобы просто вывести надпись. Факт её выведения является доказательством того, что нормально получен доступ к базе данных.
*

sivers

  • Живу я здесь
  • 2606
  • 361 / 0
$this->items         = $this->get('Items');
эта строка в представлении вызывает метод getItems модуля (!), который, в свою очередь, вызывает метод (в модуле же) getListQuery(), в котором собственно и формируется запрос к БД (метод должен вернуть сформированную строку запроса БД). Вот в getListQuery вы и должны учесть все переданные параметры и сформировать запрос (только сформировать, саму выборку не делать).
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Собственно, у меня ест файл
src/Model/TrainingprogramsModel.php

А в нем
Код
namespace MuCompani\Component\SchoolTech\Administrator\Model;

\defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\MVC\Model\ListModel;
use Joomla\CMS\Table\Table;
use Joomla\Database\ParameterType;
use Joomla\Utilities\ArrayHelper;

class ContactsModel extends ListModel
{
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array(
'id', 'a.id',
'name', 'a.name',
'alias', 'a.alias',
);

if (Associations::isEnabled())
{
$config['filter_fields'][] = 'association';
}
}

parent::__construct($config);
}
   
protected function populateState($ordering = 'a.name', $direction = 'asc')
{
$app = Factory::getApplication();

$forcedLanguage = $app->input->get('forcedLanguage', '', 'cmd');

// Adjust the context to support modal layouts.
if ($layout = $app->input->get('layout'))
{
$this->context .= '.' . $layout;
}

// Adjust the context to support forced languages.
if ($forcedLanguage)
{
$this->context .= '.' . $forcedLanguage;
}

// List state information.
parent::populateState($ordering, $direction);

// Force a language.
if (!empty($forcedLanguage))
{
$this->setState('filter.language', $forcedLanguage);
}
}

protected function getStoreId($id = '')
{
// Compile the store id.
$id .= ':' . $this->getState('filter.search');
$id .= ':' . $this->getState('filter.published');
$id .= ':' . serialize($this->getState('filter.category_id'));
$id .= ':' . $this->getState('filter.access');
$id .= ':' . $this->getState('filter.language');
$id .= ':' . serialize($this->getState('filter.tag'));
$id .= ':' . $this->getState('filter.level');

return parent::getStoreId($id);
}

protected function getListQuery()
{
//Создаем новый query объект
$db = $this->getDbo();
$query = $db->getQuery(true);
$user = Factory::getUser();

//Выберем необходимые поля из таблицы
$query->select(
$db->quoteName(
explode(
', ',
$this->getState(
'list.select',
'a.id, a.name, a.alias'
)
)
)
);

$query->from($db->quoteName('#__schooltech_training_programs', 'a'));


return $query;
}
}

Собственно, что с ним не так ? Или надо что-то ещё ? Или с вышеописанным src/Controller/TrainingprogramsController.php ?
« Последнее редактирование: 18.02.2022, 08:48:20 от leha111 »
*

sivers

  • Живу я здесь
  • 2606
  • 361 / 0
Собственно, что с ним не так ? Или надо что-то ещё ?
Делайте вывод логов, чтоб разобраться. Поставьте перед return $query; строчку echo $query->dump(); exit; - увидите какой запрос формируется (если ничего не увидите - значит метод не отрабатывает). Попробуйте полученный запрос выполнить вручную в пхпМуАдмин - посмотрите возвращает ли он что-нибудь. А там дальше - по результатам.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Судя по реакции, метод вообще не отрабатывается. Я как-то неправильно название файла прописал или надо его как-то в контроллерах указать ?
*

leha111

  • Захожу иногда
  • 226
  • 0 / 0
Проблема оказалась в том, что я, не подумав что это важно, тупо передрал название класса ContactsModel, вместо того, чтобы переименовать в TrainingprogramsModel
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как сохранить в файле txt информацию из поля input?

Автор GuDeVic

Ответов: 1
Просмотров: 974
Последний ответ 20.11.2023, 14:34:09
от GuDeVic
Скрыть информацию на гостевой странице

Автор Andrew_Shi

Ответов: 10
Просмотров: 1598
Последний ответ 05.11.2023, 20:32:33
от Andrew_Shi
Есть ли способ уменьшить вес таблиц в БД у компонента Finder?

Автор denxio

Ответов: 1
Просмотров: 583
Последний ответ 15.10.2023, 12:27:02
от Andrew_Shi
Фильтр type=&quot;sql&quot; для компонента J! 4

Автор GuDeVic

Ответов: 0
Просмотров: 494
Последний ответ 11.08.2022, 13:14:21
от GuDeVic
Проблема вывода компонента на Front-end

Автор GuDeVic

Ответов: 23
Просмотров: 3295
Последний ответ 09.08.2022, 16:09:21
от GuDeVic