"classmap-authoritative": true
},
"require": {
- "icewind/smb": "2.0.2",
+ "icewind/smb": "2.0.3",
"icewind/streams": "0.5.2"
}
}
"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": {
}
],
"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",
class ClassLoader
{
// PSR-4
- private $prefixLengthsPsr4 = array();
+ private $firstCharsPsr4 = array();
+ private $prefixLengthsPsr4 = array(); // For BC with legacy static maps
private $prefixDirsPsr4 = array();
private $fallbackDirsPsr4 = array();
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
// Register directories for a new namespace.
- $length = strlen($prefix);
- if ('\\' !== $prefix[$length - 1]) {
+ if ('\\' !== substr($prefix, -1)) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->firstCharsPsr4[$prefix[0]] = true;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
- $length = strlen($prefix);
- if ('\\' !== $prefix[$length - 1]) {
+ if ('\\' !== substr($prefix, -1)) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
- $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->firstCharsPsr4[$prefix[0]] = true;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
- if (isset($this->prefixLengthsPsr4[$first])) {
+ if (isset($this->firstCharsPsr4[$first]) || isset($this->prefixLengthsPsr4[$first])) {
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath.'\\';
if (isset($this->prefixDirsPsr4[$search])) {
+ $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {
- $length = $this->prefixLengthsPsr4[$first][$search];
- if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+ if (file_exists($file = $dir . $pathEnd)) {
return $file;
}
}
'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',
'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',
class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3
{
- public static $prefixLengthsPsr4 = array (
- 'I' =>
- array (
- 'Icewind\\Streams\\Tests\\' => 22,
- 'Icewind\\Streams\\' => 16,
- 'Icewind\\SMB\\Test\\' => 17,
- 'Icewind\\SMB\\' => 12,
- ),
+ public static $firstCharsPsr4 = array (
+ 'I' => true,
);
public static $prefixDirsPsr4 = array (
'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',
'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',
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
- $loader->prefixLengthsPsr4 = ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3::$prefixLengthsPsr4;
+ $loader->firstCharsPsr4 = ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3::$firstCharsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3::$classMap;
[
{
- "name": "icewind/streams",
- "version": "0.5.2",
- "version_normalized": "0.5.2.0",
+ "name": "icewind/smb",
+ "version": "v2.0.3",
+ "version_normalized": "2.0.3.0",
"source": {
"type": "git",
- "url": "https://github.com/icewind1991/Streams.git",
- "reference": "6bfd2fdbd99319f5e010d0a684409189a562cb1e"
+ "url": "https://github.com/icewind1991/SMB.git",
+ "reference": "8394551bf29a37b884edb33dae8acde369177f32"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/icewind1991/Streams/zipball/6bfd2fdbd99319f5e010d0a684409189a562cb1e",
- "reference": "6bfd2fdbd99319f5e010d0a684409189a562cb1e",
+ "url": "https://api.github.com/repos/icewind1991/SMB/zipball/8394551bf29a37b884edb33dae8acde369177f32",
+ "reference": "8394551bf29a37b884edb33dae8acde369177f32",
"shasum": ""
},
"require": {
- "php": ">=5.3"
+ "icewind/streams": ">=0.2.0",
+ "php": ">=5.4"
},
"require-dev": {
- "phpunit/phpunit": "^4.8",
- "satooshi/php-coveralls": "v1.0.0"
+ "phpunit/phpunit": "^4.8"
},
- "time": "2016-12-02T14:21:23+00:00",
+ "time": "2017-10-18T16:21:10+00:00",
"type": "library",
- "installation-source": "dist",
+ "installation-source": "source",
"autoload": {
"psr-4": {
- "Icewind\\Streams\\Tests\\": "tests/",
- "Icewind\\Streams\\": "src/"
+ "Icewind\\SMB\\": "src/",
+ "Icewind\\SMB\\Test\\": "tests/"
}
},
"notification-url": "https://packagist.org/downloads/",
"email": "icewind@owncloud.com"
}
],
- "description": "A set of generic stream wrappers"
+ "description": "php wrapper for smbclient and libsmbclient-php"
},
{
- "name": "icewind/smb",
- "version": "v2.0.2",
- "version_normalized": "2.0.2.0",
+ "name": "icewind/streams",
+ "version": "0.5.2",
+ "version_normalized": "0.5.2.0",
"source": {
"type": "git",
- "url": "https://github.com/icewind1991/SMB.git",
- "reference": "6691355d9314ac3a8cb9ec9446e4c26e8aab09d0"
+ "url": "https://github.com/icewind1991/Streams.git",
+ "reference": "6bfd2fdbd99319f5e010d0a684409189a562cb1e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/icewind1991/SMB/zipball/6691355d9314ac3a8cb9ec9446e4c26e8aab09d0",
- "reference": "6691355d9314ac3a8cb9ec9446e4c26e8aab09d0",
+ "url": "https://api.github.com/repos/icewind1991/Streams/zipball/6bfd2fdbd99319f5e010d0a684409189a562cb1e",
+ "reference": "6bfd2fdbd99319f5e010d0a684409189a562cb1e",
"shasum": ""
},
"require": {
- "icewind/streams": ">=0.2.0",
- "php": ">=5.4"
+ "php": ">=5.3"
},
"require-dev": {
- "phpunit/phpunit": "^4.8"
+ "phpunit/phpunit": "^4.8",
+ "satooshi/php-coveralls": "v1.0.0"
},
- "time": "2017-08-16T16:08:57+00:00",
+ "time": "2016-12-02T14:21:23+00:00",
"type": "library",
- "installation-source": "source",
+ "installation-source": "dist",
"autoload": {
"psr-4": {
- "Icewind\\SMB\\": "src/",
- "Icewind\\SMB\\Test\\": "tests/"
+ "Icewind\\Streams\\Tests\\": "tests/",
+ "Icewind\\Streams\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"email": "icewind@owncloud.com"
}
],
- "description": "php wrapper for smbclient and libsmbclient-php"
+ "description": "A set of generic stream wrappers"
}
]
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';
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';
}
$message .= ' for ' . $path;
}
- return new Exception($message, $error);
+ return new Exception($message, is_string($error) ? 0 : $error);
}
/**
--- /dev/null
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\SMB\Exception;
+
+class InvalidParameterException extends InvalidRequestException {}
--- /dev/null
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Licensed under the MIT license:
+ * http://opensource.org/licenses/MIT
+ */
+
+namespace Icewind\SMB\Exception;
+
+class OutOfSpaceException extends InvalidRequestException {
+}
--- /dev/null
+<?php
+/**
+ * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
+ * 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);
+ }
+}
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',
namespace Icewind\SMB;
+use Icewind\SMB\Exception\Exception;
+
class NotifyHandler implements INotifyHandler {
/**
* @var Connection
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
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);
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);
}
}
+ 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();
// 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',
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'
];
/**
namespace Icewind\SMB;
+use Icewind\SMB\Exception\ConnectException;
use Icewind\SMB\Exception\ConnectionException;
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;
*/
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;
}
/**
}
public function getAuthStream() {
- return $this->pipes[3];
+ return $this->authStream;
}
public function getFileInputStream() {
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) {
$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);
}
);
$connection = new RawConnection($command);
$connection->writeAuthentication($this->getUser(), $this->getPassword());
+ $connection->connect();
$output = $connection->readAll();
$parser = new Parser($this->timezoneProvider);
);
$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;
}
protected function reconnect() {
$this->connection->reconnect();
- $this->connection->writeAuthentication($this->server->getUser(), $this->server->getPassword());
if (!$this->connection->isValid()) {
throw new ConnectionException();
}
$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) {
}
$path = str_replace('/', '\\', $path);
$path = str_replace('"', '^"', $path);
+ $path = ltrim($path, '\\');
return '"' . $path . '"';
}