-
-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(setup-checks): Ensure URL with webroot works
We basically mock the way `URLGenerator::getAbsoluteURL` works, so we must make sure that the URL might already contain the webroot. Because `baseURL` and `cliURL` also contain the webroot we need to remove the webroot from the URL first. Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
- Loading branch information
Showing
6 changed files
with
284 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
40 changes: 40 additions & 0 deletions
40
apps/settings/tests/SetupChecks/CheckServerResponseTraitImplementation.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
/** | ||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors | ||
* SPDX-License-Identifier: AGPL-3.0-or-later | ||
*/ | ||
namespace OCA\Settings\Tests\SetupChecks; | ||
|
||
use OCA\Settings\SetupChecks\CheckServerResponseTrait; | ||
use OCP\Http\Client\IClientService; | ||
use OCP\IConfig; | ||
use OCP\IL10N; | ||
use OCP\IURLGenerator; | ||
use Psr\Log\LoggerInterface; | ||
|
||
/** | ||
* Dummy implementation for CheckServerResponseTraitTest | ||
*/ | ||
class CheckServerResponseTraitImplementation { | ||
|
||
use CheckServerResponseTrait { | ||
CheckServerResponseTrait::getRequestOptions as public; | ||
CheckServerResponseTrait::runHEAD as public; | ||
CheckServerResponseTrait::runRequest as public; | ||
CheckServerResponseTrait::normalizeUrl as public; | ||
CheckServerResponseTrait::getTestUrls as public; | ||
} | ||
|
||
public function __construct( | ||
protected IL10N $l10n, | ||
protected IConfig $config, | ||
protected IURLGenerator $urlGenerator, | ||
protected IClientService $clientService, | ||
protected LoggerInterface $logger, | ||
) { | ||
} | ||
|
||
} |
214 changes: 214 additions & 0 deletions
214
apps/settings/tests/SetupChecks/CheckServerResponseTraitTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,214 @@ | ||
<?php | ||
|
||
declare(strict_types=1); | ||
|
||
/** | ||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors | ||
* SPDX-License-Identifier: AGPL-3.0-or-later | ||
*/ | ||
namespace OCA\Settings\Tests\SetupChecks; | ||
|
||
use OCP\Http\Client\IClientService; | ||
use OCP\IConfig; | ||
use OCP\IL10N; | ||
use OCP\IURLGenerator; | ||
use PHPUnit\Framework\MockObject\MockObject; | ||
use Psr\Log\LoggerInterface; | ||
use Test\TestCase; | ||
|
||
class CheckServerResponseTraitTest extends TestCase { | ||
|
||
protected const BASE_URL = 'https://nextcloud.local'; | ||
|
||
private IL10N&MockObject $l10n; | ||
private IConfig&MockObject $config; | ||
private IURLGenerator&MockObject $urlGenerator; | ||
private IClientService&MockObject $clientService; | ||
private LoggerInterface&MockObject $logger; | ||
|
||
private CheckServerResponseTraitImplementation $trait; | ||
|
||
protected function setUp(): void { | ||
parent::setUp(); | ||
|
||
$this->l10n = $this->createMock(IL10N::class); | ||
$this->l10n->method('t') | ||
->willReturnArgument(0); | ||
$this->config = $this->createMock(IConfig::class); | ||
$this->urlGenerator = $this->createMock(IURLGenerator::class); | ||
$this->clientService = $this->createMock(IClientService::class); | ||
$this->logger = $this->createMock(LoggerInterface::class); | ||
|
||
$this->trait = new CheckServerResponseTraitImplementation( | ||
$this->l10n, | ||
$this->config, | ||
$this->urlGenerator, | ||
$this->clientService, | ||
$this->logger, | ||
); | ||
} | ||
|
||
/** | ||
* @dataProvider dataNormalizeUrl | ||
*/ | ||
public function testNormalizeUrl(string $url, string $webRoot, bool $removeWebRoot, string $expected): void { | ||
$this->assertEquals($expected, $this->trait->normalizeUrl($url, $webRoot, $removeWebRoot)); | ||
} | ||
|
||
public static function dataNormalizeUrl(): array { | ||
return [ | ||
'valid and nothing to change' => ['http://example.com/root', '/root', false, 'http://example.com/root'], | ||
'trailing slash' => ['http://example.com/root/', '/root', false, 'http://example.com/root'], | ||
'remove web root' => ['http://example.com/root/', '/root', true, 'http://example.com'], | ||
'remove web root but empty' => ['http://example.com', '', true, 'http://example.com'], | ||
]; | ||
} | ||
|
||
/** | ||
* @dataProvider dataGetTestUrls | ||
*/ | ||
public function testGetTestUrls( | ||
string $url, | ||
bool $removeWebRoot, | ||
string $cliUrl, | ||
string $webRoot, | ||
array $trustedDomains, | ||
array $expected, | ||
): void { | ||
$this->config->expects(self::atLeastOnce()) | ||
->method('getSystemValueString') | ||
->with('overwrite.cli.url', '') | ||
->willReturn($cliUrl); | ||
|
||
$this->config->expects(self::atLeastOnce()) | ||
->method('getSystemValue') | ||
->with('trusted_domains', []) | ||
->willReturn($trustedDomains); | ||
|
||
$this->urlGenerator->expects(self::atLeastOnce()) | ||
->method('getWebroot') | ||
->willReturn($webRoot); | ||
|
||
$this->urlGenerator->expects(self::atLeastOnce()) | ||
->method('getBaseUrl') | ||
->willReturn(self::BASE_URL . ($webRoot ? "/$webRoot" : '')); | ||
|
||
$result = $this->trait->getTestUrls($url, $removeWebRoot); | ||
$this->assertEquals($expected, $result); | ||
} | ||
|
||
public static function dataGetTestUrls(): array { | ||
return [ | ||
'same cli and base URL' => [ | ||
'/apps/files/js/example.js', false, 'https://nextcloud.local', '', ['nextcloud.local'], [ | ||
// from cli url | ||
'https://nextcloud.local/apps/files/js/example.js', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/apps/files/js/example.js', | ||
] | ||
], | ||
'different cli and base URL' => [ | ||
'/apps/files/js/example.js', false, 'https://example.com', '', ['nextcloud.local'], [ | ||
// from cli url | ||
'https://example.com/apps/files/js/example.js', | ||
// from base url | ||
'https://nextcloud.local/apps/files/js/example.js', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/apps/files/js/example.js', | ||
] | ||
], | ||
'different cli and base URL and trusted domains' => [ | ||
'/apps/files/js/example.js', false, 'https://example.com', '', ['nextcloud.local', 'example.com', '127.0.0.1'], [ | ||
// from cli url | ||
'https://example.com/apps/files/js/example.js', | ||
// from base url | ||
'https://nextcloud.local/apps/files/js/example.js', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/apps/files/js/example.js', | ||
'http://example.com/apps/files/js/example.js', | ||
// trusted domains | ||
'https://127.0.0.1/apps/files/js/example.js', | ||
'http://127.0.0.1/apps/files/js/example.js', | ||
] | ||
], | ||
'wildcard trusted domains' => [ | ||
'/apps/files/js/example.js', false, '', '', ['nextcloud.local', '*.example.com'], [ | ||
// from base url | ||
'https://nextcloud.local/apps/files/js/example.js', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/apps/files/js/example.js', | ||
// trusted domains with wild card are skipped | ||
] | ||
], | ||
'missing leading slash' => [ | ||
'apps/files/js/example.js', false, 'https://nextcloud.local', '', ['nextcloud.local'], [ | ||
// from cli url | ||
'https://nextcloud.local/apps/files/js/example.js', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/apps/files/js/example.js', | ||
] | ||
], | ||
'keep web-root' => [ | ||
'/apps/files/js/example.js', false, 'https://example.com', 'nextcloud/', ['nextcloud.local', 'example.com', '192.168.100.1'], [ | ||
// from cli url (note that the CLI url has NO web root) | ||
'https://example.com/apps/files/js/example.js', | ||
// from base url | ||
'https://nextcloud.local/nextcloud/apps/files/js/example.js', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/nextcloud/apps/files/js/example.js', | ||
// trusted domains with web-root | ||
'https://example.com/nextcloud/apps/files/js/example.js', | ||
'http://example.com/nextcloud/apps/files/js/example.js', | ||
'https://192.168.100.1/nextcloud/apps/files/js/example.js', | ||
'http://192.168.100.1/nextcloud/apps/files/js/example.js', | ||
] | ||
], | ||
// example if the URL is generated by the URL generator | ||
'keep web-root and web root in url' => [ | ||
'/nextcloud/apps/files/js/example.js', false, 'https://example.com', 'nextcloud/', ['nextcloud.local', 'example.com', '192.168.100.1'], [ | ||
// from cli url (note that the CLI url has NO web root) | ||
'https://example.com/apps/files/js/example.js', | ||
// from base url | ||
'https://nextcloud.local/nextcloud/apps/files/js/example.js', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/nextcloud/apps/files/js/example.js', | ||
// trusted domains with web-root | ||
'https://example.com/nextcloud/apps/files/js/example.js', | ||
'http://example.com/nextcloud/apps/files/js/example.js', | ||
'https://192.168.100.1/nextcloud/apps/files/js/example.js', | ||
'http://192.168.100.1/nextcloud/apps/files/js/example.js', | ||
] | ||
], | ||
'remove web-root' => [ | ||
'/.well-known/caldav', true, 'https://example.com', 'nextcloud/', ['nextcloud.local', 'example.com', '192.168.100.1'], [ | ||
// from cli url (note that the CLI url has NO web root) | ||
'https://example.com/.well-known/caldav', | ||
// from base url | ||
'https://nextcloud.local/.well-known/caldav', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/.well-known/caldav', | ||
'http://example.com/.well-known/caldav', | ||
// trusted domains with web-root | ||
'https://192.168.100.1/.well-known/caldav', | ||
'http://192.168.100.1/.well-known/caldav', | ||
] | ||
], | ||
// example if the URL is generated by the URL generator | ||
'remove web-root and web root in url' => [ | ||
'/nextcloud/.well-known/caldav', true, 'https://example.com', 'nextcloud/', ['nextcloud.local', 'example.com', '192.168.100.1'], [ | ||
// from cli url (note that the CLI url has NO web root) | ||
'https://example.com/.well-known/caldav', | ||
// from base url | ||
'https://nextcloud.local/.well-known/caldav', | ||
// http variant from trusted domains | ||
'http://nextcloud.local/.well-known/caldav', | ||
'http://example.com/.well-known/caldav', | ||
// trusted domains with web-root | ||
'https://192.168.100.1/.well-known/caldav', | ||
'http://192.168.100.1/.well-known/caldav', | ||
] | ||
], | ||
]; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters