Completed
Push — stable3.0 ( 04db6f )
by Robin
03:38
created

Server   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Test Coverage

Coverage 75.68%

Importance

Changes 0
Metric Value
wmc 10
lcom 1
cbo 7
dl 0
loc 73
ccs 28
cts 37
cp 0.7568
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A available() 0 3 1
A getAuthFileArgument() 0 7 2
B listShares() 0 38 6
A getShare() 0 3 1
1
<?php
2
/**
3
 * Copyright (c) 2014 Robin Appelman <[email protected]>
4
 * This file is licensed under the Licensed under the MIT license:
5
 * http://opensource.org/licenses/MIT
6
 */
7
8
namespace Icewind\SMB\Wrapped;
9
10
use Icewind\SMB\AbstractServer;
11
use Icewind\SMB\Exception\AuthenticationException;
12
use Icewind\SMB\Exception\ConnectException;
13
use Icewind\SMB\Exception\ConnectionException;
14
use Icewind\SMB\Exception\InvalidHostException;
15
use Icewind\SMB\IShare;
16
use Icewind\SMB\System;
17
18
class Server extends AbstractServer {
19
	/**
20
	 * Check if the smbclient php extension is available
21
	 *
22
	 * @param System $system
23
	 * @return bool
24
	 */
25
	public static function available(System $system) {
26
		return $system->getSmbclientPath();
27
	}
28
29 15
	private function getAuthFileArgument() {
30 15
		if ($this->getAuth()->getUsername()) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getAuth()->getUsername() of type string|null is loosely compared to true; this is ambiguous if the string can be empty. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For string values, the empty string '' is a special case, in particular the following results might be unexpected:

''   == false // true
''   == null  // true
'ab' == false // false
'ab' == null  // false

// It is often better to use strict comparison
'' === false // false
'' === null  // false
Loading history...
31 15
			return '--authentication-file=' . System::getFD(3);
32
		} else {
33
			return '';
34
		}
35
	}
36
37
	/**
38
	 * @return IShare[]
39
	 *
40
	 * @throws AuthenticationException
41
	 * @throws InvalidHostException
42
	 * @throws ConnectException
43
	 */
44 15
	public function listShares() {
45 15
		$command = sprintf('%s %s %s -L %s',
46 15
			$this->system->getSmbclientPath(),
47 15
			$this->getAuthFileArgument(),
48 15
			$this->getAuth()->getExtraCommandLineArguments(),
49 15
			escapeshellarg('//' . $this->getHost())
50
		);
51 15
		$connection = new RawConnection($command);
52 15
		$connection->writeAuthentication($this->getAuth()->getUsername(), $this->getAuth()->getPassword());
53 15
		$connection->connect();
54 15
		if (!$connection->isValid()) {
55
			throw new ConnectionException($connection->readLine());
56
		}
57
58 15
		$parser = new Parser($this->timezoneProvider);
59
60 15
		$output = $connection->readAll();
61 15
		if (isset($output[0])) {
62 9
			$parser->checkConnectionError($output[0]);
63
		}
64
65
		// sometimes we get an empty line first
66 6
		if (count($output) < 2) {
67 6
			$output = $connection->readAll();
68
		}
69
70 6
		if (isset($output[0])) {
71 6
			$parser->checkConnectionError($output[0]);
72
		}
73
74 6
		$shareNames = $parser->parseListShares($output);
75
76 6
		$shares = array();
77 6
		foreach ($shareNames as $name => $description) {
78 6
			$shares[] = $this->getShare($name);
79
		}
80 6
		return $shares;
81
	}
82
83
	/**
84
	 * @param string $name
85
	 * @return IShare
86
	 */
87 768
	public function getShare($name) {
88 768
		return new Share($this, $name, $this->system);
89
	}
90
}
91