diff options
author | Arthur Schiwon <blizzz@arthur-schiwon.de> | 2024-09-05 20:11:50 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-05 20:11:50 +0200 |
commit | eaa03b967d1180dbcb12157e7d4ed75ce96c3a82 (patch) | |
tree | 161bee3b1d206b688d1cb0d9017b5f6e1543ce97 | |
parent | 050a5d092abee76e541c64db2bad099262566fc1 (diff) | |
parent | 6830b250b42ec6c85615a705a782c299be761bad (diff) | |
download | nextcloud-server-eaa03b967d1180dbcb12157e7d4ed75ce96c3a82.tar.gz nextcloud-server-eaa03b967d1180dbcb12157e7d4ed75ce96c3a82.zip |
Merge pull request #47775 from nextcloud/backport/46255/stable30
[stable30] fix: add option to remove the webroot for setup checks and don't chec…
-rw-r--r-- | apps/settings/lib/SetupChecks/CheckServerResponseTrait.php | 59 | ||||
-rw-r--r-- | apps/settings/lib/SetupChecks/OcxProviders.php | 2 | ||||
-rw-r--r-- | apps/settings/lib/SetupChecks/WellKnownUrls.php | 2 |
3 files changed, 51 insertions, 12 deletions
diff --git a/apps/settings/lib/SetupChecks/CheckServerResponseTrait.php b/apps/settings/lib/SetupChecks/CheckServerResponseTrait.php index 734ac1ff223..d4e0567cfaf 100644 --- a/apps/settings/lib/SetupChecks/CheckServerResponseTrait.php +++ b/apps/settings/lib/SetupChecks/CheckServerResponseTrait.php @@ -37,25 +37,64 @@ trait CheckServerResponseTrait { * Get all possible URLs that need to be checked for a local request test. * This takes all `trusted_domains` and the CLI overwrite URL into account. * - * @param string $url The relative URL to test + * @param string $url The relative URL to test starting with a / * @return string[] List of possible absolute URLs */ - protected function getTestUrls(string $url): array { - $hosts = $this->config->getSystemValue('trusted_domains', []); - $cliUrl = $this->config->getSystemValue('overwrite.cli.url', ''); + protected function getTestUrls(string $url, bool $removeWebroot): array { + $testUrls = []; + + $webroot = rtrim($this->urlGenerator->getWebroot(), '/'); + + /* Try overwrite.cli.url first, it’s supposed to be how the server contacts itself */ + $cliUrl = $this->config->getSystemValueString('overwrite.cli.url', ''); + if ($cliUrl !== '') { - $hosts[] = $cliUrl; + $cliUrl = $this->normalizeUrl( + $cliUrl, + $webroot, + $removeWebroot + ); + + $testUrls[] = $cliUrl . $url; } - $testUrls = array_merge( - [$this->urlGenerator->getAbsoluteURL($url)], - array_map(fn (string $host): string => $host . $url, $hosts), + /* Try URL generator second */ + $baseUrl = $this->normalizeUrl( + $this->urlGenerator->getBaseUrl(), + $webroot, + $removeWebroot ); + if ($baseUrl !== $cliUrl) { + $testUrls[] = $baseUrl . $url; + } + + /* Last resort: trusted domains */ + $hosts = $this->config->getSystemValue('trusted_domains', []); + foreach ($hosts as $host) { + if (str_contains($host, '*')) { + /* Ignore domains with a wildcard */ + continue; + } + $hosts[] = 'https://' . $host . $url; + $hosts[] = 'http://' . $host . $url; + } + return $testUrls; } /** + * Strip a trailing slash and remove the webroot if requested. + */ + protected function normalizeUrl(string $url, string $webroot, bool $removeWebroot): string { + $url = rtrim($url, '/'); + if ($removeWebroot && str_ends_with($url, $webroot)) { + $url = substr($url, -strlen($webroot)); + } + return rtrim($url, '/'); + } + + /** * Run a HTTP request to check header * @param string $method The HTTP method to use * @param string $url The relative URL to check @@ -69,14 +108,14 @@ trait CheckServerResponseTrait { * * @return Generator<int, IResponse> */ - protected function runRequest(string $method, string $url, array $options = []): Generator { + protected function runRequest(string $method, string $url, array $options = [], bool $removeWebroot = false): Generator { $options = array_merge(['ignoreSSL' => true, 'httpErrors' => true], $options); $client = $this->clientService->newClient(); $requestOptions = $this->getRequestOptions($options['ignoreSSL'], $options['httpErrors']); $requestOptions = array_merge($requestOptions, $options['options'] ?? []); - foreach ($this->getTestUrls($url) as $testURL) { + foreach ($this->getTestUrls($url, $removeWebroot) as $testURL) { try { yield $client->request($method, $testURL, $requestOptions); } catch (\Throwable $e) { diff --git a/apps/settings/lib/SetupChecks/OcxProviders.php b/apps/settings/lib/SetupChecks/OcxProviders.php index ecb8ecd6609..84da99dbfb0 100644 --- a/apps/settings/lib/SetupChecks/OcxProviders.php +++ b/apps/settings/lib/SetupChecks/OcxProviders.php @@ -51,7 +51,7 @@ class OcxProviders implements ISetupCheck { ]; foreach ($providers as $provider) { - foreach ($this->runRequest('HEAD', $this->urlGenerator->getWebroot() . $provider, ['httpErrors' => false]) as $response) { + foreach ($this->runRequest('HEAD', $provider, ['httpErrors' => false]) as $response) { $testedProviders[$provider] = true; if ($response->getStatusCode() === 200) { $workingProviders[] = $provider; diff --git a/apps/settings/lib/SetupChecks/WellKnownUrls.php b/apps/settings/lib/SetupChecks/WellKnownUrls.php index 2b5481d16ff..565544cfdd7 100644 --- a/apps/settings/lib/SetupChecks/WellKnownUrls.php +++ b/apps/settings/lib/SetupChecks/WellKnownUrls.php @@ -52,7 +52,7 @@ class WellKnownUrls implements ISetupCheck { foreach ($urls as [$verb,$url,$validStatuses,$checkCustomHeader]) { $works = null; - foreach ($this->runRequest($verb, $url, ['httpErrors' => false, 'options' => ['allow_redirects' => ['track_redirects' => true]]]) as $response) { + foreach ($this->runRequest($verb, $url, ['httpErrors' => false, 'options' => ['allow_redirects' => ['track_redirects' => true]]], removeWebroot: true) as $response) { // Check that the response status matches $works = in_array($response->getStatusCode(), $validStatuses); // and (if needed) the custom Nextcloud header is set |