Skip to content

Commit c9de435

Browse files
committed
fix(core): resolve closure-registered nav entries in OCS requests
- ocs/v1.php never called NavigationManager::setup(), so app nav entries registered via a closure (e.g. Talk) never resolved for OCS requests, making them invisible to unified search's app provider. Assisted-by: ClaudeCode:claude-sonnet-5 Signed-off-by: Maksim Sukharev <antreesy.web@gmail.com>
1 parent 262972d commit c9de435

2 files changed

Lines changed: 35 additions & 0 deletions

File tree

ocs/v1.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* SPDX-License-Identifier: AGPL-3.0-only
99
*/
1010

11+
use OC\NavigationManager;
1112
use OC\OCS\ApiHelper;
1213
use OC\Route\Router;
1314
use OC\SystemConfig;
@@ -79,6 +80,10 @@
7980
$appManager->loadApps(['core']);
8081
}
8182

83+
// All apps are now loaded to handle the request, resolve their navigation entries
84+
// (index.php does this via OC::handleRequest(), which this OCS dispatch bypasses)
85+
Server::get(NavigationManager::class)->setup();
86+
8287
Server::get(Router::class)->match('/ocsapp' . $request->getRawPathInfo());
8388
} catch (MaxDelayReached $ex) {
8489
ApiHelper::respond(Http::STATUS_TOO_MANY_REQUESTS, $ex->getMessage());

tests/lib/NavigationManagerTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,36 @@ public function testAddClosure(array $entry, array $expectedEntry): void {
173173
$this->assertEmpty($this->navigationManager->getAll('all'), 'Expected no navigation entry exists after clear()');
174174
}
175175

176+
/**
177+
* Entry points that never call setup() (e.g. the OCS dispatch in ocs/v1.php)
178+
* must not silently lose closure-registered entries such as an app's nav
179+
* link: getAll() should only resolve what it can, not resolve nothing.
180+
*/
181+
public function testGetAllDoesNotResolveClosureBeforeSetup(): void {
182+
$numberOfCalls = 0;
183+
$this->navigationManager->add(function () use (&$numberOfCalls) {
184+
$numberOfCalls++;
185+
186+
return [
187+
'id' => 'entry id',
188+
'name' => 'link text',
189+
'order' => 1,
190+
'href' => 'url',
191+
];
192+
});
193+
194+
$navigationEntries = $this->navigationManager->getAll('all');
195+
196+
$this->assertEquals(0, $numberOfCalls, 'Expected that the closure is not called by getAll() before setup()');
197+
$this->assertEmpty($navigationEntries, 'Expected no navigation entry exists before setup()');
198+
199+
$this->navigationManager->setup();
200+
$navigationEntries = $this->navigationManager->getAll('all');
201+
202+
$this->assertEquals(1, $numberOfCalls, 'Expected that the closure is called by getAll() once setup() has run');
203+
$this->assertArrayHasKey('entry id', $navigationEntries);
204+
}
205+
176206
public function testAddClosureAfterSetup(): void {
177207
$this->navigationManager->setup();
178208
$this->assertEmpty($this->navigationManager->getAll('all'), 'Expected no navigation entry exists');

0 commit comments

Comments
 (0)