Joomla! 4.4.0 Alpha 1

This commit is contained in:
Allon Moritz 2023-05-31 16:58:50 +02:00
parent 18a29a6a4d
commit 4f2ae76fed
139 changed files with 283 additions and 180 deletions

View File

@ -0,0 +1,2 @@
ALTER TABLE `#__user_mfa` ADD COLUMN `tries` int NOT NULL DEFAULT 0 /** CAN FAIL **/;
ALTER TABLE `#__user_mfa` ADD COLUMN `last_try` datetime /** CAN FAIL **/;

View File

@ -0,0 +1,2 @@
ALTER TABLE "#__user_mfa" ADD COLUMN "tries" bigint DEFAULT 0 NOT NULL /** CAN FAIL **/;
ALTER TABLE "#__user_mfa" ADD COLUMN "last_try" timestamp without time zone /** CAN FAIL **/;

View File

@ -88,7 +88,7 @@ class HtmlView extends BaseHtmlView
* The ordering list for the categories
*
* @var array
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected $ordering = [];

View File

@ -88,7 +88,7 @@ class HtmlView extends BaseHtmlView
* Is the vote plugin enabled on the site
*
* @var boolean
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected $vote = false;
@ -96,7 +96,7 @@ class HtmlView extends BaseHtmlView
* Are hits being recorded on the site?
*
* @var boolean
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected $hits = false;

View File

@ -36,7 +36,7 @@ abstract class PrivacyPlugin extends CMSPlugin
*
* @var \Joomla\Database\DatabaseDriver
* @since 3.9.0
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0 use $this->getDatabase() instead
* @deprecated 4.4.0 will be removed in 6.0 use $this->getDatabase() instead
*/
protected $db;

View File

@ -84,7 +84,7 @@ class HtmlView extends BaseHtmlView
* The ordering list for the tags
*
* @var array
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected $ordering = [];

View File

@ -329,6 +329,30 @@
default=""
showon="mfaredirectonlogin:1"
/>
<field
name="mfatrycount"
type="number"
label="COM_USERS_CONFIG_MFATRYCOUNT_LABEL"
filter="integer"
min="0"
max="20"
step="1"
default="10"
validate="number"
/>
<field
name="mfatrytime"
type="number"
label="COM_USERS_CONFIG_MFATRYTIME_LABEL"
filter="integer"
min="1"
max="24"
step="1"
default="1"
validate="number"
/>
</fieldset>
<fieldset

View File

@ -153,6 +153,18 @@ class CaptiveController extends BaseController implements UserFactoryAwareInterf
throw new RuntimeException(Text::_('COM_USERS_MFA_INVALID_METHOD'), 500);
}
if (!$model->checkTryLimit($record)) {
// The try limit is reached, show error and return
$captiveURL = Route::_('index.php?option=com_users&view=captive&task=select', false);
$message = Text::_('COM_USERS_MFA_TRY_LIMIT_REACHED');
$this->setRedirect($captiveURL, $message, 'error');
$event = new NotifyActionLog('onComUsersCaptiveValidateTryLimitReached');
$this->app->getDispatcher()->dispatch($event->getName(), $event);
return;
}
// Validate the code
$user = $this->app->getIdentity() ?: $this->getUserFactory()->loadUserById(0);
@ -210,6 +222,8 @@ class CaptiveController extends BaseController implements UserFactoryAwareInterf
$jNow = Date::getInstance();
$record->last_used = $jNow->toSql();
$record->tries = 0;
$record->last_try = null;
$record->store();
// Flag the user as fully logged in

View File

@ -18,6 +18,7 @@ use Joomla\CMS\Language\Text;
use Joomla\CMS\MVC\Controller\BaseController as BaseControllerAlias;
use Joomla\CMS\MVC\Factory\MVCFactoryInterface;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\User\User;
use Joomla\CMS\User\UserFactoryAwareInterface;
use Joomla\CMS\User\UserFactoryAwareTrait;
@ -205,7 +206,7 @@ class MethodController extends BaseControllerAlias implements UserFactoryAwareIn
$redirectUrl = 'index.php?option=com_users&task=method.edit&user_id=' . $userId . '&id=' . $backupCodesRecord->id;
$returnURL = $this->input->getBase64('returnurl');
if (!empty($returnURL)) {
if (!empty($returnURL) && Uri::isInternal(base64_decode($returnURL))) {
$redirectUrl .= '&returnurl=' . $returnURL;
}
@ -260,7 +261,7 @@ class MethodController extends BaseControllerAlias implements UserFactoryAwareIn
$url = Route::_('index.php?option=com_users&task=methods.display&user_id=' . $userId, false);
$returnURL = $this->input->getBase64('returnurl');
if (!empty($returnURL)) {
if (!empty($returnURL) && Uri::isInternal(base64_decode($returnURL))) {
$url = base64_decode($returnURL);
}
@ -291,7 +292,7 @@ class MethodController extends BaseControllerAlias implements UserFactoryAwareIn
$url = Route::_('index.php?option=com_users&task=methods.display&user_id=' . $userId, false);
$returnURL = $this->input->getBase64('returnurl');
if (!empty($returnURL)) {
if (!empty($returnURL) && Uri::isInternal(base64_decode($returnURL))) {
$url = base64_decode($returnURL);
}

View File

@ -103,7 +103,7 @@ class MethodsController extends BaseController implements UserFactoryAwareInterf
$url = Route::_('index.php?option=com_users&task=methods.display&user_id=' . $userId, false);
$returnURL = $this->input->getBase64('returnurl');
if (!empty($returnURL)) {
if (!empty($returnURL) && Uri::isInternal(base64_decode($returnURL))) {
$url = base64_decode($returnURL);
}
@ -190,7 +190,7 @@ class MethodsController extends BaseController implements UserFactoryAwareInterf
$url = Uri::base();
$returnURL = $this->input->getBase64('returnurl');
if (!empty($returnURL)) {
if (!empty($returnURL) && Uri::isInternal(base64_decode($returnURL))) {
$url = base64_decode($returnURL);
}

View File

@ -13,6 +13,7 @@ namespace Joomla\Component\Users\Administrator\Model;
use Exception;
use Joomla\CMS\Application\CMSApplication;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Event\MultiFactor\Captive;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
@ -409,4 +410,43 @@ class CaptiveModel extends BaseDatabaseModel
return $res;
}
/**
* Method to check if the mfa method in question has reached it's usage limit
*
* @param MfaTable $method Mfa method record
*
* @return boolean true if user can use the method, false if not
*
* @since 4.4.0
* @throws \Exception
*/
public function checkTryLimit(MfaTable $method)
{
$params = ComponentHelper::getParams('com_users');
$jNow = Date::getInstance();
$maxTries = (int) $params->get('mfatrycount', 10);
$blockHours = (int) $params->get('mfatrytime', 1);
$lastTryTime = strtotime($method->last_try) ?: 0;
$hoursSinceLastTry = (strtotime(Factory::getDate()->toSql()) - $lastTryTime) / 3600;
if ($method->last_try !== null && $hoursSinceLastTry > $blockHours) {
// If it's been long enough, start a new reset count
$method->last_try = null;
$method->tries = 0;
} elseif ($method->tries < $maxTries) {
// If we are under the max count, just increment the counter
++$method->tries;
$method->last_try = $jNow->toSql();
} else {
// At this point, we know we have exceeded the maximum resets for the time period
return false;
}
// Store changes to try counter and/or the timestamp
$method->store();
return true;
}
}

View File

@ -44,6 +44,8 @@ use Throwable;
* @property array $options Configuration options for the MFA Method.
* @property string $created_on Date and time the record was created.
* @property string $last_used Date and time the record was last used successfully.
* @property int $tries Counter for unsuccessful tries
* @property string $last_try Date and time of the last unsuccessful try
*
* @since 4.2.0
*/

View File

@ -17,6 +17,7 @@ use Joomla\CMS\Toolbar\Button\BasicButton;
use Joomla\CMS\Toolbar\Button\LinkButton;
use Joomla\CMS\Toolbar\Toolbar;
use Joomla\CMS\Toolbar\ToolbarHelper;
use Joomla\CMS\Uri\Uri;
use Joomla\CMS\User\User;
use Joomla\Component\Users\Administrator\Model\MethodModel;
@ -168,7 +169,9 @@ class HtmlView extends BaseHtmlView
}
$returnUrl = empty($this->returnURL) ? '' : base64_decode($this->returnURL);
$returnUrl = $returnUrl ?: Route::_('index.php?option=com_users&task=methods.display&user_id=' . $this->user->id);
$returnUrl = ($returnUrl && Uri::isInternal($returnUrl))
? $returnUrl
: Route::_('index.php?option=com_users&task=methods.display&user_id=' . $this->user->id);
if ($this->isAdmin && $this->getLayout() === 'edit') {
$button = (new BasicButton('user-mfa-edit-save'))

View File

@ -81,6 +81,8 @@ COM_USERS_CONFIG_SAVE_FAILED="An error was encountered while saving the configur
COM_USERS_CONFIG_SILENTRESPONSES_DESC="For experts. A commaseparated list of Joomla authentication response types which are considered silent logins. The default is <code>cookie</code> (the Remember Me feature) and <code>passwordless</code> (WebAuthn)."
COM_USERS_CONFIG_SILENTRESPONSES_LABEL="Silent login authentication response types (for experts)"
COM_USERS_CONFIG_USER_OPTIONS="User Options"
COM_USERS_CONFIG_MFATRYCOUNT_LABEL="Maximum MFA tries"
COM_USERS_CONFIG_MFATRYTIME_LABEL="MFA limit block time (in hours)"
COM_USERS_COUNT_DISABLED_USERS="Blocked Users"
COM_USERS_COUNT_ENABLED_USERS="Enabled Users"
COM_USERS_DASHBOARD_TITLE="Users Dashboard"
@ -271,6 +273,7 @@ COM_USERS_MFA_FIRSTTIME_NOTINTERESTED="Don't show this again"
COM_USERS_MFA_FIRSTTIME_PAGE_HEAD="Set up your Multi-factor Authentication"
COM_USERS_MFA_INVALID_CODE="Multi-factor Authentication failed. Please try again."
COM_USERS_MFA_INVALID_METHOD="Invalid Multi-factor Authentication method."
COM_USERS_MFA_TRY_LIMIT_REACHED="You have reached the try limit for the currently selected Authentication method. Please choose a different method or wait."
COM_USERS_MFA_LBL_CREATEDON="Added: %s"
COM_USERS_MFA_LBL_DATE_FORMAT_PAST="F d, Y"
COM_USERS_MFA_LBL_DATE_FORMAT_TODAY="H:i"

View File

@ -3,7 +3,7 @@
<name>English (en-GB)</name>
<tag>en-GB</tag>
<version>4.4.0</version>
<creationDate>2023-03</creationDate>
<creationDate>2023-05</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>

View File

@ -2,7 +2,7 @@
<metafile client="administrator">
<name>English (en-GB)</name>
<version>4.4.0</version>
<creationDate>2023-03</creationDate>
<creationDate>2023-05</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>

View File

@ -6,8 +6,8 @@
<authorUrl>www.joomla.org</authorUrl>
<copyright>(C) 2019 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<version>4.4.0-dev</version>
<creationDate>2023-03</creationDate>
<version>4.4.0-alpha1</version>
<creationDate>2023-05</creationDate>
<description>FILES_JOOMLA_XML_DESCRIPTION</description>
<scriptfile>administrator/components/com_admin/script.php</scriptfile>

View File

@ -3,7 +3,7 @@
<name>English (en-GB) Language Pack</name>
<packagename>en-GB</packagename>
<version>4.4.0.1</version>
<creationDate>2023-03</creationDate>
<creationDate>2023-05</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>

View File

@ -3,7 +3,7 @@
<name>English (en-GB)</name>
<tag>en-GB</tag>
<version>4.4.0</version>
<creationDate>2023-03</creationDate>
<creationDate>2023-05</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>

View File

@ -2,7 +2,7 @@
<metafile client="api">
<name>English (en-GB)</name>
<version>4.4.0</version>
<creationDate>2023-03</creationDate>
<creationDate>2023-05</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>

View File

@ -2,7 +2,7 @@
<metafile client="installation">
<name>English (United Kingdom)</name>
<version>4.4.0</version>
<creationDate>2023-03</creationDate>
<creationDate>2023-05</creationDate>
<author>Joomla! Project</author>
<copyright>(C) 2005 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>

View File

@ -1044,6 +1044,8 @@ CREATE TABLE IF NOT EXISTS `#__user_mfa` (
`options` mediumtext NOT NULL,
`created_on` datetime NOT NULL,
`last_used` datetime,
`tries` int NOT NULL DEFAULT 0,
`last_try` datetime,
PRIMARY KEY (`id`),
KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci COMMENT='Multi-factor Authentication settings';

View File

@ -1065,6 +1065,8 @@ CREATE TABLE IF NOT EXISTS "#__user_mfa" (
"options" text NOT NULL,
"created_on" timestamp without time zone NOT NULL,
"last_used" timestamp without time zone,
"tries" bigint DEFAULT 0 NOT NULL,
"last_try" timestamp without time zone,
PRIMARY KEY ("id")
);

View File

@ -77,6 +77,7 @@ COM_USERS_MFA_MANDATORY_NOTICE_BODY="Please enable a Multi-factor Authentication
COM_USERS_MFA_MANDATORY_NOTICE_HEAD="Multi-factor Authentication is mandatory for your user account"
COM_USERS_MFA_SELECT_PAGE_HEAD="Select a Multi-factor Authentication method"
COM_USERS_MFA_USE_DIFFERENT_METHOD="Select a different method"
COM_USERS_MFA_TRY_LIMIT_REACHED="You have reached the try limit for the currently selected Authentication method. Please choose a different method or wait."
COM_USERS_MFA_VALIDATE="Validate"
COM_USERS_OR="or"
COM_USERS_PROFILE="User Profile"

View File

@ -3,7 +3,7 @@
<name>English (en-GB)</name>
<tag>en-GB</tag>
<version>4.4.0</version>
<creationDate>2023-03</creationDate>
<creationDate>2023-05</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>

View File

@ -2,7 +2,7 @@
<metafile client="site">
<name>English (en-GB)</name>
<version>4.4.0</version>
<creationDate>2023-03</creationDate>
<creationDate>2023-05</creationDate>
<author>Joomla! Project</author>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>

View File

@ -13,7 +13,7 @@ defined('_JEXEC') or die;
/**
* Set the platform root path as a constant if necessary.
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use defined('_JEXEC') or die; to detect if the CMS is loaded correctly
**/
defined('JPATH_PLATFORM') or define('JPATH_PLATFORM', __DIR__);

View File

@ -21,7 +21,7 @@ trigger_error(
/**
* Set the platform root path as a constant if necessary.
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use defined('_JEXEC') or die; to detect if the CMS is loaded correctly
**/
if (!defined('JPATH_PLATFORM')) {

View File

@ -20,7 +20,7 @@ trigger_error(
/**
* Set the platform root path as a constant if necessary.
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use defined('_JEXEC') or die; to detect if the CMS is loaded correctly
**/
if (!defined('JPATH_PLATFORM')) {

View File

@ -20,7 +20,7 @@ trigger_error(
/**
* Set the platform root path as a constant if necessary.
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use defined('_JEXEC') or die; to detect if the CMS is loaded correctly
**/
if (!defined('JPATH_PLATFORM')) {

View File

@ -409,6 +409,8 @@ trait MultiFactorAuthenticationHandler
'default' => 0,
'created_on' => Date::getInstance()->toSql(),
'last_used' => null,
'tries' => 0,
'try_count' => null,
'options' => ['key' => $config['code']],
]
);
@ -425,6 +427,8 @@ trait MultiFactorAuthenticationHandler
'default' => 0,
'created_on' => Date::getInstance()->toSql(),
'last_used' => null,
'tries' => 0,
'try_count' => null,
'options' => ['id' => $config['yubikey']],
]
);
@ -458,6 +462,8 @@ trait MultiFactorAuthenticationHandler
'default' => 0,
'created_on' => Date::getInstance()->toSql(),
'last_used' => null,
'tries' => 0,
'try_count' => null,
'options' => @json_decode($otep, true),
]
);

View File

@ -51,7 +51,7 @@ abstract class WebApplication extends AbstractWebApplication
* @var integer
* @since 4.3.0
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0 as this property is not used anymore
* @deprecated 4.4.0 will be removed in 6.0 as this property is not used anymore
*/
public $item_associations;

View File

@ -30,6 +30,7 @@ class NotifyActionLog extends AbstractImmutableEvent
'onComUsersCaptiveShowSelect',
'onComUsersCaptiveValidateFailed',
'onComUsersCaptiveValidateInvalidMethod',
'onComUsersCaptiveValidateTryLimitReached',
'onComUsersCaptiveValidateSuccess',
'onComUsersControllerMethodAfterRegenerateBackupCodes',
'onComUsersControllerMethodBeforeAdd',

View File

@ -52,7 +52,7 @@ class MeterField extends FormField
* The min value of the progress bar
*
* @var int
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected $min = 0;
@ -68,7 +68,7 @@ class MeterField extends FormField
* The width of the progress bar
*
* @var string
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected $width;
@ -76,7 +76,7 @@ class MeterField extends FormField
* The color of the progress bar
*
* @var string
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected $color;

View File

@ -377,7 +377,7 @@ class MVCFactory implements MVCFactoryInterface, FormFactoryAwareInterface, Site
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private function setUserFactoryOnObject($object): void
{

View File

@ -226,7 +226,7 @@ class User extends CMSObject
* @var integer
* @since 4.3.0
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0 as this property is not used anymore
* @deprecated 4.4.0 will be removed in 6.0 as this property is not used anymore
*/
public $aid = null;

View File

@ -16,7 +16,7 @@ namespace Joomla\CMS\User;
/**
* Interface to be implemented by classes depending on a user factory.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
interface UserFactoryAwareInterface
{
@ -27,7 +27,7 @@ interface UserFactoryAwareInterface
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function setUserFactory(UserFactoryInterface $factory): void;
}

View File

@ -16,7 +16,7 @@ namespace Joomla\CMS\User;
/**
* Defines the trait for a UserFactoryInterface Aware Class.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
trait UserFactoryAwareTrait
{
@ -24,7 +24,7 @@ trait UserFactoryAwareTrait
* UserFactoryInterface
*
* @var UserFactoryInterface
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private $userFactory;
@ -33,7 +33,7 @@ trait UserFactoryAwareTrait
*
* @return UserFactoryInterface
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
* @throws \UnexpectedValueException May be thrown if the UserFactory has not been set.
*/
protected function getUserFactory(): UserFactoryInterface
@ -52,7 +52,7 @@ trait UserFactoryAwareTrait
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function setUserFactory(UserFactoryInterface $userFactory): void
{

View File

@ -66,7 +66,7 @@ final class Version
* @var string
* @since 3.8.0
*/
public const EXTRA_VERSION = 'dev';
public const EXTRA_VERSION = 'alpha1';
/**
* Development status.
@ -74,7 +74,7 @@ final class Version
* @var string
* @since 3.5
*/
public const DEV_STATUS = 'Development';
public const DEV_STATUS = 'Alpha';
/**
* Code name.
@ -90,7 +90,7 @@ final class Version
* @var string
* @since 3.5
*/
public const RELDATE = '17-October-2023';
public const RELDATE = '30-May-2023';
/**
* Release time.

View File

@ -19,7 +19,7 @@ use Joomla\DI\ServiceProviderInterface;
/**
* The articles archive module service provider.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
return new class () implements ServiceProviderInterface {
/**
@ -29,7 +29,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -21,7 +21,7 @@ use Joomla\CMS\Helper\HelperFactoryAwareTrait;
/**
* Dispatcher class for mod_articles_archive
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface
{
@ -32,7 +32,7 @@ class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareI
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected function getLayoutData(): array
{

View File

@ -42,7 +42,7 @@ class ArticlesArchiveHelper implements DatabaseAwareInterface
*
* @return \stdClass[]
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function getArticlesByMonths(Registry $moduleParams, SiteApplication $app): array
{
@ -109,7 +109,7 @@ class ArticlesArchiveHelper implements DatabaseAwareInterface
*
* @since 1.5
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use the non-static method getArticlesByMonths
* Example: Factory::getApplication()->bootModule('mod_articles_archive', 'site')
* ->getHelper('ArticlesArchiveHelper')

View File

@ -19,7 +19,7 @@ use Joomla\DI\ServiceProviderInterface;
/**
* The articles categories module service provider.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
return new class () implements ServiceProviderInterface {
/**
@ -29,7 +29,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container)
{

View File

@ -22,7 +22,7 @@ use Joomla\CMS\Helper\ModuleHelper;
/**
* Dispatcher class for mod_articles_categories
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface
{
@ -33,7 +33,7 @@ class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareI
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected function getLayoutData(): array
{

View File

@ -39,7 +39,7 @@ class ArticlesCategoriesHelper implements DatabaseAwareInterface
*
* @return CategoryNode[]
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function getChildrenCategories(Registry $moduleParams, SiteApplication $app): array
{
@ -80,7 +80,7 @@ class ArticlesCategoriesHelper implements DatabaseAwareInterface
*
* @since 1.6
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use the non-static method getChildrenCategories
* Example: Factory::getApplication()->bootModule('mod_articles_categories', 'site')
* ->getHelper('ArticlesCategoriesHelper')

View File

@ -19,7 +19,7 @@ use Joomla\DI\ServiceProviderInterface;
/**
* The articles category module service provider.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
return new class () implements ServiceProviderInterface {
/**
@ -29,7 +29,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container)
{

View File

@ -22,7 +22,7 @@ use Joomla\CMS\Helper\ModuleHelper;
/**
* Dispatcher class for mod_articles_category
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface
{
@ -33,7 +33,7 @@ class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareI
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected function getLayoutData(): array
{

View File

@ -46,7 +46,7 @@ class ArticlesCategoryHelper implements DatabaseAwareInterface
*
* @return object[]
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function getArticles(Registry $params, SiteApplication $app)
{
@ -325,7 +325,7 @@ class ArticlesCategoryHelper implements DatabaseAwareInterface
*
* @since 1.6
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use the non-static method getArticles
* Example: Factory::getApplication()->bootModule('mod_articles_category', 'site')
* ->getHelper('ArticlesCategoryHelper')

View File

@ -19,7 +19,7 @@ use Joomla\DI\ServiceProviderInterface;
/**
* The breadcrumbs module service provider.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
return new class () implements ServiceProviderInterface {
/**
@ -29,7 +29,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -21,7 +21,7 @@ use Joomla\CMS\Helper\HelperFactoryAwareTrait;
/**
* Dispatcher class for mod_breadcrumbs
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface
{
@ -32,7 +32,7 @@ class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareI
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected function getLayoutData(): array
{

View File

@ -36,7 +36,7 @@ class BreadcrumbsHelper
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function getBreadcrumbs(Registry $params, SiteApplication $app): array
{
@ -69,7 +69,7 @@ class BreadcrumbsHelper
*
* @return object
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function getHomeItem(Registry $params, SiteApplication $app): object
{
@ -97,7 +97,7 @@ class BreadcrumbsHelper
*
* @since 1.5
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0 as this function is not used anymore
* @deprecated 4.4.0 will be removed in 6.0 as this function is not used anymore
*/
public static function setSeparator($custom = null)
{
@ -128,7 +128,7 @@ class BreadcrumbsHelper
*
* @since 1.5
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use the non-static method getBreadcrumbs
* Example: Factory::getApplication()->bootModule('mod_breadcrumbs', 'site')
* ->getHelper('BreadcrumbsHelper')
@ -149,7 +149,7 @@ class BreadcrumbsHelper
*
* @since 4.2.0
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use the non-static method getHomeItem
* Example: Factory::getApplication()->bootModule('mod_breadcrumbs', 'site')
* ->getHelper('BreadcrumbsHelper')

View File

@ -18,7 +18,7 @@ use Joomla\DI\ServiceProviderInterface;
/**
* The module Custom HTML service provider.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
return new class () implements ServiceProviderInterface {
/**
@ -28,7 +28,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -20,7 +20,7 @@ use Joomla\CMS\HTML\HTMLHelper;
/**
* Dispatcher class for mod_custom
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
class Dispatcher extends AbstractModuleDispatcher
{
@ -29,7 +29,7 @@ class Dispatcher extends AbstractModuleDispatcher
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected function getLayoutData()
{

View File

@ -18,7 +18,7 @@ use Joomla\DI\ServiceProviderInterface;
/**
* The footer module service provider.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
return new class () implements ServiceProviderInterface {
/**
@ -28,7 +28,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -20,7 +20,7 @@ use Joomla\CMS\HTML\HTMLHelper;
/**
* Dispatcher class for mod_footer
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
class Dispatcher extends AbstractModuleDispatcher
{
@ -29,7 +29,7 @@ class Dispatcher extends AbstractModuleDispatcher
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected function getLayoutData(): array
{

View File

@ -19,7 +19,7 @@ use Joomla\DI\ServiceProviderInterface;
/**
* The articles related module service provider.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
return new class () implements ServiceProviderInterface {
/**
@ -29,7 +29,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container)
{

View File

@ -22,7 +22,7 @@ use Joomla\CMS\Helper\ModuleHelper;
/**
* Dispatcher class for mod_articles_popular
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface
{
@ -33,7 +33,7 @@ class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareI
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected function getLayoutData(): array
{

View File

@ -44,7 +44,7 @@ class RelatedItemsHelper implements DatabaseAwareInterface
*
* @return \stdClass[]
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function getRelatedArticles(Registry $params, SiteApplication $app): array
{
@ -186,7 +186,7 @@ class RelatedItemsHelper implements DatabaseAwareInterface
*
* @since 1.6
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use the non-static method getRelatedArticles
* Example: Factory::getApplication()->bootModule('mod_related_items', 'site')
* ->getHelper('RelatedItemsHelper')

View File

@ -19,7 +19,7 @@ use Joomla\DI\ServiceProviderInterface;
/**
* The users latest module service provider.
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
return new class () implements ServiceProviderInterface {
/**
@ -29,7 +29,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -21,7 +21,7 @@ use Joomla\CMS\Helper\HelperFactoryAwareTrait;
/**
* Dispatcher class for mod_users_latest
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface
{
@ -32,7 +32,7 @@ class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareI
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected function getLayoutData(): array
{

View File

@ -38,7 +38,7 @@ class UsersLatestHelper implements DatabaseAwareInterface
*
* @return array The array of users
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function getLatestUsers(Registry $params, SiteApplication $app): array
{
@ -85,7 +85,7 @@ class UsersLatestHelper implements DatabaseAwareInterface
*
* @since 1.6
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0
* @deprecated 4.4.0 will be removed in 6.0
* Use the non-static method getLatestUsers
* Example: Factory::getApplication()->bootModule('mod_users_latest', 'site')
* ->getHelper('UsersLatestHelper')

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -28,7 +28,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -29,7 +29,7 @@ final class Vote extends CMSPlugin
*
* @since 3.7.0
*
* @deprecated __DEPLOY_VERSION__ will be removed in 6.0 as it is there only for layout overrides
* @deprecated 4.4.0 will be removed in 6.0 as it is there only for layout overrides
* Use getApplication() instead
*/
protected $app;

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container)
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container)
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container)
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container)
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container)
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*
* @throws Exception
*/

View File

@ -27,7 +27,7 @@ use Joomla\Module\Quickicon\Administrator\Event\QuickIconsEvent;
/**
* Joomla! end of support notification plugin
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
final class Eos extends CMSPlugin implements SubscriberInterface
{
@ -37,7 +37,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
* The EOS date for 4.4.
*
* @var string
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private const EOS_DATE = '2025-10-17';
@ -45,7 +45,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
* Load the language file on instantiation.
*
* @var bool
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
protected $autoloadLanguage = false;
@ -53,7 +53,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
* Holding the current valid message to be shown.
*
* @var array
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private $currentMessage = [];
@ -61,7 +61,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
* Are the messages initialized.
*
* @var bool
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private $messagesInitialized = false;
@ -71,7 +71,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public static function getSubscribedEvents(): array
{
@ -92,7 +92,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*
* @throws Exception
*/
@ -156,7 +156,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
*
* @return bool
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private function saveParams(): bool
{
@ -178,7 +178,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
*
* @return bool
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*
* @throws Exception
*/
@ -202,7 +202,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
*
* @return array An array with the message to be displayed or false
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private function getMessageInfo(int $monthsUntilEOS, int $inverted): array
{
@ -284,7 +284,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
*
* @return bool
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*
* @throws Exception
*/
@ -298,7 +298,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
*
* @return string
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*
* @throws Notallowed If user is not allowed
*
@ -329,7 +329,7 @@ final class Eos extends CMSPlugin implements SubscriberInterface
*
* @return array
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private function setMessage(): array
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -28,7 +28,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -28,7 +28,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -98,7 +98,7 @@ final class LanguageFilter extends CMSPlugin
*
* @var LanguageFactoryInterface
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
private $languageFactory;

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -26,7 +26,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

View File

@ -27,7 +27,7 @@ return new class () implements ServiceProviderInterface {
*
* @return void
*
* @since __DEPLOY_VERSION__
* @since 4.4.0
*/
public function register(Container $container): void
{

Some files were not shown because too many files have changed in this diff Show More