Fix parsing of sftp hosts when using ipv6
This commit is contained in:
parent
5e3d29b661
commit
67710e62fa
2 changed files with 62 additions and 14 deletions
|
@ -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'];
|
||||
|
||||
|
|
|
@ -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/',
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue