Merge pull request #41616 from nextcloud/bugfix/noid/fix-ocs-absolute-URLs-with-ignore-front-controller

fix: Fix linkToOCSRouteAbsolute() without index.php and with subfolder
pull/41617/head
Joas Schilling 2023-11-20 17:00:43 +07:00 committed by GitHub
commit e5b996722a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 10 deletions

@ -116,16 +116,25 @@ class URLGenerator implements IURLGenerator {
}
public function linkToOCSRouteAbsolute(string $routeName, array $arguments = []): string {
// Returns `/subfolder/index.php/ocsapp/…` with `'htaccess.IgnoreFrontController' => false` in config.php
// And `/subfolder/ocsapp/…` with `'htaccess.IgnoreFrontController' => true` in config.php
$route = $this->router->generate('ocs.'.$routeName, $arguments, false);
$indexPhpPos = strpos($route, '/index.php/');
if ($indexPhpPos !== false) {
$route = substr($route, $indexPhpPos + 10);
// Cut off `/subfolder`
if (\OC::$WEBROOT !== '' && str_starts_with($route, \OC::$WEBROOT)) {
$route = substr($route, \strlen(\OC::$WEBROOT));
}
if (str_starts_with($route, '/index.php/')) {
$route = substr($route, 10);
}
// Remove `ocsapp/` bit
$route = substr($route, 7);
// Prefix with ocs/v2.php endpoint
$route = '/ocs/v2.php' . $route;
// Turn into an absolute URL
return $this->getAbsoluteURL($route);
}

@ -192,26 +192,34 @@ class UrlGeneratorTest extends \Test\TestCase {
/**
* @dataProvider provideOCSRoutes
*/
public function testLinkToOCSRouteAbsolute(string $route, string $expected) {
public function testLinkToOCSRouteAbsolute(string $route, bool $ignoreFrontController, string $expected): void {
$this->mockBaseUrl();
\OC::$WEBROOT = '/nextcloud';
$this->router->expects($this->once())
->method('generate')
->willReturnCallback(function ($routeName, $parameters) {
->willReturnCallback(function (string $routeName, array $parameters) use ($ignoreFrontController) {
if ($routeName === 'ocs.core.OCS.getCapabilities') {
return '/index.php/ocsapp/cloud/capabilities';
if (!$ignoreFrontController) {
return '/nextcloud/index.php/ocsapp/cloud/capabilities';
}
return '/nextcloud/ocsapp/cloud/capabilities';
} elseif ($routeName === 'ocs.core.WhatsNew.dismiss') {
return '/index.php/ocsapp/core/whatsnew';
if (!$ignoreFrontController) {
return '/nextcloud/index.php/ocsapp/core/whatsnew';
}
return '/nextcloud/ocsapp/core/whatsnew';
}
});
$result = $this->urlGenerator->linkToOCSRouteAbsolute($route);
$this->assertEquals($expected, $result);
}
public function provideOCSRoutes() {
public function provideOCSRoutes(): array {
return [
['core.OCS.getCapabilities', 'http://localhost/nextcloud/ocs/v2.php/cloud/capabilities'],
['core.WhatsNew.dismiss', 'http://localhost/nextcloud/ocs/v2.php/core/whatsnew'],
['core.OCS.getCapabilities', false, 'http://localhost/nextcloud/ocs/v2.php/cloud/capabilities'],
['core.OCS.getCapabilities', true, 'http://localhost/nextcloud/ocs/v2.php/cloud/capabilities'],
['core.WhatsNew.dismiss', false, 'http://localhost/nextcloud/ocs/v2.php/core/whatsnew'],
['core.WhatsNew.dismiss', true, 'http://localhost/nextcloud/ocs/v2.php/core/whatsnew'],
];
}