Merge pull request #52434 from nextcloud/bugfix/52420/closure-as-default-app

fix(navigation): Fix default app entry registered as closure
pull/52055/head
Joas Schilling 5 months ago committed by GitHub
commit 40e52e212a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 19
      lib/private/NavigationManager.php
  2. 5
      lib/private/URLGenerator.php
  3. 40
      tests/lib/NavigationManagerTest.php

@ -77,7 +77,7 @@ class NavigationManager implements INavigationManager {
$this->closureEntries[] = $entry;
return;
}
$this->init();
$this->init(false);
$id = $entry['id'];
@ -123,10 +123,6 @@ class NavigationManager implements INavigationManager {
*/
public function getAll(string $type = 'link'): array {
$this->init();
foreach ($this->closureEntries as $c) {
$this->add($c());
}
$this->closureEntries = [];
$result = $this->entries;
if ($type !== 'all') {
@ -212,7 +208,13 @@ class NavigationManager implements INavigationManager {
return $this->activeEntry;
}
private function init() {
private function init(bool $resolveClosures = true): void {
if ($resolveClosures) {
while ($c = array_pop($this->closureEntries)) {
$this->add($c());
}
}
if ($this->init) {
return;
}
@ -420,11 +422,6 @@ class NavigationManager implements INavigationManager {
public function get(string $id): ?array {
$this->init();
foreach ($this->closureEntries as $c) {
$this->add($c());
}
$this->closureEntries = [];
return $this->entries[$id];
}

@ -304,6 +304,11 @@ class URLGenerator implements IURLGenerator {
if ($href === '') {
throw new \InvalidArgumentException('Default navigation entry is missing href: ' . $entryId);
}
if (str_starts_with($href, $this->getBaseUrl())) {
return $href;
}
if (str_starts_with($href, '/index.php/') && ($this->config->getSystemValueBool('htaccess.IgnoreFrontController', false) || getenv('front_controller_active') === 'true')) {
$href = substr($href, 10);
}

@ -704,30 +704,64 @@ class NavigationManagerTest extends TestCase {
true,
'settings',
],
// closure navigation entries are also resolved
[
'closure2',
'',
'',
true,
'closure2',
],
[
'',
'closure2',
'',
true,
'closure2',
],
[
'',
'',
'{"closure2":{"order":1,"app":"closure2","href":"/closure2"}}',
true,
'closure2',
],
];
}
/**
* @dataProvider provideDefaultEntries
*/
public function testGetDefaultEntryIdForUser($defaultApps, $userDefaultApps, $userApporder, $withFallbacks, $expectedApp): void {
public function testGetDefaultEntryIdForUser(string $defaultApps, string $userDefaultApps, string $userApporder, bool $withFallbacks, string $expectedApp): void {
$this->navigationManager->add([
'id' => 'files',
]);
$this->navigationManager->add([
'id' => 'settings',
]);
$this->navigationManager->add(static function (): array {
return [
'id' => 'closure1',
'href' => '/closure1',
];
});
$this->navigationManager->add(static function (): array {
return [
'id' => 'closure2',
'href' => '/closure2',
];
});
$this->appManager->method('getEnabledApps')->willReturn([]);
$user = $this->createMock(IUser::class);
$user->method('getUID')->willReturn('user1');
$this->userSession->expects($this->once())
$this->userSession->expects($this->atLeastOnce())
->method('getUser')
->willReturn($user);
$this->config->expects($this->once())
$this->config->expects($this->atLeastOnce())
->method('getSystemValueString')
->with('defaultapp', $this->anything())
->willReturn($defaultApps);

Loading…
Cancel
Save