* 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 CLIENT = 'smbclient'; const LOCALE = 'en_US.UTF-8'; /** * @var string $host */ protected $host; /** * @var string $user */ protected $user; /** * @var string $password */ protected $password; /** * 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; $this->user = $user; $this->password = $password; } /** * @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 \Icewind\SMB\IShare[] * * @throws \Icewind\SMB\Exception\AuthenticationException * @throws \Icewind\SMB\Exception\InvalidHostException */ public function listShares() { $command = Server::CLIENT . ' --authentication-file=/proc/self/fd/3' . ' -gL ' . escapeshellarg($this->getHost()); $connection = new RawConnection($command); $connection->writeAuthentication($this->getUser(), $this->getPassword()); $output = $connection->readAll(); $line = $output[0]; $line = rtrim($line, ')'); if (substr($line, -23) === ErrorCodes::LogonFailure) { throw new AuthenticationException(); } if (substr($line, -26) === ErrorCodes::BadHostName) { throw new InvalidHostException(); } if (substr($line, -22) === ErrorCodes::Unsuccessful) { throw new InvalidHostException(); } if (substr($line, -28) === ErrorCodes::ConnectionRefused) { throw new InvalidHostException(); } $shareNames = array(); foreach ($output as $line) { if (strpos($line, '|')) { list($type, $name, $description) = explode('|', $line); if (strtolower($type) === 'disk') { $shareNames[$name] = $description; } } } $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); } /** * @return string */ public function getTimeZone() { $command = 'net time zone -S ' . escapeshellarg($this->getHost()); return exec($command); } }