mirror of
https://codeberg.org/icewind/SMB.git
synced 2026-06-03 17:24:07 +02:00
formatting
This commit is contained in:
parent
bf27345a53
commit
8af8d79df9
10 changed files with 115 additions and 74 deletions
|
|
@ -6,6 +6,7 @@ end_of_line=lf
|
|||
insert_final_newline=false
|
||||
indent_style=space
|
||||
indent_size=4
|
||||
insert_final_newline=true
|
||||
|
||||
[{composer.lock,.babelrc,.stylelintrc,.eslintrc,jest.config,*.bowerrc,*.jsb3,*.jsb2,*.json}]
|
||||
indent_style=space
|
||||
|
|
@ -15,7 +16,7 @@ indent_size=2
|
|||
indent_style=tab
|
||||
tab_width=4
|
||||
|
||||
[{*.module,*.hphp,*.phtml,*.php5,*.php4,*.php,*.inc}]
|
||||
[{*.module,*.hphp,*.phtml,*.php5,*.php4,*.php,*.phpstub,*.inc}]
|
||||
indent_style=tab
|
||||
tab_width=4
|
||||
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ jobs:
|
|||
- name: Setup PHP
|
||||
uses: https://github.com/shivammathur/setup-php@v2
|
||||
with:
|
||||
php-version: '8.2'
|
||||
php-version: "8.2"
|
||||
extensions: apcu
|
||||
- name: Composer
|
||||
run: composer install
|
||||
|
|
@ -44,7 +44,9 @@ jobs:
|
|||
env:
|
||||
ACCOUNT_test: test
|
||||
UID_test: 1000
|
||||
SAMBA_VOLUME_CONFIG_test: "[test]; path=/tmp; valid users = test; guest ok = no; read only = no; browseable = yes"
|
||||
SAMBA_VOLUME_CONFIG_test:
|
||||
"[test]; path=/tmp; valid users = test; guest ok = no; read only =
|
||||
no; browseable = yes"
|
||||
|
||||
steps:
|
||||
- name: Install packages
|
||||
|
|
@ -71,7 +73,9 @@ jobs:
|
|||
timeout_minutes: 2
|
||||
max_attempts: 3
|
||||
retry_on: timeout
|
||||
command: php ./vendor/bin/phpunit tests -c tests/phpunit.xml --coverage-clover=coverage.xml
|
||||
command:
|
||||
php ./vendor/bin/phpunit tests -c tests/phpunit.xml
|
||||
--coverage-clover=coverage.xml
|
||||
env:
|
||||
BACKEND: smbclient
|
||||
- name: PHPUnit Tests - libsmbclient
|
||||
|
|
@ -80,7 +84,9 @@ jobs:
|
|||
timeout_minutes: 2
|
||||
max_attempts: 3
|
||||
retry_on: timeout
|
||||
command: php ./vendor/bin/phpunit tests -c tests/phpunit.xml --coverage-clover=coverage.xml
|
||||
command:
|
||||
php ./vendor/bin/phpunit tests -c tests/phpunit.xml
|
||||
--coverage-clover=coverage.xml
|
||||
env:
|
||||
BACKEND: libsmbclient
|
||||
- uses: https://github.com/codecov/codecov-action@v3
|
||||
|
|
@ -89,7 +95,9 @@ jobs:
|
|||
|
||||
smb-versions:
|
||||
runs-on: ubuntu-22.04
|
||||
name: Unit tests - Samba ${{ matrix.server-version }} - smbclient ${{ matrix.client-version }}
|
||||
name:
|
||||
Unit tests - Samba ${{ matrix.server-version }} - smbclient ${{
|
||||
matrix.client-version }}
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
|
|
@ -115,7 +123,9 @@ jobs:
|
|||
env:
|
||||
ACCOUNT_test: test
|
||||
UID_test: 1000
|
||||
SAMBA_VOLUME_CONFIG_test: "[test]; path=/tmp; valid users = test; guest ok = no; read only = no; browseable = yes"
|
||||
SAMBA_VOLUME_CONFIG_test:
|
||||
"[test]; path=/tmp; valid users = test; guest ok = no; read only =
|
||||
no; browseable = yes"
|
||||
|
||||
steps:
|
||||
- name: Setup smbclient
|
||||
|
|
@ -146,7 +156,9 @@ jobs:
|
|||
timeout_minutes: 2
|
||||
max_attempts: 3
|
||||
retry_on: timeout
|
||||
command: php ./vendor/bin/phpunit tests -c tests/phpunit.xml --coverage-clover=coverage.xml
|
||||
command:
|
||||
php ./vendor/bin/phpunit tests -c tests/phpunit.xml
|
||||
--coverage-clover=coverage.xml
|
||||
env:
|
||||
BACKEND: smbclient
|
||||
- uses: https://github.com/codecov/codecov-action@v3
|
||||
|
|
@ -163,7 +175,9 @@ jobs:
|
|||
env:
|
||||
ACCOUNT_test: test
|
||||
UID_test: 1000
|
||||
SAMBA_VOLUME_CONFIG_test: "[test]; path=/tmp; valid users = test; guest ok = no; read only = no; browseable = yes"
|
||||
SAMBA_VOLUME_CONFIG_test:
|
||||
"[test]; path=/tmp; valid users = test; guest ok = no; read only =
|
||||
no; browseable = yes"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
|
@ -182,7 +196,9 @@ jobs:
|
|||
timeout_minutes: 2
|
||||
max_attempts: 3
|
||||
retry_on: timeout
|
||||
command: php ./vendor/bin/phpunit tests -c tests/phpunit.xml --coverage-clover=coverage.xml
|
||||
command:
|
||||
php ./vendor/bin/phpunit tests -c tests/phpunit.xml
|
||||
--coverage-clover=coverage.xml
|
||||
env:
|
||||
BACKEND: smbclient
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,6 @@ jobs:
|
|||
reuse-compliance-check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: https://github.com/actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
- name: REUSE Compliance Check
|
||||
uses: https://github.com/fsfe/reuse-action@a46482ca367aef4454a87620aa37c2be4b2f8106 # v3.0.0
|
||||
- uses: https://github.com/actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
|
||||
- name: REUSE Compliance Check
|
||||
uses: https://github.com/fsfe/reuse-action@a46482ca367aef4454a87620aa37c2be4b2f8106 # v3.0.0
|
||||
|
|
|
|||
83
README.md
83
README.md
|
|
@ -2,24 +2,25 @@
|
|||
- SPDX-FileCopyrightText: 2014 Robin Appelman <robin@icewind.nl>
|
||||
- SPDX-License-Identifier: MIT
|
||||
-->
|
||||
SMB
|
||||
===
|
||||
|
||||
# SMB
|
||||
|
||||
[](https://github.com/icewind1991/SMB/actions/workflows/ci.yaml)
|
||||
[](https://codecov.io/gh/icewind1991/SMB)
|
||||
|
||||
PHP wrapper for `smbclient` and [`libsmbclient-php`](https://github.com/eduardok/libsmbclient-php)
|
||||
PHP wrapper for `smbclient` and
|
||||
[`libsmbclient-php`](https://github.com/eduardok/libsmbclient-php)
|
||||
|
||||
- Reuses a single `smbclient` instance for multiple requests
|
||||
- Doesn't leak the password to the process list
|
||||
- Simple 1-on-1 mapping of SMB commands
|
||||
- A stream-based api to remove the need for temporary files
|
||||
- Support for using libsmbclient directly trough [`libsmbclient-php`](https://github.com/eduardok/libsmbclient-php)
|
||||
- Support for using libsmbclient directly trough
|
||||
[`libsmbclient-php`](https://github.com/eduardok/libsmbclient-php)
|
||||
|
||||
Examples
|
||||
----
|
||||
## Examples
|
||||
|
||||
### Connect to a share ###
|
||||
### Connect to a share
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
|
@ -35,10 +36,10 @@ $server = $serverFactory->createServer('localhost', $auth);
|
|||
$share = $server->getShare('test');
|
||||
```
|
||||
|
||||
The server factory will automatically pick between the `smbclient` and `libsmbclient-php`
|
||||
based backend depending on what is available.
|
||||
The server factory will automatically pick between the `smbclient` and
|
||||
`libsmbclient-php` based backend depending on what is available.
|
||||
|
||||
### Using anonymous authentication ###
|
||||
### Using anonymous authentication
|
||||
|
||||
```php
|
||||
$serverFactory = new ServerFactory();
|
||||
|
|
@ -46,7 +47,7 @@ $auth = new AnonymousAuth();
|
|||
$server = $serverFactory->createServer('localhost', $auth);
|
||||
```
|
||||
|
||||
### Using kerberos authentication ###
|
||||
### Using kerberos authentication
|
||||
|
||||
There are two ways of using kerberos to authenticate against the smb server:
|
||||
|
||||
|
|
@ -55,7 +56,8 @@ There are two ways of using kerberos to authenticate against the smb server:
|
|||
|
||||
### Using a server ticket
|
||||
|
||||
Using a server ticket allows the web server to authenticate against the smb server using an existing machine account.
|
||||
Using a server ticket allows the web server to authenticate against the smb
|
||||
server using an existing machine account.
|
||||
|
||||
The ticket needs to be available in the environment of the php process.
|
||||
|
||||
|
|
@ -67,15 +69,18 @@ $server = $serverFactory->createServer('localhost', $auth);
|
|||
|
||||
### Re-using a client ticket
|
||||
|
||||
By re-using a client ticket you can create a single sign-on setup where the user authenticates against
|
||||
the web service using kerberos. And the web server can forward that ticket to the smb server, allowing it
|
||||
to act on the behalf of the user without requiring the user to enter his password.
|
||||
By re-using a client ticket you can create a single sign-on setup where the user
|
||||
authenticates against the web service using kerberos. And the web server can
|
||||
forward that ticket to the smb server, allowing it to act on the behalf of the
|
||||
user without requiring the user to enter his password.
|
||||
|
||||
The setup for such a system is fairly involved and requires roughly the following this
|
||||
The setup for such a system is fairly involved and requires roughly the
|
||||
following this
|
||||
|
||||
- The web server is authenticated against kerberos with a machine account
|
||||
- Delegation is enabled for the web server's machine account
|
||||
- The web server is setup to perform kerberos authentication and save the ticket in it's environment
|
||||
- The web server is setup to perform kerberos authentication and save the ticket
|
||||
in it's environment
|
||||
- Php has the krb5 extension installed
|
||||
- The client authenticates using a ticket with forwarding enabled
|
||||
|
||||
|
|
@ -86,36 +91,36 @@ $auth->setTicket(KerberosTicket::fromEnv());
|
|||
$server = $serverFactory->createServer('localhost', $auth);
|
||||
```
|
||||
|
||||
### Upload a file ###
|
||||
### Upload a file
|
||||
|
||||
```php
|
||||
$share->put($fileToUpload, 'example.txt');
|
||||
```
|
||||
|
||||
### Download a file ###
|
||||
### Download a file
|
||||
|
||||
```php
|
||||
$share->get('example.txt', $target);
|
||||
```
|
||||
|
||||
### List shares on the remote server ###
|
||||
### List shares on the remote server
|
||||
|
||||
```php
|
||||
$shares = $server->listShares();
|
||||
|
||||
foreach ($shares as $share) {
|
||||
echo $share->getName() . "\n";
|
||||
echo $share->getName() . "\n";
|
||||
}
|
||||
```
|
||||
|
||||
### List the content of a folder ###
|
||||
### List the content of a folder
|
||||
|
||||
```php
|
||||
$content = $share->dir('test');
|
||||
|
||||
foreach ($content as $info) {
|
||||
echo $info->getName() . "\n";
|
||||
echo "\tsize :" . $info->getSize() . "\n";
|
||||
echo $info->getName() . "\n";
|
||||
echo "\tsize :" . $info->getSize() . "\n";
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -135,20 +140,22 @@ fwrite($fh, 'bar');
|
|||
fclose($fh);
|
||||
```
|
||||
|
||||
**Note**: write() will truncate your file to 0bytes. You may open a writeable stream with append() which will point
|
||||
the cursor to the end of the file or create it if it does not exist yet. (append() is only compatible with libsmbclient-php)
|
||||
**Note**: write() will truncate your file to 0bytes. You may open a writeable
|
||||
stream with append() which will point the cursor to the end of the file or
|
||||
create it if it does not exist yet. (append() is only compatible with
|
||||
libsmbclient-php)
|
||||
|
||||
```php
|
||||
$fh = $share->append('test.txt');
|
||||
fwrite($fh, 'bar');
|
||||
fclose($fh);
|
||||
```
|
||||
|
||||
|
||||
### Using notify
|
||||
|
||||
```php
|
||||
$share->notify('')->listen(function (\Icewind\SMB\Change $change) {
|
||||
echo $change->getCode() . ': ' . $change->getPath() . "\n";
|
||||
echo $change->getCode() . ': ' . $change->getPath() . "\n";
|
||||
});
|
||||
```
|
||||
|
||||
|
|
@ -169,24 +176,30 @@ $options->setMaxProtocol(IOptions::PROTOCOL_SMB3);
|
|||
$serverFactory = new ServerFactory($options);
|
||||
```
|
||||
|
||||
Note, setting the protocol version is not supported with php-smbclient version 1.0.1 or lower.
|
||||
Note, setting the protocol version is not supported with php-smbclient version
|
||||
1.0.1 or lower.
|
||||
|
||||
### Customizing system integration
|
||||
|
||||
The `smbclient` backend needs to get various information about the system it's running on to function
|
||||
such as the paths of various binaries or the system timezone.
|
||||
While the default logic for getting this information should work on most systems, it is possible to customize this behaviour.
|
||||
The `smbclient` backend needs to get various information about the system it's
|
||||
running on to function such as the paths of various binaries or the system
|
||||
timezone. While the default logic for getting this information should work on
|
||||
most systems, it is possible to customize this behaviour.
|
||||
|
||||
In order to customize the integration you provide a custom implementation of `ITimezoneProvider` and/or `ISystem` and pass them as arguments to the `ServerFactory`.
|
||||
In order to customize the integration you provide a custom implementation of
|
||||
`ITimezoneProvider` and/or `ISystem` and pass them as arguments to the
|
||||
`ServerFactory`.
|
||||
|
||||
## 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)
|
||||
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.
|
||||
If everything works correctly then the contents of the share should be
|
||||
outputted.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"host": "skybox.icewind.link",
|
||||
"user": "test",
|
||||
"password": "test",
|
||||
"share": "test",
|
||||
"root": "test"
|
||||
"host": "skybox.icewind.link",
|
||||
"user": "test",
|
||||
"password": "test",
|
||||
"share": "test",
|
||||
"root": "test"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,12 +6,23 @@
|
|||
*/
|
||||
|
||||
class KRB5CCache {
|
||||
public function getEntries(): array { return [];}
|
||||
public function getName(): string {return "";}
|
||||
public function initKeytab(string $principal, string $keytab, array $flags = []): void {}
|
||||
public function initPassword(string $principal, string $password, array $flags = []): void {}
|
||||
public function isValid(): bool {return false;}
|
||||
public function open(string $source): void {}
|
||||
public function save(string $destination): void {}
|
||||
public function setConfig(string $destination): void {}
|
||||
public function getEntries(): array {
|
||||
return [];
|
||||
}
|
||||
public function getName(): string {
|
||||
return "";
|
||||
}
|
||||
public function initKeytab(string $principal, string $keytab, array $flags = []): void {
|
||||
}
|
||||
public function initPassword(string $principal, string $password, array $flags = []): void {
|
||||
}
|
||||
public function isValid(): bool {
|
||||
return false;
|
||||
}
|
||||
public function open(string $source): void {
|
||||
}
|
||||
public function save(string $destination): void {
|
||||
}
|
||||
public function setConfig(string $destination): void {
|
||||
}
|
||||
}
|
||||
|
|
@ -4,12 +4,12 @@
|
|||
- SPDX-License-Identifier: MIT
|
||||
-->
|
||||
<phpunit bootstrap="bootstrap.php">
|
||||
<testsuite name='SMB'>
|
||||
<directory suffix='.php'>./</directory>
|
||||
</testsuite>
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||
<directory suffix=".php">../src</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
<testsuite name='SMB'>
|
||||
<directory suffix='.php'>./</directory>
|
||||
</testsuite>
|
||||
<filter>
|
||||
<whitelist processUncoveredFilesFromWhitelist="true">
|
||||
<directory suffix=".php">../src</directory>
|
||||
</whitelist>
|
||||
</filter>
|
||||
</phpunit>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue