diff --git a/installation/sql/mysql/joomla.sql b/installation/sql/mysql/joomla.sql
index 4495b65095b98..40b42b3d66d36 100644
--- a/installation/sql/mysql/joomla.sql
+++ b/installation/sql/mysql/joomla.sql
@@ -550,7 +550,7 @@ INSERT INTO `#__extensions` (`extension_id`, `package_id`, `name`, `type`, `elem
(33, 0, 'com_fields', 'component', 'com_fields', '', 1, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
(34, 0, 'com_associations', 'component', 'com_associations', '', 1, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
(35, 0, 'com_privacy', 'component', 'com_privacy', '', 1, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(36, 0, 'com_actionlogs', 'component', 'com_actionlogs', '', 1, 1, 1, 1, '', '{"ip_logging":"0","csv_delimiter":",","loggable_extensions":["com_banners","com_cache","com_categories","com_config","com_contact","com_content","com_installer","com_media","com_menus","com_messages","com_modules","com_newsfeeds","com_plugins","com_redirect","com_tags","com_templates","com_users"]}', 0, '0000-00-00 00:00:00', 0, 0),
+(36, 0, 'com_actionlogs', 'component', 'com_actionlogs', '', 1, 1, 1, 1, '', '{"ip_logging":0,"csv_delimiter":",","loggable_extensions":["com_banners","com_cache","com_categories","com_config","com_contact","com_content","com_installer","com_media","com_menus","com_messages","com_modules","com_newsfeeds","com_plugins","com_redirect","com_tags","com_templates","com_users"]}', 0, '0000-00-00 00:00:00', 0, 0),
(37, 0, 'com_workflow', 'component', 'com_workflow', '', 1, 1, 0, 1, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
(38, 0, 'com_csp', 'component', 'com_csp', '', 1, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
(103, 0, 'Joomla! Platform', 'library', 'joomla', '', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0),
@@ -674,36 +674,41 @@ INSERT INTO `#__extensions` (`extension_id`, `package_id`, `name`, `type`, `elem
(479, 0, 'plg_sampledata_blog', 'plugin', 'blog', 'sampledata', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
(480, 0, 'plg_system_sessiongc', 'plugin', 'sessiongc', 'system', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
(481, 0, 'plg_fields_repeatable', 'plugin', 'repeatable', 'fields', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(482, 0, 'plg_content_confirmconsent', 'plugin', 'confirmconsent', 'content', 0, 0, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(483, 0, 'plg_system_actionlogs', 'plugin', 'actionlogs', 'system', 0, 1, 1, 0, '', '{"logDeletePeriod":"0"}', 0, '0000-00-00 00:00:00', 0, 0),
+(482, 0, 'plg_content_confirmconsent', 'plugin', 'confirmconsent', 'content', 0, 0, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(483, 0, 'plg_system_actionlogs', 'plugin', 'actionlogs', 'system', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
(484, 0, 'plg_actionlog_joomla', 'plugin', 'joomla', 'actionlog', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(485, 0, 'plg_system_privacyconsent', 'plugin', 'privacyconsent', 'system', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(486, 0, 'plg_system_logrotation', 'plugin', 'logrotation', 'system', 0, 1, 1, 0, '', '{"cachetimeout":"30","logstokeep":"1","lastrun":0}', 0, '0000-00-00 00:00:00', 0, 0),
-(487, 0, 'plg_privacy_user', 'plugin', 'user', 'privacy', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(488, 0, 'plg_quickicon_privacycheck', 'plugin', 'privacycheck', 'quickicon', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(489, 0, 'plg_user_terms', 'plugin', 'terms', 'user', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(490, 0, 'plg_behaviour_taggable', 'plugin', 'taggable', 'behaviour', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(491, 0, 'plg_behaviour_versionable', 'plugin', 'versionable', 'behaviour', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(492, 0, 'plg_filesystem_local', 'plugin', 'local', 'filesystem', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(493, 0, 'plg_media-action_crop', 'plugin', 'crop', 'media-action', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(494, 0, 'plg_media-action_resize', 'plugin', 'resize', 'media-action', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(495, 0, 'plg_media-action_rotate', 'plugin', 'rotate', 'media-action', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(496, 0, 'plg_installer_webinstaller', 'plugin', 'webinstaller', 'installer', 0, 1, 1, 0, '', '{"tab_position":"1"}', 0, '0000-00-00 00:00:00', 0, 0),
-(497, 0, 'plg_system_httpheaders', 'plugin', 'httpheaders', 'system', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(498, 0, 'plg_sampledata_multilang', 'plugin', 'multilang', 'sampledata', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(499, 0, 'plg_extension_namespacemap', 'plugin', 'namespacemap', 'extension', 0, 1, 1, 1, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(500, 0, 'plg_installer_override', 'plugin', 'override', 'installer', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 4, 0),
-(501, 0, 'plg_quickicon_overridecheck', 'plugin', 'overridecheck', 'quickicon', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(502, 0, 'plg_extension_finder', 'plugin', 'finder', 'extension', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(503, 0, 'plg_api-authentication_basic', 'plugin', 'basic', 'api-authentication', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(504, 0, 'plg_webservices_content', 'plugin', 'content', 'webservices', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
-(505, 0, 'plg_system_skipto', 'plugin', 'skipto', 'system', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(485, 0, 'plg_system_privacyconsent', 'plugin', 'privacyconsent', 'system', 0, 0, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(486, 0, 'plg_system_logrotation', 'plugin', 'logrotation', 'system', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(487, 0, 'plg_privacy_user', 'plugin', 'user', 'privacy', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(488, 0, 'plg_quickicon_privacycheck', 'plugin', 'privacycheck', 'quickicon', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(489, 0, 'plg_user_terms', 'plugin', 'terms', 'user', 0, 0, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(490, 0, 'plg_privacy_contact', 'plugin', 'contact', 'privacy', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(491, 0, 'plg_privacy_content', 'plugin', 'content', 'privacy', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(492, 0, 'plg_privacy_message', 'plugin', 'message', 'privacy', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(493, 0, 'plg_privacy_actionlogs', 'plugin', 'actionlogs', 'privacy', 0, 0, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(494, 0, 'plg_behaviour_taggable', 'plugin', 'taggable', 'behaviour', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(495, 0, 'plg_behaviour_versionable', 'plugin', 'versionable', 'behaviour', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(496, 0, 'plg_filesystem_local', 'plugin', 'local', 'filesystem', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(497, 0, 'plg_media-action_crop', 'plugin', 'crop', 'media-action', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(498, 0, 'plg_media-action_resize', 'plugin', 'resize', 'media-action', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(499, 0, 'plg_media-action_rotate', 'plugin', 'rotate', 'media-action', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(500, 0, 'plg_installer_webinstaller', 'plugin', 'webinstaller', 'installer', 0, 1, 1, 0, '', '{"tab_position":"1"}', 0, '0000-00-00 00:00:00', 0, 0),
+(501, 0, 'plg_system_httpheaders', 'plugin', 'httpheaders', 'system', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(502, 0, 'plg_sampledata_multilang', 'plugin', 'multilang', 'sampledata', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
+(503, 0, 'plg_extension_namespacemap', 'plugin', 'namespacemap', 'extension', 0, 1, 1, 1, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(504, 0, 'plg_installer_override', 'plugin', 'override', 'installer', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 4, 0),
+(505, 0, 'plg_quickicon_overridecheck', 'plugin', 'overridecheck', 'quickicon', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0),
+(506, 0, 'plg_extension_finder', 'plugin', 'finder', 'extension', 0, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
+(507, 0, 'plg_system_skipto', 'plugin', 'skipto', 'system', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
(509, 0, 'atum', 'template', 'atum', '', 1, 1, 1, 0, '', '', 0, '0000-00-00 00:00:00', 0, 0),
(510, 0, 'cassiopeia', 'template', 'cassiopeia', '', 0, 1, 1, 0, '', '{"logoFile":"","fluidContainer":"0","sidebarLeftWidth":"3","sidebarRightWidth":"3"}', 0, '0000-00-00 00:00:00', 0, 0),
(600, 802, 'English (en-GB)', 'language', 'en-GB', '', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0),
(601, 802, 'English (en-GB)', 'language', 'en-GB', '', 1, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0),
(700, 0, 'files_joomla', 'file', 'joomla', '', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0),
-(802, 0, 'English (en-GB) Language Pack', 'package', 'pkg_en-GB', '', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0);
+(802, 0, 'English (en-GB) Language Pack', 'package', 'pkg_en-GB', '', 0, 1, 1, 1, '', '', 0, '0000-00-00 00:00:00', 0, 0),
+-- Temporarily giving some plugins IDs of 900 until we remove all and just use auto-increment.
+(900, 0, 'plg_api-authentication_basic', 'plugin', 'basic', 'api-authentication', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0),
+(901, 0, 'plg_webservices_content', 'plugin', 'content', 'webservices', 0, 1, 1, 0, '', '{}', 0, '0000-00-00 00:00:00', 0, 0);
-- --------------------------------------------------------
@@ -2063,7 +2068,7 @@ CREATE TABLE IF NOT EXISTS `#__action_logs` (
`extension` varchar(50) NOT NULL DEFAULT '',
`user_id` int(11) NOT NULL DEFAULT 0,
`item_id` int(11) NOT NULL DEFAULT 0,
- `ip_address` VARCHAR(30) NOT NULL DEFAULT '0.0.0.0',
+ `ip_address` VARCHAR(40) NOT NULL DEFAULT '0.0.0.0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
@@ -2097,10 +2102,10 @@ INSERT INTO `#__action_logs_extensions` (`id`, `extension`) VALUES
(17, 'com_users');
--
--- Table structure for table `#__action_logs_tables_data`
+-- Table structure for table `#__action_log_config`
--
-CREATE TABLE IF NOT EXISTS `#__action_logs_tables_data` (
+CREATE TABLE IF NOT EXISTS `#__action_log_config` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type_title` varchar(255) NOT NULL DEFAULT '',
`type_alias` varchar(255) NOT NULL DEFAULT '',
@@ -2111,7 +2116,7 @@ CREATE TABLE IF NOT EXISTS `#__action_logs_tables_data` (
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
-INSERT INTO `#__action_logs_tables_data` (`id`, `type_title`, `type_alias`, `id_holder`, `title_holder`, `table_name`, `text_prefix`) VALUES
+INSERT INTO `#__action_log_config` (`id`, `type_title`, `type_alias`, `id_holder`, `title_holder`, `table_name`, `text_prefix`) VALUES
(1, 'article', 'com_content.article', 'id' ,'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(2, 'article', 'com_content.form', 'id', 'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(3, 'banner', 'com_banners.banner', 'id' ,'name' , '#__banners', 'PLG_ACTIONLOG_JOOMLA'),
@@ -2121,7 +2126,7 @@ INSERT INTO `#__action_logs_tables_data` (`id`, `type_title`, `type_alias`, `id_
(7, 'menu', 'com_menus.menu', 'id' ,'title' , '#__menu_types', 'PLG_ACTIONLOG_JOOMLA'),
(8, 'menu_item', 'com_menus.item', 'id' , 'title' , '#__menu', 'PLG_ACTIONLOG_JOOMLA'),
(9, 'newsfeed', 'com_newsfeeds.newsfeed', 'id' ,'name' , '#__newsfeeds', 'PLG_ACTIONLOG_JOOMLA'),
-(10, 'link', 'com_redirect.link', 'id', 'old_url' , '__redirect_links', 'PLG_ACTIONLOG_JOOMLA'),
+(10, 'link', 'com_redirect.link', 'id', 'old_url' , '#__redirect_links', 'PLG_ACTIONLOG_JOOMLA'),
(11, 'tag', 'com_tags.tag', 'id', 'title' , '#__tags', 'PLG_ACTIONLOG_JOOMLA'),
(12, 'style', 'com_templates.style', 'id' , 'title' , '#__template_styles', 'PLG_ACTIONLOG_JOOMLA'),
(13, 'plugin', 'com_plugins.plugin', 'extension_id' , 'name' , '#__extensions', 'PLG_ACTIONLOG_JOOMLA'),
@@ -2129,7 +2134,8 @@ INSERT INTO `#__action_logs_tables_data` (`id`, `type_title`, `type_alias`, `id_
(15, 'contact', 'com_contact.contact', 'id', 'name', '#__contact_details', 'PLG_ACTIONLOG_JOOMLA'),
(16, 'module', 'com_modules.module', 'id' ,'title', '#__modules', 'PLG_ACTIONLOG_JOOMLA'),
(17, 'access_level', 'com_users.level', 'id' , 'title', '#__viewlevels', 'PLG_ACTIONLOG_JOOMLA'),
-(18, 'banner_client', 'com_banners.client', 'id', 'name', '#__banner_clients', 'PLG_ACTIONLOG_JOOMLA');
+(18, 'banner_client', 'com_banners.client', 'id', 'name', '#__banner_clients', 'PLG_ACTIONLOG_JOOMLA'),
+(19, 'application_config', 'com_config.application', '', 'name', '', 'PLG_ACTIONLOG_JOOMLA');
--
-- Table structure for table `#__utf8_conversion`
diff --git a/installation/sql/postgresql/joomla.sql b/installation/sql/postgresql/joomla.sql
index d4f8d65f8e75b..9bafb234f3708 100644
--- a/installation/sql/postgresql/joomla.sql
+++ b/installation/sql/postgresql/joomla.sql
@@ -561,7 +561,7 @@ INSERT INTO "#__extensions" ("extension_id", "package_id", "name", "type", "elem
(33, 0, 'com_fields', 'component', 'com_fields', '', 1, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
(34, 0, 'com_associations', 'component', 'com_associations', '', 1, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
(35, 0, 'com_privacy', 'component', 'com_privacy', '', 1, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(36, 0, 'com_actionlogs', 'component', 'com_actionlogs', '', 1, 1, 1, 1, '', '{"ip_logging":"0","csv_delimiter":",","loggable_extensions":["com_banners","com_cache","com_categories","com_config","com_contact","com_content","com_installer","com_media","com_menus","com_messages","com_modules","com_newsfeeds","com_plugins","com_redirect","com_tags","com_templates","com_users"]}', 0, '1970-01-01 00:00:00', 0, 0),
+(36, 0, 'com_actionlogs', 'component', 'com_actionlogs', '', 1, 1, 1, 1, '', '{"ip_logging":0,"csv_delimiter":",","loggable_extensions":["com_banners","com_cache","com_categories","com_config","com_contact","com_content","com_installer","com_media","com_menus","com_messages","com_modules","com_newsfeeds","com_plugins","com_redirect","com_tags","com_templates","com_users"]}', 0, '1970-01-01 00:00:00', 0, 0),
(37, 0, 'com_workflow', 'component', 'com_workflow', '', 1, 1, 0, 1, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
(38, 0, 'com_csp', 'component', 'com_csp', '', 1, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
(103, 0, 'Joomla! Platform', 'library', 'joomla', '', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0),
@@ -685,36 +685,41 @@ INSERT INTO "#__extensions" ("extension_id", "package_id", "name", "type", "elem
(479, 0, 'plg_sampledata_blog', 'plugin', 'blog', 'sampledata', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
(480, 0, 'plg_system_sessiongc', 'plugin', 'sessiongc', 'system', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
(481, 0, 'plg_fields_repeatable', 'plugin', 'repeatable', 'fields', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(482, 0, 'plg_content_confirmconsent', 'plugin', 'confirmconsent', 'content', 0, 0, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(483, 0, 'plg_system_actionlogs', 'plugin', 'actionlogs', 'system', 0, 1, 1, 0, '', '{"logDeletePeriod":"0"}', 0, '1970-01-01 00:00:00', 0, 0),
+(482, 0, 'plg_content_confirmconsent', 'plugin', 'confirmconsent', 'content', 0, 0, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(483, 0, 'plg_system_actionlogs', 'plugin', 'actionlogs', 'system', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
(484, 0, 'plg_actionlog_joomla', 'plugin', 'joomla', 'actionlog', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(485, 0, 'plg_system_privacyconsent', 'plugin', 'privacyconsent', 'system', 0, 0, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(486, 0, 'plg_system_logrotation', 'plugin', 'logrotation', 'system', 0, 0, 1, 0, '', '{"cachetimeout":"30","logstokeep":"1","lastrun":0}', 0, '1970-01-01 00:00:00', 0, 0),
-(487, 0, 'plg_privacy_user', 'plugin', 'user', 'privacy', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(488, 0, 'plg_quickicon_privacycheck', 'plugin', 'privacycheck', 'quickicon', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(489, 0, 'plg_user_terms', 'plugin', 'terms', 'user', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(490, 0, 'plg_behaviour_taggable', 'plugin', 'taggable', 'behaviour', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(491, 0, 'plg_behaviour_versionable', 'plugin', 'versionable', 'behaviour', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(492, 0, 'plg_filesystem_local', 'plugin', 'local', 'filesystem', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(493, 0, 'plg_media-action_crop', 'plugin', 'crop', 'media-action', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(494, 0, 'plg_media-action_resize', 'plugin', 'resize', 'media-action', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(495, 0, 'plg_media-action_rotate', 'plugin', 'rotate', 'media-action', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(496, 0, 'plg_installer_webinstaller', 'plugin', 'webinstaller', 'installer', 0, 1, 1, 0, '', '{"tab_position":"1"}', 0, '1970-01-01 00:00:00', 0, 0),
-(497, 0, 'plg_system_httpheaders', 'plugin', 'httpheaders', 'system', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(498, 0, 'plg_sampledata_multilang', 'plugin', 'multilang', 'sampledata', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(499, 0, 'plg_extension_namespacemap', 'plugin', 'namespacemap', 'extension', 0, 1, 1, 1, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(500, 0, 'plg_installer_override', 'plugin', 'override', 'installer', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 4, 0),
-(501, 0, 'plg_quickicon_overridecheck', 'plugin', 'overridecheck', 'quickicon', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(502, 0, 'plg_extension_finder', 'plugin', 'finder', 'extension', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(503, 0, 'plg_api-authentication_basic', 'plugin', 'basic', 'api-authentication', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(504, 0, 'plg_webservices_content', 'plugin', 'content', 'webservices', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
-(505, 0, 'plg_system_skipto', 'plugin', 'skipto', 'system', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(485, 0, 'plg_system_privacyconsent', 'plugin', 'privacyconsent', 'system', 0, 0, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(486, 0, 'plg_system_logrotation', 'plugin', 'logrotation', 'system', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(487, 0, 'plg_privacy_user', 'plugin', 'user', 'privacy', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(488, 0, 'plg_quickicon_privacycheck', 'plugin', 'privacycheck', 'quickicon', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(489, 0, 'plg_user_terms', 'plugin', 'terms', 'user', 0, 0, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(490, 0, 'plg_privacy_contact', 'plugin', 'contact', 'privacy', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(491, 0, 'plg_privacy_content', 'plugin', 'content', 'privacy', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(492, 0, 'plg_privacy_message', 'plugin', 'message', 'privacy', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(493, 0, 'plg_privacy_actionlogs', 'plugin', 'actionlogs', 'privacy', 0, 0, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(494, 0, 'plg_behaviour_taggable', 'plugin', 'taggable', 'behaviour', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(495, 0, 'plg_behaviour_versionable', 'plugin', 'versionable', 'behaviour', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(496, 0, 'plg_filesystem_local', 'plugin', 'local', 'filesystem', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(497, 0, 'plg_media-action_crop', 'plugin', 'crop', 'media-action', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(498, 0, 'plg_media-action_resize', 'plugin', 'resize', 'media-action', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(499, 0, 'plg_media-action_rotate', 'plugin', 'rotate', 'media-action', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(500, 0, 'plg_installer_webinstaller', 'plugin', 'webinstaller', 'installer', 0, 1, 1, 0, '', '{"tab_position":"1"}', 0, '1970-01-01 00:00:00', 0, 0),
+(501, 0, 'plg_system_httpheaders', 'plugin', 'httpheaders', 'system', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(502, 0, 'plg_sampledata_multilang', 'plugin', 'multilang', 'sampledata', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
+(503, 0, 'plg_extension_namespacemap', 'plugin', 'namespacemap', 'extension', 0, 1, 1, 1, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(504, 0, 'plg_installer_override', 'plugin', 'override', 'installer', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 4, 0),
+(505, 0, 'plg_quickicon_overridecheck', 'plugin', 'overridecheck', 'quickicon', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0),
+(506, 0, 'plg_extension_finder', 'plugin', 'finder', 'extension', 0, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
+(507, 0, 'plg_system_skipto', 'plugin', 'skipto', 'system', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
(509, 0, 'atum', 'template', 'atum', '', 1, 1, 1, 0, '', '', 0, '1970-01-01 00:00:00', 0, 0),
(510, 0, 'cassiopeia', 'template', 'cassiopeia', '', 0, 1, 1, 0, '', '{"logoFile":"","fluidContainer":"0","sidebarLeftWidth":"3","sidebarRightWidth":"3"}', 0, '1970-01-01 00:00:00', 0, 0),
(600, 802, 'English (en-GB)', 'language', 'en-GB', '', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0),
(601, 802, 'English (en-GB)', 'language', 'en-GB', '', 1, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0),
(700, 0, 'files_joomla', 'file', 'joomla', '', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0),
-(802, 0, 'English (en-GB) Language Pack', 'package', 'pkg_en-GB', '', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0);
+(802, 0, 'English (en-GB) Language Pack', 'package', 'pkg_en-GB', '', 0, 1, 1, 1, '', '', 0, '1970-01-01 00:00:00', 0, 0),
+-- Temporarily giving some plugins IDs of 900 until we remove all and just use auto-increment.
+(900, 0, 'plg_api-authentication_basic', 'plugin', 'basic', 'api-authentication', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0),
+(901, 0, 'plg_webservices_content', 'plugin', 'content', 'webservices', 0, 1, 1, 0, '', '{}', 0, '1970-01-01 00:00:00', 0, 0);
SELECT setval('#__extensions_extension_id_seq', 10000, false);
@@ -2074,7 +2079,7 @@ CREATE TABLE "#__action_logs" (
"extension" varchar(50) NOT NULL DEFAULT '',
"user_id" integer DEFAULT 0 NOT NULL,
"item_id" integer DEFAULT 0 NOT NULL,
- "ip_address" varchar(30) NOT NULL DEFAULT '0.0.0.0',
+ "ip_address" varchar(40) NOT NULL DEFAULT '0.0.0.0',
PRIMARY KEY ("id")
);
@@ -2112,9 +2117,9 @@ SELECT setval('#__action_logs_extensions_id_seq', 18, false);
-- --------------------------------------------------------
--
--- Table: #__action_logs_tables_data
+-- Table: #__action_log_config
--
-CREATE TABLE "#__action_logs_tables_data" (
+CREATE TABLE "#__action_log_config" (
"id" serial NOT NULL,
"type_title" varchar(255) NOT NULL DEFAULT '',
"type_alias" varchar(255) NOT NULL DEFAULT '',
@@ -2126,9 +2131,9 @@ CREATE TABLE "#__action_logs_tables_data" (
);
--
--- Dumping data for table #__action_logs_tables_data
+-- Dumping data for table #__action_log_config
--
-INSERT INTO "#__action_logs_tables_data" ("id", "type_title", "type_alias", "id_holder", "title_holder", "table_name", "text_prefix") VALUES
+INSERT INTO "#__action_log_config" ("id", "type_title", "type_alias", "id_holder", "title_holder", "table_name", "text_prefix") VALUES
(1, 'article', 'com_content.article', 'id' ,'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(2, 'article', 'com_content.form', 'id', 'title' , '#__content', 'PLG_ACTIONLOG_JOOMLA'),
(3, 'banner', 'com_banners.banner', 'id' ,'name' , '#__banners', 'PLG_ACTIONLOG_JOOMLA'),
@@ -2138,7 +2143,7 @@ INSERT INTO "#__action_logs_tables_data" ("id", "type_title", "type_alias", "id_
(7, 'menu', 'com_menus.menu', 'id' ,'title' , '#__menu_types', 'PLG_ACTIONLOG_JOOMLA'),
(8, 'menu_item', 'com_menus.item', 'id' , 'title' , '#__menu', 'PLG_ACTIONLOG_JOOMLA'),
(9, 'newsfeed', 'com_newsfeeds.newsfeed', 'id' ,'name' , '#__newsfeeds', 'PLG_ACTIONLOG_JOOMLA'),
-(10, 'link', 'com_redirect.link', 'id', 'old_url' , '__redirect_links', 'PLG_ACTIONLOG_JOOMLA'),
+(10, 'link', 'com_redirect.link', 'id', 'old_url' , '#__redirect_links', 'PLG_ACTIONLOG_JOOMLA'),
(11, 'tag', 'com_tags.tag', 'id', 'title' , '#__tags', 'PLG_ACTIONLOG_JOOMLA'),
(12, 'style', 'com_templates.style', 'id' , 'title' , '#__template_styles', 'PLG_ACTIONLOG_JOOMLA'),
(13, 'plugin', 'com_plugins.plugin', 'extension_id' , 'name' , '#__extensions', 'PLG_ACTIONLOG_JOOMLA'),
@@ -2146,10 +2151,11 @@ INSERT INTO "#__action_logs_tables_data" ("id", "type_title", "type_alias", "id_
(15, 'contact', 'com_contact.contact', 'id', 'name', '#__contact_details', 'PLG_ACTIONLOG_JOOMLA'),
(16, 'module', 'com_modules.module', 'id' ,'title', '#__modules', 'PLG_ACTIONLOG_JOOMLA'),
(17, 'access_level', 'com_users.level', 'id' , 'title', '#__viewlevels', 'PLG_ACTIONLOG_JOOMLA'),
-(18, 'banner_client', 'com_banners.client', 'id', 'name', '#__banner_clients', 'PLG_ACTIONLOG_JOOMLA');
+(18, 'banner_client', 'com_banners.client', 'id', 'name', '#__banner_clients', 'PLG_ACTIONLOG_JOOMLA'),
+(19, 'application_config', 'com_config.application', '', 'name', '', 'PLG_ACTIONLOG_JOOMLA');
-SELECT setval('#__action_logs_tables_data_id_seq', 18, false);
+SELECT setval('#__action_log_config_id_seq', 18, false);
--
-- Table structure for table `#__viewlevels`
diff --git a/language/en-GB/en-GB.com_privacy.ini b/language/en-GB/en-GB.com_privacy.ini
index af2b7bc52938e..2865eb7ae4323 100644
--- a/language/en-GB/en-GB.com_privacy.ini
+++ b/language/en-GB/en-GB.com_privacy.ini
@@ -21,7 +21,8 @@ COM_PRIVACY_CREATE_REQUEST_SUCCEEDED="Your information request has been created.
; \n Newline character. Use it to start a new line in the email.
COM_PRIVACY_EMAIL_REQUEST_BODY_EXPORT_REQUEST="Someone has created a request to export all personal information related to this email address at [URL]. As a security measure, you must confirm that this is a valid request for your personal information from this website.\n\nIn order to confirm this request, you can complete one of the following tasks:\n\n1. Visit the following URL: [TOKENURL]\n\n2. Copy your token from this email, visit the referenced URL, and paste your token into the form.\nURL: [FORMURL]\nToken: [TOKEN]\n\nPlease note that this token is only valid for 24 hours from the time this email was sent."
COM_PRIVACY_EMAIL_REQUEST_BODY_REMOVE_REQUEST="Someone has created a request to remove all personal information related to this email address at [URL]. As a security measure, you must confirm that this is a valid request for your personal information to be removed from this website.\n\nIn order to confirm this request, you can complete one of the following tasks:\n\n1. Visit the following URL: [TOKENURL]\n\n2. Copy your token from this email, visit the referenced URL, and paste your token into the form.\nURL: [FORMURL]\nToken: [TOKEN]\n\nPlease note that this token is only valid for 24 hours from the time this email was sent."
-COM_PRIVACY_EMAIL_REQUEST_SUBJECT="Information Request Created at [SITENAME]"
+COM_PRIVACY_EMAIL_REQUEST_SUBJECT_EXPORT_REQUEST="Information Request Created at [SITENAME]"
+COM_PRIVACY_EMAIL_REQUEST_SUBJECT_REMOVE_REQUEST="Information Deletion Request Created at [SITENAME]"
COM_PRIVACY_ERROR_CHECKING_FOR_EXISTING_REQUESTS="There was an error checking for existing information requests, please try submitting this request again."
COM_PRIVACY_ERROR_CONFIRM_TOKEN_EXPIRED="The confirmation token for your information request has expired. You will need to submit a new request."
COM_PRIVACY_ERROR_CONFIRMING_REMIND_FAILED="No expiration reminder was found."
diff --git a/language/en-GB/en-GB.mod_articles_category.ini b/language/en-GB/en-GB.mod_articles_category.ini
index a5fe3b9d6f8d9..68b8727322d1d 100644
--- a/language/en-GB/en-GB.mod_articles_category.ini
+++ b/language/en-GB/en-GB.mod_articles_category.ini
@@ -21,6 +21,8 @@ MOD_ARTICLES_CATEGORY_FIELD_DATEFIELD_LABEL="Date Field"
MOD_ARTICLES_CATEGORY_FIELD_DATEFIELDFORMAT_DESC="Please enter in a valid date format. See: http://php.net/date for formatting information."
MOD_ARTICLES_CATEGORY_FIELD_DATEFIELDFORMAT_LABEL="Date Format"
MOD_ARTICLES_CATEGORY_FIELD_DATEFILTERING_LABEL="Date Filtering"
+MOD_ARTICLES_CATEGORY_FIELD_DATEGROUPINGFIELD_DESC="Select which date field you want the date grouping to be applied to."
+MOD_ARTICLES_CATEGORY_FIELD_DATEGROUPINGFIELD_LABEL="Date Grouping Field"
MOD_ARTICLES_CATEGORY_FIELD_ENDDATE_LABEL="To Date"
MOD_ARTICLES_CATEGORY_FIELD_EXCLUDEDARTICLES_LABEL="Article IDs to Exclude"
MOD_ARTICLES_CATEGORY_FIELD_GROUP_DISPLAY_LABEL="Display Options"
@@ -69,4 +71,4 @@ MOD_ARTICLES_CATEGORY_OPTION_YEAR_VALUE="Year"
MOD_ARTICLES_CATEGORY_READ_MORE="Read more: "
MOD_ARTICLES_CATEGORY_READ_MORE_TITLE="Read More ..."
MOD_ARTICLES_CATEGORY_REGISTER_TO_READ_MORE="Register to read more"
-MOD_ARTICLES_CATEGORY_XML_DESCRIPTION="This module displays a list of articles from one or more categories."
\ No newline at end of file
+MOD_ARTICLES_CATEGORY_XML_DESCRIPTION="This module displays a list of articles from one or more categories."
diff --git a/libraries/src/Extension/ExtensionHelper.php b/libraries/src/Extension/ExtensionHelper.php
index 1bb05492b53b4..a25ebe9871f3f 100644
--- a/libraries/src/Extension/ExtensionHelper.php
+++ b/libraries/src/Extension/ExtensionHelper.php
@@ -38,6 +38,7 @@ class ExtensionHelper
// Format: `type`, `element`, `folder`, `client_id`
// Core component extensions
+ array('component', 'com_actionlogs', '', 1),
array('component', 'com_admin', '', 1),
array('component', 'com_ajax', '', 1),
array('component', 'com_associations', '', 1),
@@ -71,7 +72,6 @@ class ExtensionHelper
array('component', 'com_tags', '', 1),
array('component', 'com_templates', '', 1),
array('component', 'com_users', '', 1),
- array('component', 'com_userslogs', '', 1),
array('component', 'com_workflow', '', 1),
array('component', 'com_wrapper', '', 0),
@@ -137,8 +137,8 @@ class ExtensionHelper
// Core package extensions
array('package', 'pkg_en-GB', '', 0),
- // Core plugin extensions - actionlogs
- array('plugin', 'joomla', 'actionlogs', 0),
+ // Core plugin extensions - actionlog
+ array('plugin', 'joomla', 'actionlog', 0),
// Core plugin extensions - authentication
array('plugin', 'cookie', 'authentication', 0),
@@ -223,7 +223,13 @@ class ExtensionHelper
array('plugin', 'resize', 'media-action', 0),
array('plugin', 'rotate', 'media-action', 0),
- // Core plugin extensions - quickicon
+ // Core plugin extensions - privacy
+ array('plugin', 'contact', 'privacy', 0),
+ array('plugin', 'content', 'privacy', 0),
+ array('plugin', 'message', 'privacy', 0),
+ array('plugin', 'user', 'privacy', 0),
+
+ // Core plugin extensions - quick icon
array('plugin', 'extensionupdate', 'quickicon', 0),
array('plugin', 'joomlaupdate', 'quickicon', 0),
array('plugin', 'overridecheck', 'quickicon', 0),
diff --git a/libraries/src/Form/Field/EditorField.php b/libraries/src/Form/Field/EditorField.php
index 68cd44e2e282e..c0a725c9a76e0 100644
--- a/libraries/src/Form/Field/EditorField.php
+++ b/libraries/src/Form/Field/EditorField.php
@@ -326,7 +326,9 @@ protected function getEditor()
*
* @return string The JEditor object output.
*
- * @since 1.6
+ * @since 1.6
+ * @deprecated 4.0 Will be removed without replacement
+ * @see Editor::save()
*/
public function save()
{
diff --git a/libraries/src/Form/Form.php b/libraries/src/Form/Form.php
index b58ba4c330815..4080d8ed6d619 100644
--- a/libraries/src/Form/Form.php
+++ b/libraries/src/Form/Form.php
@@ -271,7 +271,7 @@ public function getFieldAttribute($name, $attribute, $default = null, $group = n
*
* @param string $set The optional name of the fieldset.
*
- * @return array The array of JFormField objects in the fieldset.
+ * @return \JFormField[] The array of JFormField objects in the fieldset.
*
* @since 1.7.0
*/
@@ -446,7 +446,7 @@ public function getFormControl()
* @param boolean $nested True to also include fields in nested groups that are inside of the
* group for which to find fields.
*
- * @return array The array of JFormField objects in the field group.
+ * @return \JFormField[] The array of JFormField objects in the field group.
*
* @since 1.7.0
*/
diff --git a/modules/mod_articles_category/Helper/ArticlesCategoryHelper.php b/modules/mod_articles_category/Helper/ArticlesCategoryHelper.php
index 1e19005587f84..48cb8d4a424ab 100644
--- a/modules/mod_articles_category/Helper/ArticlesCategoryHelper.php
+++ b/modules/mod_articles_category/Helper/ArticlesCategoryHelper.php
@@ -55,9 +55,7 @@ public static function getList(&$params)
$articles->setState('list.start', 0);
$articles->setState('list.limit', (int) $params->get('count', 0));
$articles->setState('filter.published', 1);
-
- // This module does not use tags data
- $articles->setState('load_tags', $params->get('filter_tag', '') !== '' ? true : false);
+ $articles->setState('load_tags', $params->get('show_tags', 0));
// Access filter
$access = !ComponentHelper::getParams('com_content')->get('show_noauth');
@@ -443,12 +441,13 @@ public static function groupBy($list, $fieldName, $article_grouping_direction, $
* @param string $article_grouping_direction ordering direction
* @param string $type type of grouping
* @param string $month_year_format date format to use
+ * @param string $field date field to group by
*
* @return array
*
* @since 1.6
*/
- public static function groupByDate($list, $article_grouping_direction, $type = 'year', $month_year_format = 'F Y')
+ public static function groupByDate($list, $article_grouping_direction = 'ksort', $type = 'year', $month_year_format = 'F Y', $field = 'created')
{
$grouped = array();
@@ -467,7 +466,7 @@ public static function groupByDate($list, $article_grouping_direction, $type = '
switch ($type)
{
case 'month_year' :
- $month_year = StringHelper::substr($item->created, 0, 7);
+ $month_year = StringHelper::substr($item->$field, 0, 7);
if (!isset($grouped[$month_year]))
{
@@ -479,7 +478,7 @@ public static function groupByDate($list, $article_grouping_direction, $type = '
case 'year' :
default:
- $year = StringHelper::substr($item->created, 0, 4);
+ $year = StringHelper::substr($item->$field, 0, 4);
if (!isset($grouped[$year]))
{
diff --git a/modules/mod_articles_category/mod_articles_category.php b/modules/mod_articles_category/mod_articles_category.php
index 0fe2aae99b5ab..434740ab5b787 100644
--- a/modules/mod_articles_category/mod_articles_category.php
+++ b/modules/mod_articles_category/mod_articles_category.php
@@ -75,7 +75,13 @@
{
case 'year' :
case 'month_year' :
- $list = ArticlesCategoryHelper::groupByDate($list, $article_grouping_direction, $article_grouping, $params->get('month_year_format', 'F Y'));
+ $list = ArticlesCategoryHelper::groupByDate(
+ $list,
+ $article_grouping_direction,
+ $article_grouping,
+ $params->get('month_year_format', 'F Y'),
+ $params->get('date_grouping_field', 'created')
+ );
break;
case 'author' :
case 'category_title' :
diff --git a/modules/mod_articles_category/mod_articles_category.xml b/modules/mod_articles_category/mod_articles_category.xml
index 860588f8c7de5..ce39632d65861 100644
--- a/modules/mod_articles_category/mod_articles_category.xml
+++ b/modules/mod_articles_category/mod_articles_category.xml
@@ -327,6 +327,19 @@
+
+
+
+
+
+
JSHOW
+
+
+
+
+
displayDate; ?>
+ get('show_tags', 0) && $item->tags->itemTags) : ?>
+
+ tags->itemTags); ?>
+
+
+
get('show_introtext')) : ?>
displayIntrotext; ?>
@@ -115,6 +121,12 @@
+ get('show_tags', 0) && $item->tags->itemTags) : ?>
+
+ tags->itemTags); ?>
+
+
+
get('show_introtext')) : ?>
displayIntrotext; ?>
diff --git a/modules/mod_feed/mod_feed.xml b/modules/mod_feed/mod_feed.xml
index 70cfdef75d435..1b9760cb29fd2 100644
--- a/modules/mod_feed/mod_feed.xml
+++ b/modules/mod_feed/mod_feed.xml
@@ -78,7 +78,7 @@
>
-
+
diff --git a/modules/mod_feed/tmpl/default.php b/modules/mod_feed/tmpl/default.php
index 9eff18e2a2382..46a026fca958d 100644
--- a/modules/mod_feed/tmpl/default.php
+++ b/modules/mod_feed/tmpl/default.php
@@ -120,7 +120,7 @@
title); ?>
- get('rssitemdate')) : ?>
+ get('rssitemdate', 0)) : ?>
publishedDate, Text::_('DATE_FORMAT_LC3')); ?>
diff --git a/plugins/actionlog/joomla/joomla.php b/plugins/actionlog/joomla/joomla.php
index f9afc6975fb40..072f1159ab0b4 100644
--- a/plugins/actionlog/joomla/joomla.php
+++ b/plugins/actionlog/joomla/joomla.php
@@ -47,7 +47,7 @@ class PlgActionlogJoomla extends JPlugin
/**
* Load plugin language file automatically so that it can be used inside component
*
- * @var bool
+ * @var boolean
* @since __DEPLOY_VERSION__
*/
protected $autoloadLanguage = true;
@@ -66,14 +66,7 @@ public function __construct(&$subject, $config)
$params = ComponentHelper::getComponent('com_actionlogs')->getParams();
- if (is_array($params->get('loggable_extensions')))
- {
- $this->loggableExtensions = $params->get('loggable_extensions');
- }
- else
- {
- $this->loggableExtensions = explode(',', $params->get('loggable_extensions'));
- }
+ $this->loggableExtensions = $params->get('loggable_extensions', array());
}
/**
@@ -106,19 +99,20 @@ public function onContentAfterSave($context, $article, $isNew)
return;
}
- $user = JFactory::getUser();
- $contentType = strtoupper($params->type_title);
+ $user = JFactory::getUser();
+ $contentTypeTitle = strtoupper($params->type_title);
+ list(, $contentType) = explode('.', $params->type_alias);
if ($isNew)
{
- $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentType . '_ADDED');
+ $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentTypeTitle . '_ADDED');
$defaultLanguageKey = strtoupper('PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED');
$action = 'add';
}
else
{
- $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentType . '_UPDATED');
+ $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentTypeTitle . '_UPDATED');
$defaultLanguageKey = strtoupper('PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED');
$action = 'update';
@@ -134,16 +128,16 @@ public function onContentAfterSave($context, $article, $isNew)
$message = array(
'action' => $action,
- 'type' => strtoupper($params->text_prefix . '_TYPE_' . $contentType),
+ 'type' => strtoupper($params->text_prefix . '_TYPE_' . $contentTypeTitle),
'id' => $id,
'title' => $article->get($params->title_holder),
- 'itemlink' => ActionlogsHelper::getContentTypeLink($option, $params->type_title, $id),
+ 'itemlink' => ActionlogsHelper::getContentTypeLink($option, $contentType, $id),
'userid' => $user->id,
'username' => $user->username,
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -175,14 +169,14 @@ public function onContentAfterDelete($context, $article)
return;
}
- $language = JFactory::getLanguage();
- $user = JFactory::getUser();
- $contentType = strtoupper($params->type_title);
+ $language = JFactory::getLanguage();
+ $user = JFactory::getUser();
+ $contentTypeTitle = strtoupper($params->type_title);
// If the content type has it own language key, use it, otherwise, use default language key
- if ($language->hasKey(strtoupper($params->text_prefix . '_' . $contentType . '_DELETED')))
+ if ($language->hasKey(strtoupper($params->text_prefix . '_' . $contentTypeTitle . '_DELETED')))
{
- $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentType . '_DELETED');
+ $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentTypeTitle . '_DELETED');
}
else
{
@@ -193,7 +187,7 @@ public function onContentAfterDelete($context, $article)
$message = array(
'action' => 'delete',
- 'type' => strtoupper($params->text_prefix . '_TYPE_' . $contentType),
+ 'type' => strtoupper($params->text_prefix . '_TYPE_' . $contentTypeTitle),
'id' => $id,
'title' => $article->get($params->title_holder),
'userid' => $user->id,
@@ -201,7 +195,7 @@ public function onContentAfterDelete($context, $article)
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -234,28 +228,29 @@ public function onContentChangeState($context, $pks, $value)
return;
}
- $user = JFactory::getUser();
- $contentType = strtoupper($params->type_title);
+ $user = JFactory::getUser();
+ $contentTypeTitle = strtoupper($params->type_title);
+ list(, $contentType) = explode('.', $params->type_alias);
switch ($value)
{
case 0:
- $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentType . '_UNPUBLISHED');
+ $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentTypeTitle . '_UNPUBLISHED');
$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UNPUBLISHED';
$action = 'unpublish';
break;
case 1:
- $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentType . '_PUBLISHED');
+ $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentTypeTitle . '_PUBLISHED');
$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_PUBLISHED';
$action = 'publish';
break;
case 2:
- $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentType . '_ARCHIVED');
+ $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentTypeTitle . '_ARCHIVED');
$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ARCHIVED';
$action = 'archive';
break;
case -2:
- $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentType . '_TRASHED');
+ $messageLanguageKey = strtoupper($params->text_prefix . '_' . $contentTypeTitle . '_TRASHED');
$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_TRASHED';
$action = 'trash';
break;
@@ -283,7 +278,7 @@ public function onContentChangeState($context, $pks, $value)
'type' => strtoupper($params->text_prefix . '_TYPE_' . $params->type_title),
'id' => $pk,
'title' => $items[$pk]->{$params->title_holder},
- 'itemlink' => ActionlogsHelper::getContentTypeLink($option, $params->type_title, $pk),
+ 'itemlink' => ActionlogsHelper::getContentTypeLink($option, $contentType, $pk),
'userid' => $user->id,
'username' => $user->username,
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
@@ -292,7 +287,44 @@ public function onContentChangeState($context, $pks, $value)
$messages[] = $message;
}
- $this->addLogsToDb($messages, $messageLanguageKey, $context);
+ $this->addLog($messages, $messageLanguageKey, $context);
+ }
+
+ /**
+ * On Saving application configuration logging method
+ * Method is called when the application config is being saved
+ *
+ * @param JRegistry $config JRegistry object with the new config
+ *
+ * @return void
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function onApplicationAfterSave($config)
+ {
+ $option = $this->app->input->getCmd('option');
+
+ if (!$this->checkLoggable($option))
+ {
+ return;
+ }
+
+ $messageLanguageKey = strtoupper('PLG_ACTIONLOG_JOOMLA_APPLICATION_CONFIG_UPDATED');
+ $action = 'update';
+
+ $user = JFactory::getUser();
+
+ $message = array(
+ 'action' => $action,
+ 'type' => strtoupper('PLG_ACTIONLOG_JOOMLA_TYPE_APPLICATION_CONFIG'),
+ 'extension_name' => 'com_config.application',
+ 'itemlink' => 'index.php?option=com_config',
+ 'userid' => $user->id,
+ 'username' => $user->username,
+ 'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
+ );
+
+ $this->addLog(array($message), $messageLanguageKey, 'com_config.application');
}
/**
@@ -342,7 +374,7 @@ public function onExtensionAfterInstall($installer, $eid)
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -399,7 +431,7 @@ public function onExtensionAfterUninstall($installer, $eid, $result)
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -449,7 +481,7 @@ public function onExtensionAfterUpdate($installer, $eid)
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -482,6 +514,7 @@ public function onExtensionAfterSave($context, $table, $isNew)
}
$extensionType = $params->type_title;
+ list(, $contentType) = explode('.', $params->type_alias);
if ($isNew)
{
@@ -491,7 +524,6 @@ public function onExtensionAfterSave($context, $table, $isNew)
}
else
{
-
$messageLanguageKey = strtoupper('PLG_ACTIONLOG_JOOMLA_' . $extensionType . '_UPDATED');
$defaultLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_UPDATED';
$action = 'update';
@@ -511,13 +543,13 @@ public function onExtensionAfterSave($context, $table, $isNew)
'id' => $table->get($params->id_holder),
'title' => $table->get($params->title_holder),
'extension_name' => $table->get($params->title_holder),
- 'itemlink' => ActionlogsHelper::getContentTypeLink($option, $params->type_title, $table->get($params->id_holder), $params->id_holder),
+ 'itemlink' => ActionlogsHelper::getContentTypeLink($option, $contentType, $table->get($params->id_holder), $params->id_holder),
'userid' => $user->id,
'username' => $user->username,
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -558,7 +590,7 @@ public function onExtensionAfterDelete($context, $table)
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -587,7 +619,12 @@ public function onUserAfterSave($user, $isnew, $success, $msg)
$jUser = JFactory::getUser();
- if ($isnew)
+ if (!$jUser->id)
+ {
+ $messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_REGISTERED';
+ $action = 'register';
+ }
+ elseif ($isnew)
{
$messageLanguageKey = 'PLG_SYSTEM_ACTIONLOGS_CONTENT_ADDED';
$action = 'add';
@@ -598,18 +635,21 @@ public function onUserAfterSave($user, $isnew, $success, $msg)
$action = 'update';
}
+ $userId = $jUser->id ?: $user['id'];
+ $username = $jUser->username ?: $user['username'];
+
$message = array(
'action' => $action,
'type' => 'PLG_ACTIONLOG_JOOMLA_TYPE_USER',
'id' => $user['id'],
'title' => $user['name'],
'itemlink' => 'index.php?option=com_users&task=user.edit&id=' . $user['id'],
- 'userid' => $jUser->id,
- 'username' => $jUser->username,
- 'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $jUser->id,
+ 'userid' => $userId,
+ 'username' => $username,
+ 'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $userId,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context, $userId);
}
/**
@@ -647,7 +687,7 @@ public function onUserAfterDelete($user, $success, $msg)
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $jUser->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -696,7 +736,7 @@ public function onUserAfterSaveGroup($context, $table, $isNew)
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
@@ -735,20 +775,19 @@ public function onUserAfterDeleteGroup($group, $success, $msg)
'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id,
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
- * Method to log user log-in action
+ * Method to log user login success action
*
- * @param array $user Holds the user data
- * @param array $options Array holding options (remember, autoregister, group)
+ * @param array $options Array holding options (user, responseType)
*
* @return void
*
* @since __DEPLOY_VERSION__
*/
- public function onUserLogin($user, $options = array())
+ public function onUserAfterLogin($options)
{
$context = 'com_users';
@@ -757,9 +796,47 @@ public function onUserLogin($user, $options = array())
return;
}
- $loggedInUser = JUser::getInstance($user['username']);
+ $loggedInUser = $options['user'];
$messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_LOGGED_IN';
+ $message = array(
+ 'action' => 'login',
+ 'username' => $loggedInUser->username,
+ 'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $loggedInUser->id,
+ 'app' => strtoupper('PLG_ACTIONLOG_JOOMLA_APPLICATION_' . $this->app->getName()),
+ );
+
+ $this->addLog(array($message), $messageLanguageKey, $context, $loggedInUser->id);
+ }
+
+ /**
+ * Method to log user login failed action
+ *
+ * @param array $response Array of response data.
+ *
+ * @return void
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ public function onUserLoginFailure($response)
+ {
+ $context = 'com_users';
+
+ if (!$this->checkLoggable($context))
+ {
+ return;
+ }
+
+ $loggedInUser = JUser::getInstance($response['username']);
+
+ // Not a valid user, return
+ if (!$loggedInUser->id)
+ {
+ return;
+ }
+
+ $messageLanguageKey = 'PLG_ACTIONLOG_JOOMLA_USER_LOGIN_FAILED';
+
$message = array(
'action' => 'login',
'id' => $loggedInUser->id,
@@ -768,7 +845,7 @@ public function onUserLogin($user, $options = array())
'app' => strtoupper('PLG_ACTIONLOG_JOOMLA_APPLICATION_' . $this->app->getName()),
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context, $loggedInUser->id);
+ $this->addLog(array($message), $messageLanguageKey, $context, $loggedInUser->id);
}
/**
@@ -801,11 +878,11 @@ public function onUserLogout($user, $options = array())
'app' => strtoupper('PLG_ACTIONLOG_JOOMLA_APPLICATION_' . $this->app->getName()),
);
- $this->addLogsToDb(array($message), $messageLanguageKey, $context);
+ $this->addLog(array($message), $messageLanguageKey, $context);
}
/**
- * Proxy for ActionlogsModelUserlog addLogsToDb method
+ * Proxy for ActionlogsModelUserlog addLog method
*
* This method adds a record to #__action_logs contains (message_language_key, message, date, context, user)
*
@@ -818,13 +895,13 @@ public function onUserLogout($user, $options = array())
*
* @since __DEPLOY_VERSION__
*/
- protected function addLogsToDb($messages, $messageLanguageKey, $context, $userId = null)
+ protected function addLog($messages, $messageLanguageKey, $context, $userId = null)
{
JLoader::register('ActionlogsModelActionlog', JPATH_ADMINISTRATOR . '/components/com_actionlogs/models/actionlog.php');
/* @var ActionlogsModelActionlog $model */
$model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
- $model->addLogsToDb($messages, $messageLanguageKey, $context, $userId);
+ $model->addLog($messages, $messageLanguageKey, $context, $userId);
}
/**
diff --git a/plugins/actionlog/joomla/joomla.xml b/plugins/actionlog/joomla/joomla.xml
index 580c56a381bb0..e38fa5ea1d973 100644
--- a/plugins/actionlog/joomla/joomla.xml
+++ b/plugins/actionlog/joomla/joomla.xml
@@ -10,7 +10,7 @@
__DEPLOY_VERSION__
PLG_ACTIONLOG_JOOMLA_XML_DESCRIPTION
- joomla.php
+ joomla.php
diff --git a/plugins/content/confirmconsent/confirmconsent.php b/plugins/content/confirmconsent/confirmconsent.php
index 98fd6e50dfac4..c7e0688130cec 100644
--- a/plugins/content/confirmconsent/confirmconsent.php
+++ b/plugins/content/confirmconsent/confirmconsent.php
@@ -97,14 +97,13 @@ public function onContentPrepareForm(JForm $form, $data)
name="consentbox"
type="checkboxes"
label="' . htmlspecialchars($consentboxLabel, ENT_COMPAT, 'UTF-8') . '"
-
required="true"
- >
+ >
-
- ');
+ '
+ );
return true;
}
@@ -186,7 +185,7 @@ private function getAssignedArticleUrl($articleId, $consentboxLabel)
);
}
- // Association is enabled but this article is not associated
+ // Association is enabled but this article is not associated
return HTMLHelper::_(
'link',
Route::_(
diff --git a/plugins/content/confirmconsent/confirmconsent.xml b/plugins/content/confirmconsent/confirmconsent.xml
index ab9a7c03e52e7..961b08a164db8 100644
--- a/plugins/content/confirmconsent/confirmconsent.xml
+++ b/plugins/content/confirmconsent/confirmconsent.xml
@@ -15,15 +15,15 @@
diff --git a/plugins/privacy/actionlogs/actionlogs.php b/plugins/privacy/actionlogs/actionlogs.php
new file mode 100644
index 0000000000000..6eee8afaf0654
--- /dev/null
+++ b/plugins/privacy/actionlogs/actionlogs.php
@@ -0,0 +1,84 @@
+user_id)
+ {
+ return array();
+ }
+
+ $domain = $this->createDomain('actionlog', 'Logged actions of the user');
+
+ $query = $this->db->getQuery(true)
+ ->select('a.*, u.name')
+ ->from('#__action_logs AS a')
+ ->innerJoin('#__users AS u ON a.user_id = u.id')
+ ->where($this->db->quoteName('a.user_id') . ' = ' . $request->user_id);
+
+ $this->db->setQuery($query);
+
+ $data = $this->db->loadObjectList();
+
+ if (!count($data))
+ {
+ return array();
+ }
+
+ $data = ActionlogsHelper::getCsvData($data);
+ array_shift($data);
+
+ foreach ($data as $item)
+ {
+ $domain->addItem($this->createItemFromArray($item));
+ }
+
+ return array($domain);
+ }
+}
diff --git a/plugins/privacy/actionlogs/actionlogs.xml b/plugins/privacy/actionlogs/actionlogs.xml
new file mode 100644
index 0000000000000..f37879f35e81b
--- /dev/null
+++ b/plugins/privacy/actionlogs/actionlogs.xml
@@ -0,0 +1,19 @@
+
+
+ plg_privacy_actionlogs
+ Joomla! Project
+ July 2018
+ (C) 2005 - 2018 Open Source Matters. All rights reserved.
+ GNU General Public License version 2 or later; see LICENSE.txt
+ admin@joomla.org
+ www.joomla.org
+ 3.9.0
+ PLG_PRIVACY_ACTIONLOGS_XML_DESCRIPTION
+
+ actionlogs.php
+
+
+ en-GB.plg_privacy_actionlogs.ini
+ en-GB.plg_privacy_actionlogs.sys.ini
+
+
diff --git a/plugins/privacy/contact/contact.php b/plugins/privacy/contact/contact.php
new file mode 100644
index 0000000000000..1a5431af71d06
--- /dev/null
+++ b/plugins/privacy/contact/contact.php
@@ -0,0 +1,157 @@
+user_id) && (!$request->email))
+ {
+ return array();
+ }
+
+ /** @var JTableUser $user */
+ $user = JUser::getTable();
+ $user->load($request->user_id);
+
+ $domains = array();
+ $domains[] = $this->createContactDomain($user);
+
+ // An user may have more than 1 contact linked to them
+ foreach ($this->contacts as $contact)
+ {
+ $domains[] = $this->createContactCustomFieldsDomain($contact);
+ }
+
+ return $domains;
+ }
+
+ /**
+ * Create the domain for the user contact data
+ *
+ * @param JTableUser $user The JTableUser object to process
+ *
+ * @return PrivacyExportDomain
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ private function createContactDomain(JTableUser $user)
+ {
+ $domain = $this->createDomain('user contact', 'Joomla! user contact data');
+
+ if (!$user->email)
+ {
+ $query = $this->db->getQuery(true)
+ ->select('*')
+ ->from($this->db->quoteName('#__contact_details'))
+ ->where($this->db->quoteName('user_id') . ' = ' . (int) $user->id)
+ ->order($this->db->quoteName('ordering') . ' ASC');
+ }
+ else
+ {
+ $query = $this->db->getQuery(true)
+ ->select('*')
+ ->from($this->db->quoteName('#__contact_details'))
+ ->where($this->db->quoteName('email_to') . ' = ' . $this->db->quote($user->email))
+ ->order($this->db->quoteName('ordering') . ' ASC');
+ }
+
+ $items = $this->db->setQuery($query)->loadAssocList();
+
+ foreach ($items as $item)
+ {
+ $domain->addItem($this->createItemFromArray($item));
+ $this->contacts[] = (object) $item;
+ }
+
+ return $domain;
+ }
+
+ /**
+ * Create the domain for the contact custom fields
+ *
+ * @param Object $contact The contact to process
+ *
+ * @return PrivacyExportDomain
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ private function createContactCustomFieldsDomain($contact)
+ {
+ $domain = $this->createDomain('contact custom fields', 'Joomla! contact custom fields data');
+
+ // Get item's fields, also preparing their value property for manual display
+ $fields = FieldsHelper::getFields('com_contact.contact', $contact);
+
+ foreach ($fields as $field)
+ {
+ $fieldValue = is_array($field->value) ? implode(', ', $field->value) : $field->value;
+
+ $data = array(
+ 'contact_id' => $contact->id,
+ 'field_name' => $field->name,
+ 'field_title' => $field->title,
+ 'field_value' => $fieldValue,
+ );
+
+ $domain->addItem($this->createItemFromArray($data));
+ }
+
+ return $domain;
+ }
+}
diff --git a/plugins/privacy/contact/contact.xml b/plugins/privacy/contact/contact.xml
new file mode 100644
index 0000000000000..2de5eed47f655
--- /dev/null
+++ b/plugins/privacy/contact/contact.xml
@@ -0,0 +1,19 @@
+
+
+ plg_privacy_contact
+ Joomla! Project
+ July 2018
+ (C) 2005 - 2018 Open Source Matters. All rights reserved.
+ GNU General Public License version 2 or later; see LICENSE.txt
+ admin@joomla.org
+ www.joomla.org
+ 3.9.0
+ PLG_PRIVACY_CONTACT_XML_DESCRIPTION
+
+ contact.php
+
+
+ en-GB.plg_privacy_contact.ini
+ en-GB.plg_privacy_contact.sys.ini
+
+
diff --git a/plugins/privacy/content/content.php b/plugins/privacy/content/content.php
new file mode 100644
index 0000000000000..358415557b2b0
--- /dev/null
+++ b/plugins/privacy/content/content.php
@@ -0,0 +1,145 @@
+user_id)
+ {
+ return array();
+ }
+
+ /** @var JTableUser $user */
+ $user = JUser::getTable();
+ $user->load($request->user_id);
+
+ $domains = array();
+ $domains[] = $this->createContentDomain($user);
+
+ foreach ($this->contents as $content)
+ {
+ $domains[] = $this->createContentCustomFieldsDomain($content);
+ }
+
+ return $domains;
+ }
+
+ /**
+ * Create the domain for the user content data
+ *
+ * @param JTableUser $user The JTableUser object to process
+ *
+ * @return PrivacyExportDomain
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ private function createContentDomain(JTableUser $user)
+ {
+ $domain = $this->createDomain('user content', 'Joomla! user content data');
+
+ $query = $this->db->getQuery(true)
+ ->select('*')
+ ->from($this->db->quoteName('#__content'))
+ ->where($this->db->quoteName('created_by') . ' = ' . $this->db->quote($user->id))
+ ->order($this->db->quoteName('ordering') . ' ASC');
+
+ $items = $this->db->setQuery($query)->loadAssocList();
+
+ foreach ($items as $item)
+ {
+ $domain->addItem($this->createItemFromArray($item));
+ $this->contents[] = (object) $item;
+ }
+
+ return $domain;
+ }
+
+ /**
+ * Create the domain for the content custom fields
+ *
+ * @param Object $content The content to process
+ *
+ * @return PrivacyExportDomain
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ private function createContentCustomFieldsDomain($content)
+ {
+ $domain = $this->createDomain('content custom fields', 'Joomla! content custom fields data');
+
+ // Get item's fields, also preparing their value property for manual display
+ $fields = FieldsHelper::getFields('com_content.article', $content);
+
+ foreach ($fields as $field)
+ {
+ $fieldValue = is_array($field->value) ? implode(', ', $field->value) : $field->value;
+
+ $data = array(
+ 'content_id' => $content->id,
+ 'field_name' => $field->name,
+ 'field_title' => $field->title,
+ 'field_value' => $fieldValue,
+ );
+
+ $domain->addItem($this->createItemFromArray($data));
+ }
+
+ return $domain;
+ }
+}
diff --git a/plugins/privacy/content/content.xml b/plugins/privacy/content/content.xml
new file mode 100644
index 0000000000000..a2114f106c31c
--- /dev/null
+++ b/plugins/privacy/content/content.xml
@@ -0,0 +1,19 @@
+
+
+ plg_privacy_content
+ Joomla! Project
+ July 2018
+ (C) 2005 - 2018 Open Source Matters. All rights reserved.
+ GNU General Public License version 2 or later; see LICENSE.txt
+ admin@joomla.org
+ www.joomla.org
+ 3.9.0
+ PLG_PRIVACY_CONTENT_XML_DESCRIPTION
+
+ content.php
+
+
+ en-GB.plg_privacy_content.ini
+ en-GB.plg_privacy_content.sys.ini
+
+
diff --git a/plugins/privacy/message/message.php b/plugins/privacy/message/message.php
new file mode 100644
index 0000000000000..2667a2d41ca72
--- /dev/null
+++ b/plugins/privacy/message/message.php
@@ -0,0 +1,97 @@
+user_id)
+ {
+ return array();
+ }
+
+ /** @var JTableUser $user */
+ $user = JUser::getTable();
+ $user->load($request->user_id);
+
+ $domains = array();
+ $domains[] = $this->createMessageDomain($user);
+
+ return $domains;
+ }
+
+ /**
+ * Create the domain for the user message data
+ *
+ * @param JTableUser $user The JTableUser object to process
+ *
+ * @return PrivacyExportDomain
+ *
+ * @since __DEPLOY_VERSION__
+ */
+ private function createMessageDomain(JTableUser $user)
+ {
+ $domain = $this->createDomain('user message', 'Joomla! user message data');
+
+ $query = $this->db->getQuery(true)
+ ->select('*')
+ ->from($this->db->quoteName('#__messages'))
+ ->where($this->db->quoteName('user_id_from') . ' = ' . $this->db->quote($user->id))
+ ->orWhere($this->db->quoteName('user_id_to') . ' = ' . $this->db->quote($user->id))
+ ->order($this->db->quoteName('date_time') . ' ASC');
+
+ $items = $this->db->setQuery($query)->loadAssocList();
+
+ foreach ($items as $item)
+ {
+ $domain->addItem($this->createItemFromArray($item));
+ }
+
+ return $domain;
+ }
+}
diff --git a/plugins/privacy/message/message.xml b/plugins/privacy/message/message.xml
new file mode 100644
index 0000000000000..9a7f19f6f1548
--- /dev/null
+++ b/plugins/privacy/message/message.xml
@@ -0,0 +1,19 @@
+
+
+ plg_privacy_message
+ Joomla! Project
+ July 2018
+ (C) 2005 - 2018 Open Source Matters. All rights reserved.
+ GNU General Public License version 2 or later; see LICENSE.txt
+ admin@joomla.org
+ www.joomla.org
+ 3.9.0
+ PLG_PRIVACY_MESSAGE_XML_DESCRIPTION
+
+ message.php
+
+
+ en-GB.plg_privacy_message.ini
+ en-GB.plg_privacy_message.sys.ini
+
+
diff --git a/plugins/privacy/user/user.php b/plugins/privacy/user/user.php
index 51d66c555519a..c5efa2b6b82f6 100644
--- a/plugins/privacy/user/user.php
+++ b/plugins/privacy/user/user.php
@@ -135,13 +135,44 @@ public function onPrivacyRemoveData(PrivacyTableRequest $request)
$pseudoanonymisedData = array(
'name' => 'User ID ' . $user->id,
'username' => bin2hex(random_bytes(12)),
- 'email' => 'UserID' . $user->id . 'removed@email.removed',
+ 'email' => 'UserID' . $user->id . 'removed@email.invalid',
'block' => true,
);
$user->bind($pseudoanonymisedData);
$user->save();
+
+ // Destroy all sessions for the user account
+ $sessionIds = $this->db->setQuery(
+ $this->db->getQuery(true)
+ ->select($this->db->quoteName('session_id'))
+ ->from($this->db->quoteName('#__session'))
+ ->where($this->db->quoteName('userid') . ' = ' . (int) $user->id)
+ )->loadColumn();
+
+ // If there aren't any active sessions then there's nothing to do here
+ if (empty($sessionIds))
+ {
+ return;
+ }
+
+ $storeName = JFactory::getConfig()->get('session_handler', 'none');
+ $store = JSessionStorage::getInstance($storeName);
+ $quotedIds = array();
+
+ // Destroy the sessions and quote the IDs to purge the session table
+ foreach ($sessionIds as $sessionId)
+ {
+ $store->destroy($sessionId);
+ $quotedIds[] = $this->db->quote($sessionId);
+ }
+
+ $this->db->setQuery(
+ $this->db->getQuery(true)
+ ->delete($this->db->quoteName('#__session'))
+ ->where($this->db->quoteName('session_id') . ' IN (' . implode(', ', $quotedIds) . ')')
+ )->execute();
}
/**
@@ -267,7 +298,7 @@ private function createUserCustomFieldsDomain(JTableUser $user)
foreach ($fields as $field)
{
- $fieldValue = is_array($field->value) ? implode(', ', $field->value): $field->value;
+ $fieldValue = is_array($field->value) ? implode(', ', $field->value) : $field->value;
$data = array(
'user_id' => $user->id,
diff --git a/plugins/quickicon/privacycheck/privacycheck.php b/plugins/quickicon/privacycheck/privacycheck.php
index 7feb644f0d01c..f78fabd4286de 100644
--- a/plugins/quickicon/privacycheck/privacycheck.php
+++ b/plugins/quickicon/privacycheck/privacycheck.php
@@ -73,7 +73,7 @@ public function onGetIcons($context)
'icon' => 'header/icon-48-user.png',
'text' => Text::_('PLG_QUICKICON_PRIVACYCHECK_CHECKING'),
'id' => 'plg_quickicon_privacycheck',
- 'group' => 'MOD_QUICKICON_MAINTENANCE'
+ 'group' => 'MOD_QUICKICON_USERS'
)
);
}
diff --git a/plugins/system/actionlogs/actionlogs.php b/plugins/system/actionlogs/actionlogs.php
index 4325a16798565..00b5e6ced8f56 100644
--- a/plugins/system/actionlogs/actionlogs.php
+++ b/plugins/system/actionlogs/actionlogs.php
@@ -88,14 +88,32 @@ public function onContentPrepareForm($form, $data)
return true;
}
- $canView = false;
+ /**
+ * We only allow users who has Super User permission change this setting for himself or for other users
+ * who has same Super User permission
+ */
- if (isset($data->id))
+ $user = JFactory::getUser();
+
+ if (!$user->authorise('core.admin'))
+ {
+ return true;
+ }
+
+ // If we are on the save command, no data is passed to $data variable, we need to get it directly from request
+ $jformData = $this->app->input->get('jform', array(), 'array');
+
+ if ($jformData && !$data)
+ {
+ $data = $jformData;
+ }
+
+ if (is_array($data))
{
- $canView = JUser::getInstance($data->id)->authorise('core.admin');
+ $data = (object) $data;
}
- if (!$canView)
+ if (!empty($data->id) && !JUser::getInstance($data->id)->authorise('core.admin'))
{
return true;
}
@@ -120,7 +138,8 @@ public function onAfterRespond()
return;
}
- $deleteFrequency = 3600 * 24; // The delete frequency will be once per day
+ // The delete frequency will be once per day
+ $deleteFrequency = 3600 * 24;
// Do we need to run? Compare the last run timestamp stored in the plugin's options with the current
// timestamp. If the difference is greater than the cache timeout we shall not execute again.
diff --git a/plugins/system/actionlogs/actionlogs.xml b/plugins/system/actionlogs/actionlogs.xml
index effcae1c3ffba..d40bf67394489 100644
--- a/plugins/system/actionlogs/actionlogs.xml
+++ b/plugins/system/actionlogs/actionlogs.xml
@@ -32,7 +32,7 @@
name="lastrun"
type="hidden"
default="0"
- size="15"
+ filter="integer"
/>
diff --git a/plugins/system/actionlogs/forms/actionlogs.xml b/plugins/system/actionlogs/forms/actionlogs.xml
index 953fd58474e6a..1aef8b6157a56 100644
--- a/plugins/system/actionlogs/forms/actionlogs.xml
+++ b/plugins/system/actionlogs/forms/actionlogs.xml
@@ -9,6 +9,7 @@
description="PLG_SYSTEM_ACTIONLOGS_NOTIFICATIONS_DESC"
class="btn-group btn-group-yesno"
default="0"
+ filter="integer"
required="true"
>
diff --git a/plugins/system/logrotation/logrotation.php b/plugins/system/logrotation/logrotation.php
index f13c27407a210..542f13e17e23c 100644
--- a/plugins/system/logrotation/logrotation.php
+++ b/plugins/system/logrotation/logrotation.php
@@ -136,7 +136,6 @@ public function onAfterRender()
$logFiles = $this->getLogFiles($logPath);
-
// Sort log files by version number in reserve order
krsort($logFiles, SORT_NUMERIC);
diff --git a/plugins/system/logrotation/logrotation.xml b/plugins/system/logrotation/logrotation.xml
index bb962a20de05c..6b826a8d800f7 100644
--- a/plugins/system/logrotation/logrotation.xml
+++ b/plugins/system/logrotation/logrotation.xml
@@ -28,6 +28,8 @@
last="120"
step="1"
default="30"
+ filter="int"
+ validate="number"
/>
diff --git a/plugins/system/privacyconsent/field/privacy.php b/plugins/system/privacyconsent/field/privacy.php
index 057eb3276d7ca..6a86c260a956a 100644
--- a/plugins/system/privacyconsent/field/privacy.php
+++ b/plugins/system/privacyconsent/field/privacy.php
@@ -69,7 +69,7 @@ protected function getLabel()
JHtml::_('behavior.modal');
// Build the class for the label.
- $class = !empty($this->description) ? 'hasTooltip' : '';
+ $class = !empty($this->description) ? 'hasPopover' : '';
$class = $class . ' required';
$class = !empty($this->labelClass) ? $class . ' ' . $this->labelClass : $class;
@@ -79,16 +79,22 @@ protected function getLabel()
// If a description is specified, use it to build a tooltip.
if (!empty($this->description))
{
- $label .= ' title="'
- . htmlspecialchars(
- trim($text, ':') . '
' . ($this->translateDescription ? Text::_($this->description) : $this->description),
- ENT_COMPAT, 'UTF-8'
- ) . '"';
+ $label .= ' title="' . htmlspecialchars(trim($text, ':'), ENT_COMPAT, 'UTF-8') . '"';
+ $label .= ' data-content="' . htmlspecialchars(
+ $this->translateDescription ? Text::_($this->description) : $this->description,
+ ENT_COMPAT,
+ 'UTF-8'
+ ) . '"';
}
- $privacyarticle = $this->element['article'] > 0 ? (int) $this->element['article'] : 0;
+ if (Factory::getLanguage()->isRtl())
+ {
+ $label .= ' data-placement="left"';
+ }
+
+ $privacyArticle = $this->element['article'] > 0 ? (int) $this->element['article'] : 0;
- if ($privacyarticle && Factory::getApplication()->isClient('site'))
+ if ($privacyArticle && Factory::getApplication()->isClient('site'))
{
JLoader::register('ContentHelperRoute', JPATH_BASE . '/components/com_content/helpers/route.php');
@@ -100,13 +106,13 @@ protected function getLabel()
$query = $db->getQuery(true)
->select($db->quoteName(array('id', 'alias', 'catid', 'language')))
->from($db->quoteName('#__content'))
- ->where($db->quoteName('id') . ' = ' . (int) $privacyarticle);
+ ->where($db->quoteName('id') . ' = ' . (int) $privacyArticle);
$db->setQuery($query);
$article = $db->loadObject();
$slug = $article->alias ? ($article->id . ':' . $article->alias) : $article->id;
- $url = ContentHelperRoute::getArticleRoute($slug, $article->catid);
- $link = JHtml::_('link', JRoute::_($url . '&tmpl=component&lang=' . $article->language), $text, $attribs);
+ $url = ContentHelperRoute::getArticleRoute($slug, $article->catid, $article->language);
+ $link = JHtml::_('link', JRoute::_($url . '&tmpl=component'), $text, $attribs);
}
else
{
diff --git a/plugins/system/privacyconsent/privacyconsent.php b/plugins/system/privacyconsent/privacyconsent.php
index 0c2b42a663189..aedbe6241faa8 100644
--- a/plugins/system/privacyconsent/privacyconsent.php
+++ b/plugins/system/privacyconsent/privacyconsent.php
@@ -188,7 +188,6 @@ public function onUserAfterSave($data, $isNew, $result, $error)
&&in_array($task, array('registration.register', 'profile.save'))
&& !empty($form['privacyconsent']['privacy']))
{
-
$userId = ArrayHelper::getValue($data, 'id', 0, 'int');
// Get the user's IP address
@@ -367,7 +366,7 @@ private function getRedirectMessage()
*
* @param int $userId ID of uer to check
*
- * @return bool
+ * @return boolean
*
* @since __DEPLOY_VERSION__
*/
@@ -386,7 +385,7 @@ private function isUserConsented($userId)
* Get privacy article ID. If the site is a multilingual website and there is associated article for the
* current language, ID of the associlated article will be returned
*
- * @return int
+ * @return integer
*/
private function getPrivacyArticleId()
{
@@ -419,7 +418,7 @@ public function onAfterRender()
{
return;
}
-
+
$cacheTimeout = (int) $this->params->get('cachetimeout', 30);
$cacheTimeout = 24 * 3600 * $cacheTimeout;
@@ -427,7 +426,7 @@ public function onAfterRender()
// timestamp. If the difference is greater than the cache timeout we shall not execute again.
$now = time();
$last = (int) $this->params->get('lastrun', 0);
-
+
if ((abs($now - $last) < $cacheTimeout))
{
return;
@@ -442,6 +441,7 @@ public function onAfterRender()
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote('system'))
->where($db->quoteName('element') . ' = ' . $db->quote('privacyconsent'));
+
try
{
// Lock the tables to prevent multiple plugin executions causing a race condition
@@ -494,7 +494,7 @@ public function onAfterRender()
/**
* Method to send the remind for privacy consents renew
*
- * @return int
+ * @return integer
*
* @since __DEPLOY_VERSION__
*/
@@ -597,7 +597,7 @@ private function remindExpiringConsents()
/**
* Method to delete the expired privacy consents
*
- * @return bool
+ * @return boolean
*
* @since __DEPLOY_VERSION__
*/
diff --git a/plugins/system/privacyconsent/privacyconsent.xml b/plugins/system/privacyconsent/privacyconsent.xml
index 572cafc47f5d1..f995ddc8686b2 100644
--- a/plugins/system/privacyconsent/privacyconsent.xml
+++ b/plugins/system/privacyconsent/privacyconsent.xml
@@ -21,17 +21,17 @@
@@ -110,7 +111,7 @@
name="lastrun"
type="hidden"
default="0"
- size="15"
+ filter="integer"
/>
diff --git a/plugins/system/privacyconsent/privacyconsent/privacyconsent.xml b/plugins/system/privacyconsent/privacyconsent/privacyconsent.xml
index d31edcbd7fa40..f86b54faaf58c 100644
--- a/plugins/system/privacyconsent/privacyconsent/privacyconsent.xml
+++ b/plugins/system/privacyconsent/privacyconsent/privacyconsent.xml
@@ -11,6 +11,7 @@
label="PLG_SYSTEM_PRIVACYCONSENT_FIELD_LABEL"
description="PLG_SYSTEM_PRIVACYCONSENT_FIELD_DESC"
default="0"
+ filter="integer"
>
diff --git a/plugins/user/terms/field/terms.php b/plugins/user/terms/field/terms.php
index ca19f1bb587e8..e82996b800703 100644
--- a/plugins/user/terms/field/terms.php
+++ b/plugins/user/terms/field/terms.php
@@ -69,7 +69,7 @@ protected function getLabel()
JHtml::_('behavior.modal');
// Build the class for the label.
- $class = !empty($this->description) ? 'hasTooltip' : '';
+ $class = !empty($this->description) ? 'hasPopover' : '';
$class = $class . ' required';
$class = !empty($this->labelClass) ? $class . ' ' . $this->labelClass : $class;
@@ -79,16 +79,22 @@ protected function getLabel()
// If a description is specified, use it to build a tooltip.
if (!empty($this->description))
{
- $label .= ' title="'
- . htmlspecialchars(
- trim($text, ':') . '
' . ($this->translateDescription ? Text::_($this->description) : $this->description),
- ENT_COMPAT, 'UTF-8'
- ) . '"';
+ $label .= ' title="' . htmlspecialchars(trim($text, ':'), ENT_COMPAT, 'UTF-8') . '"';
+ $label .= ' data-content="' . htmlspecialchars(
+ $this->translateDescription ? Text::_($this->description) : $this->description,
+ ENT_COMPAT,
+ 'UTF-8'
+ ) . '"';
}
- $termsarticle = $this->element['article'] > 0 ? (int) $this->element['article'] : 0;
+ if (Factory::getLanguage()->isRtl())
+ {
+ $label .= ' data-placement="left"';
+ }
+
+ $termsArticle = $this->element['article'] > 0 ? (int) $this->element['article'] : 0;
- if ($termsarticle && Factory::getApplication()->isClient('site'))
+ if ($termsArticle && Factory::getApplication()->isClient('site'))
{
JLoader::register('ContentHelperRoute', JPATH_BASE . '/components/com_content/helpers/route.php');
@@ -100,27 +106,31 @@ protected function getLabel()
$query = $db->getQuery(true)
->select($db->quoteName(array('id', 'alias', 'catid', 'language')))
->from($db->quoteName('#__content'))
- ->where($db->quoteName('id') . ' = ' . (int) $termsarticle);
+ ->where($db->quoteName('id') . ' = ' . (int) $termsArticle);
$db->setQuery($query);
$article = $db->loadObject();
if (JLanguageAssociations::isEnabled())
{
- $termsassociated = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $termsarticle);
+ $termsAssociated = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $termsArticle);
}
- $current_lang = Factory::getLanguage()->getTag();
+ $currentLang = Factory::getLanguage()->getTag();
- if (isset($termsassociated) && $current_lang !== $article->language && array_key_exists($current_lang, $termsassociated))
+ if (isset($termsAssociated) && $currentLang !== $article->language && array_key_exists($currentLang, $termsAssociated))
{
- $url = ContentHelperRoute::getArticleRoute($termsassociated[$current_lang]->id, $termsassociated[$current_lang]->catid);
- $link = JHtml::_('link', JRoute::_($url . '&tmpl=component&lang=' . $termsassociated[$current_lang]->language), $text, $attribs);
+ $url = ContentHelperRoute::getArticleRoute(
+ $termsAssociated[$currentLang]->id,
+ $termsAssociated[$currentLang]->catid,
+ $termsAssociated[$currentLang]->language
+ );
+ $link = JHtml::_('link', JRoute::_($url . '&tmpl=component'), $text, $attribs);
}
else
{
$slug = $article->alias ? ($article->id . ':' . $article->alias) : $article->id;
- $url = ContentHelperRoute::getArticleRoute($slug, $article->catid);
- $link = JHtml::_('link', JRoute::_($url . '&tmpl=component&lang=' . $article->language), $text, $attribs);
+ $url = ContentHelperRoute::getArticleRoute($slug, $article->catid, $article->language);
+ $link = JHtml::_('link', JRoute::_($url . '&tmpl=component'), $text, $attribs);
}
}
else
diff --git a/plugins/user/terms/terms.php b/plugins/user/terms/terms.php
index 9aa554ff2696a..c5f31207467b5 100644
--- a/plugins/user/terms/terms.php
+++ b/plugins/user/terms/terms.php
@@ -137,6 +137,40 @@ public function onUserBeforeSave($user, $isNew, $data)
}
return true;
+ }
+
+ /**
+ * Saves user profile data
+ *
+ * @param array $data entered user data
+ * @param boolean $isNew true if this is a new user
+ * @param boolean $result true if saving the user worked
+ * @param string $error error message
+ *
+ * @return boolean
+ */
+ public function onUserAfterSave($data, $isNew, $result, $error)
+ {
+ if (!$isNew || !$result)
+ {
+ return true;
+ }
+ JLoader::register('ActionlogsModelActionlog', JPATH_ADMINISTRATOR . '/components/com_actionlogs/models/actionlog.php');
+ $userId = ArrayHelper::getValue($data, 'id', 0, 'int');
+
+ $message = array(
+ 'action' => 'consent',
+ 'id' => $userId,
+ 'title' => $data['name'],
+ 'itemlink' => 'index.php?option=com_users&task=user.edit&id=' . $userId,
+ 'userid' => $userId,
+ 'username' => $data['username'],
+ 'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $userId,
+ );
+
+ /* @var ActionlogsModelActionlog $model */
+ $model = JModelLegacy::getInstance('Actionlog', 'ActionlogsModel');
+ $model->addLog(array($message), 'PLG_USER_TERMS_LOGGING_CONSENT_TO_TERMS', 'plg_user_terms', $userId);
}
}
diff --git a/plugins/user/terms/terms/terms.xml b/plugins/user/terms/terms/terms.xml
index 5f65e815febe3..c654e3cc3e44a 100644
--- a/plugins/user/terms/terms/terms.xml
+++ b/plugins/user/terms/terms/terms.xml
@@ -11,6 +11,7 @@
label="PLG_USER_TERMS_FIELD_LABEL"
description="PLG_USER_TERMS_FIELD_DESC"
default="0"
+ filter="integer"
>