Quellcode durchsuchen

Fix parsing of sftp hosts when using ipv6

tags/v9.0beta1
Robin Appelman vor 8 Jahren
Ursprung
Commit
67710e62fa
2 geänderte Dateien mit 62 neuen und 14 gelöschten Zeilen
  1. 24
    14
      apps/files_external/lib/sftp.php
  2. 38
    0
      apps/files_external/tests/backends/sftp.php

+ 24
- 14
apps/files_external/lib/sftp.php Datei anzeigen

@@ -51,6 +51,27 @@ class SFTP extends \OC\Files\Storage\Common {
*/
protected $client;

/**
* @param string $host protocol://server:port
* @return array [$server, $port]
*/
private function splitHost($host) {
$input = $host;
if (strpos($host, '://') === false) {
// add a protocol to fix parse_url behavior with ipv6
$host = 'http://' . $host;
}

$parsed = parse_url($host);
if(is_array($parsed) && isset($parsed['port'])) {
return [$parsed['host'], $parsed['port']];
} else if (is_array($parsed)) {
return [$parsed['host'], 22];
} else {
return [$input, 22];
}
}

/**
* {@inheritdoc}
*/
@@ -58,21 +79,10 @@ class SFTP extends \OC\Files\Storage\Common {
// Register sftp://
Stream::register();

$this->host = $params['host'];
$parsedHost = $this->splitHost($params['host']);

//deals with sftp://server example
$proto = strpos($this->host, '://');
if ($proto != false) {
$this->host = substr($this->host, $proto+3);
}

//deals with server:port
$hasPort = strpos($this->host,':');
if($hasPort != false) {
$pieces = explode(":", $this->host);
$this->host = $pieces[0];
$this->port = $pieces[1];
}
$this->host = $parsedHost[0];
$this->port = $parsedHost[1];

$this->user = $params['user'];


+ 38
- 0
apps/files_external/tests/backends/sftp.php Datei anzeigen

@@ -26,6 +26,11 @@
namespace Test\Files\Storage;

class SFTP extends Storage {
/**
* @var \OC\Files\Storage\SFTP instance
*/
protected $instance;

private $config;

protected function setUp() {
@@ -103,6 +108,39 @@ class SFTP extends Storage {
],
'sftp::someuser@somehost:8822//remotedir/subdir/',
],
[
// ipv6 with port
[
'run' => true,
'host' => 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329',
'user' => 'someuser',
'password' => 'somepassword',
'root' => 'remotedir/subdir/',
],
'sftp::someuser@FE80:0000:0000:0000:0202:B3FF:FE1E:8329//remotedir/subdir/',
],
[
// ipv6 without port
[
'run' => true,
'host' => 'FE80:0000:0000:0000:0202:B3FF:FE1E:8329:8822',
'user' => 'someuser',
'password' => 'somepassword',
'root' => 'remotedir/subdir/',
],
'sftp::someuser@FE80:0000:0000:0000:0202:B3FF:FE1E:8329:8822//remotedir/subdir/',
],
[
// collapsed ipv6 with port
[
'run' => true,
'host' => 'FE80::0202:B3FF:FE1E:8329:8822',
'user' => 'someuser',
'password' => 'somepassword',
'root' => 'remotedir/subdir/',
],
'sftp::someuser@FE80::0202:B3FF:FE1E:8329:8822//remotedir/subdir/',
],
];
}
}

Laden…
Abbrechen
Speichern