chore: always execute parse_url in preventLocalAddress

This change should make it easier to spot wrong uses of the HTTP client on development setups where allow_local_remote_servers is usually true.

Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
pull/48451/head
Daniel Kesselberg 2 years ago
parent 870816466f
commit 6be00432b7
No known key found for this signature in database
GPG Key ID: 4A81C29F63464E8F
  1. 9
      lib/private/Http/Client/Client.php
  2. 8
      tests/lib/Http/Client/ClientTest.php

@ -158,14 +158,15 @@ class Client implements IClient {
}
protected function preventLocalAddress(string $uri, array $options): void {
if ($this->isLocalAddressAllowed($options)) {
return;
}
$host = parse_url($uri, PHP_URL_HOST);
if ($host === false || $host === null) {
throw new LocalServerException('Could not detect any host');
}
if ($this->isLocalAddressAllowed($options)) {
return;
}
if (!$this->remoteHostValidator->isValid($host)) {
throw new LocalServerException('Host "' . $host . '" violates local access rules');
}

@ -130,6 +130,13 @@ class ClientTest extends \Test\TestCase {
], self::invokePrivate($this->client, 'getProxyUri'));
}
public function testPreventLocalAddressThrowOnInvalidUri(): void {
$this->expectException(LocalServerException::class);
$this->expectExceptionMessage('Could not detect any host');
self::invokePrivate($this->client, 'preventLocalAddress', ['!@#$', []]);
}
public function dataPreventLocalAddress():array {
return [
['https://localhost/foo.bar'],
@ -146,7 +153,6 @@ class ClientTest extends \Test\TestCase {
['https://10.0.0.1'],
['https://another-host.local'],
['https://service.localhost'],
['!@#$', true], // test invalid url
['https://normal.host.com'],
['https://com.one-.nextcloud-one.com'],
];

Loading…
Cancel
Save