diff options
-rw-r--r-- | core/Middleware/TwoFactorMiddleware.php | 6 | ||||
-rw-r--r-- | lib/private/DB/QueryBuilder/QueryBuilder.php | 17 | ||||
-rw-r--r-- | lib/private/Files/Cache/Cache.php | 24 | ||||
-rw-r--r-- | lib/private/Files/Cache/CacheQueryBuilder.php | 23 | ||||
-rw-r--r-- | psalm.xml | 1 | ||||
-rw-r--r-- | resources/codesigning/root.crl | 63 |
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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 -/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----- |