From 418e49d816eea20e24044c0197e1a56cfe46c8a5 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 14 Nov 2017 14:14:30 +0100 Subject: [PATCH] update icewind/smb to 2.0.3 Signed-off-by: Robin Appelman --- apps/files_external/3rdparty/composer.json | 2 +- apps/files_external/3rdparty/composer.lock | 12 ++-- .../3rdparty/composer/autoload_classmap.php | 3 + .../3rdparty/composer/autoload_static.php | 3 + .../3rdparty/composer/installed.json | 12 ++-- .../3rdparty/icewind/smb/src/ErrorCodes.php | 4 +- .../icewind/smb/src/Exception/Exception.php | 2 +- .../Exception/InvalidParameterException.php | 10 +++ .../smb/src/Exception/OutOfSpaceException.php | 11 ++++ .../Exception/RevisionMismatchException.php | 16 +++++ .../3rdparty/icewind/smb/src/NativeState.php | 1 + .../icewind/smb/src/NotifyHandler.php | 17 +++++ .../3rdparty/icewind/smb/src/Parser.php | 4 +- .../icewind/smb/src/RawConnection.php | 64 +++++++++++-------- .../3rdparty/icewind/smb/src/Server.php | 1 + .../3rdparty/icewind/smb/src/Share.php | 11 ++-- 16 files changed, 126 insertions(+), 47 deletions(-) create mode 100644 apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidParameterException.php create mode 100644 apps/files_external/3rdparty/icewind/smb/src/Exception/OutOfSpaceException.php create mode 100644 apps/files_external/3rdparty/icewind/smb/src/Exception/RevisionMismatchException.php diff --git a/apps/files_external/3rdparty/composer.json b/apps/files_external/3rdparty/composer.json index f1613f0c70..307a062c7e 100644 --- a/apps/files_external/3rdparty/composer.json +++ b/apps/files_external/3rdparty/composer.json @@ -8,7 +8,7 @@ "classmap-authoritative": true }, "require": { - "icewind/smb": "2.0.2", + "icewind/smb": "2.0.3", "icewind/streams": "0.5.2" } } diff --git a/apps/files_external/3rdparty/composer.lock b/apps/files_external/3rdparty/composer.lock index 0cf5cabdc1..e00a7bd80e 100644 --- a/apps/files_external/3rdparty/composer.lock +++ b/apps/files_external/3rdparty/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "85f8c3519f909ded38d917d3901f2709", + "content-hash": "b6a304e8ab2effa3791b513007fadcbc", "packages": [ { "name": "icewind/smb", - "version": "v2.0.2", + "version": "v2.0.3", "source": { "type": "git", "url": "https://github.com/icewind1991/SMB.git", - "reference": "6691355d9314ac3a8cb9ec9446e4c26e8aab09d0" + "reference": "8394551bf29a37b884edb33dae8acde369177f32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/SMB/zipball/6691355d9314ac3a8cb9ec9446e4c26e8aab09d0", - "reference": "6691355d9314ac3a8cb9ec9446e4c26e8aab09d0", + "url": "https://api.github.com/repos/icewind1991/SMB/zipball/8394551bf29a37b884edb33dae8acde369177f32", + "reference": "8394551bf29a37b884edb33dae8acde369177f32", "shasum": "" }, "require": { @@ -45,7 +45,7 @@ } ], "description": "php wrapper for smbclient and libsmbclient-php", - "time": "2017-08-16T16:08:57+00:00" + "time": "2017-10-18T16:21:10+00:00" }, { "name": "icewind/streams", diff --git a/apps/files_external/3rdparty/composer/autoload_classmap.php b/apps/files_external/3rdparty/composer/autoload_classmap.php index 4c596a4441..257bdb64eb 100644 --- a/apps/files_external/3rdparty/composer/autoload_classmap.php +++ b/apps/files_external/3rdparty/composer/autoload_classmap.php @@ -22,6 +22,7 @@ return array( 'Icewind\\SMB\\Exception\\ForbiddenException' => $vendorDir . '/icewind/smb/src/Exception/ForbiddenException.php', 'Icewind\\SMB\\Exception\\HostDownException' => $vendorDir . '/icewind/smb/src/Exception/HostDownException.php', 'Icewind\\SMB\\Exception\\InvalidHostException' => $vendorDir . '/icewind/smb/src/Exception/InvalidHostException.php', + 'Icewind\\SMB\\Exception\\InvalidParameterException' => $vendorDir . '/icewind/smb/src/Exception/InvalidParameterException.php', 'Icewind\\SMB\\Exception\\InvalidPathException' => $vendorDir . '/icewind/smb/src/Exception/InvalidPathException.php', 'Icewind\\SMB\\Exception\\InvalidRequestException' => $vendorDir . '/icewind/smb/src/Exception/InvalidRequestException.php', 'Icewind\\SMB\\Exception\\InvalidResourceException' => $vendorDir . '/icewind/smb/src/Exception/InvalidResourceException.php', @@ -30,6 +31,8 @@ return array( 'Icewind\\SMB\\Exception\\NoRouteToHostException' => $vendorDir . '/icewind/smb/src/Exception/NoRouteToHostException.php', 'Icewind\\SMB\\Exception\\NotEmptyException' => $vendorDir . '/icewind/smb/src/Exception/NotEmptyException.php', 'Icewind\\SMB\\Exception\\NotFoundException' => $vendorDir . '/icewind/smb/src/Exception/NotFoundException.php', + 'Icewind\\SMB\\Exception\\OutOfSpaceException' => $vendorDir . '/icewind/smb/src/Exception/OutOfSpaceException.php', + 'Icewind\\SMB\\Exception\\RevisionMismatchException' => $vendorDir . '/icewind/smb/src/Exception/RevisionMismatchException.php', 'Icewind\\SMB\\Exception\\TimedOutException' => $vendorDir . '/icewind/smb/src/Exception/TimedOutException.php', 'Icewind\\SMB\\FileInfo' => $vendorDir . '/icewind/smb/src/FileInfo.php', 'Icewind\\SMB\\IFileInfo' => $vendorDir . '/icewind/smb/src/IFileInfo.php', diff --git a/apps/files_external/3rdparty/composer/autoload_static.php b/apps/files_external/3rdparty/composer/autoload_static.php index 459de971c4..62be2df6a0 100644 --- a/apps/files_external/3rdparty/composer/autoload_static.php +++ b/apps/files_external/3rdparty/composer/autoload_static.php @@ -52,6 +52,7 @@ class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3 'Icewind\\SMB\\Exception\\ForbiddenException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/ForbiddenException.php', 'Icewind\\SMB\\Exception\\HostDownException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/HostDownException.php', 'Icewind\\SMB\\Exception\\InvalidHostException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidHostException.php', + 'Icewind\\SMB\\Exception\\InvalidParameterException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidParameterException.php', 'Icewind\\SMB\\Exception\\InvalidPathException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidPathException.php', 'Icewind\\SMB\\Exception\\InvalidRequestException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidRequestException.php', 'Icewind\\SMB\\Exception\\InvalidResourceException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/InvalidResourceException.php', @@ -60,6 +61,8 @@ class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3 'Icewind\\SMB\\Exception\\NoRouteToHostException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/NoRouteToHostException.php', 'Icewind\\SMB\\Exception\\NotEmptyException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/NotEmptyException.php', 'Icewind\\SMB\\Exception\\NotFoundException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/NotFoundException.php', + 'Icewind\\SMB\\Exception\\OutOfSpaceException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/OutOfSpaceException.php', + 'Icewind\\SMB\\Exception\\RevisionMismatchException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/RevisionMismatchException.php', 'Icewind\\SMB\\Exception\\TimedOutException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/TimedOutException.php', 'Icewind\\SMB\\FileInfo' => __DIR__ . '/..' . '/icewind/smb/src/FileInfo.php', 'Icewind\\SMB\\IFileInfo' => __DIR__ . '/..' . '/icewind/smb/src/IFileInfo.php', diff --git a/apps/files_external/3rdparty/composer/installed.json b/apps/files_external/3rdparty/composer/installed.json index aafe1591fa..6855971a9f 100644 --- a/apps/files_external/3rdparty/composer/installed.json +++ b/apps/files_external/3rdparty/composer/installed.json @@ -44,17 +44,17 @@ }, { "name": "icewind/smb", - "version": "v2.0.2", - "version_normalized": "2.0.2.0", + "version": "v2.0.3", + "version_normalized": "2.0.3.0", "source": { "type": "git", "url": "https://github.com/icewind1991/SMB.git", - "reference": "6691355d9314ac3a8cb9ec9446e4c26e8aab09d0" + "reference": "8394551bf29a37b884edb33dae8acde369177f32" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/SMB/zipball/6691355d9314ac3a8cb9ec9446e4c26e8aab09d0", - "reference": "6691355d9314ac3a8cb9ec9446e4c26e8aab09d0", + "url": "https://api.github.com/repos/icewind1991/SMB/zipball/8394551bf29a37b884edb33dae8acde369177f32", + "reference": "8394551bf29a37b884edb33dae8acde369177f32", "shasum": "" }, "require": { @@ -64,7 +64,7 @@ "require-dev": { "phpunit/phpunit": "^4.8" }, - "time": "2017-08-16T16:08:57+00:00", + "time": "2017-10-18T16:21:10+00:00", "type": "library", "installation-source": "source", "autoload": { diff --git a/apps/files_external/3rdparty/icewind/smb/src/ErrorCodes.php b/apps/files_external/3rdparty/icewind/smb/src/ErrorCodes.php index 03bd574c18..d36cdaf2c7 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/ErrorCodes.php +++ b/apps/files_external/3rdparty/icewind/smb/src/ErrorCodes.php @@ -15,7 +15,7 @@ class ErrorCodes { const BadHostName = 'NT_STATUS_BAD_NETWORK_NAME'; const Unsuccessful = 'NT_STATUS_UNSUCCESSFUL'; const ConnectionRefused = 'NT_STATUS_CONNECTION_REFUSED'; - const NoLogonServers = 'NT_STATUS_NO_LOGON_SERVERS'; + const NoLogonServers = 'NT_STATUS_NO_LOGON_SERVERS'; const PathNotFound = 'NT_STATUS_OBJECT_PATH_NOT_FOUND'; const NoSuchFile = 'NT_STATUS_NO_SUCH_FILE'; @@ -26,4 +26,6 @@ class ErrorCodes { const FileIsADirectory = 'NT_STATUS_FILE_IS_A_DIRECTORY'; const NotADirectory = 'NT_STATUS_NOT_A_DIRECTORY'; const SharingViolation = 'NT_STATUS_SHARING_VIOLATION'; + const InvalidParameter = 'NT_STATUS_INVALID_PARAMETER'; + const RevisionMismatch = 'NT_STATUS_REVISION_MISMATCH'; } diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/Exception.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/Exception.php index 7ac528198a..93f2c1b3e2 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/Exception/Exception.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Exception/Exception.php @@ -14,7 +14,7 @@ class Exception extends \Exception { $message .= ' for ' . $path; } - return new Exception($message, $error); + return new Exception($message, is_string($error) ? 0 : $error); } /** diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidParameterException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidParameterException.php new file mode 100644 index 0000000000..163b571183 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/Exception/InvalidParameterException.php @@ -0,0 +1,10 @@ + + * This file is licensed under the Licensed under the MIT license: + * http://opensource.org/licenses/MIT + */ + +namespace Icewind\SMB\Exception; + +class InvalidParameterException extends InvalidRequestException {} diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/OutOfSpaceException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/OutOfSpaceException.php new file mode 100644 index 0000000000..4c5517a140 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/Exception/OutOfSpaceException.php @@ -0,0 +1,11 @@ + + * This file is licensed under the Licensed under the MIT license: + * http://opensource.org/licenses/MIT + */ + +namespace Icewind\SMB\Exception; + +class OutOfSpaceException extends InvalidRequestException { +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/Exception/RevisionMismatchException.php b/apps/files_external/3rdparty/icewind/smb/src/Exception/RevisionMismatchException.php new file mode 100644 index 0000000000..e898b5a234 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/Exception/RevisionMismatchException.php @@ -0,0 +1,16 @@ + + * This file is licensed under the Licensed under the MIT license: + * http://opensource.org/licenses/MIT + */ + +namespace Icewind\SMB\Exception; + +use Throwable; + +class RevisionMismatchException extends Exception { + public function __construct($message = 'Protocol version mismatch', $code = 0, Throwable $previous = null) { + parent::__construct($message, $code, $previous); + } +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeState.php b/apps/files_external/3rdparty/icewind/smb/src/NativeState.php index 7ddce83185..45e0441d25 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NativeState.php +++ b/apps/files_external/3rdparty/icewind/smb/src/NativeState.php @@ -31,6 +31,7 @@ class NativeState { 17 => '\Icewind\SMB\Exception\AlreadyExistsException', 20 => '\Icewind\SMB\Exception\InvalidTypeException', 21 => '\Icewind\SMB\Exception\InvalidTypeException', + 28 => '\Icewind\SMB\Exception\OutOfSpaceException', 39 => '\Icewind\SMB\Exception\NotEmptyException', 110 => '\Icewind\SMB\Exception\TimedOutException', 111 => '\Icewind\SMB\Exception\ConnectionRefusedException', diff --git a/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php b/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php index 6ad565555b..20ada5cf32 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php +++ b/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php @@ -9,6 +9,8 @@ namespace Icewind\SMB; +use Icewind\SMB\Exception\Exception; + class NotifyHandler implements INotifyHandler { /** * @var Connection @@ -22,6 +24,12 @@ class NotifyHandler implements INotifyHandler { private $listening = true; + // todo replace with static once <5.6 support is dropped + // see error.h + private static $exceptionMap = [ + ErrorCodes::RevisionMismatch => '\Icewind\SMB\Exception\RevisionMismatchException', + ]; + /** * @param Connection $connection * @param string $path @@ -43,6 +51,7 @@ class NotifyHandler implements INotifyHandler { stream_set_blocking($this->connection->getOutputStream(), 0); $lines = []; while (($line = $this->connection->readLine())) { + $this->checkForError($line); $lines[] = $line; } stream_set_blocking($this->connection->getOutputStream(), 1); @@ -59,6 +68,7 @@ class NotifyHandler implements INotifyHandler { public function listen($callback) { if ($this->listening) { $this->connection->read(function ($line) use ($callback) { + $this->checkForError($line); $change = $this->parseChangeLine($line); if ($change) { return $callback($change); @@ -80,6 +90,13 @@ class NotifyHandler implements INotifyHandler { } } + private function checkForError($line) { + if (substr($line, 0, 16) === 'notify returned ') { + $error = substr($line, 16); + throw Exception::fromMap(self::$exceptionMap, $error, 'Notify is not supported with the used smb version'); + } + } + public function stop() { $this->listening = false; $this->connection->close(); diff --git a/apps/files_external/3rdparty/icewind/smb/src/Parser.php b/apps/files_external/3rdparty/icewind/smb/src/Parser.php index 5cc5acbdf5..3142f9c29e 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/Parser.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Parser.php @@ -30,6 +30,7 @@ class Parser { // todo replace with static once <5.6 support is dropped // see error.h private static $exceptionMap = [ + ErrorCodes::LogonFailure => '\Icewind\SMB\Exception\AuthenticationException', ErrorCodes::PathNotFound => '\Icewind\SMB\Exception\NotFoundException', ErrorCodes::ObjectNotFound => '\Icewind\SMB\Exception\NotFoundException', ErrorCodes::NoSuchFile => '\Icewind\SMB\Exception\NotFoundException', @@ -38,7 +39,8 @@ class Parser { ErrorCodes::DirectoryNotEmpty => '\Icewind\SMB\Exception\NotEmptyException', ErrorCodes::FileIsADirectory => '\Icewind\SMB\Exception\InvalidTypeException', ErrorCodes::NotADirectory => '\Icewind\SMB\Exception\InvalidTypeException', - ErrorCodes::SharingViolation => '\Icewind\SMB\Exception\FileInUseException' + ErrorCodes::SharingViolation => '\Icewind\SMB\Exception\FileInUseException', + ErrorCodes::InvalidParameter => '\Icewind\SMB\Exception\InvalidParameterException' ]; /** diff --git a/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php b/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php index e934971643..42923f09ed 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php +++ b/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php @@ -7,6 +7,7 @@ namespace Icewind\SMB; +use Icewind\SMB\Exception\ConnectException; use Icewind\SMB\Exception\ConnectionException; class RawConnection { @@ -25,6 +26,9 @@ class RawConnection { * * $pipes[0] holds STDIN for smbclient * $pipes[1] holds STDOUT for smbclient + * $pipes[3] holds the authfile for smbclient + * $pipes[4] holds the stream for writing files + * $pipes[5] holds the stream for reading files */ private $pipes; @@ -33,32 +37,44 @@ class RawConnection { */ private $process; - public function __construct($command, $env = array()) { + /** + * @var resource|null $authStream + */ + private $authStream = null; + + private $connected = false; + + public function __construct($command, array $env = []) { $this->command = $command; $this->env = $env; - $this->connect(); } - private function connect() { - $descriptorSpec = array( - 0 => array('pipe', 'r'), // child reads from stdin - 1 => array('pipe', 'w'), // child writes to stdout - 2 => array('pipe', 'w'), // child writes to stderr - 3 => array('pipe', 'r'), // child reads from fd#3 - 4 => array('pipe', 'r'), // child reads from fd#4 - 5 => array('pipe', 'w') // child writes to fd#5 - ); + public function connect() { + if (is_null($this->getAuthStream())) { + throw new ConnectException('Authentication not set before connecting'); + } + + $descriptorSpec = [ + 0 => ['pipe', 'r'], // child reads from stdin + 1 => ['pipe', 'w'], // child writes to stdout + 2 => ['pipe', 'w'], // child writes to stderr + 3 => $this->getAuthStream(), // child reads from fd#3 + 4 => ['pipe', 'r'], // child reads from fd#4 + 5 => ['pipe', 'w'] // child writes to fd#5 + ]; + setlocale(LC_ALL, Server::LOCALE); - $env = array_merge($this->env, array( + $env = array_merge($this->env, [ 'CLI_FORCE_INTERACTIVE' => 'y', // Needed or the prompt isn't displayed!! - 'LC_ALL' => Server::LOCALE, - 'LANG' => Server::LOCALE, - 'COLUMNS' => 8192 // prevent smbclient from line-wrapping it's output - )); + 'LC_ALL' => Server::LOCALE, + 'LANG' => Server::LOCALE, + 'COLUMNS' => 8192 // prevent smbclient from line-wrapping it's output + ]); $this->process = proc_open($this->command, $descriptorSpec, $this->pipes, '/', $env); if (!$this->isValid()) { throw new ConnectionException(); } + $this->connected = true; } /** @@ -129,7 +145,7 @@ class RawConnection { } public function getAuthStream() { - return $this->pipes[3]; + return $this->authStream; } public function getFileInputStream() { @@ -143,14 +159,10 @@ class RawConnection { public function writeAuthentication($user, $password) { $auth = ($password === false) ? "username=$user" - : "username=$user\npassword=$password"; + : "username=$user\npassword=$password\n"; - if (fwrite($this->getAuthStream(), $auth) === false) { - fclose($this->getAuthStream()); - return false; - } - fclose($this->getAuthStream()); - return true; + $this->authStream = fopen('php://temp', 'w+'); + fwrite($this->getAuthStream(), $auth); } public function close($terminate = true) { @@ -163,8 +175,8 @@ class RawConnection { $status = proc_get_status($this->process); $ppid = $status['pid']; $pids = preg_split('/\s+/', `ps -o pid --no-heading --ppid $ppid`); - foreach($pids as $pid) { - if(is_numeric($pid)) { + foreach ($pids as $pid) { + if (is_numeric($pid)) { //9 is the SIGKILL signal posix_kill($pid, 9); } diff --git a/apps/files_external/3rdparty/icewind/smb/src/Server.php b/apps/files_external/3rdparty/icewind/smb/src/Server.php index 12692eb4c6..21cc605ed1 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/Server.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Server.php @@ -134,6 +134,7 @@ class Server { ); $connection = new RawConnection($command); $connection->writeAuthentication($this->getUser(), $this->getPassword()); + $connection->connect(); $output = $connection->readAll(); $parser = new Parser($this->timezoneProvider); diff --git a/apps/files_external/3rdparty/icewind/smb/src/Share.php b/apps/files_external/3rdparty/icewind/smb/src/Share.php index ba8bbbbb8c..542eaf0887 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/Share.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Share.php @@ -68,8 +68,9 @@ class Share extends AbstractShare { ); $connection = new Connection($command, $this->parser); $connection->writeAuthentication($this->server->getUser(), $this->server->getPassword()); + $connection->connect(); if (!$connection->isValid()) { - throw new ConnectionException(); + throw new ConnectionException($connection->readLine()); } return $connection; } @@ -88,7 +89,6 @@ class Share extends AbstractShare { protected function reconnect() { $this->connection->reconnect(); - $this->connection->writeAuthentication($this->server->getUser(), $this->server->getPassword()); if (!$this->connection->isValid()) { throw new ConnectionException(); } @@ -318,9 +318,9 @@ class Share extends AbstractShare { $modeString = ''; $modeMap = array( FileInfo::MODE_READONLY => 'r', - FileInfo::MODE_HIDDEN => 'h', - FileInfo::MODE_ARCHIVE => 'a', - FileInfo::MODE_SYSTEM => 's' + FileInfo::MODE_HIDDEN => 'h', + FileInfo::MODE_ARCHIVE => 'a', + FileInfo::MODE_SYSTEM => 's' ); foreach ($modeMap as $modeByte => $string) { if ($mode & $modeByte) { @@ -413,6 +413,7 @@ class Share extends AbstractShare { } $path = str_replace('/', '\\', $path); $path = str_replace('"', '^"', $path); + $path = ltrim($path, '\\'); return '"' . $path . '"'; }