diff --git a/administrator/components/com_actionlogs/models/forms/filter_actionlogs.xml b/administrator/components/com_actionlogs/models/forms/filter_actionlogs.xml index 73441dbe7e5e1..e46fc35d7364e 100644 --- a/administrator/components/com_actionlogs/models/forms/filter_actionlogs.xml +++ b/administrator/components/com_actionlogs/models/forms/filter_actionlogs.xml @@ -4,6 +4,7 @@ diff --git a/administrator/components/com_admin/sql/updates/postgresql/3.9.15-2020-01-08.sql b/administrator/components/com_admin/sql/updates/postgresql/3.9.15-2020-01-08.sql new file mode 100644 index 0000000000000..a25179f9b38d1 --- /dev/null +++ b/administrator/components/com_admin/sql/updates/postgresql/3.9.15-2020-01-08.sql @@ -0,0 +1 @@ +CREATE INDEX "#__users_email_lower" ON "#__users" (lower("email")); diff --git a/administrator/components/com_associations/models/forms/filter_associations.xml b/administrator/components/com_associations/models/forms/filter_associations.xml index 1a9ddca3423a0..11280a318744a 100644 --- a/administrator/components/com_associations/models/forms/filter_associations.xml +++ b/administrator/components/com_associations/models/forms/filter_associations.xml @@ -26,6 +26,7 @@ COM_CHECKIN_DATABASE_TABLE_DESC - + select('COUNT(' . $db->quoteName('asso2.id') . ') > 1 as ' . $db->quoteName('association')) - ->join( - 'LEFT', - $db->quoteName('#__associations', 'asso') . ' ON ' . $db->quoteName('asso.id') . ' = ' . $db->quoteName('a.id') - . ' AND ' . $db->quoteName('asso.context') . ' = ' . $db->quote('com_contact.item') - ) - ->join( - 'LEFT', - $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso2.key') . ' = ' . $db->quoteName('asso.key') - ) - ->group( - $db->quoteName( - array( - 'a.id', - 'a.name', - 'a.alias', - 'a.checked_out', - 'a.checked_out_time', - 'a.catid', - 'a.user_id', - 'a.published', - 'a.access', - 'a.created', - 'a.created_by', - 'a.ordering', - 'a.featured', - 'a.language', - 'a.publish_up', - 'a.publish_down', - 'ul.name' , - 'ul.email', - 'l.title' , - 'l.image' , - 'uc.name' , - 'ag.title' , - 'c.title', - 'c.level' - ) + $subQuery = $db->getQuery(true) + ->select('COUNT(' . $db->quoteName('asso1.id') . ') > 1') + ->from($db->quoteName('#__associations', 'asso1')) + ->join('INNER', $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso1.key') . ' = ' . $db->quoteName('asso2.key')) + ->where( + array( + $db->quoteName('asso1.id') . ' = ' . $db->quoteName('a.id'), + $db->quoteName('asso1.context') . ' = ' . $db->quote('com_contact.item'), ) ); + + $query->select('(' . $subQuery . ') AS ' . $db->quoteName('association')); } // Filter by access level. diff --git a/administrator/components/com_contact/models/forms/filter_contacts.xml b/administrator/components/com_contact/models/forms/filter_contacts.xml index c106396eefcfb..318bfdaa689a3 100644 --- a/administrator/components/com_contact/models/forms/filter_contacts.xml +++ b/administrator/components/com_contact/models/forms/filter_contacts.xml @@ -6,6 +6,7 @@ select( $this->getState( 'list.select', - 'DISTINCT a.id, a.title, a.alias, a.checked_out, a.checked_out_time, a.catid' . + 'a.id, a.title, a.alias, a.checked_out, a.checked_out_time, a.catid' . ', a.state, a.access, a.created, a.created_by, a.created_by_alias, a.modified, a.ordering, a.featured, a.language, a.hits' . ', a.publish_up, a.publish_down, a.note' ) @@ -219,11 +219,8 @@ protected function getListQuery() ->join('LEFT', '#__users AS ua ON ua.id = a.created_by'); // Join on voting table - $assogroup = 'a.id, l.title, l.image, uc.name, ag.title, c.title, ua.name, c.created_user_id, c.level, parent.id'; - if (JPluginHelper::isEnabled('content', 'vote')) { - $assogroup .= ', v.rating_sum, v.rating_count'; $query->select('COALESCE(NULLIF(ROUND(v.rating_sum / v.rating_count, 0), 0), 0) AS rating, COALESCE(NULLIF(v.rating_count, 0), 0) as rating_count') ->join('LEFT', '#__content_rating AS v ON a.id = v.content_id'); @@ -232,10 +229,18 @@ protected function getListQuery() // Join over the associations. if (JLanguageAssociations::isEnabled()) { - $query->select('CASE WHEN COUNT(asso2.id)>1 THEN 1 ELSE 0 END as association') - ->join('LEFT', '#__associations AS asso ON asso.id = a.id AND asso.context=' . $db->quote('com_content.item')) - ->join('LEFT', '#__associations AS asso2 ON ' . $db->quoteName('asso2.key') . ' = ' . $db->quoteName('asso.key')) - ->group($assogroup); + $subQuery = $db->getQuery(true) + ->select('COUNT(' . $db->quoteName('asso1.id') . ') > 1') + ->from($db->quoteName('#__associations', 'asso1')) + ->join('INNER', $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso1.key') . ' = ' . $db->quoteName('asso2.key')) + ->where( + array( + $db->quoteName('asso1.id') . ' = ' . $db->quoteName('a.id'), + $db->quoteName('asso1.context') . ' = ' . $db->quote('com_content.item'), + ) + ); + + $query->select('(' . $subQuery . ') AS ' . $db->quoteName('association')); } // Filter by access level. @@ -353,36 +358,48 @@ protected function getListQuery() $query->where('a.language = ' . $db->quote($language)); } - // Filter by a single or group of tags. - $hasTag = false; - $tagId = $this->getState('filter.tag'); + $tag = $this->getState('filter.tag'); - if (is_numeric($tagId)) + // Run simplified query when filtering by one tag. + if (\is_array($tag) && \count($tag) === 1) { - $hasTag = true; - - $query->where($db->quoteName('tagmap.tag_id') . ' = ' . (int) $tagId); + $tag = $tag[0]; } - elseif (is_array($tagId)) - { - $tagId = ArrayHelper::toInteger($tagId); - $tagId = implode(',', $tagId); - if (!empty($tagId)) - { - $hasTag = true; - - $query->where($db->quoteName('tagmap.tag_id') . ' IN (' . $tagId . ')'); - } - } - - if ($hasTag) + if ($tag && \is_array($tag)) { - $query->join('LEFT', $db->quoteName('#__contentitem_tag_map', 'tagmap') - . ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id') - . ' AND ' . $db->quoteName('tagmap.type_alias') . ' = ' . $db->quote('com_content.article') + $tag = ArrayHelper::toInteger($tag); + + $subQuery = $db->getQuery(true) + ->select('DISTINCT ' . $db->quoteName('content_item_id')) + ->from($db->quoteName('#__contentitem_tag_map')) + ->where( + array( + $db->quoteName('tag_id') . ' IN (' . implode(',', $tag) . ')', + $db->quoteName('type_alias') . ' = ' . $db->quote('com_content.article'), + ) + ); + + $query->join( + 'INNER', + '(' . $subQuery . ') AS ' . $db->quoteName('tagmap') + . ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id') ); } + elseif ($tag = (int) $tag) + { + $query->join( + 'INNER', + $db->quoteName('#__contentitem_tag_map', 'tagmap') + . ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id') + ) + ->where( + array( + $db->quoteName('tagmap.tag_id') . ' = ' . $tag, + $db->quoteName('tagmap.type_alias') . ' = ' . $db->quote('com_content.article'), + ) + ); + } // Add the list ordering clause. $orderCol = $this->state->get('list.ordering', 'a.id'); diff --git a/administrator/components/com_content/models/forms/filter_articles.xml b/administrator/components/com_content/models/forms/filter_articles.xml index 859948681fa37..5424ca76a8133 100644 --- a/administrator/components/com_content/models/forms/filter_articles.xml +++ b/administrator/components/com_content/models/forms/filter_articles.xml @@ -4,6 +4,7 @@ select('COUNT(asso2.id)>1 as association') - ->join('LEFT', '#__associations AS asso ON asso.id = a.id AND asso.context=' . $db->quote('com_menus.item')) - ->join('LEFT', '#__associations AS asso2 ON asso2.key = asso.key') - ->group('a.id, e.enabled, l.title, l.image, u.name, c.element, ag.title, e.name, mt.id, mt.title, l.sef'); + $subQuery = $db->getQuery(true) + ->select('COUNT(' . $db->quoteName('asso1.id') . ') > 1') + ->from($db->quoteName('#__associations', 'asso1')) + ->join('INNER', $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso1.key') . ' = ' . $db->quoteName('asso2.key')) + ->where( + array( + $db->quoteName('asso1.id') . ' = ' . $db->quoteName('a.id'), + $db->quoteName('asso1.context') . ' = ' . $db->quote('com_menus.item'), + ) + ); + + $query->select('(' . $subQuery . ') AS ' . $db->quoteName('association')); } // Join over the extensions diff --git a/administrator/components/com_messages/models/forms/filter_messages.xml b/administrator/components/com_messages/models/forms/filter_messages.xml index 98248b7577849..15531c8bc1353 100644 --- a/administrator/components/com_messages/models/forms/filter_messages.xml +++ b/administrator/components/com_messages/models/forms/filter_messages.xml @@ -4,6 +4,7 @@ COM_MESSAGES_HEADING_FROM_DESC - + select( $this->getState( 'list.select', - 'DISTINCT a.id, a.name, a.alias, a.checked_out, a.checked_out_time, a.catid,' . + 'a.id, a.name, a.alias, a.checked_out, a.checked_out_time, a.catid,' . ' a.numarticles, a.cache_time, a.created_by,' . ' a.published, a.access, a.ordering, a.language, a.publish_up, a.publish_down' ) @@ -186,10 +186,18 @@ protected function getListQuery() if ($assoc) { - $query->select('COUNT(asso2.id)>1 AS association') - ->join('LEFT', $db->quoteName('#__associations', 'asso') . ' ON asso.id = a.id AND asso.context = ' . $db->quote('com_newsfeeds.item')) - ->join('LEFT', $db->quoteName('#__associations', 'asso2') . ' ON asso2.key = asso.key') - ->group('a.id, l.title, l.image, uc.name, ag.title, c.title'); + $subQuery = $db->getQuery(true) + ->select('COUNT(' . $db->quoteName('asso1.id') . ') > 1') + ->from($db->quoteName('#__associations', 'asso1')) + ->join('INNER', $db->quoteName('#__associations', 'asso2') . ' ON ' . $db->quoteName('asso1.key') . ' = ' . $db->quoteName('asso2.key')) + ->where( + array( + $db->quoteName('asso1.id') . ' = ' . $db->quoteName('a.id'), + $db->quoteName('asso1.context') . ' = ' . $db->quote('com_newsfeeds.item'), + ) + ); + + $query->select('(' . $subQuery . ') AS ' . $db->quoteName('association')); } // Filter by access level. @@ -253,33 +261,47 @@ protected function getListQuery() } // Filter by a single or group of tags. - $hasTag = false; - $tagId = $this->getState('filter.tag'); + $tag = $this->getState('filter.tag'); - if (is_numeric($tagId)) + // Run simplified query when filtering by one tag. + if (\is_array($tag) && \count($tag) === 1) { - $hasTag = true; - - $query->where($db->quoteName('tagmap.tag_id') . ' = ' . (int) $tagId); + $tag = $tag[0]; } - elseif (is_array($tagId)) - { - $tagId = implode(',', ArrayHelper::toInteger($tagId)); - if (!empty($tagId)) - { - $hasTag = true; - - $query->where($db->quoteName('tagmap.tag_id') . ' IN (' . $tagId . ')'); - } + if ($tag && \is_array($tag)) + { + $tag = ArrayHelper::toInteger($tag); + + $subQuery = $db->getQuery(true) + ->select('DISTINCT ' . $db->quoteName('content_item_id')) + ->from($db->quoteName('#__contentitem_tag_map')) + ->where( + array( + $db->quoteName('tag_id') . ' IN (' . implode(',', $tag) . ')', + $db->quoteName('type_alias') . ' = ' . $db->quote('com_newsfeeds.newsfeed'), + ) + ); + + $query->join( + 'INNER', + '(' . $subQuery . ') AS ' . $db->quoteName('tagmap') + . ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id') + ); } - - if ($hasTag) + elseif ($tag = (int) $tag) { - $query->join('LEFT', $db->quoteName('#__contentitem_tag_map', 'tagmap') + $query->join( + 'INNER', + $db->quoteName('#__contentitem_tag_map', 'tagmap') . ' ON ' . $db->quoteName('tagmap.content_item_id') . ' = ' . $db->quoteName('a.id') - . ' AND ' . $db->quoteName('tagmap.type_alias') . ' = ' . $db->quote('com_newsfeeds.newsfeed') - ); + ) + ->where( + array( + $db->quoteName('tagmap.tag_id') . ' = ' . $tag, + $db->quoteName('tagmap.type_alias') . ' = ' . $db->quote('com_newsfeeds.newsfeed'), + ) + ); } // Add the list ordering clause. diff --git a/administrator/components/com_plugins/models/forms/filter_plugins.xml b/administrator/components/com_plugins/models/forms/filter_plugins.xml index ea46059072712..170163fd59c14 100644 --- a/administrator/components/com_plugins/models/forms/filter_plugins.xml +++ b/administrator/components/com_plugins/models/forms/filter_plugins.xml @@ -6,6 +6,7 @@ getQuery(true) ->select('id') ->from($db->quoteName('#__users')) - ->where($db->quoteName('email') . ' = ' . $db->quote($table->email)), + ->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($table->email) . ')'), 0, 1 )->loadResult(); @@ -164,7 +164,7 @@ public function emailDataExport($id = null) $db->getQuery(true) ->select('id') ->from($db->quoteName('#__users')) - ->where($db->quoteName('email') . ' = ' . $db->quote($table->email)), + ->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($table->email) . ')'), 0, 1 )->loadResult(); diff --git a/administrator/components/com_privacy/models/forms/filter_consents.xml b/administrator/components/com_privacy/models/forms/filter_consents.xml index 866dd9e99af36..a789e9e46b54a 100644 --- a/administrator/components/com_privacy/models/forms/filter_consents.xml +++ b/administrator/components/com_privacy/models/forms/filter_consents.xml @@ -6,6 +6,7 @@ getQuery(true) ->select('id') ->from($db->quoteName('#__users')) - ->where($db->quoteName('email') . ' = ' . $db->quote($table->email)), + ->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($table->email) . ')'), 0, 1 )->loadResult(); diff --git a/administrator/components/com_privacy/models/request.php b/administrator/components/com_privacy/models/request.php index bf3eead939c3e..5c679f5ca3acb 100644 --- a/administrator/components/com_privacy/models/request.php +++ b/administrator/components/com_privacy/models/request.php @@ -262,7 +262,7 @@ public function notifyUserAdminCreatedRequest($id) $db->getQuery(true) ->select('id') ->from($db->quoteName('#__users')) - ->where($db->quoteName('email') . ' = ' . $db->quote($table->email)), + ->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($table->email) . ')'), 0, 1 )->loadResult(); diff --git a/administrator/components/com_redirect/models/forms/filter_links.xml b/administrator/components/com_redirect/models/forms/filter_links.xml index 900e7012ea851..4d1bd3dfc51a6 100644 --- a/administrator/components/com_redirect/models/forms/filter_links.xml +++ b/administrator/components/com_redirect/models/forms/filter_links.xml @@ -4,6 +4,7 @@ - + English (en-GB) 3.9.15 December 2019 diff --git a/administrator/language/en-GB/install.xml b/administrator/language/en-GB/install.xml index cee38de3be27a..c9082589f7d89 100644 --- a/administrator/language/en-GB/install.xml +++ b/administrator/language/en-GB/install.xml @@ -1,5 +1,5 @@ - + English (en-GB) en-GB 3.9.15 diff --git a/administrator/manifests/packages/pkg_en-GB.xml b/administrator/manifests/packages/pkg_en-GB.xml index d15d6eebe53a7..8e14aa369b085 100644 --- a/administrator/manifests/packages/pkg_en-GB.xml +++ b/administrator/manifests/packages/pkg_en-GB.xml @@ -1,5 +1,5 @@ - + English (en-GB) Language Pack en-GB 3.9.15.1 diff --git a/components/com_contact/models/forms/filter_contacts.xml b/components/com_contact/models/forms/filter_contacts.xml index d33d75f18e57e..96b40fd874587 100644 --- a/components/com_contact/models/forms/filter_contacts.xml +++ b/components/com_contact/models/forms/filter_contacts.xml @@ -6,6 +6,7 @@ event->afterDisplayContent; ?> + diff --git a/components/com_users/models/remind.php b/components/com_users/models/remind.php index 967daac122de7..c940c67087410 100644 --- a/components/com_users/models/remind.php +++ b/components/com_users/models/remind.php @@ -125,7 +125,7 @@ public function processRemindRequest($data) $query = $db->getQuery(true) ->select('*') ->from($db->quoteName('#__users')) - ->where($db->quoteName('email') . ' = ' . $db->quote($data['email'])); + ->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($data['email']) . ')'); // Get the user id. $db->setQuery($query); diff --git a/components/com_users/models/reset.php b/components/com_users/models/reset.php index d93c49eb491e7..4946ecb237db1 100644 --- a/components/com_users/models/reset.php +++ b/components/com_users/models/reset.php @@ -208,10 +208,15 @@ public function processResetComplete($data) return false; } + // Prepare user data. + $data['password'] = $data['password1']; + $data['activation'] = ''; + // Update the user object. - $user->password = JUserHelper::hashPassword($data['password1']); - $user->activation = ''; - $user->password_clear = $data['password1']; + if (!$user->bind($data)) + { + return new \Exception($user->getError(), 500); + } // Save the user to the database. if (!$user->save(true)) @@ -379,7 +384,7 @@ public function processResetRequest($data) $query = $db->getQuery(true) ->select('id') ->from($db->quoteName('#__users')) - ->where($db->quoteName('email') . ' = ' . $db->quote($data['email'])); + ->where('LOWER(' . $db->quoteName('email') . ') = LOWER(' . $db->quote($data['email']) . ')'); // Get the user object. $db->setQuery($query); diff --git a/installation/language/de-AT/de-AT.ini b/installation/language/de-AT/de-AT.ini index a67f36d49500f..b0c03ea86eb41 100644 --- a/installation/language/de-AT/de-AT.ini +++ b/installation/language/de-AT/de-AT.ini @@ -43,7 +43,7 @@ INSTL_DATABASE_PASSWORD_DESC="Für die Sicherheit der Website sollte immer ein D INSTL_DATABASE_PASSWORD_LABEL="Passwort" INSTL_DATABASE_PREFIX_DESC="Einen Tabellenpräfix vergeben oder den zufällig generierten belassen. Idealerweise besteht dieser aus 3 bis 4 Zeichen, enthält nur alphanumerische Zeichen und MUSS mit einem Unterstrich enden. Es MUSS sichergestellt sein, das der Präfix nicht schon von anderen Tabellen genutzt wird!" INSTL_DATABASE_PREFIX_LABEL="Tabellenpräfix" -INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen, danach können optional alphanumerische Zeichen und ein Unterstrich folgen." +INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen. Danach können optional alphanumerische Zeichen folgen. Er muss mit einem Unterstrich enden." INSTL_DATABASE_TYPE_DESC="Dies ist normalerweise „MySQLi“" INSTL_DATABASE_TYPE_LABEL="Datenbanktyp" INSTL_DATABASE_USER_DESC="Entweder ein selbst eingerichteter Benutzername oder ein vorgegebener Benutzername des Webhosters." @@ -259,7 +259,7 @@ INSTL_MAGIC_QUOTES_GPC="Magic Quotes GPC aus" INSTL_MAGIC_QUOTES_RUNTIME="Magic Quotes Laufzeit" INSTL_MB_LANGUAGE_IS_DEFAULT="MB Sprache ist Standard" INSTL_MB_STRING_OVERLOAD_OFF="MB String overload ist deaktiviert" -INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess korrigiert werden." +INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess angepasst werden." INSTL_NOTICEMBSTRINGOVERLOAD="PHPs „mbstring function overload“ ist gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.func_overload 0“ in der Datei .htaccess deaktiviert werden." INSTL_NOTICEYOUCANSTILLINSTALL="
Die Installation kann ohne Probleme weitergeführt werden, da die Konfigurationsdaten am Schluss angezeigt werden, allerdings muss dieser Code manuell hochgeladen werden. Ein Klick in das Textfeld wird den gesamten Code markieren, anschließend ist der Code in eine neue Textdatei einzufügen. Diese Datei muss den Namen „configuration.php„ haben und in das Joomla!-Root-Verzeichnis hochgeladen werden." INSTL_OUTPUT_BUFFERING="Gepufferte Ausgabe" diff --git a/installation/language/de-AT/de-AT.xml b/installation/language/de-AT/de-AT.xml index 0da2efda36384..2cfa17aa3efba 100644 --- a/installation/language/de-AT/de-AT.xml +++ b/installation/language/de-AT/de-AT.xml @@ -1,8 +1,8 @@ German (Austria) - 3.9.13 - 05.11.2019 + 3.9.14 + 17.12.2019 J!German Copyright (C) 2005 - 2019 Open Source Matters. All rights reserved. GNU General Public License version 2 or later; see LICENSE.txt diff --git a/installation/language/de-CH/de-CH.ini b/installation/language/de-CH/de-CH.ini index 31ecf189b48f7..4d9f33bd66d51 100644 --- a/installation/language/de-CH/de-CH.ini +++ b/installation/language/de-CH/de-CH.ini @@ -43,7 +43,7 @@ INSTL_DATABASE_PASSWORD_DESC="Für die Sicherheit der Website sollte immer ein D INSTL_DATABASE_PASSWORD_LABEL="Passwort" INSTL_DATABASE_PREFIX_DESC="Einen Tabellenpräfix vergeben oder den zufällig generierten belassen. Idealerweise besteht dieser aus 3 bis 4 Zeichen, enthält nur alphanumerische Zeichen und MUSS mit einem Unterstrich enden. Es MUSS sichergestellt sein, das der Präfix nicht schon von anderen Tabellen genutzt wird!" INSTL_DATABASE_PREFIX_LABEL="Tabellenpräfix" -INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen, danach können optional alphanumerische Zeichen und ein Unterstrich folgen." +INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen. Danach können optional alphanumerische Zeichen folgen. Er muss mit einem Unterstrich enden." INSTL_DATABASE_TYPE_DESC="Dies ist normalerweise „MySQLi“" INSTL_DATABASE_TYPE_LABEL="Datenbanktyp" INSTL_DATABASE_USER_DESC="Entweder ein selbst eingerichteter Benutzername oder ein vorgegebener Benutzername des Webhosters." @@ -259,7 +259,7 @@ INSTL_MAGIC_QUOTES_GPC="Magic Quotes GPC aus" INSTL_MAGIC_QUOTES_RUNTIME="Magic Quotes Laufzeit" INSTL_MB_LANGUAGE_IS_DEFAULT="MB Sprache ist Standard" INSTL_MB_STRING_OVERLOAD_OFF="MB String overload ist deaktiviert" -INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess korrigiert werden." +INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess angepasst werden." INSTL_NOTICEMBSTRINGOVERLOAD="PHPs „mbstring function overload“ ist gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.func_overload 0“ in der Datei .htaccess deaktiviert werden." INSTL_NOTICEYOUCANSTILLINSTALL="
Die Installation kann ohne Probleme weitergeführt werden, da die Konfigurationsdaten am Schluss angezeigt werden, allerdings muss dieser Code manuell hochgeladen werden. Ein Klick in das Textfeld wird den gesamten Code markieren, anschliessend ist der Code in eine neue Textdatei einzufügen. Diese Datei muss den Namen „configuration.php„ haben und in das Joomla!-Root-Verzeichnis hochgeladen werden." INSTL_OUTPUT_BUFFERING="Gepufferte Ausgabe" diff --git a/installation/language/de-CH/de-CH.xml b/installation/language/de-CH/de-CH.xml index 9a152d7023cd7..cbf7bea4a2b54 100644 --- a/installation/language/de-CH/de-CH.xml +++ b/installation/language/de-CH/de-CH.xml @@ -1,8 +1,8 @@ German (Switzerland) - 3.9.13 - 05.11.2019 + 3.9.14 + 17.12.2019 J!German Copyright (C) 2005 - 2019 Open Source Matters. All rights reserved. GNU General Public License version 2 or later; see LICENSE.txt diff --git a/installation/language/de-DE/de-DE.ini b/installation/language/de-DE/de-DE.ini index 938418c86e101..bd8ef9852c6d9 100644 --- a/installation/language/de-DE/de-DE.ini +++ b/installation/language/de-DE/de-DE.ini @@ -43,7 +43,7 @@ INSTL_DATABASE_PASSWORD_DESC="Für die Sicherheit der Website sollte immer ein D INSTL_DATABASE_PASSWORD_LABEL="Passwort" INSTL_DATABASE_PREFIX_DESC="Einen Tabellenpräfix vergeben oder den zufällig generierten belassen. Idealerweise besteht dieser aus 3 bis 4 Zeichen, enthält nur alphanumerische Zeichen und MUSS mit einem Unterstrich enden. Es MUSS sichergestellt sein, das der Präfix nicht schon von anderen Tabellen genutzt wird!" INSTL_DATABASE_PREFIX_LABEL="Tabellenpräfix" -INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen, danach können optional alphanumerische Zeichen und ein Unterstrich folgen." +INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen. Danach können optional alphanumerische Zeichen folgen. Er muss mit einem Unterstrich enden." INSTL_DATABASE_TYPE_DESC="Dies ist normalerweise „MySQLi“" INSTL_DATABASE_TYPE_LABEL="Datenbanktyp" INSTL_DATABASE_USER_DESC="Entweder ein selbst eingerichteter Benutzername oder ein vorgegebener Benutzername des Webhosters." @@ -259,7 +259,7 @@ INSTL_MAGIC_QUOTES_GPC="Magic Quotes GPC aus" INSTL_MAGIC_QUOTES_RUNTIME="Magic Quotes Laufzeit" INSTL_MB_LANGUAGE_IS_DEFAULT="MB Sprache ist Standard" INSTL_MB_STRING_OVERLOAD_OFF="MB String overload ist deaktiviert" -INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess korrigiert werden." +INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess angepasst werden." INSTL_NOTICEMBSTRINGOVERLOAD="PHPs „mbstring function overload“ ist gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.func_overload 0“ in der Datei .htaccess deaktiviert werden." INSTL_NOTICEYOUCANSTILLINSTALL="
Die Installation kann ohne Probleme weitergeführt werden, da die Konfigurationsdaten am Schluss angezeigt werden, allerdings muss dieser Code manuell hochgeladen werden. Ein Klick in das Textfeld wird den gesamten Code markieren, anschließend ist der Code in eine neue Textdatei einzufügen. Diese Datei muss den Namen „configuration.php„ haben und in das Joomla!-Root-Verzeichnis hochgeladen werden." INSTL_OUTPUT_BUFFERING="Gepufferte Ausgabe" diff --git a/installation/language/de-DE/de-DE.xml b/installation/language/de-DE/de-DE.xml index c35b7bfb3b7dd..09e0ca6129a0f 100644 --- a/installation/language/de-DE/de-DE.xml +++ b/installation/language/de-DE/de-DE.xml @@ -1,8 +1,8 @@ German (Germany) - 3.9.13 - 05.11.2019 + 3.9.14 + 17.12.2019 J!German Copyright (C) 2005 - 2019 Open Source Matters. All rights reserved. GNU General Public License version 2 or later; see LICENSE.txt diff --git a/installation/language/de-LI/de-LI.ini b/installation/language/de-LI/de-LI.ini index 866f645e6a5ec..2097476a810e8 100644 --- a/installation/language/de-LI/de-LI.ini +++ b/installation/language/de-LI/de-LI.ini @@ -43,7 +43,7 @@ INSTL_DATABASE_PASSWORD_DESC="Für die Sicherheit der Website sollte immer ein D INSTL_DATABASE_PASSWORD_LABEL="Passwort" INSTL_DATABASE_PREFIX_DESC="Einen Tabellenpräfix vergeben oder den zufällig generierten belassen. Idealerweise besteht dieser aus 3 bis 4 Zeichen, enthält nur alphanumerische Zeichen und MUSS mit einem Unterstrich enden. Es MUSS sichergestellt sein, das der Präfix nicht schon von anderen Tabellen genutzt wird!" INSTL_DATABASE_PREFIX_LABEL="Tabellenpräfix" -INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen, danach können optional alphanumerische Zeichen und ein Unterstrich folgen." +INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen. Danach können optional alphanumerische Zeichen folgen. Er muss mit einem Unterstrich enden." INSTL_DATABASE_TYPE_DESC="Dies ist normalerweise „MySQLi“" INSTL_DATABASE_TYPE_LABEL="Datenbanktyp" INSTL_DATABASE_USER_DESC="Entweder ein selbst eingerichteter Benutzername oder ein vorgegebener Benutzername des Webhosters." @@ -259,7 +259,7 @@ INSTL_MAGIC_QUOTES_GPC="Magic Quotes GPC aus" INSTL_MAGIC_QUOTES_RUNTIME="Magic Quotes Laufzeit" INSTL_MB_LANGUAGE_IS_DEFAULT="MB Sprache ist Standard" INSTL_MB_STRING_OVERLOAD_OFF="MB String overload ist deaktiviert" -INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess korrigiert werden." +INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess angepasst werden." INSTL_NOTICEMBSTRINGOVERLOAD="PHPs „mbstring function overload“ ist gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.func_overload 0“ in der Datei .htaccess deaktiviert werden." INSTL_NOTICEYOUCANSTILLINSTALL="
Die Installation kann ohne Probleme weitergeführt werden, da die Konfigurationsdaten am Schluss angezeigt werden, allerdings muss dieser Code manuell hochgeladen werden. Ein Klick in das Textfeld wird den gesamten Code markieren, anschliessend ist der Code in eine neue Textdatei einzufügen. Diese Datei muss den Namen „configuration.php„ haben und in das Joomla!-Root-Verzeichnis hochgeladen werden." INSTL_OUTPUT_BUFFERING="Gepufferte Ausgabe" diff --git a/installation/language/de-LI/de-LI.xml b/installation/language/de-LI/de-LI.xml index b7fbb2efbf197..d0ab51bfaef28 100644 --- a/installation/language/de-LI/de-LI.xml +++ b/installation/language/de-LI/de-LI.xml @@ -1,8 +1,8 @@ German (Lichtenstein) - 3.9.13 - 05.11.2019 + 3.9.14 + 17.12.2019 J!German Copyright (C) 2005 - 2019 Open Source Matters. All rights reserved. GNU General Public License version 2 or later; see LICENSE.txt diff --git a/installation/language/de-LU/de-LU.ini b/installation/language/de-LU/de-LU.ini index 62b8537fa41ca..eba0ef578567f 100644 --- a/installation/language/de-LU/de-LU.ini +++ b/installation/language/de-LU/de-LU.ini @@ -43,7 +43,7 @@ INSTL_DATABASE_PASSWORD_DESC="Für die Sicherheit der Website sollte immer ein D INSTL_DATABASE_PASSWORD_LABEL="Passwort" INSTL_DATABASE_PREFIX_DESC="Einen Tabellenpräfix vergeben oder den zufällig generierten belassen. Idealerweise besteht dieser aus 3 bis 4 Zeichen, enthält nur alphanumerische Zeichen und MUSS mit einem Unterstrich enden. Es MUSS sichergestellt sein, das der Präfix nicht schon von anderen Tabellen genutzt wird!" INSTL_DATABASE_PREFIX_LABEL="Tabellenpräfix" -INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen, danach können optional alphanumerische Zeichen und ein Unterstrich folgen." +INSTL_DATABASE_PREFIX_MSG="Der Tabellenpräfix muss mit einem Buchstaben beginnen. Danach können optional alphanumerische Zeichen folgen. Er muss mit einem Unterstrich enden." INSTL_DATABASE_TYPE_DESC="Dies ist normalerweise „MySQLi“" INSTL_DATABASE_TYPE_LABEL="Datenbanktyp" INSTL_DATABASE_USER_DESC="Entweder ein selbst eingerichteter Benutzername oder ein vorgegebener Benutzername des Webhosters." @@ -259,7 +259,7 @@ INSTL_MAGIC_QUOTES_GPC="Magic Quotes GPC aus" INSTL_MAGIC_QUOTES_RUNTIME="Magic Quotes Laufzeit" INSTL_MB_LANGUAGE_IS_DEFAULT="MB Sprache ist Standard" INSTL_MB_STRING_OVERLOAD_OFF="MB String overload ist deaktiviert" -INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess korrigiert werden." +INSTL_NOTICEMBLANGNOTDEFAULT="PHPs mbstring Spracheinstellung ist nicht auf „neutral“ gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.language neutral“ in der Datei .htaccess angepasst werden." INSTL_NOTICEMBSTRINGOVERLOAD="PHPs „mbstring function overload“ ist gesetzt. Bei Verwendung des PHP-Moduls kann dies lokal durch Eingabe von „php_value mbstring.func_overload 0“ in der Datei .htaccess deaktiviert werden." INSTL_NOTICEYOUCANSTILLINSTALL="
Die Installation kann ohne Probleme weitergeführt werden, da die Konfigurationsdaten am Schluss angezeigt werden, allerdings muss dieser Code manuell hochgeladen werden. Ein Klick in das Textfeld wird den gesamten Code markieren, anschließend ist der Code in eine neue Textdatei einzufügen. Diese Datei muss den Namen „configuration.php„ haben und in das Joomla!-Root-Verzeichnis hochgeladen werden." INSTL_OUTPUT_BUFFERING="Gepufferte Ausgabe" diff --git a/installation/language/de-LU/de-LU.xml b/installation/language/de-LU/de-LU.xml index 5f3aec6a472d6..8228af3aac15b 100644 --- a/installation/language/de-LU/de-LU.xml +++ b/installation/language/de-LU/de-LU.xml @@ -1,8 +1,8 @@ German (Luxembourg) - 3.9.13 - 05.11.2019 + 3.9.14 + 17.12.2019 J!German Copyright (C) 2005 - 2019 Open Source Matters. All rights reserved. GNU General Public License version 2 or later; see LICENSE.txt diff --git a/installation/language/es-CO/es-CO.ini b/installation/language/es-CO/es-CO.ini index 216956d60bfdf..8cd38abc1df41 100644 --- a/installation/language/es-CO/es-CO.ini +++ b/installation/language/es-CO/es-CO.ini @@ -155,6 +155,7 @@ INSTL_DEFAULTLANGUAGE_ADMIN_SET_DEFAULT="El idioma predeterminado para el admini INSTL_DEFAULTLANGUAGE_COLUMN_HEADER_SELECT="Seleccionar" INSTL_DEFAULTLANGUAGE_COLUMN_HEADER_LANGUAGE="Idioma" INSTL_DEFAULTLANGUAGE_COLUMN_HEADER_TAG="Código" +INSTL_DEFAULTLANGUAGE_COULD_NOT_INSTALL_MULTILANG="Joomla no pudo instalar los datos de ejemplo multilingüe porque solo hay un idioma instalado. Para activar la funcionalidad multilingüe, ud. debe instalar más idiomas. Presione el botón «Anterior» y escoja los idiomas que desee de la lista." INSTL_DEFAULTLANGUAGE_COULD_NOT_ADD_ASSOCIATIONS="Joomla no pudo crear automáticamente las asociaciones de idioma." INSTL_DEFAULTLANGUAGE_COULD_NOT_CREATE_CONTENT_LANGUAGE="Joomla no pudo crear automáticamente el idioma de contenido %s." INSTL_DEFAULTLANGUAGE_COULD_NOT_CREATE_MENU="Joomla no pudo crear automáticamente el menú %s." @@ -186,6 +187,7 @@ INSTL_DEFAULTLANGUAGE_NATIVE_LANGUAGE_NAME="Español colombiano" INSTL_DATABASE_COULD_NOT_CONNECT="No fue posible conectarse a la base de datos. Error de conexión: %s" INSTL_DATABASE_COULD_NOT_CREATE_DATABASE="El instalador no pudo conectarse a la base de datos especificada, ni tampoco pudo crearla. Por favor verifique su configuración y cree manualmente la base de datos de ser necesario." INSTL_DATABASE_COULD_NOT_REFRESH_MANIFEST_CACHE="No se pudo actualizar la caché del manifiesto para la extensión: %s" +INSTL_DATABASE_EMPTY_NAME="" INSTL_DATABASE_ERROR_BACKINGUP="Hubo algunos errores al hacer la copia de seguridad de la base de datos." INSTL_DATABASE_ERROR_CREATE="Hubo un error al intentar crear la base de datos %s.
El usuario puede no tener privilegios suficientes para crear una base de datos. La base de datos debe ser creada por aparte antes de poder instalar Joomla" INSTL_DATABASE_ERROR_DELETE="Hubo algunos errores al borrar la base de datos." diff --git a/installation/language/es-CO/es-CO.xml b/installation/language/es-CO/es-CO.xml index bf3411ebfaafd..b27591e680e18 100644 --- a/installation/language/es-CO/es-CO.xml +++ b/installation/language/es-CO/es-CO.xml @@ -2,9 +2,9 @@ - Español (Colombia) - 3.9.0 - 2018-10-17 + Spanish (Colombia) + 3.9.15 + December 2019 jugbogota.org Copyright (C) 2005 - 2019 Open Source Matters. All rights reserved. GNU General Public License version 2 or later; see LICENSE.txt diff --git a/installation/sql/postgresql/joomla.sql b/installation/sql/postgresql/joomla.sql index 77cebdbebafcb..54116efe76d21 100644 --- a/installation/sql/postgresql/joomla.sql +++ b/installation/sql/postgresql/joomla.sql @@ -2055,6 +2055,7 @@ CREATE INDEX "#__users_idx_name" ON "#__users" ("name"); CREATE INDEX "#__users_idx_block" ON "#__users" ("block"); CREATE INDEX "#__users_username" ON "#__users" ("username"); CREATE INDEX "#__users_email" ON "#__users" ("email"); +CREATE INDEX "#__users_email_lower" ON "#__users" (lower("email")); COMMENT ON COLUMN "#__users"."lastResetTime" IS 'Date of last password reset'; COMMENT ON COLUMN "#__users"."resetCount" IS 'Count of password resets since lastResetTime'; diff --git a/language/en-GB/en-GB.lib_joomla.ini b/language/en-GB/en-GB.lib_joomla.ini index d7ee32d686908..f6cfeabc1b69d 100644 --- a/language/en-GB/en-GB.lib_joomla.ini +++ b/language/en-GB/en-GB.lib_joomla.ini @@ -493,6 +493,7 @@ JLIB_INSTALLER_ABORT_INSTALL_CUSTOM_INSTALL_FAILURE="Extension %s: Custom instal JLIB_INSTALLER_ABORT_LIB_COPY_FILES="Library %s: Could not copy files from the source." JLIB_INSTALLER_ABORT_LIB_INSTALL_ALREADY_INSTALLED="Library Install: Library already installed." JLIB_INSTALLER_ABORT_LIB_INSTALL_COPY_SETUP="Library Install: Could not copy setup file." +JLIB_INSTALLER_ABORT_LIB_INSTALL_CORE_FOLDER="Library Install: Library has the same name as a core folder." JLIB_INSTALLER_ABORT_LIB_INSTALL_FAILED_TO_CREATE_DIRECTORY="Library Install: Failed to create folder: %s" JLIB_INSTALLER_ABORT_LIB_INSTALL_NOFILE="Library Install: No library file specified." JLIB_INSTALLER_ABORT_LIB_INSTALL_ROLLBACK="Library Install: %s" diff --git a/language/en-GB/en-GB.xml b/language/en-GB/en-GB.xml index 63b98f4232982..f8479d0d107a8 100644 --- a/language/en-GB/en-GB.xml +++ b/language/en-GB/en-GB.xml @@ -1,5 +1,5 @@ - + English (en-GB) 3.9.15 December 2019 diff --git a/language/en-GB/install.xml b/language/en-GB/install.xml index e657adeae2ce1..f0f6218a07e81 100644 --- a/language/en-GB/install.xml +++ b/language/en-GB/install.xml @@ -1,5 +1,5 @@ - + English (en-GB) en-GB 3.9.15 diff --git a/libraries/src/Installer/Adapter/LibraryAdapter.php b/libraries/src/Installer/Adapter/LibraryAdapter.php index c5d423467f62d..b0a782d7e7173 100644 --- a/libraries/src/Installer/Adapter/LibraryAdapter.php +++ b/libraries/src/Installer/Adapter/LibraryAdapter.php @@ -234,6 +234,14 @@ protected function setupInstallPaths() throw new \RuntimeException(\JText::_('JLIB_INSTALLER_ABORT_LIB_INSTALL_NOFILE')); } + // Don't install libraries which would override core folders + $restrictedFolders = array('cms', 'fof', 'idna_convert', 'joomla', 'legacy', 'php-encryption', 'phpass', 'phputf8', 'src', 'vendor'); + + if (in_array($group, $restrictedFolders)) + { + throw new \RuntimeException(\JText::_('JLIB_INSTALLER_ABORT_LIB_INSTALL_CORE_FOLDER')); + } + $this->parent->setPath('extension_root', JPATH_PLATFORM . '/' . implode(DIRECTORY_SEPARATOR, explode('/', $group))); } diff --git a/libraries/src/Table/User.php b/libraries/src/Table/User.php index fd35e44864ce3..2527c988b817b 100644 --- a/libraries/src/Table/User.php +++ b/libraries/src/Table/User.php @@ -245,7 +245,7 @@ public function check() $query->clear() ->select($this->_db->quoteName('id')) ->from($this->_db->quoteName('#__users')) - ->where($this->_db->quoteName('email') . ' = ' . $this->_db->quote($this->email)) + ->where('LOWER(' . $this->_db->quoteName('email') . ') = LOWER(' . $this->_db->quote($this->email) . ')') ->where($this->_db->quoteName('id') . ' != ' . (int) $this->id); $this->_db->setQuery($query); $xid = (int) $this->_db->loadResult(); diff --git a/media/system/js/subform-repeatable-uncompressed.js b/media/system/js/subform-repeatable-uncompressed.js index b13d34e1f895b..249f42d3cb4bc 100644 --- a/media/system/js/subform-repeatable-uncompressed.js +++ b/media/system/js/subform-repeatable-uncompressed.js @@ -28,6 +28,9 @@ // check rows container this.$containerRows = this.options.rowsContainer ? this.$container.find(this.options.rowsContainer) : this.$container; + // Keep track of amount of rows, this is important to avoid a name duplication + this.lastRowNum = this.$containerRows.find(this.options.repeatableElement).length; + // To avoid scope issues, var self = this; @@ -158,8 +161,10 @@ var group = (typeof _group === 'undefined' ? $row.attr('data-group') : _group), basename = (typeof _basename === 'undefined' ? $row.attr('data-base-name') : _basename), count = (typeof _count === 'undefined' ? 0 : _count), - groupnew = basename + count; + countnew = Math.max(this.lastRowNum, count), + groupnew = basename + countnew; + this.lastRowNum = countnew + 1; $row.attr('data-group', groupnew); // Fix inputs that have a "name" attribute diff --git a/media/system/js/subform-repeatable.js b/media/system/js/subform-repeatable.js index a16338b4f22c3..3536a21961444 100644 --- a/media/system/js/subform-repeatable.js +++ b/media/system/js/subform-repeatable.js @@ -1 +1 @@ -(function($){"use strict";$.subformRepeatable=function(container,options){this.$container=$(container);if(this.$container.data("subformRepeatable")){return self}this.$container.data("subformRepeatable",self);this.options=$.extend({},$.subformRepeatable.defaults,options);this.template="";this.prepareTemplate();this.$containerRows=this.options.rowsContainer?this.$container.find(this.options.rowsContainer):this.$container;var self=this;this.$container.on("click",this.options.btAdd,function(e){e.preventDefault();var after=$(this).parents(self.options.repeatableElement);if(!after.length){after=null}self.addRow(after)});this.$container.on("click",this.options.btRemove,function(e){e.preventDefault();var $row=$(this).parents(self.options.repeatableElement);self.removeRow($row)});if(this.options.btMove){this.$containerRows.sortable({items:this.options.repeatableElement,handle:this.options.btMove,tolerance:"pointer"})}this.$container.trigger("subform-ready")};$.subformRepeatable.prototype.prepareTemplate=function(){if(this.options.rowTemplateSelector){var $tmplElement=this.$container.find(this.options.rowTemplateSelector).last();this.template=$.trim($tmplElement.html())||"";$tmplElement.css("display","none");var map={SUBFORMLT:"<",SUBFORMGT:">"};this.template=this.template.replace(/(SUBFORMLT)|(SUBFORMGT)/g,function(match){return map[match]})}else{var row=this.$container.find(this.options.repeatableElement).get(0),$row=$(row).clone();try{this.clearScripts($row)}catch(e){if(window.console){console.log(e)}}this.template=$row.prop("outerHTML")}};$.subformRepeatable.prototype.addRow=function(after){var count=this.$containerRows.find(this.options.repeatableElement).length;if(count>=this.options.maximum){return null}var row=$.parseHTML(this.template);if(after){$(after).after(row)}else{this.$containerRows.append(row)}var $row=$(row);$row.attr("data-new","true");this.fixUniqueAttributes($row,count);try{this.fixScripts($row)}catch(e){if(window.console){console.log(e)}}this.$container.trigger("subform-row-add",$row);return $row};$.subformRepeatable.prototype.removeRow=function($row){var count=this.$containerRows.find(this.options.repeatableElement).length;if(count<=this.options.minimum){return}this.$container.trigger("subform-row-remove",$row);$row.remove()};$.subformRepeatable.prototype.fixUniqueAttributes=function($row,_count,_group,_basename){var group=typeof _group==="undefined"?$row.attr("data-group"):_group,basename=typeof _basename==="undefined"?$row.attr("data-base-name"):_basename,count=typeof _count==="undefined"?0:_count,groupnew=basename+count;$row.attr("data-group",groupnew);var haveName=$row.find("[name]"),ids={};for(var i=0,l=haveName.length;i"};this.template=this.template.replace(/(SUBFORMLT)|(SUBFORMGT)/g,function(match){return map[match]})}else{var row=this.$container.find(this.options.repeatableElement).get(0),$row=$(row).clone();try{this.clearScripts($row)}catch(e){if(window.console){console.log(e)}}this.template=$row.prop("outerHTML")}};$.subformRepeatable.prototype.addRow=function(after){var count=this.$containerRows.find(this.options.repeatableElement).length;if(count>=this.options.maximum){return null}var row=$.parseHTML(this.template);if(after){$(after).after(row)}else{this.$containerRows.append(row)}var $row=$(row);$row.attr("data-new","true");this.fixUniqueAttributes($row,count);try{this.fixScripts($row)}catch(e){if(window.console){console.log(e)}}this.$container.trigger("subform-row-add",$row);return $row};$.subformRepeatable.prototype.removeRow=function($row){var count=this.$containerRows.find(this.options.repeatableElement).length;if(count<=this.options.minimum){return}this.$container.trigger("subform-row-remove",$row);$row.remove()};$.subformRepeatable.prototype.fixUniqueAttributes=function($row,_count,_group,_basename){var group=typeof _group==="undefined"?$row.attr("data-group"):_group,basename=typeof _basename==="undefined"?$row.attr("data-base-name"):_basename,count=typeof _count==="undefined"?0:_count,countnew=Math.max(this.lastRowNum,count),groupnew=basename+countnew;this.lastRowNum=countnew+1;$row.attr("data-group",groupnew);var haveName=$row.find("[name]"),ids={};for(var i=0,l=haveName.length;iget('recaptcha_challenge_field', '', 'string'); - $response = $input->get('recaptcha_response_field', '', 'string'); + $response = $code ? $code : $input->get('recaptcha_response_field', '', 'string'); $spam = ($challenge === '' || $response === ''); break; case '2.0': // Challenge Not needed in 2.0 but needed for getResponse call $challenge = null; - $response = $input->get('g-recaptcha-response', '', 'string'); + $response = $code ? $code : $input->get('g-recaptcha-response', '', 'string'); $spam = ($response === ''); break; } diff --git a/plugins/content/pagebreak/pagebreak.php b/plugins/content/pagebreak/pagebreak.php index 8aa598da7e3ac..9cd5fd7caf667 100644 --- a/plugins/content/pagebreak/pagebreak.php +++ b/plugins/content/pagebreak/pagebreak.php @@ -32,6 +32,14 @@ */ class PlgContentPagebreak extends JPlugin { + /** + * The navigation list with all page objects if parameter 'multipage_toc' is active. + * + * @var array + * @since __DEPLOY_VERSION__ + */ + protected $list = array(); + /** * Plugin that adds a pagebreak into the text and truncates text at that point * @@ -262,7 +270,6 @@ protected function _createToc(&$row, &$matches, &$page) $limitstart = $input->getUInt('limitstart', 0); $showall = $input->getInt('showall', 0); $headingtext = ''; - $list = array(); if ($this->params->get('article_index', 1) == 1) { @@ -275,11 +282,11 @@ protected function _createToc(&$row, &$matches, &$page) } // TOC first Page link. - $list[1] = new stdClass; - $list[1]->liClass = ($limitstart === 0 && $showall === 0) ? 'toclink active' : 'toclink'; - $list[1]->class = $list[1]->liClass; - $list[1]->link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language)); - $list[1]->title = $heading; + $this->list[1] = new stdClass; + $this->list[1]->liClass = ($limitstart === 0 && $showall === 0) ? 'toclink active' : 'toclink'; + $this->list[1]->class = $this->list[1]->liClass; + $this->list[1]->link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language)); + $this->list[1]->title = $heading; $i = 2; @@ -307,24 +314,25 @@ protected function _createToc(&$row, &$matches, &$page) $title = JText::sprintf('PLG_CONTENT_PAGEBREAK_PAGE_NUM', $i); } - $list[$i] = new stdClass; - $list[$i]->link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&limitstart=' . ($i - 1)); - $list[$i]->title = $title; - $list[$i]->liClass = ($limitstart === $i - 1) ? 'active' : ''; - $list[$i]->class = ($limitstart === $i - 1) ? 'toclink active' : 'toclink'; + $this->list[$i] = new stdClass; + $this->list[$i]->link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&limitstart=' . ($i - 1)); + $this->list[$i]->title = $title; + $this->list[$i]->liClass = ($limitstart === $i - 1) ? 'active' : ''; + $this->list[$i]->class = ($limitstart === $i - 1) ? 'toclink active' : 'toclink'; $i++; } if ($this->params->get('showall')) { - $list[$i] = new stdClass; - $list[$i]->link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&showall=1'); - $list[$i]->liClass = ($showall === 1) ? 'active' : ''; - $list[$i]->class = ($showall === 1) ? 'toclink active' : 'toclink'; - $list[$i]->title = JText::_('PLG_CONTENT_PAGEBREAK_ALL_PAGES'); + $this->list[$i] = new stdClass; + $this->list[$i]->link = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid, $row->language) . '&showall=1'); + $this->list[$i]->liClass = ($showall === 1) ? 'active' : ''; + $this->list[$i]->class = ($showall === 1) ? 'toclink active' : 'toclink'; + $this->list[$i]->title = JText::_('PLG_CONTENT_PAGEBREAK_ALL_PAGES'); } + $list = $this->list; $path = JPluginHelper::getLayoutPath('content', 'pagebreak', 'toc'); ob_start(); include $path; @@ -335,8 +343,8 @@ protected function _createToc(&$row, &$matches, &$page) * Creates the navigation for the item * * @param object &$row The article object. Note $article->text is also available - * @param int $page The total number of pages - * @param int $n The page number + * @param int $page The page number + * @param int $n The total number of pages * * @return void * diff --git a/plugins/content/pagebreak/tmpl/navigation.php b/plugins/content/pagebreak/tmpl/navigation.php index 972eedd59b217..88437c88d8075 100644 --- a/plugins/content/pagebreak/tmpl/navigation.php +++ b/plugins/content/pagebreak/tmpl/navigation.php @@ -8,24 +8,30 @@ */ defined('_JEXEC') or die; + +$lang = JFactory::getLanguage(); ?> diff --git a/plugins/editors/tinymce/tinymce.php b/plugins/editors/tinymce/tinymce.php index 9d8c550a77452..9a084a637b834 100644 --- a/plugins/editors/tinymce/tinymce.php +++ b/plugins/editors/tinymce/tinymce.php @@ -656,7 +656,8 @@ public function onDisplay( 'templates' => $templates, 'image_advtab' => (bool) $levelParams->get('image_advtab', false), 'external_plugins' => empty($externalPlugins) ? null : $externalPlugins, - + 'contextmenu' => (bool) $levelParams->get('contextmenu', true) ? null : false, + 'elementpath' => (bool) $levelParams->get('element_path', true), ) ); diff --git a/plugins/system/updatenotification/updatenotification.php b/plugins/system/updatenotification/updatenotification.php index da06897328ed2..c3df4a09f323e 100644 --- a/plugins/system/updatenotification/updatenotification.php +++ b/plugins/system/updatenotification/updatenotification.php @@ -366,7 +366,7 @@ private function getSuperUsers($email = null) if (!empty($emails)) { - $query->where($db->qn('email') . 'IN(' . implode(',', $emails) . ')'); + $query->where('LOWER(' . $db->qn('email') . ') IN(' . implode(',', array_map('strtolower', $emails)) . ')'); } $db->setQuery($query); diff --git a/templates/protostar/component.php b/templates/protostar/component.php index 9cc2e121d50e5..a944cdce3ee03 100644 --- a/templates/protostar/component.php +++ b/templates/protostar/component.php @@ -19,6 +19,9 @@ // Add JavaScript Frameworks JHtml::_('bootstrap.framework'); +// Add template js +JHtml::_('script', 'template.js', array('version' => 'auto', 'relative' => true)); + // Add html5 shiv JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));