diff options
author | Robin Appelman <robin@icewind.nl> | 2018-06-21 16:02:51 +0200 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2018-06-21 16:02:51 +0200 |
commit | 4a424f86db7ceeb9f90e925cd76d890c5487af64 (patch) | |
tree | 227e1a2b75c5dc438f5db51c1fa59ccba6cad7d7 | |
parent | a10690c1e9cb3a4b2c84f97e53b798640aae5101 (diff) | |
download | nextcloud-server-4a424f86db7ceeb9f90e925cd76d890c5487af64.tar.gz nextcloud-server-4a424f86db7ceeb9f90e925cd76d890c5487af64.zip |
update icewind/smb to 3.0.0
Signed-off-by: Robin Appelman <robin@icewind.nl>
34 files changed, 840 insertions, 433 deletions
diff --git a/apps/files_external/3rdparty/composer.json b/apps/files_external/3rdparty/composer.json index 9655a8f1564..537159bbf66 100644 --- a/apps/files_external/3rdparty/composer.json +++ b/apps/files_external/3rdparty/composer.json @@ -9,6 +9,6 @@ }, "require": { "icewind/streams": "0.5.2", - "icewind/smb": "2.0.5" + "icewind/smb": "3.0.0" } } diff --git a/apps/files_external/3rdparty/composer.lock b/apps/files_external/3rdparty/composer.lock index f3987e2c1e3..7bfcdba3d2f 100644 --- a/apps/files_external/3rdparty/composer.lock +++ b/apps/files_external/3rdparty/composer.lock @@ -1,31 +1,31 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "53a1e7ab19e98c20c720cab0340bc56a", + "content-hash": "0235b6f1a4131c9312afef7a58f3a80e", "packages": [ { "name": "icewind/smb", - "version": "v2.0.5", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/icewind1991/SMB.git", - "reference": "b888dd81bd05532677e1469849d9065011256a33" + "reference": "0d31da4757a37d322e1e181f2286e8a4c89fbc0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/SMB/zipball/b888dd81bd05532677e1469849d9065011256a33", - "reference": "b888dd81bd05532677e1469849d9065011256a33", + "url": "https://api.github.com/repos/icewind1991/SMB/zipball/0d31da4757a37d322e1e181f2286e8a4c89fbc0c", + "reference": "0d31da4757a37d322e1e181f2286e8a4c89fbc0c", "shasum": "" }, "require": { "icewind/streams": ">=0.2.0", - "php": ">=5.4" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^5.7" }, "type": "library", "autoload": { @@ -45,7 +45,7 @@ } ], "description": "php wrapper for smbclient and libsmbclient-php", - "time": "2018-03-28T13:51:31+00:00" + "time": "2018-05-24T09:48:51+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 b4a1d64eb0f..d2e658d9f61 100644 --- a/apps/files_external/3rdparty/composer/autoload_classmap.php +++ b/apps/files_external/3rdparty/composer/autoload_classmap.php @@ -6,10 +6,11 @@ $vendorDir = dirname(dirname(__FILE__)); $baseDir = $vendorDir; return array( + 'Icewind\\SMB\\AbstractServer' => $vendorDir . '/icewind/smb/src/AbstractServer.php', 'Icewind\\SMB\\AbstractShare' => $vendorDir . '/icewind/smb/src/AbstractShare.php', + 'Icewind\\SMB\\AnonymousAuth' => $vendorDir . '/icewind/smb/src/AnonymousAuth.php', + 'Icewind\\SMB\\BasicAuth' => $vendorDir . '/icewind/smb/src/BasicAuth.php', 'Icewind\\SMB\\Change' => $vendorDir . '/icewind/smb/src/Change.php', - 'Icewind\\SMB\\Connection' => $vendorDir . '/icewind/smb/src/Connection.php', - 'Icewind\\SMB\\ErrorCodes' => $vendorDir . '/icewind/smb/src/ErrorCodes.php', 'Icewind\\SMB\\Exception\\AccessDeniedException' => $vendorDir . '/icewind/smb/src/Exception/AccessDeniedException.php', 'Icewind\\SMB\\Exception\\AlreadyExistsException' => $vendorDir . '/icewind/smb/src/Exception/AlreadyExistsException.php', 'Icewind\\SMB\\Exception\\AuthenticationException' => $vendorDir . '/icewind/smb/src/Exception/AuthenticationException.php', @@ -35,32 +36,38 @@ return array( '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\\IAuth' => $vendorDir . '/icewind/smb/src/IAuth.php', 'Icewind\\SMB\\IFileInfo' => $vendorDir . '/icewind/smb/src/IFileInfo.php', 'Icewind\\SMB\\INotifyHandler' => $vendorDir . '/icewind/smb/src/INotifyHandler.php', + 'Icewind\\SMB\\IServer' => $vendorDir . '/icewind/smb/src/IServer.php', 'Icewind\\SMB\\IShare' => $vendorDir . '/icewind/smb/src/IShare.php', - 'Icewind\\SMB\\NativeFileInfo' => $vendorDir . '/icewind/smb/src/NativeFileInfo.php', - 'Icewind\\SMB\\NativeReadStream' => $vendorDir . '/icewind/smb/src/NativeReadStream.php', - 'Icewind\\SMB\\NativeServer' => $vendorDir . '/icewind/smb/src/NativeServer.php', - 'Icewind\\SMB\\NativeShare' => $vendorDir . '/icewind/smb/src/NativeShare.php', - 'Icewind\\SMB\\NativeState' => $vendorDir . '/icewind/smb/src/NativeState.php', - 'Icewind\\SMB\\NativeStream' => $vendorDir . '/icewind/smb/src/NativeStream.php', - 'Icewind\\SMB\\NativeWriteStream' => $vendorDir . '/icewind/smb/src/NativeWriteStream.php', - 'Icewind\\SMB\\NotifyHandler' => $vendorDir . '/icewind/smb/src/NotifyHandler.php', - 'Icewind\\SMB\\Parser' => $vendorDir . '/icewind/smb/src/Parser.php', - 'Icewind\\SMB\\RawConnection' => $vendorDir . '/icewind/smb/src/RawConnection.php', - 'Icewind\\SMB\\Server' => $vendorDir . '/icewind/smb/src/Server.php', - 'Icewind\\SMB\\Share' => $vendorDir . '/icewind/smb/src/Share.php', + 'Icewind\\SMB\\KerberosAuth' => $vendorDir . '/icewind/smb/src/KerberosAuth.php', + 'Icewind\\SMB\\Native\\NativeFileInfo' => $vendorDir . '/icewind/smb/src/Native/NativeFileInfo.php', + 'Icewind\\SMB\\Native\\NativeReadStream' => $vendorDir . '/icewind/smb/src/Native/NativeReadStream.php', + 'Icewind\\SMB\\Native\\NativeServer' => $vendorDir . '/icewind/smb/src/Native/NativeServer.php', + 'Icewind\\SMB\\Native\\NativeShare' => $vendorDir . '/icewind/smb/src/Native/NativeShare.php', + 'Icewind\\SMB\\Native\\NativeState' => $vendorDir . '/icewind/smb/src/Native/NativeState.php', + 'Icewind\\SMB\\Native\\NativeStream' => $vendorDir . '/icewind/smb/src/Native/NativeStream.php', + 'Icewind\\SMB\\Native\\NativeWriteStream' => $vendorDir . '/icewind/smb/src/Native/NativeWriteStream.php', + 'Icewind\\SMB\\ServerFactory' => $vendorDir . '/icewind/smb/src/ServerFactory.php', 'Icewind\\SMB\\System' => $vendorDir . '/icewind/smb/src/System.php', 'Icewind\\SMB\\Test\\AbstractShareTest' => $vendorDir . '/icewind/smb/tests/AbstractShareTest.php', - 'Icewind\\SMB\\Test\\NativeShareTestTest' => $vendorDir . '/icewind/smb/tests/NativeShareTestTest.php', + 'Icewind\\SMB\\Test\\NativeShareTest' => $vendorDir . '/icewind/smb/tests/NativeShareTest.php', 'Icewind\\SMB\\Test\\NativeStreamTest' => $vendorDir . '/icewind/smb/tests/NativeStreamTest.php', 'Icewind\\SMB\\Test\\NotifyHandlerTest' => $vendorDir . '/icewind/smb/tests/NotifyHandlerTest.php', 'Icewind\\SMB\\Test\\ParserTest' => $vendorDir . '/icewind/smb/tests/ParserTest.php', 'Icewind\\SMB\\Test\\ServerTest' => $vendorDir . '/icewind/smb/tests/ServerTest.php', - 'Icewind\\SMB\\Test\\ShareTestTest' => $vendorDir . '/icewind/smb/tests/ShareTestTest.php', + 'Icewind\\SMB\\Test\\ShareTest' => $vendorDir . '/icewind/smb/tests/ShareTest.php', 'Icewind\\SMB\\Test\\TestCase' => $vendorDir . '/icewind/smb/tests/TestCase.php', 'Icewind\\SMB\\TimeZoneProvider' => $vendorDir . '/icewind/smb/src/TimeZoneProvider.php', + 'Icewind\\SMB\\Wrapped\\Connection' => $vendorDir . '/icewind/smb/src/Wrapped/Connection.php', + 'Icewind\\SMB\\Wrapped\\ErrorCodes' => $vendorDir . '/icewind/smb/src/Wrapped/ErrorCodes.php', + 'Icewind\\SMB\\Wrapped\\FileInfo' => $vendorDir . '/icewind/smb/src/Wrapped/FileInfo.php', + 'Icewind\\SMB\\Wrapped\\NotifyHandler' => $vendorDir . '/icewind/smb/src/Wrapped/NotifyHandler.php', + 'Icewind\\SMB\\Wrapped\\Parser' => $vendorDir . '/icewind/smb/src/Wrapped/Parser.php', + 'Icewind\\SMB\\Wrapped\\RawConnection' => $vendorDir . '/icewind/smb/src/Wrapped/RawConnection.php', + 'Icewind\\SMB\\Wrapped\\Server' => $vendorDir . '/icewind/smb/src/Wrapped/Server.php', + 'Icewind\\SMB\\Wrapped\\Share' => $vendorDir . '/icewind/smb/src/Wrapped/Share.php', 'Icewind\\Streams\\CallbackWrapper' => $vendorDir . '/icewind/streams/src/CallbackWrapper.php', 'Icewind\\Streams\\Directory' => $vendorDir . '/icewind/streams/src/Directory.php', 'Icewind\\Streams\\DirectoryFilter' => $vendorDir . '/icewind/streams/src/DirectoryFilter.php', diff --git a/apps/files_external/3rdparty/composer/autoload_static.php b/apps/files_external/3rdparty/composer/autoload_static.php index 68698ad1bf8..3234d89e5b9 100644 --- a/apps/files_external/3rdparty/composer/autoload_static.php +++ b/apps/files_external/3rdparty/composer/autoload_static.php @@ -36,10 +36,11 @@ class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3 ); public static $classMap = array ( + 'Icewind\\SMB\\AbstractServer' => __DIR__ . '/..' . '/icewind/smb/src/AbstractServer.php', 'Icewind\\SMB\\AbstractShare' => __DIR__ . '/..' . '/icewind/smb/src/AbstractShare.php', + 'Icewind\\SMB\\AnonymousAuth' => __DIR__ . '/..' . '/icewind/smb/src/AnonymousAuth.php', + 'Icewind\\SMB\\BasicAuth' => __DIR__ . '/..' . '/icewind/smb/src/BasicAuth.php', 'Icewind\\SMB\\Change' => __DIR__ . '/..' . '/icewind/smb/src/Change.php', - 'Icewind\\SMB\\Connection' => __DIR__ . '/..' . '/icewind/smb/src/Connection.php', - 'Icewind\\SMB\\ErrorCodes' => __DIR__ . '/..' . '/icewind/smb/src/ErrorCodes.php', 'Icewind\\SMB\\Exception\\AccessDeniedException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/AccessDeniedException.php', 'Icewind\\SMB\\Exception\\AlreadyExistsException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/AlreadyExistsException.php', 'Icewind\\SMB\\Exception\\AuthenticationException' => __DIR__ . '/..' . '/icewind/smb/src/Exception/AuthenticationException.php', @@ -65,32 +66,38 @@ class ComposerStaticInit98fe9b281934250b3a93f69a5ce843b3 '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\\IAuth' => __DIR__ . '/..' . '/icewind/smb/src/IAuth.php', 'Icewind\\SMB\\IFileInfo' => __DIR__ . '/..' . '/icewind/smb/src/IFileInfo.php', 'Icewind\\SMB\\INotifyHandler' => __DIR__ . '/..' . '/icewind/smb/src/INotifyHandler.php', + 'Icewind\\SMB\\IServer' => __DIR__ . '/..' . '/icewind/smb/src/IServer.php', 'Icewind\\SMB\\IShare' => __DIR__ . '/..' . '/icewind/smb/src/IShare.php', - 'Icewind\\SMB\\NativeFileInfo' => __DIR__ . '/..' . '/icewind/smb/src/NativeFileInfo.php', - 'Icewind\\SMB\\NativeReadStream' => __DIR__ . '/..' . '/icewind/smb/src/NativeReadStream.php', - 'Icewind\\SMB\\NativeServer' => __DIR__ . '/..' . '/icewind/smb/src/NativeServer.php', - 'Icewind\\SMB\\NativeShare' => __DIR__ . '/..' . '/icewind/smb/src/NativeShare.php', - 'Icewind\\SMB\\NativeState' => __DIR__ . '/..' . '/icewind/smb/src/NativeState.php', - 'Icewind\\SMB\\NativeStream' => __DIR__ . '/..' . '/icewind/smb/src/NativeStream.php', - 'Icewind\\SMB\\NativeWriteStream' => __DIR__ . '/..' . '/icewind/smb/src/NativeWriteStream.php', - 'Icewind\\SMB\\NotifyHandler' => __DIR__ . '/..' . '/icewind/smb/src/NotifyHandler.php', - 'Icewind\\SMB\\Parser' => __DIR__ . '/..' . '/icewind/smb/src/Parser.php', - 'Icewind\\SMB\\RawConnection' => __DIR__ . '/..' . '/icewind/smb/src/RawConnection.php', - 'Icewind\\SMB\\Server' => __DIR__ . '/..' . '/icewind/smb/src/Server.php', - 'Icewind\\SMB\\Share' => __DIR__ . '/..' . '/icewind/smb/src/Share.php', + 'Icewind\\SMB\\KerberosAuth' => __DIR__ . '/..' . '/icewind/smb/src/KerberosAuth.php', + 'Icewind\\SMB\\Native\\NativeFileInfo' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeFileInfo.php', + 'Icewind\\SMB\\Native\\NativeReadStream' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeReadStream.php', + 'Icewind\\SMB\\Native\\NativeServer' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeServer.php', + 'Icewind\\SMB\\Native\\NativeShare' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeShare.php', + 'Icewind\\SMB\\Native\\NativeState' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeState.php', + 'Icewind\\SMB\\Native\\NativeStream' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeStream.php', + 'Icewind\\SMB\\Native\\NativeWriteStream' => __DIR__ . '/..' . '/icewind/smb/src/Native/NativeWriteStream.php', + 'Icewind\\SMB\\ServerFactory' => __DIR__ . '/..' . '/icewind/smb/src/ServerFactory.php', 'Icewind\\SMB\\System' => __DIR__ . '/..' . '/icewind/smb/src/System.php', 'Icewind\\SMB\\Test\\AbstractShareTest' => __DIR__ . '/..' . '/icewind/smb/tests/AbstractShareTest.php', - 'Icewind\\SMB\\Test\\NativeShareTestTest' => __DIR__ . '/..' . '/icewind/smb/tests/NativeShareTestTest.php', + 'Icewind\\SMB\\Test\\NativeShareTest' => __DIR__ . '/..' . '/icewind/smb/tests/NativeShareTest.php', 'Icewind\\SMB\\Test\\NativeStreamTest' => __DIR__ . '/..' . '/icewind/smb/tests/NativeStreamTest.php', 'Icewind\\SMB\\Test\\NotifyHandlerTest' => __DIR__ . '/..' . '/icewind/smb/tests/NotifyHandlerTest.php', 'Icewind\\SMB\\Test\\ParserTest' => __DIR__ . '/..' . '/icewind/smb/tests/ParserTest.php', 'Icewind\\SMB\\Test\\ServerTest' => __DIR__ . '/..' . '/icewind/smb/tests/ServerTest.php', - 'Icewind\\SMB\\Test\\ShareTestTest' => __DIR__ . '/..' . '/icewind/smb/tests/ShareTestTest.php', + 'Icewind\\SMB\\Test\\ShareTest' => __DIR__ . '/..' . '/icewind/smb/tests/ShareTest.php', 'Icewind\\SMB\\Test\\TestCase' => __DIR__ . '/..' . '/icewind/smb/tests/TestCase.php', 'Icewind\\SMB\\TimeZoneProvider' => __DIR__ . '/..' . '/icewind/smb/src/TimeZoneProvider.php', + 'Icewind\\SMB\\Wrapped\\Connection' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/Connection.php', + 'Icewind\\SMB\\Wrapped\\ErrorCodes' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/ErrorCodes.php', + 'Icewind\\SMB\\Wrapped\\FileInfo' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/FileInfo.php', + 'Icewind\\SMB\\Wrapped\\NotifyHandler' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/NotifyHandler.php', + 'Icewind\\SMB\\Wrapped\\Parser' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/Parser.php', + 'Icewind\\SMB\\Wrapped\\RawConnection' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/RawConnection.php', + 'Icewind\\SMB\\Wrapped\\Server' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/Server.php', + 'Icewind\\SMB\\Wrapped\\Share' => __DIR__ . '/..' . '/icewind/smb/src/Wrapped/Share.php', 'Icewind\\Streams\\CallbackWrapper' => __DIR__ . '/..' . '/icewind/streams/src/CallbackWrapper.php', 'Icewind\\Streams\\Directory' => __DIR__ . '/..' . '/icewind/streams/src/Directory.php', 'Icewind\\Streams\\DirectoryFilter' => __DIR__ . '/..' . '/icewind/streams/src/DirectoryFilter.php', diff --git a/apps/files_external/3rdparty/composer/installed.json b/apps/files_external/3rdparty/composer/installed.json index 0ae6be99ffd..3b2870a13bf 100644 --- a/apps/files_external/3rdparty/composer/installed.json +++ b/apps/files_external/3rdparty/composer/installed.json @@ -1,27 +1,27 @@ [ { "name": "icewind/smb", - "version": "v2.0.5", - "version_normalized": "2.0.5.0", + "version": "v3.0.0", + "version_normalized": "3.0.0.0", "source": { "type": "git", "url": "https://github.com/icewind1991/SMB.git", - "reference": "b888dd81bd05532677e1469849d9065011256a33" + "reference": "0d31da4757a37d322e1e181f2286e8a4c89fbc0c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/icewind1991/SMB/zipball/b888dd81bd05532677e1469849d9065011256a33", - "reference": "b888dd81bd05532677e1469849d9065011256a33", + "url": "https://api.github.com/repos/icewind1991/SMB/zipball/0d31da4757a37d322e1e181f2286e8a4c89fbc0c", + "reference": "0d31da4757a37d322e1e181f2286e8a4c89fbc0c", "shasum": "" }, "require": { "icewind/streams": ">=0.2.0", - "php": ">=5.4" + "php": ">=5.6" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^5.7" }, - "time": "2018-03-28T13:51:31+00:00", + "time": "2018-05-24T09:48:51+00:00", "type": "library", "installation-source": "dist", "autoload": { diff --git a/apps/files_external/3rdparty/icewind/smb/README.md b/apps/files_external/3rdparty/icewind/smb/README.md index c8f31193c83..fd47f1a4393 100644 --- a/apps/files_external/3rdparty/icewind/smb/README.md +++ b/apps/files_external/3rdparty/icewind/smb/README.md @@ -16,45 +16,58 @@ PHP wrapper for `smbclient` and [`libsmbclient-php`](https://github.com/eduardok Examples ---- -### Upload a file ### +### Connect to a share ### ```php <?php -use Icewind\SMB\Server; +use Icewind\SMB\ServerFactory; +use Icewind\SMB\BasicAuth; require('vendor/autoload.php'); -$fileToUpload = __FILE__; +$serverFactory = new ServerFactory(); +$auth = new BasicAuth('test', 'workgroup', 'test'); +$server = $serverFactory->createServer('localhost', $auth); -$server = new Server('localhost', 'test', 'test'); $share = $server->getShare('test'); -$share->put($fileToUpload, 'example.txt'); ``` -### Download a file ### +The server factory will automatically pick between the `smbclient` and `libsmbclient-php` +based backend depending on what is available. + +### Using anonymous authentication ### ```php -<?php -use Icewind\SMB\Server; +$serverFactory = new ServerFactory(); +$auth = new AnonymousAuth(); +$server = $serverFactory->createServer('localhost', $auth); +``` -require('vendor/autoload.php'); +### Using kerberos authentication ### + +```php +$serverFactory = new ServerFactory(); +$auth = new KerberosAuth(); +$server = $serverFactory->createServer('localhost', $auth); +``` -$target = __DIR__ . '/target.txt'; +Note that this requires a valid kerberos ticket to already be available for php -$server = new Server('localhost', 'test', 'test'); -$share = $server->getShare('test'); -$share->get('example.txt', $target); +### Upload a file ### + +```php +$share->put($fileToUpload, 'example.txt'); ``` -### List shares on the remote server ### +### Download a file ### ```php -<?php -use Icewind\SMB\Server; +$share->get('example.txt', $target); +``` -require('vendor/autoload.php'); +### List shares on the remote server ### -$server = new Server('localhost', 'test', 'test'); +```php $shares = $server->listShares(); foreach ($shares as $share) { @@ -65,13 +78,6 @@ foreach ($shares as $share) { ### List the content of a folder ### ```php -<?php -use Icewind\SMB\Server; - -require('vendor/autoload.php'); - -$server = new Server('localhost', 'test', 'test'); -$share = $server->getShare('test'); $content = $share->dir('test'); foreach ($content as $info) { @@ -83,14 +89,6 @@ foreach ($content as $info) { ### Using read streams ```php -<?php -use Icewind\SMB\Server; - -require('vendor/autoload.php'); - -$server = new Server('localhost', 'test', 'test'); -$share = $server->getShare('test'); - $fh = $share->read('test.txt'); echo fread($fh, 4086); fclose($fh); @@ -99,54 +97,27 @@ fclose($fh); ### Using write streams ```php -<?php -use Icewind\SMB\Server; - -require('vendor/autoload.php'); - -$server = new Server('localhost', 'test', 'test'); -$share = $server->getShare('test'); - $fh = $share->write('test.txt'); fwrite($fh, 'bar'); fclose($fh); ``` -### Using libsmbclient-php ### - -Install [libsmbclient-php](https://github.com/eduardok/libsmbclient-php) - -```php -<?php -use Icewind\SMB\Server; -use Icewind\SMB\NativeServer; - -require('vendor/autoload.php'); - -$fileToUpload = __FILE__; - -if (Server::NativeAvailable()) { - $server = new NativeServer('localhost', 'test', 'test'); -} else { - echo 'libsmbclient-php not available, falling back to wrapping smbclient'; - $server = new Server('localhost', 'test', 'test'); -} -$share = $server->getShare('test'); -$share->put($fileToUpload, 'example.txt'); -``` - ### Using notify ```php -<?php -use Icewind\SMB\Server; - -require('vendor/autoload.php'); - -$server = new Server('localhost', 'test', 'test'); -$share = $server->getShare('test'); - $share->notify('')->listen(function (\Icewind\SMB\Change $change) { echo $change->getCode() . ': ' . $change->getPath() . "\n"; }); ``` + +## Testing SMB + +Use the following steps to check if the library can connect to your SMB share. + +1. Clone this repository or download the source as [zip](https://github.com/icewind1991/SMB/archive/master.zip) +2. Make sure [composer](https://getcomposer.org/) is installed +3. Run `composer install` in the root of the repository +4. Edit `example.php` with the relevant settings for your share. +5. Run `php example.php` + +If everything works correctly then the contents of the share should be outputted. diff --git a/apps/files_external/3rdparty/icewind/smb/composer.json b/apps/files_external/3rdparty/icewind/smb/composer.json index 8374f564bf1..708c59bc725 100644 --- a/apps/files_external/3rdparty/icewind/smb/composer.json +++ b/apps/files_external/3rdparty/icewind/smb/composer.json @@ -9,11 +9,11 @@ } ], "require" : { - "php": ">=5.4", + "php": ">=5.6", "icewind/streams": ">=0.2.0" }, "require-dev": { - "phpunit/phpunit": "^4.8" + "phpunit/phpunit": "^5.7" }, "autoload" : { "psr-4": { diff --git a/apps/files_external/3rdparty/icewind/smb/src/AbstractServer.php b/apps/files_external/3rdparty/icewind/smb/src/AbstractServer.php new file mode 100644 index 00000000000..7fa87a59573 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/AbstractServer.php @@ -0,0 +1,85 @@ +<?php +/** + * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Icewind\SMB; + + +abstract class AbstractServer implements IServer { + const LOCALE = 'en_US.UTF-8'; + + /** + * @var string $host + */ + protected $host; + + /** + * @var IAuth $user + */ + protected $auth; + + /** + * @var \Icewind\SMB\System + */ + protected $system; + + /** + * @var TimeZoneProvider + */ + protected $timezoneProvider; + + /** + * @param string $host + * @param IAuth $auth + * @param System $system + * @param TimeZoneProvider $timeZoneProvider + */ + public function __construct($host, IAuth $auth, System $system, TimeZoneProvider $timeZoneProvider) { + $this->host = $host; + $this->auth = $auth; + $this->system = $system; + $this->timezoneProvider = $timeZoneProvider; + } + + /** + * @return IAuth + */ + public function getAuth() { + return $this->auth; + } + + /** + * return string + */ + public function getHost() { + return $this->host; + } + + /** + * @return string + */ + public function getTimeZone() { + return $this->timezoneProvider->get(); + } + + public function getSystem() { + return $this->system; + } +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/AnonymousAuth.php b/apps/files_external/3rdparty/icewind/smb/src/AnonymousAuth.php new file mode 100644 index 00000000000..6d1feacf1ee --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/AnonymousAuth.php @@ -0,0 +1,45 @@ +<?php +/** + * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Icewind\SMB; + + +class AnonymousAuth implements IAuth { + public function getUsername() { + return null; + } + + public function getWorkgroup() { + return 'dummy'; + } + + public function getPassword() { + return null; + } + + public function getExtraCommandLineArguments() { + return '-N'; + } + + public function setExtraSmbClientOptions($smbClientState) { + smbclient_option_set($smbClientState, SMBCLIENT_OPT_AUTO_ANONYMOUS_LOGIN, true); + } +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/BasicAuth.php b/apps/files_external/3rdparty/icewind/smb/src/BasicAuth.php new file mode 100644 index 00000000000..0032dc53034 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/BasicAuth.php @@ -0,0 +1,66 @@ +<?php +/** + * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Icewind\SMB; + + +class BasicAuth implements IAuth { + /** @var string */ + private $username; + /** @var string */ + private $workgroup; + /** @var string */ + private $password; + + /** + * BasicAuth constructor. + * + * @param string $username + * @param string $workgroup + * @param string $password + */ + public function __construct($username, $workgroup, $password) { + $this->username = $username; + $this->workgroup = $workgroup; + $this->password = $password; + } + + public function getUsername() { + return $this->username; + } + + public function getWorkgroup() { + return $this->workgroup; + } + + public function getPassword() { + return $this->password; + } + + public function getExtraCommandLineArguments() { + return ($this->workgroup) ? '-W ' . escapeshellarg($this->workgroup) : ''; + } + + public function setExtraSmbClientOptions($smbClientState) { + // noop + } + +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/IAuth.php b/apps/files_external/3rdparty/icewind/smb/src/IAuth.php new file mode 100644 index 00000000000..731b315ebaa --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/IAuth.php @@ -0,0 +1,53 @@ +<?php +/** + * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Icewind\SMB; + +interface IAuth { + /** + * @return string|null + */ + public function getUsername(); + + /** + * @return string|null + */ + public function getWorkgroup(); + + /** + * @return string|null + */ + public function getPassword(); + + /** + * Any extra command line option for smbclient that are required + * + * @return string + */ + public function getExtraCommandLineArguments(); + + /** + * Set any extra options for libsmbclient that are required + * + * @param resource $smbClientState + */ + public function setExtraSmbClientOptions($smbClientState); +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/IFileInfo.php b/apps/files_external/3rdparty/icewind/smb/src/IFileInfo.php index 16ea8cfbd04..ae8acd3a3db 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/IFileInfo.php +++ b/apps/files_external/3rdparty/icewind/smb/src/IFileInfo.php @@ -8,6 +8,19 @@ namespace Icewind\SMB; interface IFileInfo { + /* + * Mappings of the DOS mode bits, as returned by smbc_getxattr() when the + * attribute name "system.dos_attr.mode" (or "system.dos_attr.*" or + * "system.*") is specified. + */ + const MODE_READONLY = 0x01; + const MODE_HIDDEN = 0x02; + const MODE_SYSTEM = 0x04; + const MODE_VOLUME_ID = 0x08; + const MODE_DIRECTORY = 0x10; + const MODE_ARCHIVE = 0x20; + const MODE_NORMAL = 0x80; + /** * @return string */ diff --git a/apps/files_external/3rdparty/icewind/smb/src/IServer.php b/apps/files_external/3rdparty/icewind/smb/src/IServer.php new file mode 100644 index 00000000000..2c8d5c67de2 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/IServer.php @@ -0,0 +1,64 @@ +<?php +/** + * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Icewind\SMB; + +interface IServer { + /** + * @return IAuth + */ + public function getAuth(); + + /** + * @return string + */ + public function getHost(); + + /** + * @return \Icewind\SMB\IShare[] + * + * @throws \Icewind\SMB\Exception\AuthenticationException + * @throws \Icewind\SMB\Exception\InvalidHostException + */ + public function listShares(); + + /** + * @param string $name + * @return \Icewind\SMB\IShare + */ + public function getShare($name); + + /** + * @return string + */ + public function getTimeZone(); + + /** + * @return System + */ + public function getSystem(); + + /** + * @param System $system + * @return bool + */ + public static function available(System $system); +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/KerberosAuth.php b/apps/files_external/3rdparty/icewind/smb/src/KerberosAuth.php new file mode 100644 index 00000000000..9510a6dc277 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/KerberosAuth.php @@ -0,0 +1,49 @@ +<?php +/** + * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Icewind\SMB; + +/** + * Use existing kerberos ticket to authenticate + */ +class KerberosAuth implements IAuth { + public function getUsername() { + return 'dummy'; + } + + public function getWorkgroup() { + return 'dummy'; + } + + public function getPassword() { + return null; + } + + public function getExtraCommandLineArguments() { + return '-k'; + } + + public function setExtraSmbClientOptions($smbClientState) { + smbclient_option_set($smbClientState, SMBCLIENT_OPT_USE_KERBEROS, true); + smbclient_option_set($smbClientState, SMBCLIENT_OPT_FALLBACK_AFTER_KERBEROS, false); + } + +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeFileInfo.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeFileInfo.php index 6cb070196a6..3466797e21b 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NativeFileInfo.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeFileInfo.php @@ -5,7 +5,9 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Native; + +use Icewind\SMB\IFileInfo; class NativeFileInfo implements IFileInfo { const MODE_FILE = 0100000; @@ -21,7 +23,7 @@ class NativeFileInfo implements IFileInfo { protected $name; /** - * @var \Icewind\SMB\NativeShare + * @var NativeShare */ protected $share; @@ -36,7 +38,7 @@ class NativeFileInfo implements IFileInfo { protected $modeCache; /** - * @param \Icewind\SMB\NativeShare $share + * @param NativeShare $share * @param string $path * @param string $name * @param array $stat @@ -113,7 +115,7 @@ class NativeFileInfo implements IFileInfo { */ public function isReadOnly() { $mode = $this->getMode(); - return (bool)($mode & FileInfo::MODE_READONLY); + return (bool)($mode & IFileInfo::MODE_READONLY); } /** @@ -121,7 +123,7 @@ class NativeFileInfo implements IFileInfo { */ public function isHidden() { $mode = $this->getMode(); - return (bool)($mode & FileInfo::MODE_HIDDEN); + return (bool)($mode & IFileInfo::MODE_HIDDEN); } /** @@ -129,7 +131,7 @@ class NativeFileInfo implements IFileInfo { */ public function isSystem() { $mode = $this->getMode(); - return (bool)($mode & FileInfo::MODE_SYSTEM); + return (bool)($mode & IFileInfo::MODE_SYSTEM); } /** @@ -137,6 +139,6 @@ class NativeFileInfo implements IFileInfo { */ public function isArchived() { $mode = $this->getMode(); - return (bool)($mode & FileInfo::MODE_ARCHIVE); + return (bool)($mode & IFileInfo::MODE_ARCHIVE); } } diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeReadStream.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeReadStream.php index 6fd4f5b7f35..3ef5b21639f 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NativeReadStream.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeReadStream.php @@ -5,7 +5,7 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Native; /** * Stream optimized for read only usage @@ -38,7 +38,7 @@ class NativeReadStream extends NativeStream { * @return resource */ public static function wrap($state, $smbStream, $mode, $url) { - stream_wrapper_register('nativesmb', '\Icewind\SMB\NativeReadStream'); + stream_wrapper_register('nativesmb', NativeReadStream::class); $context = stream_context_create(array( 'nativesmb' => array( 'state' => $state, diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeServer.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeServer.php index ce8e6d636a9..c6274e59b5f 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NativeServer.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeServer.php @@ -5,26 +5,32 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Native; -class NativeServer extends Server { +use Icewind\SMB\AbstractServer; +use Icewind\SMB\IAuth; +use Icewind\SMB\System; +use Icewind\SMB\TimeZoneProvider; + +class NativeServer extends AbstractServer { /** - * @var \Icewind\SMB\NativeState + * @var NativeState */ protected $state; /** * @param string $host - * @param string $user - * @param string $password + * @param IAuth $auth + * @param System $system + * @param TimeZoneProvider $timeZoneProvider */ - public function __construct($host, $user, $password) { - parent::__construct($host, $user, $password); + public function __construct($host, IAuth $auth, System $system, TimeZoneProvider $timeZoneProvider) { + parent::__construct($host, $auth, $system, $timeZoneProvider); $this->state = new NativeState(); } protected function connect() { - $this->state->init($this->getWorkgroup(), $this->getUser(), $this->getPassword()); + $this->state->init($this->getAuth()); } /** @@ -52,4 +58,14 @@ class NativeServer extends Server { public function getShare($name) { return new NativeShare($this, $name); } + + /** + * Check if the smbclient php extension is available + * + * @param System $system + * @return bool + */ + public static function available(System $system) { + return function_exists('smbclient_state_new'); + } } diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeShare.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeShare.php index 9653e6064b2..130a5a070ff 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NativeShare.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeShare.php @@ -5,14 +5,20 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Native; +use Icewind\SMB\AbstractShare; +use Icewind\SMB\Exception\DependencyException; use Icewind\SMB\Exception\InvalidPathException; use Icewind\SMB\Exception\InvalidResourceException; +use Icewind\SMB\INotifyHandler; +use Icewind\SMB\IServer; +use Icewind\SMB\Wrapped\Server; +use Icewind\SMB\Wrapped\Share; class NativeShare extends AbstractShare { /** - * @var Server $server + * @var IServer $server */ private $server; @@ -22,12 +28,12 @@ class NativeShare extends AbstractShare { private $name; /** - * @var \Icewind\SMB\NativeState $state + * @var NativeState $state */ private $state; /** - * @param Server $server + * @param IServer $server * @param string $name */ public function __construct($server, $name) { @@ -47,7 +53,7 @@ class NativeShare extends AbstractShare { } $this->state = new NativeState(); - $this->state->init($this->server->getWorkgroup(), $this->server->getUser(), $this->server->getPassword()); + $this->state->init($this->server->getAuth()); return $this->state; } @@ -295,6 +301,9 @@ class NativeShare extends AbstractShare { public function notify($path) { // php-smbclient does support notify (https://github.com/eduardok/libsmbclient-php/issues/29) // so we use the smbclient based backend for this + if (!Server::available($this->server->getSystem())) { + throw new DependencyException('smbclient not found in path for notify command'); + } $share = new Share($this->server, $this->getName()); return $share->notify($path); } diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeState.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeState.php index 036a0255048..179ba95beac 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NativeState.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeState.php @@ -5,9 +5,22 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Native; +use Icewind\SMB\Exception\AlreadyExistsException; +use Icewind\SMB\Exception\ConnectionRefusedException; use Icewind\SMB\Exception\Exception; +use Icewind\SMB\Exception\FileInUseException; +use Icewind\SMB\Exception\ForbiddenException; +use Icewind\SMB\Exception\HostDownException; +use Icewind\SMB\Exception\InvalidArgumentException; +use Icewind\SMB\Exception\InvalidTypeException; +use Icewind\SMB\Exception\NoRouteToHostException; +use Icewind\SMB\Exception\NotEmptyException; +use Icewind\SMB\Exception\NotFoundException; +use Icewind\SMB\Exception\OutOfSpaceException; +use Icewind\SMB\Exception\TimedOutException; +use Icewind\SMB\IAuth; /** * Low level wrapper for libsmbclient-php with error handling @@ -22,23 +35,22 @@ class NativeState { protected $connected = false; - // todo replace with static once <5.6 support is dropped // see error.h - private static $exceptionMap = [ - 1 => '\Icewind\SMB\Exception\ForbiddenException', - 2 => '\Icewind\SMB\Exception\NotFoundException', - 13 => '\Icewind\SMB\Exception\ForbiddenException', - 16 => '\Icewind\SMB\Exception\FileInUseException', - 17 => '\Icewind\SMB\Exception\AlreadyExistsException', - 20 => '\Icewind\SMB\Exception\InvalidTypeException', - 21 => '\Icewind\SMB\Exception\InvalidTypeException', - 22 => '\Icewind\SMB\Exception\InvalidArgumentException', - 28 => '\Icewind\SMB\Exception\OutOfSpaceException', - 39 => '\Icewind\SMB\Exception\NotEmptyException', - 110 => '\Icewind\SMB\Exception\TimedOutException', - 111 => '\Icewind\SMB\Exception\ConnectionRefusedException', - 112 => '\Icewind\SMB\Exception\HostDownException', - 113 => '\Icewind\SMB\Exception\NoRouteToHostException' + const EXCEPTION_MAP = [ + 1 => ForbiddenException::class, + 2 => NotFoundException::class, + 13 => ForbiddenException::class, + 16 => FileInUseException::class, + 17 => AlreadyExistsException::class, + 20 => InvalidTypeException::class, + 21 => InvalidTypeException::class, + 22 => InvalidArgumentException::class, + 28 => OutOfSpaceException::class, + 39 => NotEmptyException::class, + 110 => TimedOutException::class, + 111 => ConnectionRefusedException::class, + 112 => HostDownException::class, + 113 => NoRouteToHostException::class ]; protected function handleError($path) { @@ -46,13 +58,13 @@ class NativeState { if ($error === 0) { return; } - throw Exception::fromMap(self::$exceptionMap, $error, $path); + throw Exception::fromMap(self::EXCEPTION_MAP, $error, $path); } protected function testResult($result, $uri) { if ($result === false or $result === null) { // smb://host/share/path - if (is_string($uri)) { + if (is_string($uri) && count(explode('/', $uri, 5)) > 4) { list(, , , , $path) = explode('/', $uri, 5); $path = '/' . $path; } else { @@ -63,18 +75,17 @@ class NativeState { } /** - * @param string $workGroup - * @param string $user - * @param string $password + * @param IAuth $auth * @return bool */ - public function init($workGroup, $user, $password) { + public function init(IAuth $auth) { if ($this->connected) { return true; } $this->state = smbclient_state_new(); smbclient_option_set($this->state, SMBCLIENT_OPT_AUTO_ANONYMOUS_LOGIN, false); - $result = @smbclient_state_init($this->state, $workGroup, $user, $password); + $auth->setExtraSmbClientOptions($this->state); + $result = @smbclient_state_init($this->state, $auth->getWorkgroup(), $auth->getUsername(), $auth->getPassword()); $this->testResult($result, ''); $this->connected = true; diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeStream.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeStream.php index bce72001b5a..3b3c65de276 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NativeStream.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeStream.php @@ -5,7 +5,7 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Native; use Icewind\SMB\Exception\Exception; use Icewind\SMB\Exception\InvalidRequestException; @@ -18,7 +18,7 @@ class NativeStream implements File { public $context; /** - * @var \Icewind\SMB\NativeState + * @var NativeState */ protected $state; @@ -47,7 +47,7 @@ class NativeStream implements File { * @return resource */ public static function wrap($state, $smbStream, $mode, $url) { - stream_wrapper_register('nativesmb', '\Icewind\SMB\NativeStream'); + stream_wrapper_register('nativesmb', NativeStream::class); $context = stream_context_create(array( 'nativesmb' => array( 'state' => $state, diff --git a/apps/files_external/3rdparty/icewind/smb/src/NativeWriteStream.php b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeWriteStream.php index 69a270f160f..f5143a09ae2 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NativeWriteStream.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Native/NativeWriteStream.php @@ -5,7 +5,7 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Native; /** * Stream optimized for write only usage @@ -38,7 +38,7 @@ class NativeWriteStream extends NativeStream { * @return resource */ public static function wrap($state, $smbStream, $mode, $url) { - stream_wrapper_register('nativesmb', '\Icewind\SMB\NativeWriteStream'); + stream_wrapper_register('nativesmb', NativeWriteStream::class); $context = stream_context_create(array( 'nativesmb' => array( 'state' => $state, diff --git a/apps/files_external/3rdparty/icewind/smb/src/Server.php b/apps/files_external/3rdparty/icewind/smb/src/Server.php deleted file mode 100644 index 21cc605ed1f..00000000000 --- a/apps/files_external/3rdparty/icewind/smb/src/Server.php +++ /dev/null @@ -1,166 +0,0 @@ -<?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; - -use Icewind\SMB\Exception\AuthenticationException; -use Icewind\SMB\Exception\InvalidHostException; - -class Server { - const LOCALE = 'en_US.UTF-8'; - - /** - * @var string $host - */ - protected $host; - - /** - * @var string $user - */ - protected $user; - - /** - * @var string $password - */ - protected $password; - - /** - * @var string $workgroup - */ - protected $workgroup; - - /** - * @var \Icewind\SMB\System - */ - private $system; - - /** - * @var TimeZoneProvider - */ - private $timezoneProvider; - - /** - * Check if the smbclient php extension is available - * - * @return bool - */ - public static function NativeAvailable() { - return function_exists('smbclient_state_new'); - } - - /** - * @param string $host - * @param string $user - * @param string $password - */ - public function __construct($host, $user, $password) { - $this->host = $host; - list($workgroup, $user) = $this->splitUser($user); - $this->user = $user; - $this->workgroup = $workgroup; - $this->password = $password; - $this->system = new System(); - $this->timezoneProvider = new TimeZoneProvider($host, $this->system); - } - - /** - * Split workgroup from username - * - * @param $user - * @return string[] [$workgroup, $user] - */ - public function splitUser($user) { - if (strpos($user, '/')) { - return explode('/', $user, 2); - } elseif (strpos($user, '\\')) { - return explode('\\', $user); - } else { - return array(null, $user); - } - } - - /** - * @return string - */ - public function getAuthString() { - return $this->user . '%' . $this->password; - } - - /** - * @return string - */ - public function getUser() { - return $this->user; - } - - /** - * @return string - */ - public function getPassword() { - return $this->password; - } - - /** - * return string - */ - public function getHost() { - return $this->host; - } - - /** - * @return string - */ - public function getWorkgroup() { - return $this->workgroup; - } - - /** - * @return \Icewind\SMB\IShare[] - * - * @throws \Icewind\SMB\Exception\AuthenticationException - * @throws \Icewind\SMB\Exception\InvalidHostException - */ - public function listShares() { - $workgroupArgument = ($this->workgroup) ? ' -W ' . escapeshellarg($this->workgroup) : ''; - $command = sprintf('%s %s --authentication-file=%s -gL %s', - $this->system->getSmbclientPath(), - $workgroupArgument, - System::getFD(3), - escapeshellarg($this->getHost()) - ); - $connection = new RawConnection($command); - $connection->writeAuthentication($this->getUser(), $this->getPassword()); - $connection->connect(); - $output = $connection->readAll(); - $parser = new Parser($this->timezoneProvider); - - $parser->checkConnectionError($output[0]); - - $shareNames = $parser->parseListShares($output); - - $shares = array(); - foreach ($shareNames as $name => $description) { - $shares[] = $this->getShare($name); - } - return $shares; - } - - /** - * @param string $name - * @return \Icewind\SMB\IShare - */ - public function getShare($name) { - return new Share($this, $name, $this->system); - } - - /** - * @return string - */ - public function getTimeZone() { - return $this->timezoneProvider->get(); - } -} diff --git a/apps/files_external/3rdparty/icewind/smb/src/ServerFactory.php b/apps/files_external/3rdparty/icewind/smb/src/ServerFactory.php new file mode 100644 index 00000000000..b54168a520c --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/ServerFactory.php @@ -0,0 +1,64 @@ +<?php +/** + * @copyright Copyright (c) 2018 Robin Appelman <robin@icewind.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace Icewind\SMB; + + +use Icewind\SMB\Exception\DependencyException; +use Icewind\SMB\Native\NativeServer; +use Icewind\SMB\Wrapped\Server; + +class ServerFactory { + const BACKENDS = [ + NativeServer::class, + Server::class + ]; + + /** @var System|null */ + private $system = null; + + /** + * @param $host + * @param IAuth $credentials + * @return IServer + * @throws DependencyException + */ + public function createServer($host, IAuth $credentials) { + foreach (self::BACKENDS as $backend) { + if (call_user_func("$backend::available", $this->getSystem())) { + return new $backend($host, $credentials, $this->getSystem(), new TimeZoneProvider($host, $this->getSystem())); + } + } + + throw new DependencyException('No valid backend available, ensure smbclient is in the path or php-smbclient is installed'); + } + + /** + * @return System + */ + private function getSystem() { + if (is_null($this->system)) { + $this->system = new System(); + } + + return $this->system; + } +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/System.php b/apps/files_external/3rdparty/icewind/smb/src/System.php index 7c519988aa5..30592dd2627 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/System.php +++ b/apps/files_external/3rdparty/icewind/smb/src/System.php @@ -17,10 +17,10 @@ class System { private $stdbuf; public static function getFD($num) { - $folders = array( + $folders = [ '/proc/self/fd', '/dev/fd' - ); + ]; foreach ($folders as $folder) { if (file_exists($folder)) { return $folder . '/' . $num; diff --git a/apps/files_external/3rdparty/icewind/smb/src/Connection.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Connection.php index 661a361ec54..7eddb85ac4f 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/Connection.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Connection.php @@ -5,7 +5,7 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Wrapped; use Icewind\SMB\Exception\AuthenticationException; use Icewind\SMB\Exception\ConnectException; diff --git a/apps/files_external/3rdparty/icewind/smb/src/ErrorCodes.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/ErrorCodes.php index d36cdaf2c7d..7df83b268d8 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/ErrorCodes.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/ErrorCodes.php @@ -5,7 +5,7 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Wrapped; class ErrorCodes { /** diff --git a/apps/files_external/3rdparty/icewind/smb/src/FileInfo.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/FileInfo.php index ef9121a8f57..094e665a935 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/FileInfo.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/FileInfo.php @@ -5,22 +5,11 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Wrapped; -class FileInfo implements IFileInfo { - /* - * Mappings of the DOS mode bits, as returned by smbc_getxattr() when the - * attribute name "system.dos_attr.mode" (or "system.dos_attr.*" or - * "system.*") is specified. - */ - const MODE_READONLY = 0x01; - const MODE_HIDDEN = 0x02; - const MODE_SYSTEM = 0x04; - const MODE_VOLUME_ID = 0x08; - const MODE_DIRECTORY = 0x10; - const MODE_ARCHIVE = 0x20; - const MODE_NORMAL = 0x80; +use Icewind\SMB\IFileInfo; +class FileInfo implements IFileInfo { /** * @var string */ @@ -93,34 +82,34 @@ class FileInfo implements IFileInfo { * @return bool */ public function isDirectory() { - return (bool)($this->mode & self::MODE_DIRECTORY); + return (bool)($this->mode & IFileInfo::MODE_DIRECTORY); } /** * @return bool */ public function isReadOnly() { - return (bool)($this->mode & self::MODE_READONLY); + return (bool)($this->mode & IFileInfo::MODE_READONLY); } /** * @return bool */ public function isHidden() { - return (bool)($this->mode & self::MODE_HIDDEN); + return (bool)($this->mode & IFileInfo::MODE_HIDDEN); } /** * @return bool */ public function isSystem() { - return (bool)($this->mode & self::MODE_SYSTEM); + return (bool)($this->mode & IFileInfo::MODE_SYSTEM); } /** * @return bool */ public function isArchived() { - return (bool)($this->mode & self::MODE_ARCHIVE); + return (bool)($this->mode & IFileInfo::MODE_ARCHIVE); } } diff --git a/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/NotifyHandler.php index 20ada5cf320..a32ae3cafa4 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/NotifyHandler.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/NotifyHandler.php @@ -6,10 +6,13 @@ * */ -namespace Icewind\SMB; +namespace Icewind\SMB\Wrapped; +use Icewind\SMB\Change; use Icewind\SMB\Exception\Exception; +use Icewind\SMB\Exception\RevisionMismatchException; +use Icewind\SMB\INotifyHandler; class NotifyHandler implements INotifyHandler { /** @@ -24,10 +27,9 @@ 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', + const EXCEPTION_MAP = [ + ErrorCodes::RevisionMismatch => RevisionMismatchException::class, ]; /** @@ -93,7 +95,7 @@ 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'); + throw Exception::fromMap(array_merge(self::EXCEPTION_MAP, Parser::EXCEPTION_MAP), $error, 'Notify is not supported with the used smb version'); } } diff --git a/apps/files_external/3rdparty/icewind/smb/src/Parser.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Parser.php index a30032178b1..c446ae85b30 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/Parser.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Parser.php @@ -5,7 +5,7 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Wrapped; use Icewind\SMB\Exception\AccessDeniedException; use Icewind\SMB\Exception\AlreadyExistsException; @@ -13,11 +13,13 @@ use Icewind\SMB\Exception\AuthenticationException; use Icewind\SMB\Exception\Exception; use Icewind\SMB\Exception\FileInUseException; use Icewind\SMB\Exception\InvalidHostException; +use Icewind\SMB\Exception\InvalidParameterException; use Icewind\SMB\Exception\InvalidResourceException; use Icewind\SMB\Exception\InvalidTypeException; use Icewind\SMB\Exception\NoLoginServerException; use Icewind\SMB\Exception\NotEmptyException; use Icewind\SMB\Exception\NotFoundException; +use Icewind\SMB\TimeZoneProvider; class Parser { const MSG_NOT_FOUND = 'Error opening local file '; @@ -29,22 +31,31 @@ 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', - ErrorCodes::NameCollision => '\Icewind\SMB\Exception\AlreadyExistsException', - ErrorCodes::AccessDenied => '\Icewind\SMB\Exception\AccessDeniedException', - 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::InvalidParameter => '\Icewind\SMB\Exception\InvalidParameterException' + const EXCEPTION_MAP = [ + ErrorCodes::LogonFailure => AuthenticationException::class, + ErrorCodes::PathNotFound => NotFoundException::class, + ErrorCodes::ObjectNotFound => NotFoundException::class, + ErrorCodes::NoSuchFile => NotFoundException::class, + ErrorCodes::NameCollision => AlreadyExistsException::class, + ErrorCodes::AccessDenied => AccessDeniedException::class, + ErrorCodes::DirectoryNotEmpty => NotEmptyException::class, + ErrorCodes::FileIsADirectory => InvalidTypeException::class, + ErrorCodes::NotADirectory => InvalidTypeException::class, + ErrorCodes::SharingViolation => FileInUseException::class, + ErrorCodes::InvalidParameter => InvalidParameterException::class + ]; + + const MODE_STRINGS = [ + 'R' => FileInfo::MODE_READONLY, + 'H' => FileInfo::MODE_HIDDEN, + 'S' => FileInfo::MODE_SYSTEM, + 'D' => FileInfo::MODE_DIRECTORY, + 'A' => FileInfo::MODE_ARCHIVE, + 'N' => FileInfo::MODE_NORMAL ]; /** - * @param \Icewind\SMB\TimeZoneProvider $timeZoneProvider + * @param TimeZoneProvider $timeZoneProvider */ public function __construct(TimeZoneProvider $timeZoneProvider) { $this->timeZoneProvider = $timeZoneProvider; @@ -71,7 +82,7 @@ class Parser { throw new InvalidResourceException('Failed opening local file "' . $localPath . '" for writing'); } - throw Exception::fromMap(self::$exceptionMap, $error, $path); + throw Exception::fromMap(self::EXCEPTION_MAP, $error, $path); } /** @@ -107,15 +118,7 @@ class Parser { public function parseMode($mode) { $result = 0; - $modeStrings = array( - 'R' => FileInfo::MODE_READONLY, - 'H' => FileInfo::MODE_HIDDEN, - 'S' => FileInfo::MODE_SYSTEM, - 'D' => FileInfo::MODE_DIRECTORY, - 'A' => FileInfo::MODE_ARCHIVE, - 'N' => FileInfo::MODE_NORMAL - ); - foreach ($modeStrings as $char => $val) { + foreach (self::MODE_STRINGS as $char => $val) { if (strpos($mode, $char) !== false) { $result |= $val; } @@ -168,6 +171,10 @@ class Parser { if (strtolower($type) === 'disk') { $shareNames[$name] = $description; } + } else if (strpos($line, 'Disk')) { + // new output format + list($name, $description) = explode('Disk', $line); + $shareNames[trim($name)] = trim($description); } } return $shareNames; diff --git a/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/RawConnection.php index 42923f09eda..f29cf60eb66 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/RawConnection.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/RawConnection.php @@ -5,7 +5,7 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Wrapped; use Icewind\SMB\Exception\ConnectException; use Icewind\SMB\Exception\ConnectionException; @@ -49,6 +49,9 @@ class RawConnection { $this->env = $env; } + /** + * @throws ConnectException + */ public function connect() { if (is_null($this->getAuthStream())) { throw new ConnectException('Authentication not set before connecting'); @@ -125,7 +128,7 @@ class RawConnection { * @return array */ public function readAll() { - $output = array(); + $output = []; while ($line = $this->readLine()) { $output[] = $line; } diff --git a/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Server.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Server.php new file mode 100644 index 00000000000..cc0f13f3606 --- /dev/null +++ b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Server.php @@ -0,0 +1,90 @@ +<?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\Wrapped; + +use Icewind\SMB\AbstractServer; +use Icewind\SMB\Exception\AuthenticationException; +use Icewind\SMB\Exception\ConnectException; +use Icewind\SMB\Exception\ConnectionException; +use Icewind\SMB\Exception\InvalidHostException; +use Icewind\SMB\IShare; +use Icewind\SMB\System; + +class Server extends AbstractServer { + /** + * Check if the smbclient php extension is available + * + * @param System $system + * @return bool + */ + public static function available(System $system) { + return $system->getSmbclientPath(); + } + + private function getAuthFileArgument() { + if ($this->getAuth()->getUsername()) { + return '--authentication-file=' . System::getFD(3); + } else { + return ''; + } + } + + /** + * @return IShare[] + * + * @throws AuthenticationException + * @throws InvalidHostException + * @throws ConnectException + */ + public function listShares() { + $command = sprintf('%s %s %s -L %s', + $this->system->getSmbclientPath(), + $this->getAuthFileArgument(), + $this->getAuth()->getExtraCommandLineArguments(), + escapeshellarg('//' . $this->getHost()) + ); + $connection = new RawConnection($command); + $connection->writeAuthentication($this->getAuth()->getUsername(), $this->getAuth()->getPassword()); + $connection->connect(); + if (!$connection->isValid()) { + throw new ConnectionException($connection->readLine()); + } + + $parser = new Parser($this->timezoneProvider); + + $output = $connection->readAll(); + if (isset($output[0])) { + $parser->checkConnectionError($output[0]); + } + + // sometimes we get an empty line first + if (count($output) < 2) { + $output = $connection->readAll(); + } + + if (isset($output[0])) { + $parser->checkConnectionError($output[0]); + } + + $shareNames = $parser->parseListShares($output); + + $shares = array(); + foreach ($shareNames as $name => $description) { + $shares[] = $this->getShare($name); + } + return $shares; + } + + /** + * @param string $name + * @return IShare + */ + public function getShare($name) { + return new Share($this, $name, $this->system); + } +} diff --git a/apps/files_external/3rdparty/icewind/smb/src/Share.php b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Share.php index be1ba025508..ca88af219a8 100644 --- a/apps/files_external/3rdparty/icewind/smb/src/Share.php +++ b/apps/files_external/3rdparty/icewind/smb/src/Wrapped/Share.php @@ -5,18 +5,23 @@ * http://opensource.org/licenses/MIT */ -namespace Icewind\SMB; +namespace Icewind\SMB\Wrapped; +use Icewind\SMB\AbstractShare; use Icewind\SMB\Exception\ConnectionException; use Icewind\SMB\Exception\DependencyException; use Icewind\SMB\Exception\FileInUseException; use Icewind\SMB\Exception\InvalidTypeException; use Icewind\SMB\Exception\NotFoundException; +use Icewind\SMB\INotifyHandler; +use Icewind\SMB\IServer; +use Icewind\SMB\System; +use Icewind\SMB\TimeZoneProvider; use Icewind\Streams\CallbackWrapper; class Share extends AbstractShare { /** - * @var Server $server + * @var IServer $server */ private $server; @@ -31,21 +36,28 @@ class Share extends AbstractShare { public $connection; /** - * @var \Icewind\SMB\Parser + * @var Parser */ protected $parser; /** - * @var \Icewind\SMB\System + * @var System */ private $system; + const MODE_MAP = [ + FileInfo::MODE_READONLY => 'r', + FileInfo::MODE_HIDDEN => 'h', + FileInfo::MODE_ARCHIVE => 'a', + FileInfo::MODE_SYSTEM => 's' + ]; + /** - * @param Server $server + * @param IServer $server * @param string $name * @param System $system */ - public function __construct($server, $name, System $system = null) { + public function __construct(IServer $server, $name, System $system = null) { parent::__construct(); $this->server = $server; $this->name = $name; @@ -53,21 +65,24 @@ class Share extends AbstractShare { $this->parser = new Parser(new TimeZoneProvider($this->server->getHost(), $this->system)); } - protected function getConnection() { - $workgroupArgument = ($this->server->getWorkgroup()) ? ' -W ' . escapeshellarg($this->server->getWorkgroup()) : ''; - $smbClientPath = $this->system->getSmbclientPath(); - if (!$smbClientPath) { - throw new DependencyException('Can\'t find smbclient binary in path'); + private function getAuthFileArgument() { + if ($this->server->getAuth()->getUsername()) { + return '--authentication-file=' . System::getFD(3); + } else { + return ''; } - $command = sprintf('%s%s %s --authentication-file=%s %s', + } + + protected function getConnection() { + $command = sprintf('%s%s %s %s %s', $this->system->hasStdBuf() ? 'stdbuf -o0 ' : '', $this->system->getSmbclientPath(), - $workgroupArgument, - System::getFD(3), + $this->getAuthFileArgument(), + $this->server->getAuth()->getExtraCommandLineArguments(), escapeshellarg('//' . $this->server->getHost() . '/' . $this->name) ); $connection = new Connection($command, $this->parser); - $connection->writeAuthentication($this->server->getUser(), $this->server->getPassword()); + $connection->writeAuthentication($this->server->getAuth()->getUsername(), $this->server->getAuth()->getPassword()); $connection->connect(); if (!$connection->isValid()) { throw new ConnectionException($connection->readLine()); @@ -319,13 +334,7 @@ class Share extends AbstractShare { */ public function setMode($path, $mode) { $modeString = ''; - $modeMap = array( - FileInfo::MODE_READONLY => 'r', - FileInfo::MODE_HIDDEN => 'h', - FileInfo::MODE_ARCHIVE => 'a', - FileInfo::MODE_SYSTEM => 's' - ); - foreach ($modeMap as $modeByte => $string) { + foreach (self::MODE_MAP as $modeByte => $string) { if ($mode & $modeByte) { $modeString .= $string; } diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php index a533298c06d..93fc020d71b 100644 --- a/apps/files_external/lib/Lib/Storage/SMB.php +++ b/apps/files_external/lib/Lib/Storage/SMB.php @@ -34,14 +34,16 @@ namespace OCA\Files_External\Lib\Storage; +use Icewind\SMB\BasicAuth; use Icewind\SMB\Exception\AlreadyExistsException; use Icewind\SMB\Exception\ConnectException; use Icewind\SMB\Exception\Exception; use Icewind\SMB\Exception\ForbiddenException; use Icewind\SMB\Exception\NotFoundException; use Icewind\SMB\IFileInfo; -use Icewind\SMB\NativeServer; -use Icewind\SMB\Server; +use Icewind\SMB\Native\NativeServer; +use Icewind\SMB\ServerFactory; +use Icewind\SMB\System; use Icewind\Streams\CallbackWrapper; use Icewind\Streams\IteratorDirectory; use OC\Cache\CappedMemoryCache; @@ -53,16 +55,15 @@ use OCP\Files\Notify\IRenameChange; use OCP\Files\Storage\INotifyStorage; use OCP\Files\StorageNotAvailableException; use OCP\ILogger; -use OCP\Util; class SMB extends Common implements INotifyStorage { /** - * @var \Icewind\SMB\Server + * @var \Icewind\SMB\IServer */ protected $server; /** - * @var \Icewind\SMB\Share + * @var \Icewind\SMB\IShare */ protected $share; @@ -72,17 +73,16 @@ class SMB extends Common implements INotifyStorage { protected $root; /** - * @var \Icewind\SMB\FileInfo[] + * @var \Icewind\SMB\IFileInfo[] */ protected $statCache; public function __construct($params) { if (isset($params['host']) && isset($params['user']) && isset($params['password']) && isset($params['share'])) { - if (Server::NativeAvailable()) { - $this->server = new NativeServer($params['host'], $params['user'], $params['password']); - } else { - $this->server = new Server($params['host'], $params['user'], $params['password']); - } + list($workgroup, $user) = $this->splitUser($params['user']); + $auth = new BasicAuth($user, $workgroup, $params['password']); + $serverFactory = new ServerFactory(); + $this->server = $serverFactory->createServer($params['host'], $auth); $this->share = $this->server->getShare(trim($params['share'], '/')); $this->root = $params['root'] ?? '/'; @@ -95,6 +95,16 @@ class SMB extends Common implements INotifyStorage { parent::__construct($params); } + private function splitUser($user) { + if (strpos($user, '/')) { + return explode('/', $user, 2); + } elseif (strpos($user, '\\')) { + return explode('\\', $user); + } else { + return [null, $user]; + } + } + /** * @return string */ @@ -102,7 +112,7 @@ class SMB extends Common implements INotifyStorage { // FIXME: double slash to keep compatible with the old storage ids, // failure to do so will lead to creation of a new storage id and // loss of shares from the storage - return 'smb::' . $this->server->getUser() . '@' . $this->server->getHost() . '//' . $this->share->getName() . '/' . $this->root; + return 'smb::' . $this->server->getAuth()->getUsername() . '@' . $this->server->getHost() . '//' . $this->share->getName() . '/' . $this->root; } /** @@ -504,7 +514,7 @@ class SMB extends Common implements INotifyStorage { public static function checkDependencies() { return ( (bool)\OC_Helper::findBinaryPath('smbclient') - || Server::NativeAvailable() + || NativeServer::available(new System()) ) ? true : ['smbclient']; } diff --git a/apps/files_external/tests/Service/StoragesServiceTest.php b/apps/files_external/tests/Service/StoragesServiceTest.php index 01e5c4122f2..b875bcb55e6 100644 --- a/apps/files_external/tests/Service/StoragesServiceTest.php +++ b/apps/files_external/tests/Service/StoragesServiceTest.php @@ -331,7 +331,8 @@ abstract class StoragesServiceTest extends \Test\TestCase { $storageCheckQuery = $qb->select('*') ->from('storages') ->where($qb->expr()->eq('numeric_id', $qb->expr()->literal($numericId))); - $this->assertCount($expectedCountAfterDeletion, $storageCheckQuery->execute()->fetchAll()); + $storages = $storageCheckQuery->execute()->fetchAll(); + $this->assertCount($expectedCountAfterDeletion, $storages, "expected $expectedCountAfterDeletion storages, got " . json_encode($storages)); } /** |