From 69e6b6a483a04644948790c6fcc3e673924fdd44 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 11 Dec 2025 07:41:06 +0100 Subject: [PATCH] fix(comments): Check comment object Signed-off-by: Joas Schilling --- apps/dav/lib/Comments/EntityCollection.php | 9 ++++++-- .../unit/Comments/EntityCollectionTest.php | 23 +++++++++++++++---- lib/private/DB/QueryBuilder/QueryBuilder.php | 8 +++++++ .../Sharded/ShardedQueryBuilder.php | 12 ++++++++-- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/apps/dav/lib/Comments/EntityCollection.php b/apps/dav/lib/Comments/EntityCollection.php index 33c58ee44d2..fadb5f5dabd 100644 --- a/apps/dav/lib/Comments/EntityCollection.php +++ b/apps/dav/lib/Comments/EntityCollection.php @@ -77,6 +77,10 @@ class EntityCollection extends RootCollection implements IProperties { public function getChild($name) { try { $comment = $this->commentsManager->get($name); + if ($comment->getObjectType() !== $this->name + || $comment->getObjectId() !== $this->id) { + throw new NotFound(); + } return new CommentNode( $this->commentsManager, $comment, @@ -130,8 +134,9 @@ class EntityCollection extends RootCollection implements IProperties { */ public function childExists($name) { try { - $this->commentsManager->get($name); - return true; + $comment = $this->commentsManager->get($name); + return $comment->getObjectType() === $this->name + && $comment->getObjectId() === $this->id; } catch (NotFoundException $e) { return false; } diff --git a/apps/dav/tests/unit/Comments/EntityCollectionTest.php b/apps/dav/tests/unit/Comments/EntityCollectionTest.php index 29ebde7d602..2c31b56268f 100644 --- a/apps/dav/tests/unit/Comments/EntityCollectionTest.php +++ b/apps/dav/tests/unit/Comments/EntityCollectionTest.php @@ -48,14 +48,16 @@ class EntityCollectionTest extends \Test\TestCase { } public function testGetChild(): void { + $comment = $this->createMock(IComment::class); + $comment->method('getObjectType') + ->willReturn('files'); + $comment->method('getObjectId') + ->willReturn('19'); + $this->commentsManager->expects($this->once()) ->method('get') ->with('55') - ->willReturn( - $this->getMockBuilder(IComment::class) - ->disableOriginalConstructor() - ->getMock() - ); + ->willReturn($comment); $node = $this->collection->getChild('55'); $this->assertInstanceOf(CommentNode::class, $node); @@ -107,6 +109,17 @@ class EntityCollectionTest extends \Test\TestCase { } public function testChildExistsTrue(): void { + $comment = $this->createMock(IComment::class); + $comment->method('getObjectType') + ->willReturn('files'); + $comment->method('getObjectId') + ->willReturn('19'); + + $this->commentsManager->expects($this->once()) + ->method('get') + ->with('44') + ->willReturn($comment); + $this->assertTrue($this->collection->childExists('44')); } diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php index 494e271bbad..82fc6f84117 100644 --- a/lib/private/DB/QueryBuilder/QueryBuilder.php +++ b/lib/private/DB/QueryBuilder/QueryBuilder.php @@ -1094,6 +1094,10 @@ class QueryBuilder implements IQueryBuilder { * @return $this This QueryBuilder instance. */ public function orderBy($sort, $order = null) { + if ($order !== null && !in_array(strtoupper((string)$order), ['ASC', 'DESC'], true)) { + $order = null; + } + $this->queryBuilder->orderBy( $this->helper->quoteColumnName($sort), $order @@ -1111,6 +1115,10 @@ class QueryBuilder implements IQueryBuilder { * @return $this This QueryBuilder instance. */ public function addOrderBy($sort, $order = null) { + if ($order !== null && !in_array(strtoupper((string)$order), ['ASC', 'DESC'], true)) { + $order = null; + } + $this->queryBuilder->addOrderBy( $this->helper->quoteColumnName($sort), $order diff --git a/lib/private/DB/QueryBuilder/Sharded/ShardedQueryBuilder.php b/lib/private/DB/QueryBuilder/Sharded/ShardedQueryBuilder.php index 4bdbe1ed461..2694a116af4 100644 --- a/lib/private/DB/QueryBuilder/Sharded/ShardedQueryBuilder.php +++ b/lib/private/DB/QueryBuilder/Sharded/ShardedQueryBuilder.php @@ -280,13 +280,21 @@ class ShardedQueryBuilder extends ExtendedQueryBuilder { } public function addOrderBy($sort, $order = null) { - $this->registerOrder((string)$sort, (string)$order ?? 'ASC'); + if ($order !== null && !in_array(strtoupper((string)$order), ['ASC', 'DESC'], true)) { + $order = null; + } + + $this->registerOrder((string)$sort, (string)($order ?? 'ASC')); return parent::addOrderBy($sort, $order); } public function orderBy($sort, $order = null) { + if ($order !== null && !in_array(strtoupper((string)$order), ['ASC', 'DESC'], true)) { + $order = null; + } + $this->sortList = []; - $this->registerOrder((string)$sort, (string)$order ?? 'ASC'); + $this->registerOrder((string)$sort, (string)($order ?? 'ASC')); return parent::orderBy($sort, $order); }