Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/Middleware/TwoFactorMiddleware.php6
-rw-r--r--lib/private/DB/QueryBuilder/QueryBuilder.php17
-rw-r--r--lib/private/Files/Cache/Cache.php24
-rw-r--r--lib/private/Files/Cache/CacheQueryBuilder.php23
-rw-r--r--psalm.xml1
-rw-r--r--resources/codesigning/root.crl63
6 files changed, 93 insertions, 41 deletions
diff --git a/core/Middleware/TwoFactorMiddleware.php b/core/Middleware/TwoFactorMiddleware.php
index d5a8a2f877a..c0e01cbe033 100644
--- a/core/Middleware/TwoFactorMiddleware.php
+++ b/core/Middleware/TwoFactorMiddleware.php
@@ -32,6 +32,7 @@ use OC\Authentication\TwoFactorAuth\Manager;
use OC\Core\Controller\LoginController;
use OC\Core\Controller\TwoFactorChallengeController;
use OC\User\Session;
+use OCA\TwoFactorNextcloudNotification\Controller\APIController;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Middleware;
@@ -83,6 +84,11 @@ class TwoFactorMiddleware extends Middleware {
* @param string $methodName
*/
public function beforeController($controller, $methodName) {
+ if ($controller instanceof APIController && $methodName === 'poll') {
+ // Allow polling the twofactor nextcloud notifications state
+ return;
+ }
+
if ($controller instanceof TwoFactorChallengeController
&& $this->userSession->getUser() !== null
&& !$this->reflector->hasAnnotation('TwoFactorSetUpDoneRequired')) {
diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php
index 352829a56ae..82add039cf5 100644
--- a/lib/private/DB/QueryBuilder/QueryBuilder.php
+++ b/lib/private/DB/QueryBuilder/QueryBuilder.php
@@ -1301,4 +1301,21 @@ class QueryBuilder implements IQueryBuilder {
return $this->helper->quoteColumnName($alias);
}
+
+ /**
+ * Either appends to or replaces a single, generic query part.
+ *
+ * The available parts are: 'select', 'from', 'set', 'where',
+ * 'groupBy', 'having' and 'orderBy'.
+ *
+ * @param string $sqlPartName
+ * @param mixed $sqlPart
+ * @param bool $append
+ *
+ * @return $this This QueryBuilder instance.
+ */
+ public function add(string $sqlPartName, $sqlPart, bool $append = false) {
+ $this->queryBuilder->add($sqlPartName, $sqlPart, $append);
+ return $this;
+ }
}
diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php
index 3ede9fac618..4e5edc0e0a6 100644
--- a/lib/private/Files/Cache/Cache.php
+++ b/lib/private/Files/Cache/Cache.php
@@ -587,8 +587,12 @@ class Cache implements ICache {
$query = $this->getQueryBuilder();
$query->delete('filecache_extended')
- ->where($query->expr()->in('fileid', $query->createNamedParameter($childIds, IQueryBuilder::PARAM_INT_ARRAY)));
- $query->execute();
+ ->where($query->expr()->in('fileid', $query->createParameter('childIds')));
+
+ foreach (array_chunk($childIds, 1000) as $childIdChunk) {
+ $query->setParameter('childIds', $childIdChunk, IQueryBuilder::PARAM_INT_ARRAY);
+ $query->execute();
+ }
/** @var ICacheEntry[] $childFolders */
$childFolders = array_filter($children, function ($child) {
@@ -602,8 +606,12 @@ class Cache implements ICache {
$query = $this->getQueryBuilder();
$query->delete('filecache')
- ->whereParentIn($parentIds);
- $query->execute();
+ ->whereParentInParameter('parentIds');
+
+ foreach (array_chunk($parentIds, 1000) as $parentIdChunk) {
+ $query->setParameter('parentIds', $parentIdChunk, IQueryBuilder::PARAM_INT_ARRAY);
+ $query->execute();
+ }
}
/**
@@ -840,7 +848,13 @@ class Cache implements ICache {
protected function buildSearchQuery(ISearchQuery $searchQuery): IQueryBuilder {
$builder = $this->getQueryBuilder();
- $query = $builder->selectFileCache('file');
+ // mysql really likes to pick an index for sorting if it can't fully satisfy the where
+ // filter with an index, since search queries pretty much never are fully filtered by index
+ // mysql often picks an index for sorting instead of the *much* more useful index for filtering.
+ //
+ // To bypass this, we tell mysql explicitly not to use the mtime (the default order field) index,
+ // so it will instead pick an index that is actually useful.
+ $query = $builder->selectFileCache('file', 'ignore index for order by (fs_mtime)');
$query->whereStorageId();
diff --git a/lib/private/Files/Cache/CacheQueryBuilder.php b/lib/private/Files/Cache/CacheQueryBuilder.php
index ac17cfaffb2..9847375495e 100644
--- a/lib/private/Files/Cache/CacheQueryBuilder.php
+++ b/lib/private/Files/Cache/CacheQueryBuilder.php
@@ -26,6 +26,7 @@ declare(strict_types=1);
namespace OC\Files\Cache;
+use Doctrine\DBAL\Platforms\MySQLPlatform;
use OC\DB\QueryBuilder\QueryBuilder;
use OC\SystemConfig;
use OCP\DB\QueryBuilder\IQueryBuilder;
@@ -45,12 +46,24 @@ class CacheQueryBuilder extends QueryBuilder {
$this->cache = $cache;
}
- public function selectFileCache(string $alias = null) {
+ public function selectFileCache(string $alias = null, string $mysqlIndexHint = '') {
$name = $alias ? $alias : 'filecache';
$this->select("$name.fileid", 'storage', 'path', 'path_hash', "$name.parent", 'name', 'mimetype', 'mimepart', 'size', 'mtime',
'storage_mtime', 'encrypted', 'etag', 'permissions', 'checksum', 'metadata_etag', 'creation_time', 'upload_time')
- ->from('filecache', $name)
- ->leftJoin($name, 'filecache_extended', 'fe', $this->expr()->eq("$name.fileid", 'fe.fileid'));
+ ->from('filecache', $name);
+ if ($mysqlIndexHint !== '' && $this->getConnection()->getDatabasePlatform() instanceof MySQLPlatform) {
+ $this->add('join', [
+ $this->quoteAlias($name) => [
+ // horrible query builder crimes to sneak in raw sql after the "FROM oc_filecache $name"
+ 'joinType' => $mysqlIndexHint . ' left',
+ 'joinTable' => $this->getTableName('filecache_extended'),
+ 'joinAlias' => $this->quoteAlias('fe'),
+ 'joinCondition' => $this->expr()->eq("$name.fileid", 'fe.fileid'),
+ ],
+ ], true);
+ } else {
+ $this->leftJoin($name, 'filecache_extended', 'fe', $this->expr()->eq("$name.fileid", 'fe.fileid'));
+ }
$this->alias = $name;
@@ -95,7 +108,7 @@ class CacheQueryBuilder extends QueryBuilder {
return $this;
}
- public function whereParentIn(array $parents) {
+ public function whereParentInParameter(string $parameter) {
$alias = $this->alias;
if ($alias) {
$alias .= '.';
@@ -103,7 +116,7 @@ class CacheQueryBuilder extends QueryBuilder {
$alias = '';
}
- $this->andWhere($this->expr()->in("{$alias}parent", $this->createNamedParameter($parents, IQueryBuilder::PARAM_INT_ARRAY)));
+ $this->andWhere($this->expr()->in("{$alias}parent", $this->createParameter($parameter)));
return $this;
}
diff --git a/psalm.xml b/psalm.xml
index d51dbb9dde6..a075ceb24a7 100644
--- a/psalm.xml
+++ b/psalm.xml
@@ -80,6 +80,7 @@
<UndefinedClass>
<errorLevel type="suppress">
<referencedClass name="OCA\GroupFolders\Mount\GroupFolderStorage"/>
+ <referencedClass name="OCA\TwoFactorNextcloudNotification\Controller\APIController"/>
</errorLevel>
</UndefinedClass>
<UndefinedFunction>
diff --git a/resources/codesigning/root.crl b/resources/codesigning/root.crl
index 0f938e89499..d825b73e7ef 100644
--- a/resources/codesigning/root.crl
+++ b/resources/codesigning/root.crl
@@ -1,38 +1,39 @@
-----BEGIN X509 CRL-----
-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
+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
-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
+dGhvcml0eRcNMjExMDI3MjE1MTIwWhcNMzEwOTA1MjE1MTIwWjCCBOwwEwICEAIX
DTIxMDQxOTA5NTI0NVowEwICEBAXDTE2MTAxNzEyMDkxOVowEwICEBYXDTE3MTEy
MzE3MzUyOVowEwICEBcXDTE3MDIyMDEwMDIzOFowEwICEBgXDTE5MDEzMDEzMDEy
NVowEwICEBwXDTE4MDIwMjEwNTIzOVowEwICEB8XDTE5MDEzMDEzMDEzM1owEwIC
-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
-/dakdyqbPJfp1EYXk3HnE/up5ZyonD5I2JynyA==
+ECMXDTE5MTIxMjA5MzUzMVowEwICECYXDTIxMTAyNzIxMzExNVowEwICECgXDTIw
+MDgyNDEwMjgzN1owEwICEE0XDTE4MTIyMTE1MzIxOFowEwICEE4XDTIwMDEwNzEz
+NTc0NlowEwICEGoXDTE5MDIxMjA5MDgxNFowEwICEG4XDTE5MTEyMDE5NDYyOFow
+EwICEG8XDTE4MDQxNzA5MzkzNlowEwICEHQXDTE3MTEyMzE2NTQ1OVowEwICEHUX
+DTE5MTIxMjA5MzkwNVowEwICEHYXDTE5MTIxMjA5MzkxMlowEwICEJAXDTE4MDIw
+OTA4Mzg1OFowEwICEJkXDTIxMTAxNTA4MzkxNFowEwICEKcXDTE4MDgxMzA3NTIw
+OFowEwICEK8XDTE4MDgxMzA4MjYyMFowEwICELIXDTIxMDkxNjIyMDAwNVowEwIC
+ELUXDTE4MTAwOTA5NTMxMVowEwICELcXDTE4MTIyMTE1MzAyN1owEwICEMIXDTE4
+MTAxNzE5MjAyNFowEwICEMMXDTE4MTAxNzE5MjUzM1owEwICEMQXDTIxMDcxNTE4
+NDA0NlowEwICEMwXDTIxMDExODEyNDUxM1owEwICENcXDTE5MDIxNDEwMzMwNlow
+EwICENwXDTIwMDkxNjEwNDQwNFowEwICEOAXDTE5MDUyMDA5MzAxMFowEwICEPgX
+DTIwMDQyODA2MjIzNlowEwICEPkXDTIwMDQyODA2MjI0NVowEwICEPoXDTIwMDQy
+ODA2MDQzMFowEwICEPsXDTIwMDQyODA2MDUzMFowEwICEPwXDTIwMDQyODA2MDU0
+MFowEwICEP0XDTE5MTIxMjA5MzUzNlowEwICEP4XDTIwMDQyODA2MDYwNVowEwIC
+EP8XDTIwMDQyODA2MDYxM1owEwICEQAXDTIwMDQyODA2MDYyMlowEwICEQEXDTIw
+MDQyNzExMjI1NFowEwICEQIXDTIwMDQyODA2MDY0MFowEwICEQMXDTIwMDQyODA2
+MDY0N1owEwICEQQXDTIwMDQyODA2MDY1NFowEwICEQUXDTIwMDQyODA2MDcwMVow
+EwICEQYXDTIwMDQyODA2MDcwNlowEwICEQcXDTIwMDQyODA2MDcxM1owEwICES0X
+DTIxMDEwNjEyMjEzMVowEwICEUcXDTIxMDIxNTE5MTQwMVowEwICEUgXDTIxMDIx
+NTE5MTQxM1owEwICEUkXDTIxMDIxNTE5MTUyNFowEwICEUoXDTIxMDIxNTE5MTQ0
+OFowEwICEUsXDTIxMDIxNTE5MTM0NlowEwICEUwXDTIxMDIxNTE5MTUwOVowEwIC
+EU0XDTIxMDIxNTE5MTUxNlowEwICEVIXDTIxMDIxNTE5MTQ1OFowEwICEVMXDTIx
+MDIxNTE5MTQzOFowEwICEVQXDTIxMDIxNTE5MTQyMlowEwICEaMXDTIxMTAyNzIx
+NTExNFqgMDAuMB8GA1UdIwQYMBaAFG3qbqqpNyw8iS0XPv1G7sOeeO10MAsGA1Ud
+FAQEAgIQHTANBgkqhkiG9w0BAQsFAAOCAQEAVHlUJ+g9573rnFUA5MtAZSudYlH3
+nyyI7F1AarUrI0jiqb8lkjCHMcuToA31uNVa+iOl3ZuAQ//To9YZ/Br8dYwSde/H
+yDlqEB5Ku/iB9ApCzMjNyayj7fu51pQcNzcgikQ+72Y2YYwmVh3DEeKSsI3axG4P
+Ke4bhGkffg/Mlu10VsQHfLxPknqmobGl4jRK4dC0IpWqnSp3U15ZQfFqlG5hFvcK
+X/xW149jHbfD1vhKLrTdd25NaqEfMyq4mhnJ3J3ol14RpvYe/j54OrEySPrc5vOP
+UWFSXPLyJWFJ72RIo7t5qmezH1pcl0wvgSvsdfIuCfk1eXwJwx1gBQnOWQ==
-----END X509 CRL-----