From 0db7d64e508cd6c76ad5fd1b4ffddb4f074965f5 Mon Sep 17 00:00:00 2001 From: Micke Nordin Date: Thu, 9 Oct 2025 13:59:48 +0200 Subject: [PATCH] fix(ocm): align discovery process with OCM spec Signed-off-by: Micke Nordin --- lib/private/OCM/OCMDiscoveryService.php | 46 +++++++++++++++++++------ 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/lib/private/OCM/OCMDiscoveryService.php b/lib/private/OCM/OCMDiscoveryService.php index 76dacffaff9..a939fa6ef29 100644 --- a/lib/private/OCM/OCMDiscoveryService.php +++ b/lib/private/OCM/OCMDiscoveryService.php @@ -103,22 +103,46 @@ class OCMDiscoveryService implements IOCMDiscoveryService { if ($this->config->getSystemValueBool('sharing.federation.allowSelfSignedCertificates') === true) { $options['verify'] = false; } - $response = $client->get($remote . '/ocm-provider/', $options); - - $body = null; - if ($response->getStatusCode() === Http::STATUS_OK) { - $body = $response->getBody(); - // update provider with data returned by the request - $provider->import(json_decode($body, true, 8, JSON_THROW_ON_ERROR) ?? []); - $this->cache->set($remote, $body, 60 * 60 * 24); - $this->remoteProviders[$remote] = $provider; - return $provider; + $urls = [ + $remote . '/.well-known/ocm', + $remote . '/ocm-provider', + ]; + + + foreach ($urls as $url) { + $exception = null; + $body = null; + $status = null; + try { + $response = $client->get($url, $options); + if ($response->getStatusCode() === Http::STATUS_OK) { + $body = $response->getBody(); + $status = $response->getStatusCode(); + // update provider with data returned by the request + $provider->import(json_decode($body, true, 8, JSON_THROW_ON_ERROR) ?? []); + $this->cache->set($remote, $body, 60 * 60 * 24); + $this->remoteProviders[$remote] = $provider; + return $provider; + } + } catch (\Exception $e) { + $this->logger->debug("Tried unsuccesfully to do discovery at: {$url}", [ + 'exception' => $e, + 'remote' => $remote + ]); + // We want to throw only the last exception + $exception = $e; + continue; + } + } + if ($exception) { + throw $exception; } + throw new OCMProviderException('invalid remote ocm endpoint'); } catch (JsonException|OCMProviderException) { $this->cache->set($remote, false, 5 * 60); - throw new OCMProviderException('data returned by remote seems invalid - status:' . $response->getStatusCode() . ' - ' . ($body ?? '')); + throw new OCMProviderException('data returned by remote seems invalid - status: ' . ($status ?? '') . ' - body: ' . ($body ?? '')); } catch (\Exception $e) { $this->cache->set($remote, false, 5 * 60); $this->logger->warning('error while discovering ocm provider', [