Completed
Push — master ( 5a8d9e...0bfb02 )
by Robin
03:26
created

Server::getShare()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 3
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 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
		return '-U ' . $this->getAuth()->getUsername() . '%' . $this->getAuth()->getPassword();
31
		if ($this->getAuth()->getUsername()) {
0 ignored issues
show
Unused Code introduced by
if ($this->getAuth()->ge...else { return ''; } does not seem to be reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

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