diff options
-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 e78ec602209..a62fe236369 100644 --- a/apps/settings/lib/SetupChecks/CheckServerResponseTrait.php +++ b/apps/settings/lib/SetupChecks/CheckServerResponseTrait.php @@ -54,25 +54,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 @@ -86,14 +125,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 f387fe23a32..3a2863d441d 100644 --- a/apps/settings/lib/SetupChecks/OcxProviders.php +++ b/apps/settings/lib/SetupChecks/OcxProviders.php @@ -68,7 +68,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 9471867c866..24f3c2d84e2 100644 --- a/apps/settings/lib/SetupChecks/WellKnownUrls.php +++ b/apps/settings/lib/SetupChecks/WellKnownUrls.php @@ -70,7 +70,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 |